wiki test: open page

git-svn-id: trunk@35749 -
This commit is contained in:
mattias 2012-03-05 20:04:53 +00:00
parent e1b2c61f10
commit 64fc77e75d
5 changed files with 121 additions and 24 deletions

View File

@ -96,7 +96,7 @@ type
CurNode: TDOMElement; // current fpdoc node
public
FPDoc: TXMLDocument;
destructor Destroy; override;
procedure ClearConversion; override;
end;
{ TWiki2FPDocConverter }
@ -122,10 +122,9 @@ implementation
{ TW2FPDocPage }
destructor TW2FPDocPage.Destroy;
procedure TW2FPDocPage.ClearConversion;
begin
FreeAndNil(FPDoc);
inherited Destroy;
end;
{ TWiki2FPDocConverter }

View File

@ -40,7 +40,7 @@ type
public
XHTML: TXMLDocument;
Filename: string;
destructor Destroy; override;
procedure ClearConversion; override;
end;
{ TWiki2XHTMLConverter }
@ -59,7 +59,7 @@ type
procedure OnWikiToken(Token: TWPToken); virtual;
function GetImageLink(ImgFilename: string): string; virtual;
function FindImage(const ImgFilename: string): string; virtual;
procedure MarkImageAsUsed(const ImgFilename: string; Page: TW2XHTMLPage);
procedure MarkImageAsUsed(const ImgFilename: string; Page: TW2XHTMLPage); virtual;
function GetPageLink(Page: TW2XHTMLPage): string; virtual;
function InsertLink(const LinkToken: TWPLinkToken): boolean;
procedure InsertText(Token: TWPToken; Txt: string); virtual;
@ -254,7 +254,7 @@ var
Node: TDOMElement;
CurCSSFilename: String;
begin
FreeAndNil(Page.XHTML);
Page.ClearConversion;
if Page.WikiPage=nil then exit;
Page.XHTML:=TXMLDocument.Create;
doc:=Page.XHTML;
@ -774,10 +774,12 @@ end;
{ TW2XHTMLPage }
destructor TW2XHTMLPage.Destroy;
procedure TW2XHTMLPage.ClearConversion;
begin
BodyNode:=nil;
CurNode:=nil;
SectionLevel:=0;
FreeAndNil(XHTML);
inherited Destroy;
end;
end.

View File

