unit mudhelp;
interface
uses
dtypes;
type
GHelp = class
keywords, helptype, syntax, related : string;
text : string;
level : integer;
end;
var
help_files : GDLinkedList;
procedure load_help(fname:string);
function findHelp(text : string) : GHelp;
implementation
uses
SysUtils,
constants,
strip,
util,
mudsystem;
procedure load_help(fname:string);
var f:textfile;
s, g, key : string;
keyword : boolean;
keys, text, helptype, related, syntax : string;
help : GHelp;
a, b : integer;
begin
assignfile(f,'help\'+fname);
{$I-}
reset(f);
{$I+}
if IOResult<>0 then
begin
bugreport('load_help', 'mudhelp.pas', 'could not open help\' + fname,
'The specified helpfile could not be opened. Please check your settings.');
exit;
end;
// first, add a default help
help := GHelp.Create;
help.level := 0;
help.keywords := 'DEFAULT_';
help.helptype := '';
help.syntax := '';
help.related := '';
help.text := 'This is dummy help.';
help_files.insertLast(help);
keyword := false;
repeat
readln(f,s);
if pos('#',s)=1 then
begin
g := uppercase(stripl(s,'='));
if (g = '#KEYWORD') then
begin
keys:=stripr(s,'=');
keyword:=true;
text:='';
end
else
if (g = '#TYPE') then
begin
helptype := stripr(s,'=');
end
else
if (g = '#SYNTAX') then
begin
syntax := stripr(s,'=');
end
else
if (g = '#RELATED') then
begin
related := stripr(s,'=');
end
else
if g='#END' then
begin
keyword:=false;
help := GHelp.Create;
help.level := StrToInt(stripr(s,'='));
help.keywords := keys;
help.helptype := helptype;
help.syntax := syntax;
help.related := related;
help.text := text;
help_files.insertLast(help);
end
else
if g='#INCLUDE' then
load_help(stripr(s,'='));
end
else
if keyword then
begin
a := 1;
while (a <= length(s)) do
begin
if (s[a] = '%') then
begin
if (a = length(s)) then
begin
bugreport('load_help', 'mudhelp.pas', 'illegal "%" character use in ' + fname,
'Use of the character "%" is prohibited in helpfiles.');
exit;
end;
if (s[a + 1] = '%') then
begin
g := '%';
a := a + 2;
continue;
end;
key := '';
b := a + 1;
while (s[b] <> '%') do
begin
key := key + s[b];
inc(b);
end;
if (key = 'VERSION') then
g := version_number
else
if (key = 'INFO') then
g := version_info
else
if (key = 'COPYRIGHT') then
g := version_copyright
else
bugreport('load_help', 'mudhelp.pas', 'illegal key "' + key + '" in ' + fname,
'This helpfile uses an unknown key.');
text := text + g;
a := b;
end
else
text := text + s[a];
inc(a);
end;
text := text + #13#10;
end;
until eof(f);
closefile(f);
end;
function findHelp(text : string) : GHelp;
var
node : GListNode;
help : GHelp;
key, arg : string;
s, p : integer;
begin
Result := help_files.head.element;
p := high(integer);
text := uppercase(text);
node := help_files.head;
while (node <> nil) do
begin
help := node.element;
key := help.keywords;
while (length(key) > 0) do
begin
key := one_argument(key, arg);
s := pos(text, arg);
if (s > 0) and (s < p) then
begin
p := s;
Result := help;
end;
end;
node := node.next;
end;
end;
begin
help_files := GDLinkedList.Create;
end.