wiki test: parse files

git-svn-id: trunk@35645 -
This commit is contained in:
mattias 2012-03-01 23:28:00 +00:00
parent 9e9f823a55
commit d1ec4c9c3d
5 changed files with 86 additions and 62 deletions

View File

@ -132,8 +132,9 @@ var
ms: TMemoryStream;
Filename: String;
begin
if OutputDir='' then exit;
Filename:=PageToFilename(Page,true);
DebugLn(['TWiki2HTMLConverter.SavePage ',Filename]);
Log('TWiki2HTMLConverter.SavePage '+Filename);
ms:=TMemoryStream.Create;
try
SavePageToStream(Page,ms);

View File

@ -172,7 +172,7 @@ var
exit(true);
end;
if WarnURL(LinkToken.Link) then
debugln(['WARNING: TWiki2XHTMLConverter.InsertLink "'+dbgstr(LinkToken.Link)+'": image file not found: "',Filename,'" at ',W.PosToStr(LinkToken.LinkStartPos,true)]);
Log('WARNING: TWiki2XHTMLConverter.InsertLink "'+dbgstr(LinkToken.Link)+'": image file not found: "'+Filename+'" at '+W.PosToStr(LinkToken.LinkStartPos,true));
URL:='';
exit;
end;
@ -207,7 +207,7 @@ var
URL:=GetPageLink(TargetPage);
end else if (not FileExistsUTF8(Filename)) then begin
if WarnMissingPageLinks and WarnURL(LinkToken.Link) then
debugln(['WARNING: TWiki2XHTMLConverter.InsertLink "'+dbgstr(LinkToken.Link)+'": file not found: "',Filename,'" at ',W.PosToStr(LinkToken.LinkStartPos,true)]);
Log('WARNING: TWiki2XHTMLConverter.InsertLink "'+dbgstr(LinkToken.Link)+'": file not found: "'+Filename+'" at '+W.PosToStr(LinkToken.LinkStartPos,true));
URL:='';
end;
end;
@ -328,7 +328,7 @@ begin
Page:=TW2XHTMLPage(Token.UserData);
W:=Page.WikiPage;
doc:=Page.XHTML;
//debugln(['TWiki2XHTMLConverter.OnWikiToken Token=',dbgs(Token.Token),' ',dbgs(Token)]);
//Log(['TWiki2XHTMLConverter.OnWikiToken Token='+dbgs(Token.Token)+' '+dbgs(Token));
case Token.Token of
wptText:
if Token is TWPTextToken then begin
@ -487,7 +487,7 @@ begin
end;
debugln(['TWiki2XHTMLConverter.OnWikiToken ToDo: Token=',dbgs(Token.Token),' Range=',dbgs(Token.Range),' Class=',Token.ClassName,' ',W.PosToStr(W.CurrentPos)]);
Log('TWiki2XHTMLConverter.OnWikiToken ToDo: Token='+dbgs(Token.Token)+' Range='+dbgs(Token.Range)+' Class='+Token.ClassName+' '+W.PosToStr(W.CurrentPos));
end;
function TWiki2XHTMLConverter.GetImageLink(ImgFilename: string): string;
@ -507,7 +507,7 @@ var
begin
Page:=TW2XHTMLPage(Token.UserData);
doc:=Page.XHTML;
//debugln(['TWiki2XHTMLConverter.InsertText Txt="',dbgstr(Txt),'"']);
//Log(['TWiki2XHTMLConverter.InsertText Txt="'+dbgstr(Txt)+'"']);
if Txt='' then exit;
if Page.CurNode.TagName<>'pre' then begin
if UTF8Trim(Txt)='' then begin
@ -517,7 +517,7 @@ begin
if Page.CurNode.FirstChild=nil then
Txt:=UTF8Trim(Txt,[u8tKeepEnd]);
end;
//debugln(['TWiki2XHTMLConverter.InsertText Node="',Page.CurNode.TagName,'" Text="',Txt,'"']);
//Log('TWiki2XHTMLConverter.InsertText Node="'+Page.CurNode.TagName+'" Text="'+Txt+'"');
Txt:=EncodeLesserAndGreaterThan(Txt);
Page.CurNode.AppendChild(doc.CreateTextNode(Txt));
end;
@ -644,8 +644,9 @@ procedure TWiki2XHTMLConverter.SavePage(Page: TW2XHTMLPage);
var
Filename: String;
begin
if OutputDir='' then exit;
Filename:=PageToFilename(Page,true);
DebugLn(['TWiki2HTMLConverter.SavePage ',Filename]);
Log('TWiki2HTMLConverter.SavePage '+Filename);
WriteXMLFile(Page.XHTML,Filename);
end;