@ -44,6 +44,7 @@ type
constructor Create(TheConverter: TWiki2FormatConverter); virtual;
destructor Destroy; override;
procedure ParseWikiDoc(KeepWikiDoc: boolean);
procedure ClearConversion; virtual;
end;
TW2FormatPageClass = class of TW2FormatPage;
@ -61,7 +62,8 @@ type
FImagesDir: string;
FOutputDir: string;
fPages: TFPList; // list of TW2FormatPage
fPageTree: TAvgLvlTree; // TW2FormatPage sorted for filename
fPagesSortFilename: TAvgLvlTree; // TW2FormatPage sorted for WikiFilename
fPagesSortDocumentName: TAvgLvlTree; // TW2FormatPage sorted for WikiDocumentName
FPageClass: TW2FormatPageClass;
function GetPages(Index: integer): TW2FormatPage;
procedure SetOutputDir(AValue: string);
@ -71,6 +73,7 @@ type
destructor Destroy; override;
procedure Clear; virtual;
function GetPageWithFilename(Filename: string): TW2FormatPage; virtual;
function GetPageWithDocumentName(DocumentName: string): TW2FormatPage; virtual;
function AddWikiPage(Filename: string; ParseNow: boolean = true): TW2FormatPage;
procedure Convert; virtual;
procedure Log(Msg: string);
@ -97,6 +100,8 @@ function WikiPageHasLanguage(const Page, Languages: string): boolean;
function ComparePagesWithFilenames(Page1, Page2: Pointer): integer;
function CompareFilenameWithPage(Filename, Page: Pointer): integer;
function ComparePagesWithDocumentNames(Page1, Page2: Pointer): integer;
function CompareDocumentNameWithPage(DocumentName, Page: Pointer): integer;
implementation
@ -135,7 +140,8 @@ constructor TWiki2FormatConverter.Create;
begin
FPageClass:=TW2FormatPage;
fPages:=TFPList.Create;
fPageTree:=TAvgLvlTree.Create(@ComparePagesWithFilenames);
fPagesSortFilename:=TAvgLvlTree.Create(@ComparePagesWithFilenames);
fPagesSortDocumentName:=TAvgLvlTree.Create(@ComparePagesWithDocumentNames);
FTitle:='FPC/Lazarus Wiki (offline, generated '+DatetoStr(Now)+')';
FImagesDir:='images';
FNoWarnBaseURLs:=TStringToStringTree.Create(true);
@ -145,7 +151,8 @@ destructor TWiki2FormatConverter.Destroy;
begin
Clear;
FreeAndNil(FNoWarnBaseURLs);
FreeAndNil(fPageTree);
FreeAndNil(fPagesSortFilename);
FreeAndNil(fPagesSortDocumentName);
FreeAndNil(fPages);
inherited Destroy;
end;
@ -154,7 +161,8 @@ procedure TWiki2FormatConverter.Clear;
var
i: Integer;
begin
fPageTree.Clear;
fPagesSortFilename.Clear;
fPagesSortDocumentName.Clear;
for i:=0 to Count-1 do
Pages[i].Free;
fPages.Clear;
@ -167,7 +175,20 @@ var
Node: TAvgLvlTreeNode;
begin
if Filename='' then exit(nil);
Node:=fPageTree.FindKey(Pointer(Filename),@CompareFilenameWithPage);
Node:=fPagesSortFilename.FindKey(Pointer(Filename),@CompareFilenameWithPage);
if Node<>nil then
Result:=TW2FormatPage(Node.Data)
else
Result:=nil;
end;
function TWiki2FormatConverter.GetPageWithDocumentName(DocumentName: string
): TW2FormatPage;
var
Node: TAvgLvlTreeNode;
begin
if DocumentName='' then exit(nil);
Node:=fPagesSortDocumentName.FindKey(Pointer(DocumentName),@CompareDocumentNameWithPage);
if Node<>nil then
Result:=TW2FormatPage(Node.Data)
else
@ -183,7 +204,8 @@ begin
Result.WikiFilename:=Filename;
Result.WikiDocumentName:=WikiFilenameToPage(Filename);
fPages.Add(Result);
fPageTree.Add(Result);
fPagesSortFilename.Add(Result);
fPagesSortDocumentName.Add(Result);
end;
if ParseNow then
Result.ParseWikiDoc(false);
@ -227,6 +249,7 @@ end;
destructor TW2FormatPage.Destroy;
begin
ClearConversion;
FreeAndNil(WikiDoc);
FreeAndNil(WikiPage);
inherited Destroy;
@ -264,6 +287,11 @@ begin
end;
end;
procedure TW2FormatPage.ClearConversion;
begin
end;
function WikiPageToFilename(Page: string; IsInternalLink, AppendCaseID: boolean): string;
var
i: Integer;
@ -472,5 +500,20 @@ begin
Result:=CompareFilenames(AnsiString(Filename),p.WikiFilename);
end;
function ComparePagesWithDocumentNames(Page1, Page2: Pointer): integer;
var
p1: TW2FormatPage absolute Page1;
p2: TW2FormatPage absolute Page2;
begin
Result:=CompareStr(p1.WikiDocumentName,p2.WikiDocumentName);
end;
function CompareDocumentNameWithPage(DocumentName, Page: Pointer): integer;
var
p: TW2FormatPage absolute Page;
begin
Result:=CompareStr(AnsiString(DocumentName),p.WikiDocumentName);
end;
end.

View File

@ -152,6 +152,7 @@ type
procedure ExtractAllTexts;
procedure Search(Query: TWikiHelpQuery; Scoring: TWHScoring;
var FoundPages: TFPList);
procedure SavePageAsHTMLToStream(Page: TW2HelpPage; aStream: TStream);
property Help: TWikiHelp read FHelp;
end;
@ -236,6 +237,9 @@ type
property Scoring: TWHScoring read FScoring;
property MaxResults: integer read FMaxResults write SetMaxResults;
property ResultsHTML: string read FResultsHTML;
// get page
procedure SavePageToStream(DocumentName: string; aStream: TStream);
public
property XMLDirectory: string read FXMLDirectory write SetXMLDirectory; // directory where the wiki xml files are
property ImagesDirectory: string read GetImagesDirectory write SetImagesDirectory; // directory where the wiki image files are
@ -1094,6 +1098,14 @@ begin
FoundPages.Sort(@CompareW2HPageForScore);
end;
procedure TWiki2HelpConverter.SavePageAsHTMLToStream(Page: TW2HelpPage;
aStream: TStream);
begin
ConvertPage(Page);
SavePageToStream(Page,aStream);
Page.ClearConversion;
end;
procedure TWiki2HelpConverter.LoadPages;
begin
Help.EnterCritSect;
@ -1507,5 +1519,15 @@ begin
DoSearch;
end;
procedure TWikiHelp.SavePageToStream(DocumentName: string; aStream: TStream);
var
Page: TW2HelpPage;
begin
Page:=TW2HelpPage(Converter.GetPageWithDocumentName(DocumentName));
if Page=nil then
raise Exception.Create('document "'+DocumentName+'" not found in wiki');
Converter.SavePageAsHTMLToStream(Page,aStream);
end;
end.

