mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-09 02:16:48 +02:00
chmhelp: search for predefined identifiers
git-svn-id: trunk@31372 -
This commit is contained in:
parent
9b2bd8b9bb
commit
c74cdc3959
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user