View File

@ -54,6 +54,7 @@ type
private
FLanguageTags: TKeyWordFunctionList;
FNoWarnBaseURLs: TStringToStringTree;
FOnLog: TWikiOnLog;
FTitle: string;
FWarnMissingPageLinks: boolean;
procedure SetTitle(AValue: string);
@ -62,7 +63,6 @@ type
FOutputDir: string;
fPages: TW2FormatPageList;
FPageClass: TW2FormatPageClass;
fMultiReadExclusiveWrite: TMultiReadExclusiveWriteSynchronizer;
function GetPages(Index: integer): TW2FormatPage;
procedure SetOutputDir(AValue: string);
procedure SetImagesDir(AValue: string);
@ -73,11 +73,9 @@ type
function IndexOfWikiFilename(Filename: string): integer; virtual;
function AddWikiPage(Filename: string; ParseNow: boolean = true): TW2FormatPage;
procedure Convert; virtual;
procedure Log(Msg: string);
property OnLog: TWikiOnLog read FOnLog write FOnLog;
function Count: integer;
procedure BeginRead;
procedure EndRead;
procedure BeginWrite;
procedure EndWrite;
property Pages[Index: integer]: TW2FormatPage read GetPages; default;
property PageClass: TW2FormatPageClass read FPageClass;
property OutputDir: string read FOutputDir write SetOutputDir;
@ -129,7 +127,6 @@ end;
constructor TWiki2FormatConverter.Create;
begin
fMultiReadExclusiveWrite:=TMultiReadExclusiveWriteSynchronizer.Create;
FPageClass:=TW2FormatPage;
fPages:=TW2FormatPageList.Create;
FTitle:='FPC/Lazarus Wiki (offline, generated '+DatetoStr(Now)+')';
@ -143,7 +140,6 @@ begin
FreeAndNil(FNoWarnBaseURLs);
FreeAndNil(fPages);
inherited Destroy;
FreeAndNil(fMultiReadExclusiveWrite);
end;
procedure TWiki2FormatConverter.Clear;
@ -187,7 +183,7 @@ var
i: Integer;
Page: TW2FormatPage;
begin
if not DirPathExists(OutputDir) then
if (OutputDir<>'') and (not DirPathExists(OutputDir)) then
raise Exception.Create('fpdoc output directory not found: "'+OutputDir+'"');
// load wiki pages
@ -198,31 +194,19 @@ begin
end;
end;
procedure TWiki2FormatConverter.Log(Msg: string);
begin
if Assigned(OnLog) then
OnLog(Msg)
else
debugln(Msg);
end;
function TWiki2FormatConverter.Count: integer;
begin
Result:=fPages.Count;
end;
procedure TWiki2FormatConverter.BeginRead;
begin
fMultiReadExclusiveWrite.Beginread;
end;
procedure TWiki2FormatConverter.EndRead;
begin
fMultiReadExclusiveWrite.Endread;
end;
procedure TWiki2FormatConverter.BeginWrite;
begin
fMultiReadExclusiveWrite.Beginwrite;
end;
procedure TWiki2FormatConverter.EndWrite;
begin
fMultiReadExclusiveWrite.Endwrite;
end;
{ TW2FormatPage }
constructor TW2FormatPage.Create(TheConverter: TWiki2FormatConverter);
@ -252,6 +236,8 @@ begin
if WikiPage=nil then begin
WikiPage:=TWikiPage.Create;
try
if Converter<>nil then
WikiPage.OnLog:=Converter.OnLog;
WikiPage.LoadFromDoc(WikiDoc);
except
on E: Exception do