View File

@ -5,9 +5,9 @@ unit WikiSearchMain;
interface
uses
Classes, SysUtils, FileUtil, LazLogger, LazUTF8, LazFileUtils, IpHtml,
Ipfilebroker, IpMsg, CodeToolManager, CodeCache, Forms, Controls, Graphics,
Dialogs, StdCtrls, ExtCtrls, WikiHelpManager;
Classes, SysUtils, FileUtil, LazLogger, LazUTF8, LazFileUtils, laz2_DOM,
IpHtml, Ipfilebroker, IpMsg, CodeToolManager, CodeCache, Forms, Controls,
Graphics, Dialogs, StdCtrls, ExtCtrls, WikiHelpManager;
type
@ -60,7 +60,8 @@ type
procedure SearchParamsChanged;
procedure SetIdleConnected(AValue: boolean);
procedure UpdateProgress;
procedure LoadHTML(Target: TIpHtmlPanel; HTML: string);
procedure LoadHTML(Target: TIpHtmlPanel; HTML: string); overload;
procedure LoadHTML(Target: TIpHtmlPanel; aStream: TStream); overload;
public
property IdleConnected: boolean read FIdleConnected write SetIdleConnected;
end;
@ -137,7 +138,7 @@ end;
function TWikiSearchDemoForm.DataProviderCanHandle(Sender: TObject;
const URL: string): Boolean;
begin
debugln(['TWikiSearchDemoForm.DataProviderCanHandle URL=',URL]);
//debugln(['TWikiSearchDemoForm.DataProviderCanHandle URL=',URL]);
Result:=false;
end;
@ -204,6 +205,8 @@ var
HotNode: TIpHtmlNode;
HRef: String;
Panel: TIpHtmlPanel;
ms: TMemoryStream;
Src: String;
begin
Panel:=Sender as TIpHtmlPanel;
HotNode:=Panel.HotNode;
@ -215,6 +218,22 @@ begin
//Target := TIpHtmlNodeAREA(HotNode).Target;
end;
debugln(['TWikiSearchDemoForm.ResultsIpHtmlPanelHotClick href=',href]);
// open page in PageIpHtmlPanel
ms:=TMemoryStream.Create;
try
try
WikiHelp.SavePageToStream(href,ms);
ms.Position:=0;
LoadHTML(PageIpHtmlPanel,ms);
except
on E: Exception do begin
Src:='<html><body>Error: '+EncodeLesserAndGreaterThan(E.Message)+'</body></html>';
LoadHTML(PageIpHtmlPanel,Src);
end;
end;
finally
ms.Free;
end;
end;
procedure TWikiSearchDemoForm.SearchEditChange(Sender: TObject);
@ -279,7 +298,6 @@ end;
procedure TWikiSearchDemoForm.LoadHTML(Target: TIpHtmlPanel; HTML: string);
var
ms: TMemoryStream;
NewHTML: TIpHtml;
begin
if HTML='' then
HTML:='<html><body></body></html>';
@ -288,10 +306,7 @@ begin
try
ms.Write(HTML[1],length(HTML));
ms.Position:=0;
NewHTML:=TIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel
//NewHTML.OnGetImageX:=@HTMLGetImageX;
Target.SetHtml(NewHTML);
NewHTML.LoadFromStream(ms);
LoadHTML(Target,ms);
except
on E: Exception do begin
debugln(['TWikiSearchDemoForm.LoadHTML ',E.Message]);
@ -302,5 +317,21 @@ begin
end;
end;
procedure TWikiSearchDemoForm.LoadHTML(Target: TIpHtmlPanel; aStream: TStream);
var
NewHTML: TIpHtml;
begin
try
NewHTML:=TIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel
//NewHTML.OnGetImageX:=@HTMLGetImageX;
Target.SetHtml(NewHTML);
NewHTML.LoadFromStream(aStream);
except
on E: Exception do begin
debugln(['TWikiSearchDemoForm.LoadHTML ',E.Message]);
end;
end;
end;
end.