diff options
| author | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-08-24 20:27:30 +0000 |
|---|---|---|
| committer | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-08-24 20:27:30 +0000 |
| commit | e972ccebafb72835691c650c3d96e06d6fa76531 (patch) | |
| tree | f1dbe8c9ca3f52e8ed5844e3d3add4524e5d533d /packages/chm | |
| parent | 93b83955952df8537b86e2485710fd2b937423de (diff) | |
| download | fpc-e972ccebafb72835691c650c3d96e06d6fa76531.tar.gz | |
* extracttoc/extractbinary
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@15897 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/chm')
| -rw-r--r-- | packages/chm/src/chmls.lpr | 62 | ||||
| -rw-r--r-- | packages/chm/src/chmsitemap.pas | 13 |
2 files changed, 70 insertions, 5 deletions
diff --git a/packages/chm/src/chmls.lpr b/packages/chm/src/chmls.lpr index b99430abf9..2b4a6426cf 100644 --- a/packages/chm/src/chmls.lpr +++ b/packages/chm/src/chmls.lpr @@ -28,7 +28,7 @@ program chmls; uses Classes, GetOpts, SysUtils, Types, - chmreader, chmbase; + chmreader, chmbase, chmsitemap; type @@ -50,10 +50,10 @@ type end; - TCmdEnum = (cmdList,cmdExtract,cmdExtractall,cmdUnblock,cmdextractalias,cmdNone); // One dummy element at the end avoids rangecheck errors. + TCmdEnum = (cmdList,cmdExtract,cmdExtractall,cmdUnblock,cmdextractalias,cmdextracttoc,cmdextractindex,cmdNone); // One dummy element at the end avoids rangecheck errors. Const - CmdNames : array [TCmdEnum] of String = ('LIST','EXTRACT','EXTRACTALL','UNBLOCK','EXTRACTALIAS',''); + CmdNames : array [TCmdEnum] of String = ('LIST','EXTRACT','EXTRACTALL','UNBLOCK','EXTRACTALIAS','EXTRACTTOC','EXTRACTINDEX',''); var theopts : array[1..4] of TOption; @@ -85,7 +85,10 @@ begin writeln(stderr,' Extracts context info from file "chmfilename" '); writeln(stderr,' to a "basefilename".h and "basefilename".ali,'); writeln(stderr,' using symbols "symbolprefix"contextnr'); - + writeln(stderr,' extracttoc <chmfilename> [filename]'); + writeln(stderr,' Extracts the toc (mainly to check binary TOC)'); + writeln(stderr,' extractindex <chmfilename> [filename]'); + writeln(stderr,' Extracts the index (mainly to check binary index)'); Halt(1); end; @@ -450,11 +453,48 @@ begin Files.Free; end; +const + siteext : array[TSiteMapType] of string = ('.hhc','.hhk'); + +procedure extracttocindex(filespec:TStringDynArray;sttype:TSiteMapType); +var s, + chm, + extractfn : string; + i,cnt: integer; + cl : TList; + f : textfile; + fs: TFileStream; + r : TChmReader; + x : TCHMSitemap; +begin + chm:=filespec[0]; + extractfn:=changefileext(chm,siteext[sttype]); + if length(filespec)>1 then + extractfn:=filespec[1]; + + if not Fileexists(chm) then + begin + writeln(stderr,' Can''t find file ',chm); + halt(1); + end; + fs:=TFileStream.create(chm,fmOpenRead); + r:=TCHMReader.create(fs,true); + case sttype of + stindex: x:=r.GetIndexSitemap(false); + sttoc : x:=r.gettocsitemap(false); + end; + if assigned(x) then + begin + x.savetofile( extractfn); + x.free; + end; + r.free; +end; + procedure buildarglist(var params: TStringDynArray;var cmd :TCmdEnum); var s : ansistring; j,k : Integer; - begin s:=uppercase(paramstr(optind)); cmd:=Low(TCMDEnum); @@ -564,6 +604,18 @@ begin else WrongNrParam(cmdnames[cmd],length(localparams)); end; + cmdextracttoc : begin + if length(localparams)>0 then + extracttocindex(localparams,sttoc) + else + WrongNrParam(cmdnames[cmd],length(localparams)); + end; + cmdextractindex: begin + if length(localparams)>0 then + extracttocindex(localparams,stindex) + else + WrongNrParam(cmdnames[cmd],length(localparams)); + end; end; {case cmd of} end else diff --git a/packages/chm/src/chmsitemap.pas b/packages/chm/src/chmsitemap.pas index fa13854b2b..be5f091755 100644 --- a/packages/chm/src/chmsitemap.pas +++ b/packages/chm/src/chmsitemap.pas @@ -135,6 +135,7 @@ type destructor Destroy; override; procedure LoadFromFile(AFileName: String); procedure LoadFromStream(AStream: TStream); + procedure SaveToFile(AFileName:String); procedure SaveToStream(AStream: TStream); property Items: TChmSiteMapItems read FItems write SetItems; property SiteMapType: TSiteMapType read FSiteMapType; @@ -334,6 +335,18 @@ begin end; end; +procedure TChmSiteMap.SaveToFile(AFileName:String); +var + fs : TFileStream; +begin + fs:=TFileStream.Create(AFileName,fmcreate); + try + SaveToStream(fs); + finally + fs.free; + end; +end; + procedure TChmSiteMap.SaveToStream(AStream: TStream); var Indent: Integer; |