View File

@ -232,6 +232,8 @@ type
wpvHint
);
TWikiOnLog = procedure(Msg: string) of object;
{ TWikiPage }
TWikiPage = class
@ -247,6 +249,7 @@ type
FFilename: string;
FAutoFixUTF8: boolean;
FLanguageTags: TKeyWordFunctionList;
FOnLog: TWikiOnLog;
FStack: PStackItem;
FStackPtr: integer;
FStackCapacity: integer;
@ -322,6 +325,8 @@ type
function TrimLink(const Link: string): string;
function CurrentPos: integer;
property LanguageTags: TKeyWordFunctionList read FLanguageTags write FLanguageTags;
procedure Log(Msg: string);
property OnLog: TWikiOnLog read FOnLog write FOnLog;
end;
var
@ -438,7 +443,7 @@ var
begin
inc(FStackPtr);
{$IFDEF VerboseWikiStack}
debugln(['Push :',GetIndentStr(FStackPtr*2),dbgs(Token),' at ',PosToStr(FCurP)]);
Log(['Push :',GetIndentStr(FStackPtr*2),dbgs(Token),' at ',PosToStr(FCurP)]);
{$ENDIF}
if FStackPtr>=FStackCapacity then begin
NewCapacity:=FStackCapacity*2+8;
@ -454,6 +459,20 @@ begin
end;
function TWikiPage.Pop(Token: TWPTokenType): boolean;
procedure LogMissingClose;
var
Item: PStackItem;
begin
Item:=@FStack[FStackPtr];
Log('TWikiPage.Pop WARNING: missing closing for '+dbgs(Item^.Token)+' at '+PosToStr(FCurP,true));
end;
procedure LogNotOpen;
begin
Log('TWikiPage.Pop Hint: tag was not open: '+dbgs(Token)+' at '+PosToStr(FCurP,true));
end;
var
i: Integer;
Group: TWPTokenGroup;
@ -468,13 +487,12 @@ begin
// found
while FStackPtr>=i do begin
Item:=@FStack[FStackPtr];
if (FStackPtr>i) and (wpifWarnOnAutoClose in WPTokenInfos[Item^.Token].Flags)
then begin
if Verbosity>=wpvWarning then
DebugLn(['TWikiPage.Pop WARNING: missing closing for ',dbgs(Item^.Token),' at ',PosToStr(FCurP,true)]);
end;
if (Verbosity>=wpvWarning)
and (FStackPtr>i) and (wpifWarnOnAutoClose in WPTokenInfos[Item^.Token].Flags)
then
LogMissingClose;
{$IFDEF VerboseWikiStack}
debugln(['Pop :',GetIndentStr(FStackPtr*2),dbgs(Item^.Token),' at ',PosToStr(FCurP)]);
Log('Pop :'+GetIndentStr(FStackPtr*2)+dbgs(Item^.Token)+' at '+PosToStr(FCurP));
{$ENDIF}
if Item^.Token in [wptPre,wptPreTag] then
dec(FInPre);
@ -487,7 +505,7 @@ begin
end;
// not found
if Verbosity>=wpvHint then
debugln(['TWikiPage.Pop Hint: tag was not open: ',dbgs(Token),' at ',PosToStr(FCurP,true)]);
LogNotOpen;
end;
procedure TWikiPage.Pop(Index: integer);
@ -538,7 +556,7 @@ begin
{$IFDEF VerboseWikiOnToken}
i:=FStackPtr;
if i<0 then i:=0;
debugln(['Token:',GetIndentStr(i*2),dbgs(Token.Token),' at ',PosToStr(FCurP)]);
Log('Token:'+GetIndentStr(i*2)+dbgs(Token.Token)+' at '+PosToStr(FCurP));
{$ENDIF}
FOnToken(Token);
end;
@ -569,7 +587,7 @@ procedure TWikiPage.ParseAttributes(StartPos, EndPos: PChar);
var
p: PChar;
begin
//debugln(['TWikiPage.ParseAttributes ',PosToStr(StartPos),' ',PosToStr(EndPos),' <',dbgstr(StartPos,EndPos-StartPos),'>']);
//Log('TWikiPage.ParseAttributes '+PosToStr(StartPos)+' '+PosToStr(EndPos)+' <'+dbgstr(StartPos,EndPos-StartPos),'>');
p:=StartPos;
repeat
// skip whitespace
@ -601,7 +619,7 @@ begin
DoToken(FNameValueToken);
inc(p);
until p>=EndPos;
//debugln(['TWikiPage.ParseAttributes stopped at <',dbgstr(StartPos,p-StartPos),'>']);
//Log(['TWikiPage.ParseAttributes stopped at <'+dbgstr(StartPos,p-StartPos)+'>');
end;
procedure TWikiPage.ParseNoWiki;
@ -649,6 +667,14 @@ begin
Result:=StrPos(FCurP);
end;
procedure TWikiPage.Log(Msg: string);
begin
if Assigned(OnLog) then
OnLog(Msg)
else
debugln(Msg);
end;
procedure TWikiPage.CloseRangeToken(Typ: TWPTokenType);
begin
FRangeToken.SubToken:=Typ;
@ -730,7 +756,7 @@ begin
inc(i);
end;
// maybe new header
//debugln(['HandleHeader START ',PosToStr(FCurP),' ',AtLineStart(FCurP)]);
//Log(['HandleHeader START '+PosToStr(FCurP)+' '+AtLineStart(FCurP));
if not AtLineStart(FCurP) then begin
// normal =
inc(FCurP);
@ -801,7 +827,7 @@ begin
inc(CurDepth);
if CurDepth=NewDepth then begin
// close fonts, spans and previous list item
//debugln(['TWikiPage.HandleListChar close fonts, spans, listitem']);
//Log('TWikiPage.HandleListChar close fonts, spans, listitem');
Pop(i);
end;
if (i>FStackPtr) then
@ -831,7 +857,7 @@ begin
exit;
end;
// preformatted text
//debugln(['TWikiPage.HandleSpace start pre "',dbgstr(GetLineInSrc(Src,StrPos(FCurP))),'"']);
//Log('TWikiPage.HandleSpace start pre "'+dbgstr(GetLineInSrc(Src,StrPos(FCurP)))+'"');
// ToDo: flags
EmitFlag(wptPre,wprOpen,1);
repeat
@ -845,11 +871,11 @@ begin
if FCurP^<>' ' then break;
// next line is also preformatted
inc(FCurP);
//debugln(['TWikiPage.HandleSpace line break']);
//Log('TWikiPage.HandleSpace line break');
FLastEmitPos:=FCurP;
EmitFlag(wptLineBreak,wprNone,0);
until false;
//debugln(['TWikiPage.HandleSpace end pre']);
//Log('TWikiPage.HandleSpace end pre');
FLastEmitPos:=FCurP;
EmitFlag(wptPre,wprClose,0);
end;
@ -1093,12 +1119,12 @@ procedure TWikiPage.HandleAngleBracket;
if Verbosity>=wpvWarning then begin
if IsWikiTagStartChar[FCurP[1]] then begin
{$IFDEF VerboseUnknownOpenTags}
debugln('WARNING: TWikiPage.Parse unknown opening tag: <'+GetIdentifier(FCurP+1),'> at ',PosToStr(FCurP,true));
Log('WARNING: TWikiPage.Parse unknown opening tag: <'+GetIdentifier(FCurP+1)+'> at '+PosToStr(FCurP,true));
{$ENDIF}
end else if (FCurP[1]='/') and IsWikiTagStartChar[FCurP[2]] then
debugln('WARNING: TWikiPage.Parse unknown closing tag: </'+GetIdentifier(FCurP+2),'> at ',PosToStr(FCurP,true))
Log('WARNING: TWikiPage.Parse unknown closing tag: </'+GetIdentifier(FCurP+2)+'> at '+PosToStr(FCurP,true))
else
debugln('WARNING: TWikiPage.Parse broken close tag at ',PosToStr(FCurP,true));
Log('WARNING: TWikiPage.Parse broken close tag at '+PosToStr(FCurP,true));
end;
inc(FCurP);
end;
@ -1160,7 +1186,7 @@ begin
and FLanguageTags.DoIdentifier(NameP)
then begin
// special parse for different language
//debugln(['TWikiPage.Parse code tag ',dbgs(Pointer(FCurP)),' tag=',GetIdentifier(NameP),' ',FindTagEnd(FCurP)-FCurP]);
//Log('TWikiPage.Parse code tag '+dbgs(Pointer(FCurP))+' tag='+GetIdentifier(NameP)+' '+FindTagEnd(FCurP)-FCurP);
HandleCode;
end else if TokenIs('<nowiki>') then begin
ParseNoWiki;
@ -1222,7 +1248,7 @@ begin
FNameValueToken.ValueEndPos:=StrPos(p);
FCurP:=FindTagEnd(p);
FNameValueToken.SubToken:=wptCode;
//debugln(['TWikiPage.HandleCode name="',copy(Src,FNameValueToken.NameStartPos,FNameValueToken.NameEndPos-FNameValueToken.NameStartPos),'"']);
//Log('TWikiPage.HandleCode name="'+copy(Src,FNameValueToken.NameStartPos,FNameValueToken.NameEndPos-FNameValueToken.NameStartPos)+'"');
DoToken(FNameValueToken);
FLastEmitPos:=FCurP;
end;

