chmhelp: search for predefined identifiers

git-svn-id: trunk@31372 -
This commit is contained in:
mattias 2011-06-25 07:20:31 +00:00
parent 9b2bd8b9bb
commit c74cdc3959

View File

@ -21,8 +21,11 @@ type
private private
FKeywordNodes: TList; FKeywordNodes: TList;
FKeyWordsList: TStringList; FKeyWordsList: TStringList;
FRTLIndex: TStringList;
FDocsDir: string; FDocsDir: string;
procedure ClearKeywordNodes; procedure ClearKeywordNodes;
procedure LoadChmIndex(const Path, ChmFileName: string;
IndexStrings: TStrings; const Filter: string = '');
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -67,6 +70,8 @@ begin
FKeywordNodes := TList.Create; FKeywordNodes := TList.Create;
FKeyWordsList := TStringList.Create; FKeyWordsList := TStringList.Create;
FKeyWordsList.CaseSensitive := False; FKeyWordsList.CaseSensitive := False;
FRTLIndex := TStringList.Create;
FRTLIndex.CaseSensitive := False;
end; end;
destructor TLangRefHelpDatabase.Destroy; destructor TLangRefHelpDatabase.Destroy;
@ -74,10 +79,18 @@ begin
ClearKeywordNodes; ClearKeywordNodes;
FKeywordNodes.Free; FKeywordNodes.Free;
FKeyWordsList.Free; FKeyWordsList.Free;
FRTLIndex.Free;
inherited Destroy; inherited Destroy;
end; end;
procedure TLangRefHelpDatabase.LoadKeywordList(const Path: string); procedure TLangRefHelpDatabase.LoadKeywordList(const Path: string);
begin
FRTLIndex.Clear; // Path has been changed
LoadChmIndex(Path, 'ref.chm', FKeyWordsList);
end;
procedure TLangRefHelpDatabase.LoadChmIndex(const Path, ChmFileName: string;
IndexStrings: TStrings; const Filter: string = '');
var var
chm: TChmFileList; chm: TChmFileList;
fchm: TChmReader; fchm: TChmReader;
@ -94,10 +107,10 @@ begin
end; end;
FDocsDir := AppendPathDelim(FDocsDir); FDocsDir := AppendPathDelim(FDocsDir);
FKeyWordsList.Clear; IndexStrings.Clear;
if FileExistsUTF8(FDocsDir + 'ref.chm') then if FileExistsUTF8(FDocsDir + ChmFileName) then
begin begin
chm := TChmFileList.Create(Utf8ToSys(FDocsDir + 'ref.chm')); chm := TChmFileList.Create(Utf8ToSys(FDocsDir + ChmFileName));
try try
if chm.Count = 0 then Exit; if chm.Count = 0 then Exit;
fchm := chm.Chm[0]; fchm := chm.Chm[0];
@ -108,11 +121,16 @@ begin
begin begin
s := SM.Items.Item[X].Text; s := SM.Items.Item[X].Text;
if SM.Items.Item[X].Children.Count = 0 then if SM.Items.Item[X].Children.Count = 0 then
FKeyWordsList.Add(s + '=' + SM.Items.Item[X].Local) begin
else if (Filter = '') or (Pos(Filter, SM.Items.Item[X].Local) > 0) then
IndexStrings.Add(s + '=' + SM.Items.Item[X].Local)
end else
with SM.Items.Item[X].Children do with SM.Items.Item[X].Children do
for Y := 0 to Count - 1 do for Y := 0 to Count - 1 do
FKeyWordsList.Add(s + '=' + Item[Y].Local) begin
if (Filter = '') or (Pos(Filter, Item[Y].Local) > 0) then
IndexStrings.Add(s + '=' + Item[Y].Local)
end;
end; end;
SM.Free; SM.Free;
end; end;
@ -126,7 +144,7 @@ end;
function TLangRefHelpDatabase.GetNodesForKeyword(const HelpKeyword: string; function TLangRefHelpDatabase.GetNodesForKeyword(const HelpKeyword: string;
var ListOfNodes: THelpNodeQueryList; var ErrMsg: string): TShowHelpResult; var ListOfNodes: THelpNodeQueryList; var ErrMsg: string): TShowHelpResult;
var var
KeyWord: String; KeyWord, s: String;
i, n: Integer; i, n: Integer;
KeywordNode: THelpNode; KeywordNode: THelpNode;
begin begin
@ -162,10 +180,8 @@ begin
CreateNodeQueryListAndAdd(KeywordNode,nil,ListOfNodes,true); CreateNodeQueryListAndAdd(KeywordNode,nil,ListOfNodes,true);
Result := shrSuccess; Result := shrSuccess;
end; end;
if Result <> shrSuccess then Exit; if (Result = shrSuccess) and (SameText(KeyWord, 'for') or SameText(KeyWord, 'in')) then
{ for => +forin, in => +forin } begin { for => +forin, in => +forin }
if SameText(KeyWord, 'for') or SameText(KeyWord, 'in') then
begin
i := FKeyWordsList.IndexOfName('forin'); i := FKeyWordsList.IndexOfName('forin');
if i < 0 then Exit; if i < 0 then Exit;
KeywordNode := THelpNode.CreateURL(Self,KeyWord,'ref.chm://' + FKeyWordsList.ValueFromIndex[i]); KeywordNode := THelpNode.CreateURL(Self,KeyWord,'ref.chm://' + FKeyWordsList.ValueFromIndex[i]);
@ -173,6 +189,25 @@ begin
FKeywordNodes.Add(KeywordNode); FKeywordNodes.Add(KeywordNode);
CreateNodeQueryListAndAdd(KeywordNode, nil, ListOfNodes, True); CreateNodeQueryListAndAdd(KeywordNode, nil, ListOfNodes, True);
end; end;
if Result <> shrSuccess then
begin
{ it can be predefined procedure/function from RTL }
if FRTLIndex.Count = 0 then
LoadChmIndex(FDocsDir, 'rtl.chm', FRTLIndex, 'system/');
for i := 0 to FRTLIndex.Count - 1 do
begin
s := FRTLIndex.Names[i];
if SameText(KeyWord, Copy(s, 1, Length(KeyWord))) and
((Length(s) = Length(KeyWord)) or (s[Length(KeyWord) + 1] = ' ')) then
begin
KeywordNode := THelpNode.CreateURL(Self,KeyWord,'rtl.chm://' + FRTLIndex.ValueFromIndex[i]);
KeywordNode.Title := Format('RTL - Free Pascal Run Time Library: "%s"', [KeyWord]);
FKeywordNodes.Add(KeywordNode);
CreateNodeQueryListAndAdd(KeywordNode, nil, ListOfNodes, True);
Exit(shrSuccess); // only first match
end;
end;
end;
end; end;
end; end;