* lhelp search results now color the words searched for. For some reason setting the background color with css doesn't work.

git-svn-id: trunk@26921 -
This commit is contained in:
andrew 2010-07-31 04:11:43 +00:00
parent b0843134cc
commit 900b64d932
2 changed files with 117 additions and 2 deletions

View File

@ -108,7 +108,95 @@ type
implementation
uses ChmSpecialParser{$IFDEF CHM_SEARCH}, chmFIftiMain{$ENDIF}, chmsitemap, LCLType;
uses ChmSpecialParser{$IFDEF CHM_SEARCH}, chmFIftiMain{$ENDIF}, chmsitemap, LCLType, SAX_HTML, Dom, XMLWrite, DOM_HTML;
type
{ THTMLWordHighlighter }
THTMLWordHighlighter = class
private
Doc: THTMLDocument;
Words: TStrings;
Color: String;
procedure ScanSubNodes(ADomNode: TDOMNode);
function CheckTextNode(var ATextNode: TDomNode): Boolean;
public
constructor Create(AHTMLDoc: THTMLDocument);
procedure HighlightWords(AWords: TStrings; AColor: String);
end;
{ THTMLWordHighlighter }
procedure THTMLWordHighlighter.ScanSubNodes(ADomNode: TDOMNode);
var
CurNode: TDomNode;
begin
CurNode := ADomNode;
while CurNode <> nil do
begin
if CurNode.HasChildNodes then
ScanSubNodes(CurNode.FirstChild);
if CurNode.NodeType = TEXT_NODE then
CheckTextNode(CurNode);
CurNode := CurNode.NextSibling;
end;
end;
function THTMLWordHighlighter.CheckTextNode(var ATextNode: TDomNode): Boolean;
var
i: Integer;
fPos: Integer;
WordStart,
After: TDOMText;
Span: TDomElement;
NewNode: TDOMText;
aWord: String;
Parent: TDomNode;
begin
Parent := AtextNode.ParentNode;
for i := 0 to Words.Count-1 do
begin
aWord := Words[i];
fPos := Pos(aWord, ATextNode.TextContent);
while fpos > 0 do
begin
WordStart:= TDOMText(ATextNode).SplitText(fPos-1);
After := WordStart.SplitText(Length(aword));
Span := doc.CreateElement('span');
Span.SetAttribute('style', 'color:'+Color+';background-color:gray');
Parent.InsertBefore(Span, After);
Span.AppendChild(WordStart);
// or we'll keep finding our new node again and again
ATextNode := After;
fPos := Pos(aWord, ATextNode.TextContent);
end;
end;
end;
constructor THTMLWordHighlighter.Create(AHTMLDoc: THTMLDocument);
begin
Doc := AHTMLDoc;
end;
procedure THTMLWordHighlighter.HighlightWords(AWords: TStrings; AColor: String);
var
Elem: TDOMNode;
begin
Words := AWords;
Color := AColor;
Elem := Doc.DocumentElement.FirstChild;
ScanSubNodes(Elem);
end;
function GetURIFileName(AURI: String): String;
var
@ -297,10 +385,37 @@ begin
end;
procedure TChmContentProvider.LoadingHTMLStream(var AStream: TStream);
var
Doc: THTMLDocument;
NewStream: TMemoryStream;
Highlighter: THTMLWordHighlighter;
Words: TStringList;
begin
if not FLoadingSearchURL then
Exit;
// load html and add tags to highlight words then save back to stream
NewStream := TMemoryStream.Create;
ReadHTMLFile(Doc, AStream);
Words := TStringList.Create;
Words.Delimiter:=' ';
Words.DelimitedText:=fKeywordCombo.Text;
Highlighter := THTMLWordHighlighter.Create(Doc);
Highlighter.HighlightWords(Words, 'red');
HighLighter.Free;
Words.Free;
WriteXMLFile(Doc, NewStream);
AStream.Free;
AStream := NewStream;
NewStream.Position:=0;
end;

View File

@ -245,7 +245,7 @@ object HelpForm: THelpForm
end
object PageControl: TPageControl
Left = 0
Height = 503
Height = 480
Top = 32
Width = 758
Align = alClient