summaryrefslogtreecommitdiff
path: root/packages/chm
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-08-24 20:27:30 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-08-24 20:27:30 +0000
commite972ccebafb72835691c650c3d96e06d6fa76531 (patch)
treef1dbe8c9ca3f52e8ed5844e3d3add4524e5d533d /packages/chm
parent93b83955952df8537b86e2485710fd2b937423de (diff)
downloadfpc-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.lpr62
-rw-r--r--packages/chm/src/chmsitemap.pas13
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;