mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-01 08:13:18 +01:00
wiki test: parse files
git-svn-id: trunk@35645 -
This commit is contained in:
parent
9e9f823a55
commit
d1ec4c9c3d
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user