View File

@ -6,7 +6,7 @@ interface
uses
Classes, SysUtils, LazFileUtils, LazLogger, Wiki2HTMLConvert,
MTProcs;
Wiki2XHTMLConvert, WikiFormat, MTProcs;
type
TWikiHelp = class;
@ -23,6 +23,7 @@ type
TWiki2HelpConverter = class(TWiki2HTMLConverter)
protected
procedure SavePage({%H-}Page: TW2XHTMLPage); override;
public
constructor Create; override;
end;
@ -77,6 +78,11 @@ implementation
{ TWiki2HelpConverter }
procedure TWiki2HelpConverter.SavePage(Page: TW2XHTMLPage);
begin
// do not save
end;
constructor TWiki2HelpConverter.Create;
begin
inherited Create;
@ -98,6 +104,7 @@ begin
Files:=TStringList.Create;
try
Help.Converter.OnLog:=@Log;
// get all wiki xml files
if FindFirstUTF8(XMLDirectory+AllFilesMask,faAnyFile,FileInfo)=0 then begin
repeat
@ -112,13 +119,14 @@ begin
Filename:=XMLDirectory+Files[i];
Help.Converter.AddWikiPage(Filename,false);
end;
// load xml files
ProcThreadPool.DoParallel(@LoadWikiPage,0,Help.Converter.Count-1);
Help.Converter.Convert;
finally
Files.Free;
Help.Converter.OnLog:=nil;
end;
// load xml files
ProcThreadPool.DoParallel(@LoadWikiPage,0,Help.Converter.Count-1);
Log('TWikiHelpThread.Execute SCAN complete XMLDirectory="'+XMLDirectory+'"');
except
on E: Exception do begin
@ -196,11 +204,13 @@ begin
InitCriticalSection(FCritSec);
inherited Create(AOwner);
FConverter:=TWiki2HelpConverter.Create;
FConverter.LanguageTags:=WikiCreateCommonLanguageList(true);
end;
destructor TWikiHelp.Destroy;
begin
Abort;
FConverter.LanguageTags.Free;
FreeAndNil(FConverter);
inherited Destroy;
DoneCriticalsection(FCritSec);