mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-05 16:12:34 +02:00
167 lines
4.1 KiB
ObjectPascal
167 lines
4.1 KiB
ObjectPascal
{ Converter for wiki pages to html pages
|
|
|
|
Copyright (C) 2012 Mattias Gaertner mattias@freepascal.org
|
|
|
|
This source is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 2 of the License, or (at your option)
|
|
any later version.
|
|
|
|
This code is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
details.
|
|
|
|
A copy of the GNU General Public License is available on the World Wide Web
|
|
at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
|
|
to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
|
|
Boston, MA 02110-1335, USA.
|
|
|
|
}
|
|
unit Wiki2HTMLConvert;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Wiki2XHTMLConvert, WikiParser, LazLoggerBase, laz2_DOM,
|
|
LazUTF8;
|
|
|
|
type
|
|
|
|
{ TW2HTMLPage
|
|
for future extensions and descendants }
|
|
|
|
TW2HTMLPage = class(TW2XHTMLPage)
|
|
public
|
|
|
|
end;
|
|
|
|
{ TWiki2HTMLConverter }
|
|
|
|
TWiki2HTMLConverter = class(TWiki2XHTMLConverter)
|
|
protected
|
|
procedure SavePageToStream(Page: TW2XHTMLPage; aStream: TStream); virtual;
|
|
procedure SavePage(Page: TW2XHTMLPage); override;
|
|
public
|
|
constructor Create; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TWiki2HTMLConverter }
|
|
|
|
procedure TWiki2HTMLConverter.SavePageToStream(Page: TW2XHTMLPage;
|
|
aStream: TStream);
|
|
var
|
|
LastNodeWasText: boolean;
|
|
FirstLine: boolean;
|
|
|
|
procedure w(s: string);
|
|
begin
|
|
if s='' then exit;
|
|
aStream.Write(s[1],length(s));
|
|
end;
|
|
|
|
procedure Traverse(ParentNode: TDOMNode; PreserveSpace: boolean);
|
|
var
|
|
Node: TDOMNode;
|
|
Element: TDOMElement;
|
|
i: Integer;
|
|
s: DOMString;
|
|
TagName: DOMString;
|
|
OldPreserveSpace: Boolean;
|
|
begin
|
|
for Node in ParentNode do begin
|
|
if Node is TDOMText then begin
|
|
s:=TDOMText(Node).Data;
|
|
if UTF8Trim(s)='' then continue;
|
|
LastNodeWasText:=true;
|
|
w(s);
|
|
end else if Node is TDOMElement then begin
|
|
if not LastNodeWasText then begin
|
|
if FirstLine then
|
|
FirstLine:=false
|
|
else
|
|
w(LineEnding);
|
|
w(Space(Node.GetLevel*2-2));
|
|
end;
|
|
Element:=TDOMElement(Node);
|
|
w('<');
|
|
w(Element.TagName);
|
|
OldPreserveSpace:=PreserveSpace;
|
|
if Element.TagName='pre' then
|
|
PreserveSpace:=true;
|
|
for i:=0 to Element.Attributes.Length-1 do begin
|
|
w(' ');
|
|
w(Element.Attributes[i].NodeName);
|
|
w('="');
|
|
w(StrToXMLValue(Element.Attributes[i].NodeValue));
|
|
w('"');
|
|
end;
|
|
if Node.FirstChild <> nil then
|
|
w('>')
|
|
else
|
|
w('/>');
|
|
LastNodeWasText:=PreserveSpace;
|
|
if (Node.FirstChild<>nil) then begin
|
|
Traverse(Node,PreserveSpace);
|
|
if not LastNodeWasText then begin
|
|
w(LineEnding);
|
|
w(Space(Node.GetLevel*2-2));
|
|
end;
|
|
w('</');
|
|
w(Element.TagName);
|
|
w('>');
|
|
LastNodeWasText:=PreserveSpace;
|
|
end else if Node is TDOMElement then begin
|
|
TagName:=lowercase(TDOMElement(Node).TagName);
|
|
if (TagName='td') then begin
|
|
// tag needs at least a space
|
|
w(' </');
|
|
w(Element.TagName);
|
|
w('>');
|
|
end;
|
|
end;
|
|
PreserveSpace:=OldPreserveSpace;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
LastNodeWasText:=false;
|
|
FirstLine:=true;
|
|
Traverse(Page.XHTML,false);
|
|
end;
|
|
|
|
procedure TWiki2HTMLConverter.SavePage(Page: TW2XHTMLPage);
|
|
var
|
|
ms: TMemoryStream;
|
|
Filename: String;
|
|
begin
|
|
if OutputDir='' then exit;
|
|
if Page.XHTML=nil then exit;
|
|
Filename:=PageToFilename(Page,true);
|
|
Log('TWiki2HTMLConverter.SavePage '+Filename);
|
|
ms:=TMemoryStream.Create;
|
|
try
|
|
SavePageToStream(Page,ms);
|
|
ms.Position:=0;
|
|
ms.SaveToFile(Filename);
|
|
finally
|
|
ms.Free;
|
|
end;
|
|
end;
|
|
|
|
constructor TWiki2HTMLConverter.Create;
|
|
begin
|
|
inherited Create;
|
|
FPageClass:=TW2HTMLPage;
|
|
FOutputDir:='html';
|
|
PageFileExt:='.html';
|
|
end;
|
|
|
|
end.
|
|
|