dw_html.pp 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2000 - 2005 by
  4. Areca Systems GmbH / Sebastian Guenther, [email protected]
  5. * HTML/XHTML output generator
  6. See the file COPYING, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. }
  12. {$mode objfpc}
  13. {$H+}
  14. unit dw_html;
  15. {$WARN 5024 off : Parameter "$1" not used}
  16. interface
  17. uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter, dw_basehtml;
  18. type
  19. { THTMLWriter }
  20. THTMLWriter = class(TBaseHTMLWriter)
  21. private
  22. FHeadElement: TDomElement;
  23. FOnTest: TNotifyEvent;
  24. FCSSFile: String;
  25. FCharSet : String;
  26. FHeaderHTML,
  27. FNavigatorHTML,
  28. FFooterHTML: TStringStream;
  29. FTitleElement: TDOMElement;
  30. FIncludeDateInFooter : Boolean;
  31. FUseMenuBrackets: Boolean;
  32. FDateFormat: String;
  33. FIndexColCount : Integer;
  34. FSearchPage : String;
  35. procedure CreateMinusImage;
  36. procedure CreatePlusImage;
  37. procedure SetOnTest(const AValue: TNotifyEvent);
  38. protected
  39. function CreateAllocator : TFileAllocator; override;
  40. procedure WriteDocPage(const aFileName: String; aElement: TPasElement; aSubPageIndex: Integer); override;
  41. procedure CreateCSSFile; virtual;
  42. procedure AppendTitle(const AText: String; Hints : TPasMemberHints = []); virtual;
  43. procedure AppendTitle(const AText: DOMString; Hints : TPasMemberHints = []); virtual;
  44. function AppendType(CodeEl, TableEl: TDOMElement;
  45. Element: TPasType; Expanded: Boolean;
  46. NestingLevel: Integer = 0): TDOMElement; virtual;
  47. function AppendProcType(CodeEl, TableEl: TDOMElement; Element: TPasProcedureType; Indent: Integer): TDOMElement; virtual;
  48. procedure AppendProcExt(CodeEl: TDOMElement; Element: TPasProcedure); virtual;
  49. procedure AppendProcDecl(CodeEl, TableEl: TDOMElement; Element: TPasProcedureBase); virtual;
  50. procedure AppendProcArgsSection(Parent: TDOMNode; Element: TPasProcedureType; SkipResult : Boolean = False); virtual;
  51. function AppendRecordType(CodeEl, TableEl: TDOMElement; Element: TPasRecordType; NestingLevel: Integer): TDOMElement; virtual;
  52. procedure CreateMemberDeclarations(AParent: TPasElement; Members: TFPList; TableEl: TDOmelement; AddEnd: Boolean); virtual;
  53. procedure AppendMenuBar(ASubpageIndex: Integer);virtual;
  54. procedure AppendTopicMenuBar(Topic : TTopicElement);virtual;
  55. procedure FinishElementPage(AElement: TPasElement);virtual;
  56. procedure AppendFooter;virtual;
  57. procedure AppendClassMemberListLink(aClass: TPasClassType; ParaEl: TDomElement; AListSubpageIndex: Integer; const AText: DOMString);virtual;
  58. procedure CreateClassMainPage(aClass: TPasClassType);virtual;
  59. procedure CreateClassInheritanceSubpage(aClass: TPasClassType; AFilter: TMemberFilter);virtual;
  60. procedure CreateClassSortedSubpage(AClass: TPasClassType; AFilter: TMemberFilter);virtual;
  61. procedure CreateIndexPage(L : TStringList); virtual;
  62. procedure CreateModuleIndexPage(AModule: TPasModule); virtual;
  63. // Package
  64. procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
  65. procedure CreatePackagePageBody;virtual;
  66. procedure CreatePackageIndex;
  67. procedure CreatePackageClassHierarchy;
  68. procedure CreateClassHierarchyPage(AddUnit : Boolean);
  69. // Topic
  70. Procedure CreateTopicPageBody(AElement : TTopicElement);
  71. // Module
  72. procedure CreateModuleMainPage(aModule: TPasModule);virtual;
  73. procedure CreateModuleSimpleSubpage(aModule: TPasModule; ASubpageIndex: Integer; const ATitle: DOMString; AList: TFPList);virtual;
  74. procedure CreateModuleResStringsPage(aModule: TPasModule);virtual;
  75. procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
  76. // Identifiers
  77. procedure CreateConstPageBody(AConst: TPasConst);
  78. procedure CreateTypePageBody(AType: TPasType);
  79. procedure CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
  80. procedure CreateClassMemberPageBody(AElement: TPasElement);
  81. procedure CreateVarPageBody(AVar: TPasVariable);
  82. procedure CreateProcPageBody(AProc: TPasProcedureBase);
  83. Procedure CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
  84. procedure AppendTypeDecl(AType: TPasType; TableEl, CodeEl: TDomElement);
  85. Property HeaderHTML : TStringStream Read FHeaderHTML;
  86. Property NavigatorHTML : TStringStream read FNavigatorHTML;
  87. Property FooterHTML : TStringStream read FFooterHTML;
  88. Property CSSFile : String Read FCSSFile;
  89. Property HeadElement : TDomElement Read FHeadElement;
  90. Property TitleElement: TDOMElement Read FTitleElement;
  91. public
  92. // Creating all module hierarchy classes is here !!!!
  93. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  94. // Overrides
  95. Class Function FileNameExtension : String; override;
  96. class procedure Usage(List: TStrings); override;
  97. Class procedure SplitImport(var AFilename, ALinkPrefix: String); override;
  98. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  99. Procedure WriteDoc; override;
  100. // Single-page generation
  101. function CreateHTMLPage(AElement: TPasElement; ASubpageIndex: Integer): TXMLDocument; virtual;
  102. Property SearchPage: String Read FSearchPage Write FSearchPage;
  103. Property IncludeDateInFooter : Boolean Read FIncludeDateInFooter Write FIncludeDateInFooter;
  104. Property DateFormat : String Read FDateFormat Write FDateFormat;
  105. property OnTest: TNotifyEvent read FOnTest write SetOnTest;
  106. Property CharSet : String Read FCharSet Write FCharSet;
  107. Property IndexColCount : Integer Read FIndexColCount write FIndexColCount;
  108. Property UseMenuBrackets : Boolean Read FUseMenuBrackets write FUseMenuBrackets;
  109. end;
  110. implementation
  111. uses fpdocstrs, SysUtils, HTMWrite, fpdocclasstree;
  112. {$i css.inc}
  113. {$i plusimage.inc}
  114. {$i minusimage.inc}
  115. constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  116. begin
  117. inherited Create(APackage, AEngine);
  118. // should default to true since this is the old behavior
  119. UseMenuBrackets:=True;
  120. IndexColCount:=3;
  121. Charset:='iso-8859-1';
  122. end;
  123. function THTMLWriter.CreateHTMLPage(AElement: TPasElement;
  124. ASubpageIndex: Integer): TXMLDocument;
  125. var
  126. HTMLEl: THTMLHtmlElement;
  127. HeadEl: THTMLHeadElement;
  128. BodyElement : THTMLElement;
  129. El: TDOMElement;
  130. begin
  131. Result := THTMLDocument.Create;
  132. SetHTMLDocument(THTMLDocument(Result));
  133. Doc.AppendChild(Doc.Impl.CreateDocumentType(
  134. 'HTML', '-//W3C//DTD HTML 4.01 Transitional//EN',
  135. 'http://www.w3.org/TR/html4/loose.dtd'));
  136. HTMLEl := Doc.CreateHtmlElement;
  137. Doc.AppendChild(HTMLEl);
  138. HeadEl := Doc.CreateHeadElement;
  139. FHeadElement:=HeadEl;
  140. HTMLEl.AppendChild(HeadEl);
  141. El := Doc.CreateElement('meta');
  142. HeadEl.AppendChild(El);
  143. El['http-equiv'] := 'Content-Type';
  144. El['content'] := 'text/html; charset=utf-8';
  145. FTitleElement := Doc.CreateElement('title');
  146. HeadEl.AppendChild(TitleElement);
  147. El := Doc.CreateElement('link');
  148. BodyElement := Doc.CreateElement('body');
  149. ContentElement:=BodyElement;
  150. HTMLEl.AppendChild(BodyElement);
  151. CreatePageBody(AElement, ASubpageIndex);
  152. AppendFooter;
  153. HeadEl.AppendChild(El);
  154. El['rel'] := 'stylesheet';
  155. El['type'] := 'text/css';
  156. El['href'] := UTF8Decode(FixHtmlPath(UTF8Encode(Allocator.GetCSSFilename(AElement))));
  157. end;
  158. procedure THTMLWriter.WriteDocPage(const aFileName: String; aElement: TPasElement; aSubPageIndex: Integer);
  159. Var
  160. PageDoc: TXMLDocument;
  161. FN : String;
  162. begin
  163. PageDoc := CreateHTMLPage(aElement, aSubpageIndex);
  164. try
  165. FN:=GetFileBaseDir(Engine.Output)+aFilename;
  166. //writeln('Element: ',Element.PathName, ' FileName: ', FN);
  167. WriteHTMLFile(PageDoc, FN);
  168. except
  169. on E: Exception do
  170. DoLog(SErrCouldNotCreateFile, [aFileName, e.Message]);
  171. end;
  172. PageDoc.Free;
  173. end;
  174. procedure THTMLWriter.WriteDoc;
  175. begin
  176. Inherited;
  177. CreateCSSFile;
  178. CreatePlusImage;
  179. CreateMinusImage;
  180. end;
  181. procedure THTMLWriter.CreatePlusImage;
  182. Var
  183. TempStream: TMemoryStream;
  184. begin
  185. TempStream := TMemoryStream.Create;
  186. try
  187. DoLog('Creating plus image',[]);
  188. TempStream.WriteBuffer(PlusImageData,SizeOf(PlusImageData));
  189. TempStream.Position := 0;
  190. TempStream.SaveToFile(Engine.output+'plus.png');
  191. finally
  192. TempStream.Free;
  193. end;
  194. end;
  195. procedure THTMLWriter.CreateMinusImage;
  196. Var
  197. TempStream: TMemoryStream;
  198. begin
  199. TempStream := TMemoryStream.Create;
  200. try
  201. DoLog('Creating minus image',[]);
  202. TempStream.WriteBuffer(MinusImageData,SizeOf(MinusImageData));
  203. TempStream.Position := 0;
  204. TempStream.SaveToFile(Engine.output+'minus.png');
  205. finally
  206. TempStream.Free;
  207. end;
  208. end;
  209. procedure THTMLWriter.CreateCSSFile;
  210. Var
  211. TempStream: TMemoryStream;
  212. begin
  213. TempStream := TMemoryStream.Create;
  214. try
  215. if (FCSSFile<>'') then
  216. begin
  217. if not FileExists(FCSSFile) then
  218. begin
  219. DoLog('Can''t find CSS file "%s"',[FCSSFILE]);
  220. halt(1);
  221. end;
  222. TempStream.LoadFromFile(FCSSFile);
  223. end
  224. else
  225. begin
  226. DoLog('Using built-in CSS file',[]);
  227. TempStream.WriteBuffer(DefaultCSS,SizeOf(DefaultCSS));
  228. end;
  229. TempStream.Position := 0;
  230. TempStream.SaveToFile(Engine.output+'fpdoc.css');
  231. finally
  232. TempStream.Free;
  233. end;
  234. end;
  235. { Returns the new CodeEl, which will be the old CodeEl in most cases }
  236. function THTMLWriter.AppendType(CodeEl, TableEl: TDOMElement; Element: TPasType; Expanded: Boolean; NestingLevel: Integer): TDOMElement;
  237. Var
  238. S : String;
  239. begin
  240. Result := CodeEl;
  241. if not Assigned(Element) then
  242. AppendText(CreateWarning(CodeEl), '<NIL>')
  243. else if (not Expanded) and (Length(Element.Name) > 0) then
  244. AppendHyperlink(CodeEl, Element)
  245. else
  246. // Array
  247. if Element.ClassType = TPasArrayType then
  248. begin
  249. S:='array ';
  250. If (TPasArrayType(Element).IndexRange<>'') then
  251. S:=S+'[' + TPasArrayType(Element).IndexRange + '] ';
  252. S:=S+'of ';
  253. If (TPasArrayType(Element).ElType=Nil) then
  254. S:=S+'Const';
  255. AppendPasSHFragment(CodeEl,S,0);
  256. If (TPasArrayType(Element).ElType<>Nil) then
  257. Result := AppendType(CodeEl, TableEl, TPasArrayType(Element).ElType, False);
  258. end else
  259. // Procedure or funtion type
  260. if Element.InheritsFrom(TPasProcedureType) then
  261. begin
  262. AppendKw(CodeEl, TPasProcedureType(Element).TypeName);
  263. Result := AppendProcType(CodeEl, TableEl, TPasProcedureType(Element), 0)
  264. end else
  265. // Range type
  266. if Element.InheritsFrom(TPasRangeType) then
  267. AppendPasSHFragment(CodeEl, TPasRangeType(Element).RangeStart + '..' +
  268. TPasRangeType(Element).RangeEnd, 0)
  269. // Record type
  270. else if Element.ClassType = TPasRecordType then
  271. Result := AppendRecordType(CodeEl, TableEl, TPasRecordType(Element), NestingLevel)
  272. else if (Element.ClassType = TPasFileType) and (TPasFileType(Element).elType=Nil) then
  273. AppendPasSHFragment(CodeEl,'file',0)
  274. else
  275. // Other types
  276. AppendHyperlink(CodeEl, Element);
  277. end;
  278. function THTMLWriter.AppendProcType(CodeEl, TableEl: TDOMElement;
  279. Element: TPasProcedureType; Indent: Integer): TDOMElement;
  280. function CreateIndentedCodeEl(Indent: Integer): TDOMElement;
  281. begin
  282. Result := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  283. AppendNbSp(Result, Indent);
  284. end;
  285. var
  286. i: Integer;
  287. Arg: TPasArgument;
  288. S : String;
  289. begin
  290. if Element.Args.Count > 0 then
  291. begin
  292. AppendSym(CodeEl, '(');
  293. for i := 0 to Element.Args.Count - 1 do
  294. begin
  295. Arg := TPasArgument(Element.Args[i]);
  296. CodeEl := CreateIndentedCodeEl(Indent + 2);
  297. S:=AccessNames[Arg.Access];
  298. if (S<>'') then
  299. AppendKw(CodeEl,S);
  300. AppendText(CodeEl, Arg.Name);
  301. if Assigned(Arg.ArgType) then
  302. begin
  303. AppendSym(CodeEl, ': ');
  304. CodeEl := AppendType(CodeEl, TableEl, Arg.ArgType, False);
  305. end;
  306. if Length(Arg.Value) > 0 then
  307. AppendPasSHFragment(CodeEl, ' = ' + Arg.Value, 0);
  308. if i < Element.Args.Count - 1 then
  309. AppendSym(CodeEl, ';');
  310. end;
  311. if Element.InheritsFrom(TPasFunctionType) or Element.IsOfObject then
  312. begin
  313. CodeEl := CreateIndentedCodeEl(Indent);
  314. if Element.InheritsFrom(TPasFunctionType) then
  315. begin
  316. AppendSym(CodeEl, '):');
  317. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  318. end else
  319. AppendSym(CodeEl, ')');
  320. if Element.IsOfObject then
  321. begin
  322. AppendText(CodeEl, ' '); // Don't remove
  323. AppendKw(CodeEl, 'of object');
  324. end;
  325. end else
  326. if Indent > 0 then
  327. AppendSym(CodeEl, ')')
  328. else
  329. begin
  330. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  331. AppendSym(CodeEl, ')');
  332. end;
  333. end
  334. else
  335. begin
  336. { Procedure or function without arguments }
  337. if Element.InheritsFrom(TPasFunctionType) then
  338. begin
  339. AppendSym(CodeEl, ': ');
  340. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  341. end;
  342. if Element.IsOfObject then
  343. AppendKw(CodeEl, ' of object');
  344. end;
  345. Result := CodeEl;
  346. end;
  347. procedure THTMLWriter.AppendProcExt(CodeEl: TDOMElement;
  348. Element: TPasProcedure);
  349. procedure AppendExt(const Ext: String);
  350. begin
  351. AppendKw(CodeEl, ' ' + Ext);
  352. AppendSym(CodeEl, ';');
  353. end;
  354. begin
  355. if Element.IsVirtual then
  356. AppendExt('virtual');
  357. if Element.IsDynamic then
  358. AppendExt('dynamic');
  359. if Element.IsAbstract then
  360. AppendExt('abstract');
  361. if Element.IsOverride then
  362. AppendExt('override');
  363. if Element.IsOverload then
  364. AppendExt('overload');
  365. if Element.IsMessage then
  366. AppendExt('message');
  367. end;
  368. { Used in two places:
  369. - Page for the method of a class
  370. - Page for a tandalone procedure or function. }
  371. procedure THTMLWriter.AppendProcDecl(CodeEl, TableEl: TDOMElement;
  372. Element: TPasProcedureBase);
  373. procedure WriteVariant(AProc: TPasProcedure; SkipResult : Boolean);
  374. begin
  375. AppendProcArgsSection(TableEl.ParentNode, AProc.ProcType, SkipResult);
  376. AppendKw(CodeEl, AProc.TypeName);
  377. if (Element.Parent.ClassType = TPasClassType) or (Element.Parent.ClassType = TPasRecordType) then
  378. begin
  379. AppendText(CodeEl, ' ');
  380. AppendHyperlink(CodeEl, Element.Parent);
  381. AppendSym(CodeEl, '.');
  382. AppendText(CodeEl, AProc.Name);
  383. end else
  384. if (Element is TPasOperator) then
  385. AppendText(CodeEl, ' ' + TPasOperator(AProc).GetOperatorDeclaration(True))
  386. else
  387. AppendText(CodeEl, ' ' + AProc.FullName);
  388. CodeEl := AppendProcType(CodeEl, TableEl, AProc.ProcType, 0);
  389. AppendSym(CodeEl, ';');
  390. AppendProcExt(CodeEl, AProc);
  391. end;
  392. var
  393. i,fc: Integer;
  394. P : TPasProcedure;
  395. begin
  396. fc:=0;
  397. if Element.ClassType = TPasOverloadedProc then
  398. for i := 0 to TPasOverloadedProc(Element).Overloads.Count - 1 do
  399. begin
  400. P:=TPasProcedure(TPasOverloadedProc(Element).Overloads[i]);
  401. if (P.ProcType is TPasFunctionType) then
  402. Inc(fc);
  403. if i > 0 then
  404. begin
  405. CreateEl(CodeEl, 'br');
  406. CreateEl(CodeEl, 'br');
  407. end;
  408. WriteVariant(P,fc>1);
  409. end
  410. else
  411. WriteVariant(TPasProcedure(Element),False);
  412. end;
  413. procedure THTMLWriter.AppendProcArgsSection(Parent: TDOMNode;
  414. Element: TPasProcedureType; SkipResult : Boolean = False);
  415. var
  416. HasFullDescr, IsFirst: Boolean;
  417. ResultEl: TPasResultElement;
  418. ArgTableEl, TREl: TDOMElement;
  419. DocNode: TDocNode;
  420. i: Integer;
  421. Arg: TPasArgument;
  422. begin
  423. IsFirst := True;
  424. for i := 0 to Element.Args.Count - 1 do
  425. begin
  426. Arg := TPasArgument(Element.Args[i]);
  427. if IsDescrNodeEmpty(Engine.FindShortDescr(Arg)) then
  428. continue;
  429. if IsFirst then
  430. begin
  431. IsFirst := False;
  432. AppendText(CreateH2(Parent), SDocArguments);
  433. ArgTableEl := CreateTable(Parent);
  434. end;
  435. TREl := CreateTR(ArgTableEl);
  436. AppendText(CreateCode(CreatePara(CreateTD_vtop(TREl))), Arg.Name);
  437. AppendShortDescrCell(TREl, Arg);
  438. end;
  439. if (Element.ClassType = TPasFunctionType) and not SkipResult then
  440. begin
  441. ResultEl := TPasFunctionType(Element).ResultEl;
  442. DocNode := Engine.FindDocNode(ResultEl);
  443. HasFullDescr := Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr);
  444. if HasFullDescr or
  445. (Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.ShortDescr)) then
  446. begin
  447. AppendText(CreateH2(Parent), SDocFunctionResult);
  448. if HasFullDescr then
  449. AppendDescr(ResultEl, Parent, DocNode.Descr, True)
  450. else
  451. AppendDescr(ResultEl, CreatePara(Parent), DocNode.ShortDescr, False);
  452. end;
  453. end;
  454. end;
  455. function THTMLWriter.AppendRecordType(CodeEl, TableEl: TDOMElement;
  456. Element: TPasRecordType; NestingLevel: Integer): TDOMElement;
  457. var
  458. i, j: Integer;
  459. Variable: TPasVariable;
  460. TREl: TDOMElement;
  461. CurVariant: TPasVariant;
  462. isExtended : Boolean;
  463. VariantEl: TPasElement;
  464. VariantType: TPasType;
  465. begin
  466. if not (Element.Parent is TPasVariant) then
  467. if Element.IsPacked then
  468. If Element.IsBitPacked then
  469. AppendKw(CodeEl, 'bitpacked record')
  470. else
  471. AppendKW(CodeEl, 'packed record')
  472. else
  473. AppendKw(CodeEl, 'record');
  474. isExtended:=False;
  475. I:=0;
  476. while (not isExtended) and (I<Element.Members.Count) do
  477. begin
  478. isExtended:=Not (TObject(Element.Members[i]) is TPasVariable);
  479. Inc(i);
  480. end;
  481. if isExtended then
  482. CreateMemberDeclarations(Element,Element.Members,TableEl,False)
  483. else
  484. for i := 0 to Element.Members.Count - 1 do
  485. begin
  486. Variable := TPasVariable(Element.Members[i]);
  487. TREl := CreateTR(TableEl);
  488. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  489. AppendShortDescrCell(TREl, Variable);
  490. AppendNbSp(CodeEl, NestingLevel * 2 + 2);
  491. AppendText(CodeEl, Variable.Name);
  492. AppendSym(CodeEl, ': ');
  493. CodeEl := AppendType(CodeEl, TableEl, Variable.VarType, False, NestingLevel + 1);
  494. AppendSym(CodeEl, ';');
  495. end;
  496. if Assigned(Element.VariantEl) then
  497. begin
  498. TREl := CreateTR(TableEl);
  499. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  500. AppendNbSp(CodeEl, NestingLevel * 2 + 2);
  501. AppendKw(CodeEl, 'case ');
  502. VariantEl:=TPasRecordType(Element).VariantEl;
  503. if VariantEl is TPasVariable then
  504. begin
  505. AppendText(CodeEl, TPasVariable(VariantEl).Name);
  506. AppendSym(CodeEl, ': ');
  507. VariantType:=TPasVariable(VariantEl).VarType;
  508. end else
  509. VariantType:=VariantEl as TPasType;
  510. CodeEl := AppendType(CodeEl, TableEl, VariantType, True);
  511. AppendKw(CodeEl, ' of');
  512. for i := 0 to TPasRecordType(Element).Variants.Count - 1 do
  513. begin
  514. CurVariant := TPasVariant(Element.Variants[i]);
  515. TREl := CreateTR(TableEl);
  516. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  517. AppendNbSp(CodeEl, NestingLevel * 2 + 4);
  518. for j := 0 to CurVariant.Values.Count - 1 do
  519. begin
  520. if j > 0 then
  521. AppendSym(CodeEl, ', ');
  522. AppendPasSHFragment(CodeEl, TPasElement(CurVariant.Values[j]).GetDeclaration(true), 0);
  523. end;
  524. AppendSym(CodeEl, ': (');
  525. AppendType(CodeEl, TableEl, CurVariant.Members, True, NestingLevel + 3);
  526. CodeEl := CreateCode(CreatePara(CreateTD_vtop(CreateTR(TableEl))));
  527. AppendNbSp(CodeEl, NestingLevel * 2 + 6);
  528. AppendSym(CodeEl, ');');
  529. end;
  530. end;
  531. if not (Element.Parent is TPasVariant) then
  532. begin
  533. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  534. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  535. AppendNbSp(CodeEl, NestingLevel * 2);
  536. AppendKw(CodeEl, 'end');
  537. end;
  538. Result := CodeEl;
  539. end;
  540. procedure THTMLWriter.AppendTopicMenuBar(Topic : TTopicElement);
  541. var
  542. TableEl, TREl, ParaEl, TitleEl: TDOMElement;
  543. procedure AddLink(El : TPasElement; const AName: String);
  544. begin
  545. if FUseMenuBrackets then
  546. AppendText(ParaEl, '[');
  547. AppendText(CreateLink(ParaEl, ResolveLinkWithinPackage(El,0)),AName);
  548. if FUseMenuBrackets then
  549. AppendText(ParaEl, ']');
  550. end;
  551. begin
  552. TableEl := CreateEl(ContentElement, 'table');
  553. TableEl['cellpadding'] := '4';
  554. TableEl['cellspacing'] := '0';
  555. TableEl['border'] := '0';
  556. TableEl['width'] := '100%';
  557. TableEl['class'] := 'bar';
  558. TREl := CreateTR(TableEl);
  559. ParaEl := CreateEl(CreateTD(TREl), 'b');
  560. If Assigned(Topic.Previous) then
  561. AddLink(Topic.Previous,SDocPrevious);
  562. If Assigned(Topic.Parent) then
  563. AddLink(Topic.Parent,SDocUp);
  564. if Assigned(Topic.Next) then
  565. AddLink(Topic.Next,SDocNext);
  566. if Length(SearchPage) > 0 then
  567. begin
  568. if FUseMenuBrackets then
  569. AppendText(ParaEl, '[');
  570. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  571. if FUseMenuBrackets then
  572. AppendText(ParaEl, ']');
  573. end;
  574. ParaEl := CreateTD(TREl);
  575. ParaEl['align'] := 'right';
  576. TitleEl := CreateEl(ParaEl, 'span');
  577. TitleEl['class'] := 'bartitle';
  578. if Assigned(Module) then
  579. AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
  580. if Assigned(Package) then
  581. begin
  582. AppendText(TitleEl, ' (');
  583. AppendHyperlink(TitleEl, Package);
  584. AppendText(TitleEl, ')');
  585. end;
  586. end;
  587. function THTMLWriter.CreateAllocator: TFileAllocator;
  588. begin
  589. Result:=TLongNameFileAllocator.Create('.html');
  590. end;
  591. procedure THTMLWriter.AppendMenuBar(ASubpageIndex: Integer);
  592. var
  593. TableEl, TREl, TRE2, ParaEl, TitleEl: TDOMElement;
  594. procedure AddLink(ALinkSubpageIndex: Integer; const AName: String);
  595. begin
  596. if FUseMenuBrackets then
  597. AppendText(ParaEl, '[');
  598. if ALinkSubpageIndex = ASubpageIndex then
  599. AppendText(ParaEl, AName)
  600. else
  601. AppendText(
  602. CreateLink(ParaEl, ResolveLinkWithinPackage(Module, ALinkSubpageIndex)),
  603. AName);
  604. if FUseMenuBrackets then
  605. AppendText(ParaEl, ']');
  606. end;
  607. procedure AddPackageLink(ALinkSubpageIndex: Integer; const AName: String);
  608. begin
  609. if FUseMenuBrackets then
  610. AppendText(ParaEl, '[');
  611. if ALinkSubpageIndex = ASubpageIndex then
  612. AppendText(ParaEl, AName)
  613. else
  614. AppendText(
  615. CreateLink(ParaEl, ResolveLinkWithinPackage(Package, ALinkSubpageIndex)),
  616. AName);
  617. if FUseMenuBrackets then
  618. AppendText(ParaEl, ']');
  619. end;
  620. begin
  621. TableEl := CreateEl(ContentElement, 'table');
  622. TableEl['cellpadding'] := '4';
  623. TableEl['cellspacing'] := '0';
  624. TableEl['border'] := '0';
  625. TableEl['width'] := '100%';
  626. TableEl['class'] := 'bar';
  627. // Title Row
  628. TREl := CreateTR(TableEl);
  629. // Menu title
  630. ParaEl := CreateTD(TREl);
  631. ParaEl['align'] := 'left';
  632. TitleEl := CreateEl(ParaEl, 'span');
  633. TitleEl['class'] := 'bartitle';
  634. if Assigned(Module) then
  635. AppendText(TitleEl, Format(SDocUnitMenuTitle, [Module.Name]))
  636. else
  637. AppendText(TitleEl, Format(SDocPackageMenuTitle, [Package.Name]));
  638. // Package link title
  639. ParaEl := CreateTD(TREl);
  640. ParaEl['align'] := 'right';
  641. TitleEl := CreateEl(ParaEl, 'span');
  642. TitleEl['class'] := 'bartitle';
  643. if Assigned(Module) and Assigned(Package) then // Displays a Package page
  644. begin
  645. AppendText(TitleEl, SDocPackageLinkTitle);
  646. end;
  647. // Links Row
  648. TRE2 := CreateTR(TableEl);
  649. ParaEl := CreateTD(TRE2);
  650. ParaEl['align'] := 'left';
  651. ParaEl := CreateEl(ParaEl, 'span');
  652. ParaEl['class']:= 'bartitle';
  653. if Assigned(Module) then
  654. begin
  655. AddLink(0, SDocOverview);
  656. if Module.InterfaceSection.ResStrings.Count > 0 then
  657. AddLink(ResstrSubindex, SDocResStrings);
  658. if Module.InterfaceSection.Consts.Count > 0 then
  659. AddLink(ConstsSubindex, SDocConstants);
  660. if Module.InterfaceSection.Types.Count > 0 then
  661. AddLink(TypesSubindex, SDocTypes);
  662. if Module.InterfaceSection.Classes.Count > 0 then
  663. AddLink(ClassesSubindex, SDocClasses);
  664. if Module.InterfaceSection.Functions.Count > 0 then
  665. AddLink(ProcsSubindex, SDocProceduresAndFunctions);
  666. if Module.InterfaceSection.Variables.Count > 0 then
  667. AddLink(VarsSubindex, SDocVariables);
  668. AddLink(IndexSubIndex,SDocIdentifierIndex);
  669. AppendFragment(ParaEl, NavigatorHTML);
  670. end
  671. else
  672. begin
  673. // Overview
  674. AppendText(ParaEl, '[');
  675. AppendHyperlink(ParaEl, Package).TextContent:= UTF8Decode(SDocOverview);
  676. AppendText(ParaEl, ']');
  677. //Index
  678. AddPackageLink(IndexSubIndex, SDocIdentifierIndex);
  679. // Class TObject tree
  680. AddPackageLink(ClassHierarchySubIndex, SDocPackageClassHierarchy);
  681. AppendFragment(ParaEl, NavigatorHTML)
  682. end;
  683. if Length(SearchPage) > 0 then
  684. begin
  685. if FUseMenuBrackets then
  686. AppendText(ParaEl, '[');
  687. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  688. if FUseMenuBrackets then
  689. AppendText(ParaEl, ']');
  690. end;
  691. ParaEl := CreateTD(TRE2);
  692. ParaEl['align'] := 'right';
  693. ParaEl := CreateEl(ParaEl, 'span');
  694. ParaEl['class']:= 'bartitle';
  695. if Assigned(Module) and Assigned(Package) then // Displays a Package page
  696. begin
  697. AppendText(ParaEl, '[');
  698. AppendHyperlink(ParaEl, Package);
  699. AppendText(ParaEl, ']');
  700. end;
  701. AppendFragment(ContentElement,HeaderHTML);
  702. end;
  703. procedure THTMLWriter.AppendFooter;
  704. Var
  705. S : String;
  706. F : TDomElement;
  707. begin
  708. if Assigned(FooterHTML) then
  709. AppendFragment(ContentElement, FooterHTML)
  710. else if IncludeDateInFooter then
  711. begin
  712. CreateEl(ContentElement, 'hr');
  713. F:=CreateEl(ContentElement,'span');
  714. F['class']:='footer';
  715. If (FDateFormat='') then
  716. S:=DateToStr(Date)
  717. else
  718. S:=FormatDateTime(FDateFormat,Date);
  719. AppendText(F,Format(SDocDateGenerated,[S]));
  720. end;
  721. end;
  722. procedure THTMLWriter.FinishElementPage(AElement: TPasElement);
  723. var
  724. DocNode: TDocNode;
  725. begin
  726. DocNode := Engine.FindDocNode(AElement);
  727. If Not Assigned(DocNode) then
  728. exit;
  729. // Description
  730. if Assigned(DocNode.Descr) then
  731. AppendDescrSection(AElement, ContentElement, DocNode.Descr, UTF8Encode(SDocDescription));
  732. // Append "Errors" section
  733. if Assigned(DocNode.ErrorsDoc) then
  734. AppendDescrSection(AElement, ContentElement, DocNode.ErrorsDoc, UTF8Encode(SDocErrors));
  735. // Append Version info
  736. if Assigned(DocNode.Version) then
  737. AppendDescrSection(AElement, ContentElement, DocNode.Version, UTF8Encode(SDocVersion));
  738. // Append "See also" section
  739. AppendSeeAlsoSection(AElement,DocNode);
  740. // Append examples, if present
  741. AppendExampleSection(AElement,DocNode);
  742. // Append notes, if present
  743. ConvertNotes(AElement,DocNode.Notes);
  744. end;
  745. procedure THTMLWriter.CreateTopicPageBody(AElement: TTopicElement);
  746. var
  747. DocNode: TDocNode;
  748. begin
  749. AppendTopicMenuBar(AElement);
  750. DocNode:=AElement.TopicNode;
  751. if Assigned(DocNode) then // should always be true, but we're being careful.
  752. begin
  753. AppendShortDescr(AElement,TitleElement, DocNode);
  754. AppendShortDescr(AElement,CreateH2(ContentElement), DocNode);
  755. if Assigned(DocNode.Descr) then
  756. AppendDescrSection(AElement, ContentElement, DocNode.Descr, '');
  757. AppendSeeAlsoSection(AElement,DocNode);
  758. CreateTopicLinks(DocNode,AElement);
  759. AppendExampleSection(AElement,DocNode);
  760. ConvertNotes(AElement,DocNode.Notes);
  761. end;
  762. end;
  763. procedure THTMLWriter.CreateClassHierarchyPage(AddUnit : Boolean);
  764. type
  765. TypeEN = (NPackage, NModule, NName);
  766. Procedure PushClassElement;
  767. Var
  768. H : THTMLElement;
  769. begin
  770. H:=CreateEl(CurOutputNode, 'li');
  771. H['class']:='classtree';
  772. PushOutputNode(H);
  773. H:=CreateEl(CurOutputNode, 'span');
  774. H['class']:='toggletreeclose';
  775. H['onclick']:='expandorcollapse(this)';
  776. PushOutputNode(h);
  777. AppendNbSp(h,1);
  778. PopOutputNode;
  779. end;
  780. Procedure PushClassList;
  781. Var
  782. H : THTMLElement;
  783. begin
  784. H:=CreateEl(CurOutputNode, 'ul');
  785. H['class']:='classtreelist';
  786. PushOutputNode(h);
  787. end;
  788. function ExtractName(APathName: String; Tp: TypeEN):String;
  789. var
  790. l:TStringList;
  791. begin
  792. Result:= Trim(APathName);
  793. if Result = '' then exit;
  794. l:=TStringList.Create;
  795. try
  796. l.AddDelimitedText(Result, '.', True);
  797. if l.Count=3 then
  798. Result:= l.Strings[Integer(Tp)]
  799. else
  800. Result:='';
  801. finally
  802. l.free;
  803. end;
  804. end;
  805. Procedure AppendClass(EN : TPasElementNode);
  806. Var
  807. PE,PM : TPasElement;
  808. I : Integer;
  809. begin
  810. if not Assigned(EN) then exit;
  811. PE:=EN.Element;
  812. PushClassElement;
  813. try
  814. if (PE<>Nil) then
  815. begin
  816. AppendHyperLink(CurOutputNode,PE);
  817. PM:=PE.GetModule();
  818. if (PM<>Nil) then
  819. begin
  820. AppendText(CurOutputNode,' (');
  821. AppendHyperLink(CurOutputNode,PM);
  822. AppendText(CurOutputNode,')');
  823. end
  824. end
  825. else
  826. AppendText(CurOutputNode,EN.Element.Name);
  827. if EN.ChildCount>0 then
  828. begin
  829. PushClassList;
  830. try
  831. For I:=0 to EN.ChildCount-1 do
  832. AppendClass(EN.Children[i] as TPasElementNode);
  833. finally
  834. PopOutputNode;
  835. end;
  836. end;
  837. Finally
  838. PopOutputNode;
  839. end;
  840. end;
  841. begin
  842. PushOutputNode(ContentElement);
  843. try
  844. PushClassList;
  845. AppendClass(TreeClass.RootNode);
  846. //PopOutputNode;
  847. finally
  848. PopOutputNode;
  849. end;
  850. end;
  851. procedure THTMLWriter.CreatePackageClassHierarchy;
  852. Const
  853. SFunc = 'function expandorcollapse (o) {'+sLineBreak+
  854. ' o.className = (o.className=="toggletreeclose") ? "toggletreeopen" : "toggletreeclose";'+sLineBreak+
  855. ' o.parentNode.className = (o.className=="toggletreeclose") ? "classtree" : "classtreeclosed";'+sLineBreak+
  856. ' return false;'+sLineBreak+
  857. '}';
  858. Var
  859. S : String;
  860. SE : THTMLElement;
  861. begin
  862. SE := Doc.CreateElement('script');
  863. AppendText(SE,SFunc);
  864. HeadElement.AppendChild(SE);
  865. AppendMenuBar(ClassHierarchySubIndex);
  866. S:=Package.Name;
  867. If Length(S)>0 then
  868. Delete(S,1,1);
  869. AppendTitle(UTF8Decode(Format(SDocPackageClassHierarchy, [S])));
  870. CreateClassHierarchyPage(True);
  871. end;
  872. procedure THTMLWriter.CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer);
  873. var
  874. i: Integer;
  875. Element: TPasElement;
  876. begin
  877. CurDirectory := Allocator.GetFilename(AElement, ASubpageIndex);
  878. i := Length(CurDirectory);
  879. while (i > 0) and not (CurDirectory[i] in AllowDirectorySeparators) do
  880. Dec(i);
  881. CurDirectory := Copy(CurDirectory, 1, i);
  882. BaseDirectory := Allocator.GetRelativePathToTop(AElement);
  883. if AElement.ClassType = TPasPackage then
  884. begin
  885. Module:=Nil;
  886. If (ASubPageIndex=0) then
  887. CreatePackagePageBody
  888. else if ASubPageIndex=IndexSubIndex then
  889. CreatePackageIndex
  890. else if ASubPageIndex=ClassHierarchySubIndex then
  891. CreatePackageClassHierarchy
  892. end
  893. else
  894. begin
  895. Element := AElement;
  896. while (Element<>Nil) and (not (Element.ClassType.inheritsfrom(TPasModule))) do
  897. Element := Element.Parent;
  898. Module := TPasModule(Element);
  899. if AElement.ClassType.inheritsfrom(TPasModule) then
  900. CreateModulePageBody(TPasModule(AElement), ASubpageIndex)
  901. else if AElement.Parent.InheritsFrom(TPasClassType) then
  902. CreateClassMemberPageBody(AElement)
  903. else if AElement.ClassType = TPasConst then
  904. CreateConstPageBody(TPasConst(AElement))
  905. else if AElement.InheritsFrom(TPasClassType) then
  906. CreateClassPageBody(TPasClassType(AElement), ASubpageIndex)
  907. else if AElement.InheritsFrom(TPasType) then
  908. CreateTypePageBody(TPasType(AElement))
  909. else if AElement.ClassType = TPasVariable then
  910. CreateVarPageBody(TPasVariable(AElement))
  911. else if AElement.InheritsFrom(TPasProcedureBase) then
  912. CreateProcPageBody(TPasProcedureBase(AElement))
  913. else if AElement.ClassType = TTopicELement then
  914. CreateTopicPageBody(TTopicElement(AElement))
  915. else if AElement.ClassType = TPasProperty then
  916. CreateClassMemberPageBody(TPasProperty(AElement))
  917. else
  918. writeln('Unknown classtype: ',AElement.classtype.classname);
  919. end;
  920. end;
  921. procedure THTMLWriter.CreateIndexPage(L : TStringList);
  922. Var
  923. Lists : Array['A'..'Z'] of TStringList;
  924. CL : TStringList;
  925. TableEl, TREl, EL: TDOMElement;
  926. E : TPasElement;
  927. I,Rows,J,Index : Integer;
  928. S : String;
  929. C : Char;
  930. begin
  931. For C:='A' to 'Z' do
  932. Lists[C]:=Nil;
  933. L.Sort;
  934. Cl:=Nil;
  935. // Divide over alphabet
  936. For I:=0 to L.Count-1 do
  937. begin
  938. S:=L[i];
  939. E:=TPasElement(L.Objects[i]);
  940. If not (E is TPasUnresolvedTypeRef) then
  941. begin
  942. If (S<>'') then
  943. begin
  944. C:=Upcase(S[1]);
  945. If C='_' then
  946. C:='A';
  947. If (C in ['A'..'Z']) and (Lists[C]=Nil) then
  948. begin
  949. CL:=TStringList.Create;
  950. Lists[C]:=CL;
  951. end;
  952. end;
  953. if assigned(cl) then
  954. CL.AddObject(S,E);
  955. end;
  956. end;
  957. Try
  958. // Create a quick jump table to all available letters.
  959. TableEl := CreateTable(ContentElement);
  960. TableEl['border']:='1';
  961. TableEl['width']:='50%';
  962. TREl := CreateTR(TableEl);
  963. for C:='A' to 'Z' do
  964. If (Lists[C]<>Nil) then
  965. begin
  966. El:=CreateTD_vtop(TREl);
  967. AppendText(CreateLink(El,UTF8Decode('#SECTION'+C)),UTF8Decode(C));
  968. If C<>'Z' then
  969. AppendNBsp(El,1);
  970. end;
  971. // Now emit all identifiers.
  972. TableEl:=Nil;
  973. For C:='A' to 'Z' do
  974. begin
  975. CL:=Lists[C];
  976. If CL<>Nil then
  977. begin
  978. El:=CreateH2(ContentElement);
  979. AppendText(El,UTF8Decode(C));
  980. CreateAnchor(El,UTF8Decode('SECTION'+C));
  981. TableEl := CreateTable(ContentElement);
  982. TableEl['Width']:='80%';
  983. // Determine number of rows needed
  984. Rows:=(CL.Count div IndexColCount);
  985. If ((CL.Count Mod IndexColCount)<>0) then
  986. Inc(Rows);
  987. // Fill rows
  988. For I:=0 to Rows-1 do
  989. begin
  990. TREl := CreateTR(TableEl);
  991. For J:=0 to IndexColCount-1 do
  992. begin
  993. El:=CreateTD_vtop(TREl);
  994. Index:=(J*Rows)+I;
  995. If (Index<CL.Count) then
  996. begin
  997. S:=CL[Index];
  998. E:=TPasElement(CL.Objects[Index]);
  999. AppendHyperlink(El,E);
  1000. end;
  1001. end;
  1002. end;
  1003. end; // have List
  1004. end; // For C:=
  1005. Finally
  1006. for C:='A' to 'Z' do
  1007. FreeAndNil(Lists[C]);
  1008. end;
  1009. end;
  1010. procedure THTMLWriter.CreatePackageIndex;
  1011. Var
  1012. L : TStringList;
  1013. I : Integer;
  1014. M : TPasModule;
  1015. S : String;
  1016. begin
  1017. L:=TStringList.Create;
  1018. try
  1019. L.Capacity:=PageInfos.Count; // Too much, but that doesn't hurt.
  1020. For I:=0 to Package.Modules.Count-1 do
  1021. begin
  1022. M:=TPasModule(Package.Modules[i]);
  1023. L.AddObject(M.Name,M);
  1024. AddModuleIdentifiers(M,L);
  1025. end;
  1026. AppendMenuBar(IndexSubIndex);
  1027. S:=Package.Name;
  1028. If Length(S)>0 then
  1029. Delete(S,1,1);
  1030. AppendTitle(UTF8Decode(Format(SDocPackageIndex, [S])));
  1031. CreateIndexPage(L);
  1032. Finally
  1033. L.Free;
  1034. end;
  1035. end;
  1036. procedure THTMLWriter.CreatePackagePageBody;
  1037. var
  1038. DocNode: TDocNode;
  1039. TableEl, TREl: TDOMElement;
  1040. i: Integer;
  1041. ThisModule: TPasModule;
  1042. L : TStringList;
  1043. begin
  1044. AppendMenuBar(0);
  1045. AppendTitle(UTF8Encode(Format(SDocPackageTitle, [Copy(Package.Name, 2, 256)])));
  1046. AppendShortDescr(CreatePara(ContentElement), Package);
  1047. AppendText(CreateH2(ContentElement), UTF8Encode(SDocUnits));
  1048. TableEl := CreateTable(ContentElement);
  1049. L:=TStringList.Create;
  1050. Try
  1051. L.Sorted:=True;
  1052. // Sort modules.
  1053. For I:=0 to Package.Modules.Count-1 do
  1054. L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
  1055. // Now create table.
  1056. for i:=0 to L.Count - 1 do
  1057. begin
  1058. ThisModule := TPasModule(L.Objects[i]);
  1059. TREl := CreateTR(TableEl);
  1060. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisModule);
  1061. AppendShortDescrCell(TREl, ThisModule);
  1062. end;
  1063. Finally
  1064. L.Free;
  1065. end;
  1066. DocNode := Engine.FindDocNode(Package);
  1067. if Assigned(DocNode) then
  1068. begin
  1069. if Assigned(DocNode.Descr) then
  1070. AppendDescrSection(nil, ContentElement, DocNode.Descr, UTF8Decode(SDocDescription));
  1071. CreateTopicLinks(DocNode,Package);
  1072. end;
  1073. end;
  1074. procedure THTMLWriter.CreateTopicLinks (Node: TDocNode; PasElement: TPasElement) ;
  1075. var
  1076. DocNode: TDocNode;
  1077. TableEl, TREl: TDOMElement;
  1078. First : Boolean;
  1079. ThisTopic: TPasElement;
  1080. begin
  1081. DocNode:=Node.FirstChild;
  1082. First:=True;
  1083. While Assigned(DocNode) do
  1084. begin
  1085. If DocNode.TopicNode then
  1086. begin
  1087. if first then
  1088. begin
  1089. First:=False;
  1090. AppendText(CreateH2(ContentElement), UTF8Decode(SDocRelatedTopics));
  1091. TableEl := CreateTable(ContentElement);
  1092. end;
  1093. TREl := CreateTR(TableEl);
  1094. ThisTopic:=FindTopicElement(DocNode);
  1095. if Assigned(ThisTopic) then
  1096. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisTopic);
  1097. AppendShortDescrCell(TREl, ThisTopic);
  1098. end;
  1099. DocNode:=DocNode.NextSibling;
  1100. end;
  1101. end;
  1102. procedure THTMLWriter.CreateModuleIndexPage(AModule: TPasModule);
  1103. Var
  1104. L : TStringList;
  1105. begin
  1106. L:=TStringList.Create;
  1107. try
  1108. AddModuleIdentifiers(AModule,L);
  1109. AppendMenuBar(IndexSubIndex);
  1110. AppendTitle(UTF8Decode(Format(SDocModuleIndex, [AModule.Name])));
  1111. CreateIndexPage(L);
  1112. Finally
  1113. L.Free;
  1114. end;
  1115. end;
  1116. procedure THTMLWriter.CreateModuleMainPage(aModule : TPasModule);
  1117. var
  1118. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1119. i: Integer;
  1120. UnitRef: TPasType;
  1121. DocNode: TDocNode;
  1122. begin
  1123. AppendMenuBar(0);
  1124. AppendTitle(UTF8Decode(Format(SDocUnitTitle, [AModule.Name])),AModule.Hints);
  1125. AppendShortDescr(CreatePara(ContentElement), AModule);
  1126. if AModule.InterfaceSection.UsesList.Count > 0 then
  1127. begin
  1128. TableEl := CreateTable(ContentElement);
  1129. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'uses');
  1130. for i := 0 to AModule.InterfaceSection.UsesList.Count - 1 do
  1131. begin
  1132. UnitRef := TPasType(AModule.InterfaceSection.UsesList[i]);
  1133. DocNode := Engine.FindDocNode(UnitRef);
  1134. if Assigned(DocNode) and DocNode.IsSkipped then
  1135. continue;
  1136. TREl := CreateTR(TableEl);
  1137. TDEl := CreateTD_vtop(TREl);
  1138. CodeEl := CreateCode(CreatePara(TDEl));
  1139. AppendNbSp(CodeEl, 2);
  1140. AppendHyperlink(CodeEl, UnitRef);
  1141. if i < AModule.InterfaceSection.UsesList.Count - 1 then
  1142. AppendSym(CodeEl, ',')
  1143. else
  1144. AppendSym(CodeEl, ';');
  1145. AppendText(CodeEl, ' '); // Space for descriptions
  1146. AppendShortDescrCell(TREl, UnitRef);
  1147. end;
  1148. end;
  1149. DocNode := Engine.FindDocNode(AModule);
  1150. if Assigned(DocNode) then
  1151. begin
  1152. if Assigned(DocNode.Descr) then
  1153. AppendDescrSection(AModule, ContentElement, DocNode.Descr, UTF8Decode(SDocOverview));
  1154. ConvertNotes(AModule,DocNode.Notes);
  1155. CreateTopicLinks(DocNode,AModule);
  1156. end;
  1157. end;
  1158. procedure THTMLWriter.CreateModuleSimpleSubpage(aModule: TPasModule; ASubpageIndex: Integer; const ATitle: DOMString; AList: TFPList);
  1159. var
  1160. TableEl, TREl, CodeEl: TDOMElement;
  1161. i, j: Integer;
  1162. Decl: TPasElement;
  1163. SortedList: TFPList;
  1164. DocNode: TDocNode;
  1165. S : String;
  1166. begin
  1167. AppendMenuBar(ASubpageIndex);
  1168. S:=UTF8Encode(ATitle);
  1169. AppendTitle(UTF8Decode(Format(SDocUnitTitle + ': %s', [AModule.Name, S])));
  1170. SortedList := TFPList.Create;
  1171. try
  1172. for i := 0 to AList.Count - 1 do
  1173. begin
  1174. Decl := TPasElement(AList[i]);
  1175. DocNode := Engine.FindDocNode(Decl);
  1176. if (not Assigned(DocNode)) or (not DocNode.IsSkipped) then
  1177. begin
  1178. j := 0;
  1179. while (j < SortedList.Count) and (CompareText(
  1180. TPasElement(SortedList[j]).PathName, Decl.PathName) < 0) do
  1181. Inc(j);
  1182. SortedList.Insert(j, Decl);
  1183. end;
  1184. end;
  1185. TableEl := CreateTable(ContentElement);
  1186. for i := 0 to SortedList.Count - 1 do
  1187. begin
  1188. Decl := TPasElement(SortedList[i]);
  1189. TREl := CreateTR(TableEl);
  1190. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1191. AppendHyperlink(CodeEl, Decl);
  1192. AppendShortDescrCell(TREl, Decl);
  1193. end;
  1194. finally
  1195. SortedList.Free;
  1196. end;
  1197. end;
  1198. procedure THTMLWriter.CreateModuleResStringsPage(aModule : TPasModule);
  1199. var
  1200. ParaEl: TDOMElement;
  1201. i: Integer;
  1202. Decl: TPasResString;
  1203. begin
  1204. AppendMenuBar(ResstrSubindex);
  1205. AppendTitle(UTF8Decode(Format(SDocUnitTitle + ': %s', [AModule.Name, SDocResStrings])));
  1206. for i := 0 to AModule.InterfaceSection.ResStrings.Count - 1 do
  1207. begin
  1208. Decl := TPasResString(AModule.InterfaceSection.ResStrings[i]);
  1209. CreateEl(ContentElement, 'a')['name'] := UTF8Decode(LowerCase(Decl.Name));
  1210. ParaEl := CreatePara(ContentElement);
  1211. AppendText(CreateCode(ParaEl), UTF8Decode(Decl.Name));
  1212. CreateEl(ParaEl, 'br');
  1213. AppendText(ParaEl, UTF8Decode(Decl.Expr.getDeclaration(true)));
  1214. end;
  1215. end;
  1216. procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
  1217. ASubpageIndex: Integer);
  1218. begin
  1219. case ASubpageIndex of
  1220. 0:
  1221. CreateModuleMainPage(aModule);
  1222. ResstrSubindex:
  1223. CreateModuleResStringsPage(aModule);
  1224. ConstsSubindex:
  1225. CreateModuleSimpleSubpage(aModule, ConstsSubindex,UTF8Decode(SDocConstants), AModule.InterfaceSection.Consts);
  1226. TypesSubindex:
  1227. CreateModuleSimpleSubpage(aModule, TypesSubindex,UTF8Decode(SDocTypes), AModule.InterfaceSection.Types);
  1228. ClassesSubindex:
  1229. CreateModuleSimpleSubpage(aModule, ClassesSubindex,UTF8Decode(SDocClasses), AModule.InterfaceSection.Classes);
  1230. ProcsSubindex:
  1231. CreateModuleSimpleSubpage(aModule, ProcsSubindex, UTF8Decode(SDocProceduresAndFunctions), AModule.InterfaceSection.Functions);
  1232. VarsSubindex:
  1233. CreateModuleSimpleSubpage(aModule, VarsSubindex,UTF8Decode(SDocVariables), AModule.InterfaceSection.Variables);
  1234. IndexSubIndex:
  1235. CreateModuleIndexPage(AModule);
  1236. end;
  1237. end;
  1238. procedure THTMLWriter.CreateConstPageBody(AConst: TPasConst);
  1239. var
  1240. TableEl, CodeEl: TDOMElement;
  1241. begin
  1242. AppendMenuBar(-1);
  1243. AppendTitle(UTF8Decode(AConst.Name),AConst.Hints);
  1244. AppendShortDescr(CreatePara(ContentElement), AConst);
  1245. AppendText(CreateH2(ContentElement), UTF8Decode(SDocDeclaration));
  1246. AppendSourceRef(ContentElement,AConst);
  1247. TableEl := CreateTable(ContentElement);
  1248. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1249. AppendKw(CodeEl, 'const');
  1250. AppendText(CodeEl, ' ' + UTF8Decode(AConst.Name));
  1251. if Assigned(AConst.VarType) then
  1252. begin
  1253. AppendSym(CodeEl, ': ');
  1254. AppendType(CodeEl, TableEl, AConst.VarType, False);
  1255. end;
  1256. AppendPasSHFragment(CodeEl, ' = ' + AConst.Expr.GetDeclaration(True) + ';', 0);
  1257. FinishElementPage(AConst);
  1258. end;
  1259. procedure THTMLWriter.AppendTypeDecl(AType: TPasType; TableEl,CodeEl : TDomElement);
  1260. Var
  1261. TREl : TDomElement;
  1262. i: Integer;
  1263. s: String;
  1264. EnumType: TPasEnumType;
  1265. EnumValue: TPasEnumValue;
  1266. begin
  1267. // Alias
  1268. if AType.ClassType = TPasAliasType then
  1269. begin
  1270. if Assigned(TPasAliasType(AType).DestType) then
  1271. AppendHyperlink(CodeEl, TPasAliasType(AType).DestType)
  1272. else
  1273. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1274. AppendSym(CodeEl, ';');
  1275. end else
  1276. // Class of
  1277. if AType.ClassType = TPasClassOfType then
  1278. begin
  1279. AppendKw(CodeEl, 'class of ');
  1280. AppendHyperlink(CodeEl, TPasClassOfType(AType).DestType);
  1281. AppendSym(CodeEl, ';');
  1282. end else
  1283. // Enumeration
  1284. if AType.ClassType = TPasEnumType then
  1285. begin
  1286. AppendSym(CodeEl, '(');
  1287. for i := 0 to TPasEnumType(AType).Values.Count - 1 do
  1288. begin
  1289. EnumValue := TPasEnumValue(TPasEnumType(AType).Values[i]);
  1290. TREl := CreateTR(TableEl);
  1291. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1292. AppendShortDescrCell(TREl, EnumValue);
  1293. AppendNbSp(CodeEl, 2);
  1294. s := EnumValue.Name;
  1295. if EnumValue.AssignedValue<>'' then
  1296. s := s + ' = ' + EnumValue.AssignedValue;
  1297. if i < TPasEnumType(AType).Values.Count - 1 then
  1298. s := s + ',';
  1299. AppendPasSHFragment(CodeEl, s, 0);
  1300. end;
  1301. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  1302. end else
  1303. // Pointer type
  1304. if AType.ClassType = TPasPointerType then
  1305. begin
  1306. AppendSym(CodeEl, '^');
  1307. if Assigned(TPasPointerType(AType).DestType) then
  1308. AppendHyperlink(CodeEl, TPasPointerType(AType).DestType)
  1309. else
  1310. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1311. AppendSym(CodeEl, ';');
  1312. end else
  1313. if AType.InheritsFrom(TPasProcedureType) then
  1314. begin
  1315. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  1316. AppendProcArgsSection(ContentElement, TPasProcedureType(AType));
  1317. end else
  1318. // Record
  1319. if AType.ClassType = TPasRecordType then
  1320. begin
  1321. CodeEl := AppendRecordType(CodeEl, TableEl, TPasRecordType(AType), 0);
  1322. AppendSym(CodeEl, ';');
  1323. end else
  1324. // Set
  1325. if AType.ClassType = TPasSetType then
  1326. begin
  1327. AppendKw(CodeEl, 'set of ');
  1328. if TPasSetType(AType).EnumType.ClassType = TPasEnumType then
  1329. begin
  1330. AppendSym(CodeEl, '(');
  1331. EnumType := TPasEnumType(TPasSetType(AType).EnumType);
  1332. for i := 0 to EnumType.Values.Count - 1 do
  1333. begin
  1334. EnumValue := TPasEnumValue(EnumType.Values[i]);
  1335. TREl := CreateTR(TableEl);
  1336. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1337. AppendShortDescrCell(TREl, EnumValue);
  1338. AppendNbSp(CodeEl, 2);
  1339. s := EnumValue.Name;
  1340. if (EnumValue.AssignedValue<>'') then
  1341. s := s + ' = ' + EnumValue.AssignedValue;
  1342. if i < EnumType.Values.Count - 1 then
  1343. s := s + ',';
  1344. AppendPasSHFragment(CodeEl, s, 0);
  1345. end;
  1346. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  1347. end else
  1348. begin
  1349. AppendHyperlink(CodeEl, TPasSetType(AType).EnumType);
  1350. AppendSym(CodeEl, ';');
  1351. end;
  1352. end else
  1353. // Type alias
  1354. if AType.ClassType = TPasTypeAliasType then
  1355. begin
  1356. AppendKw(CodeEl, 'type ');
  1357. AppendHyperlink(CodeEl, TPasTypeAliasType(AType).DestType);
  1358. AppendSym(CodeEl, ';');
  1359. end else
  1360. // Probably one of the simple types, which allowed in other places as wel...
  1361. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  1362. end;
  1363. procedure THTMLWriter.CreateTypePageBody(AType: TPasType);
  1364. var
  1365. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1366. DocNode: TDocNode;
  1367. begin
  1368. AppendMenuBar(-1);
  1369. AppendTitle(UTF8Decode(AType.Name),AType.Hints);
  1370. AppendShortDescr(CreatePara(ContentElement), AType);
  1371. AppendText(CreateH2(ContentElement), UTF8Decode(SDocDeclaration));
  1372. AppendSourceRef(ContentElement,AType);
  1373. TableEl := CreateTable(ContentElement);
  1374. TREl := CreateTR(TableEl);
  1375. TDEl := CreateTD(TREl);
  1376. CodeEl := CreateCode(CreatePara(TDEl));
  1377. DocNode := Engine.FindDocNode(AType);
  1378. AppendKw(CodeEl, 'type ');
  1379. AppendText(CodeEl, UTF8Decode(AType.Name));
  1380. AppendSym(CodeEl, ' = ');
  1381. If Assigned(DocNode) and
  1382. Assigned(DocNode.Node) and
  1383. (Docnode.Node['opaque']='1') then
  1384. AppendText(CodeEl,UTF8Decode(SDocOpaque))
  1385. else
  1386. begin
  1387. AppendTypeDecl(AType,TableEl,CodeEl);
  1388. end;
  1389. FinishElementPage(AType);
  1390. end;
  1391. procedure THTMLWriter.CreateMemberDeclarations(AParent : TPasElement; Members : TFPList; TableEl : TDOmelement; AddEnd : Boolean);
  1392. var
  1393. TREl, CodeEl: TDOMElement;
  1394. Member: TPasElement;
  1395. MVisibility,
  1396. CurVisibility: TPasMemberVisibility;
  1397. i: Integer;
  1398. s: String;
  1399. t : TPasType;
  1400. ah,ol,wt,ct,wc,cc : boolean;
  1401. isRecord : Boolean;
  1402. begin
  1403. isRecord:=AParent is TPasRecordType;
  1404. CodeEl:=nil;
  1405. if Members.Count > 0 then
  1406. begin
  1407. wt:=False;
  1408. wc:=False;
  1409. CurVisibility := visDefault;
  1410. for i := 0 to Members.Count - 1 do
  1411. begin
  1412. Member := TPasElement(Members[i]);
  1413. MVisibility:=Member.Visibility;
  1414. cc:=(Member is TPasConst);
  1415. ct:=(Member is TPasType);
  1416. ol:=(Member is TPasOverloadedProc);
  1417. ah:=ol or ((Member is TPasProcedure) and (TPasProcedure(Member).ProcType.Args.Count > 0));
  1418. if ol then
  1419. Member:=TPasElement((Member as TPasOverloadedProc).Overloads[0]);
  1420. if Not Engine.ShowElement(Member) then
  1421. continue;
  1422. if (CurVisibility <> MVisibility) or (cc <> wc) or (ct <> wt) then
  1423. begin
  1424. CurVisibility := MVisibility;
  1425. wc:=cc;
  1426. wt:=ct;
  1427. s:=VisibilityNames[MVisibility];
  1428. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), UTF8Decode(s));
  1429. if (ct) then AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'type');
  1430. if (cc) then AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'const');
  1431. end;
  1432. TREl := CreateTR(TableEl);
  1433. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1434. AppendNbSp(CodeEl, 2);
  1435. AppendShortDescrCell(TREl, Member);
  1436. if (Member is TPasProcedureBase) then
  1437. begin
  1438. AppendKw(CodeEl, UTF8Decode(TPasProcedureBase(Member).TypeName) + ' ');
  1439. AppendHyperlink(CodeEl, Member);
  1440. if ah then
  1441. AppendSym(CodeEl, '();')
  1442. else
  1443. AppendSym(CodeEl, ';');
  1444. if Not OL then
  1445. AppendProcExt(CodeEl, TPasProcedure(Member));
  1446. end
  1447. else if (Member is TPasConst) then
  1448. begin
  1449. AppendHyperlink(CodeEl, Member);
  1450. If Assigned(TPasConst(Member).VarType) then
  1451. begin
  1452. AppendSym(CodeEl, ' = ');
  1453. AppendTypeDecl(TPasType(TPasConst(Member).VarType),TableEl,CodeEl);
  1454. end;
  1455. AppendSym(CodeEl, ' = ');
  1456. AppendText(CodeEl,UTF8Decode(TPasConst(Member).Expr.GetDeclaration(True)));
  1457. end
  1458. else if (Member is TPasType) then
  1459. begin
  1460. AppendHyperlink(CodeEl, Member);
  1461. AppendSym(CodeEl, ' = ');
  1462. AppendTypeDecl(TPasType(Member),TableEl,CodeEl);
  1463. end
  1464. else if (Member is TPasProperty) then
  1465. begin
  1466. AppendKw(CodeEl, 'property ');
  1467. AppendHyperlink(CodeEl, Member);
  1468. t:=TPasProperty(Member).ResolvedType;
  1469. if Assigned(TPasProperty(Member).Args) and (TPasProperty(Member).Args.Count>0) then
  1470. AppendText(CodeEl, ' []');
  1471. if Assigned(T) then
  1472. begin
  1473. AppendSym(CodeEl, ': ');
  1474. AppendHyperlink(CodeEl, T);
  1475. end;
  1476. AppendSym(CodeEl, ';');
  1477. if TPasProperty(Member).IsDefault then
  1478. begin
  1479. AppendKw(CodeEl, ' default');
  1480. AppendSym(CodeEl, ';');
  1481. end;
  1482. if (TPasProperty(Member).ImplementsName<>'') then
  1483. begin
  1484. AppendKw(CodeEl, ' implements');
  1485. AppendText(CodeEl, ' '+UTF8Decode(TPasProperty(Member).ImplementsName));
  1486. AppendSym(CodeEl, ';');
  1487. end;
  1488. SetLength(s, 0);
  1489. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  1490. s := s + 'r';
  1491. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  1492. s := s + 'w';
  1493. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  1494. s := s + 's';
  1495. if Length(s) > 0 then
  1496. AppendText(CodeEl, ' [' + UTF8Decode(s) + ']');
  1497. end
  1498. else if (Member is TPasVariable) then
  1499. begin
  1500. if not isRecord then
  1501. AppendHyperlink(CodeEl, Member)
  1502. else
  1503. AppendText(CodeEl, UTF8Decode(Member.Name));
  1504. AppendSym(CodeEl, ': ');
  1505. AppendType(CodeEl, TableEl, TPasVariable(Member).VarType,False);
  1506. AppendSym(CodeEl, ';');
  1507. end
  1508. else
  1509. AppendText(CreateWarning(CodeEl), '<' + UTF8Decode(Member.ClassName) + '>');
  1510. if (Member.Hints<>[]) then
  1511. begin
  1512. AppendKW(CodeEl,' '+UTF8Decode(Engine.HintsToStr(Member.Hints)));
  1513. AppendText(CodeEl, ' ');
  1514. AppendSym(CodeEl, ';');
  1515. end;
  1516. end;
  1517. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1518. end;
  1519. if assigned(CodeEl) Then
  1520. begin
  1521. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  1522. If AddEnd then
  1523. begin
  1524. AppendKw(CodeEl, 'end');
  1525. AppendSym(CodeEl, ';');
  1526. end;
  1527. end;
  1528. end;
  1529. procedure THTMLWriter.AppendTitle(const AText: String; Hints: TPasMemberHints);
  1530. begin
  1531. AppendTitle(UTF8Decode(aText),Hints);
  1532. end;
  1533. procedure THTMLWriter.AppendTitle(const AText: DOMString; Hints : TPasMemberHints = []);
  1534. Var
  1535. T : UnicodeString;
  1536. begin
  1537. T:=AText;
  1538. if (Hints<>[]) then
  1539. T:=T+' ('+UTF8Decode(Engine.HintsToStr(Hints))+')';
  1540. AppendText(TitleElement, AText);
  1541. AppendText(CreateH1(ContentElement), T);
  1542. end;
  1543. procedure THTMLWriter.AppendClassMemberListLink(aClass : TPasClassType; ParaEl : TDomElement; AListSubpageIndex: Integer; const AText: DOMString);
  1544. var
  1545. LinkEl: TDOMElement;
  1546. begin
  1547. if FUseMenuBrackets then
  1548. AppendText(ParaEl, '[');
  1549. LinkEl := CreateEl(ParaEl, 'a');
  1550. LinkEl['href'] :=UTF8Decode(FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex)));
  1551. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  1552. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  1553. AppendText(LinkEl, AText);
  1554. AppendText(ParaEl, ' (');
  1555. LinkEl := CreateEl(ParaEl, 'a');
  1556. LinkEl['href'] :=UTF8Decode(FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex + 1)));
  1557. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  1558. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  1559. AppendText(LinkEl, UTF8Decode(SDocByName));
  1560. AppendText(ParaEl, ')');
  1561. if FUseMenuBrackets then
  1562. AppendText(ParaEl, '] ')
  1563. else
  1564. AppendText(ParaEl, ' ');
  1565. end;
  1566. procedure THTMLWriter.CreateClassMainPage(aClass : TPasClassType);
  1567. procedure AppendGenericTypes(CodeEl : TDomElement; AList : TFPList; isSpecialize : Boolean);
  1568. Var
  1569. I : integer;
  1570. begin
  1571. for I:=0 to AList.Count-1 do
  1572. begin
  1573. if I=0 then
  1574. AppendSym(CodeEl, '<')
  1575. else
  1576. AppendSym(CodeEl, ',');
  1577. AppendText(CodeEl,UTF8Decode(TPasGenericTemplateType(AList[i]).Name));
  1578. end;
  1579. AppendSym(CodeEl, '>');
  1580. end;
  1581. procedure AppendInterfaceInfo(ACodeEl : TDomElement ; AThisClass: TPasClassType);
  1582. var
  1583. i:Integer;
  1584. ThisInterface:TPasClassType;
  1585. begin
  1586. if Assigned(AThisClass) and (AThisClass.Interfaces.count>0) then
  1587. begin
  1588. for i:=0 to AThisClass.interfaces.count-1 do
  1589. begin
  1590. ThisInterface:=TPasClassType(AThisClass.Interfaces[i]);
  1591. AppendText(ACodeEl,',');
  1592. AppendHyperlink(ACodeEl, ThisInterface);
  1593. end;
  1594. end;
  1595. end;
  1596. var
  1597. ParaEl,TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1598. ThisClass, PrevClass: TPasClassType;
  1599. ThisTreeNode: TPasElementNode;
  1600. begin
  1601. //WriteLn('@ClassPageBody.CreateMainPage Class=', AClass.Name);
  1602. AppendMenuBar(-1);
  1603. AppendTitle(UTF8Decode(AClass.Name),AClass.Hints);
  1604. ParaEl := CreatePara(ContentElement);
  1605. AppendClassMemberListLink(aClass,ParaEl,PropertiesByInheritanceSubindex, UTF8Decode(SDocProperties));
  1606. AppendClassMemberListLink(aClass,ParaEl,MethodsByInheritanceSubindex, UTF8Decode(SDocMethods));
  1607. AppendClassMemberListLink(aClass,ParaEl,EventsByInheritanceSubindex, UTF8Decode(SDocEvents));
  1608. AppendShortDescr(CreatePara(ContentElement), AClass);
  1609. AppendText(CreateH2(ContentElement), UTF8Decode(SDocDeclaration));
  1610. AppendSourceRef(ContentElement,AClass);
  1611. TableEl := CreateTable(ContentElement);
  1612. TREl := CreateTR(TableEl);
  1613. TDEl := CreateTD(TREl);
  1614. CodeEl := CreateCode(CreatePara(TDEl));
  1615. AppendKw(CodeEl, 'type');
  1616. if AClass.GenericTemplateTypes.Count>0 then
  1617. AppendKw(CodeEl, ' generic ');
  1618. AppendText(CodeEl, ' ' + UTF8Decode(AClass.Name) + ' ');
  1619. if AClass.GenericTemplateTypes.Count>0 then
  1620. AppendGenericTypes(CodeEl,AClass.GenericTemplateTypes,false);
  1621. AppendSym(CodeEl, '=');
  1622. AppendText(CodeEl, ' ');
  1623. AppendKw(CodeEl, UTF8Decode(ObjKindNames[AClass.ObjKind]));
  1624. // Now we are using only TreeClass for show inheritance
  1625. ThisClass := AClass; ThisTreeNode := Nil;
  1626. if AClass.ObjKind = okInterface then
  1627. ThisTreeNode := TreeInterface.GetPasElNode(AClass)
  1628. else
  1629. ThisTreeNode := TreeClass.GetPasElNode(AClass);
  1630. if not Assigned(ThisTreeNode) Then
  1631. DoLog('EROOR Tree Class information: '+ThisClass.PathName);
  1632. if Assigned(AClass.AncestorType) then
  1633. begin
  1634. AppendSym(CodeEl, '(');
  1635. // Show parent class information
  1636. //TODO: Specialized generic classes is not processed now.
  1637. // TLazFixedRoundBufferListMemBase as example
  1638. AppendHyperlink(CodeEl, AClass.AncestorType);
  1639. AppendInterfaceInfo(CodeEl, AClass);
  1640. AppendSym(CodeEl, ')');
  1641. end;
  1642. // Class members
  1643. CreateMemberDeclarations(AClass, AClass.Members,TableEl, not AClass.IsShortDefinition);
  1644. AppendText(CreateH2(ContentElement), UTF8Decode(SDocInheritance));
  1645. TableEl := CreateTable(ContentElement);
  1646. // Process tree class information
  1647. // First tree class link is to This class
  1648. PrevClass:= nil;
  1649. while True do
  1650. begin
  1651. TREl := CreateTR(TableEl);
  1652. TDEl := CreateTD_vtop(TREl);
  1653. TDEl['align'] := 'center';
  1654. CodeEl := CreateCode(CreatePara(TDEl));
  1655. // Show class item
  1656. AppendHyperlink(CodeEl, ThisClass);
  1657. if Assigned(PrevClass) then // Interfaces from prevClass
  1658. AppendInterfaceInfo(CodeEl, PrevClass);
  1659. AppendShortDescrCell(TREl, ThisClass);
  1660. if Assigned(ThisTreeNode) then
  1661. if Assigned(ThisTreeNode.ParentNode) then
  1662. begin
  1663. TDEl := CreateTD(CreateTR(TableEl));
  1664. TDEl['align'] := 'center';
  1665. AppendText(TDEl, '|');
  1666. PrevClass:= ThisClass;
  1667. ThisClass := ThisTreeNode.ParentNode.Element;
  1668. ThisTreeNode := ThisTreeNode.ParentNode;
  1669. end
  1670. else
  1671. begin
  1672. ThisClass := nil;
  1673. ThisTreeNode:= nil;
  1674. PrevClass:= nil;
  1675. break;
  1676. end
  1677. else
  1678. break;
  1679. end;
  1680. FinishElementPage(AClass);
  1681. end;
  1682. procedure THTMLWriter.CreateClassInheritanceSubpage(aClass : TPasClassType; AFilter: TMemberFilter);
  1683. var
  1684. ThisClass: TPasClassType;
  1685. i: Integer;
  1686. Member: TPasElement;
  1687. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  1688. begin
  1689. TableEl := CreateTable(ContentElement);
  1690. ThisClass := AClass;
  1691. while True do
  1692. begin
  1693. TREl := CreateTR(TableEl);
  1694. TDEl := CreateTD(TREl);
  1695. TDEl['colspan'] := '3';
  1696. CreateTD(TREl);
  1697. LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
  1698. if Assigned(LinkEl) then
  1699. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1700. '''; return false;';
  1701. for i := 0 to ThisClass.Members.Count - 1 do
  1702. begin
  1703. Member := TPasElement(ThisClass.Members[i]);
  1704. if Not (Engine.ShowElement(Member) and AFilter(Member)) then
  1705. continue;
  1706. TREl := CreateTR(TableEl);
  1707. ParaEl := CreatePara(CreateTD(TREl));
  1708. case Member.Visibility of
  1709. visPrivate:
  1710. AppendText(ParaEl, 'pv');
  1711. visProtected:
  1712. AppendText(ParaEl, 'pt');
  1713. visPublished:
  1714. AppendText(ParaEl, 'pl');
  1715. else
  1716. end;
  1717. AppendNbSp(ParaEl, 1);
  1718. ParaEl := CreateTD(TREl);
  1719. if (Member.ClassType = TPasProperty) and
  1720. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  1721. begin
  1722. AppendText(ParaEl, 'ro');
  1723. AppendNbSp(ParaEl, 1);
  1724. end;
  1725. LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
  1726. if Assigned(LinkEl) then
  1727. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1728. '''; return false;';
  1729. end;
  1730. if (not Assigned(ThisClass.AncestorType)) or
  1731. (not (ThisClass.AncestorType.ClassType.inheritsfrom(TPasClassType))) then
  1732. break;
  1733. ThisClass := TPasClassType(ThisClass.AncestorType);
  1734. AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
  1735. end;
  1736. end;
  1737. procedure THTMLWriter.CreateClassSortedSubpage(AClass: TPasClassType; AFilter: TMemberFilter);
  1738. var
  1739. List: TFPList;
  1740. ThisClass: TPasClassType;
  1741. i, j: Integer;
  1742. Member: TPasElement;
  1743. ParaEl, TableEl, TREl, TDEl, LinkEl: TDOMElement;
  1744. begin
  1745. List := TFPList.Create;
  1746. try
  1747. ThisClass := AClass;
  1748. while True do
  1749. begin
  1750. for i := 0 to ThisClass.Members.Count - 1 do
  1751. begin
  1752. Member := TPasElement(ThisClass.Members[i]);
  1753. if Engine.ShowElement(Member) and AFilter(Member) then
  1754. begin
  1755. j := 0;
  1756. while (j < List.Count) and
  1757. (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
  1758. Inc(j);
  1759. List.Insert(j, Member);
  1760. end;
  1761. end;
  1762. if (not Assigned(ThisClass.AncestorType)) or
  1763. (not (ThisClass.AncestorType.ClassType.inheritsfrom(TPasClassType))) then
  1764. break;
  1765. ThisClass := TPasClassType(ThisClass.AncestorType);
  1766. end;
  1767. TableEl := CreateTable(ContentElement);
  1768. for i := 0 to List.Count - 1 do
  1769. begin
  1770. Member := TPasElement(List[i]);
  1771. TREl := CreateTR(TableEl);
  1772. ParaEl := CreatePara(CreateTD(TREl));
  1773. case Member.Visibility of
  1774. visPrivate:
  1775. AppendText(ParaEl, 'pv');
  1776. visProtected:
  1777. AppendText(ParaEl, 'pt');
  1778. visPublished:
  1779. AppendText(ParaEl, 'pl');
  1780. else
  1781. end;
  1782. AppendNbSp(ParaEl, 1);
  1783. ParaEl := CreatePara(CreateTD(TREl));
  1784. if (Member.ClassType = TPasProperty) and
  1785. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  1786. begin
  1787. AppendText(ParaEl, 'ro');
  1788. AppendNbSp(ParaEl, 1);
  1789. end;
  1790. TDEl := CreateTD(TREl);
  1791. TDEl['nowrap'] := 'nowrap';
  1792. ParaEl := CreatePara(TDEl);
  1793. LinkEl := AppendHyperlink(ParaEl, Member);
  1794. if Assigned(LinkEl) then
  1795. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1796. '''; return false;';
  1797. AppendText(ParaEl, ' (');
  1798. LinkEl := AppendHyperlink(ParaEl, Member.Parent);
  1799. if Assigned(LinkEl) then
  1800. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1801. '''; return false;';
  1802. AppendText(ParaEl, ')');
  1803. end;
  1804. finally
  1805. List.Free;
  1806. end;
  1807. end;
  1808. procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
  1809. begin
  1810. case ASubpageIndex of
  1811. 0:
  1812. CreateClassMainPage(aClass);
  1813. PropertiesByInheritanceSubindex:
  1814. CreateClassInheritanceSubpage(aClass,@PropertyFilter);
  1815. PropertiesByNameSubindex:
  1816. CreateClassSortedSubpage(aClass,@PropertyFilter);
  1817. MethodsByInheritanceSubindex:
  1818. CreateClassInheritanceSubpage(aClass,@MethodFilter);
  1819. MethodsByNameSubindex:
  1820. CreateClassSortedSubpage(aClass,@MethodFilter);
  1821. EventsByInheritanceSubindex:
  1822. CreateClassInheritanceSubpage(aClass,@EventFilter);
  1823. EventsByNameSubindex:
  1824. CreateClassSortedSubpage(aClass,@EventFilter);
  1825. end;
  1826. end;
  1827. procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
  1828. var
  1829. TableEl, TREl, CodeEl: TDOMElement;
  1830. procedure CreateVarPage(Element: TPasVariable);
  1831. begin
  1832. AppendHyperlink(CodeEl, Element.Parent);
  1833. AppendSym(CodeEl, '.');
  1834. AppendText(CodeEl, UTF8Decode(Element.Name));
  1835. if Assigned(Element.VarType) then
  1836. begin
  1837. AppendSym(CodeEl, ' : ');
  1838. AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
  1839. end;
  1840. end;
  1841. procedure CreateTypePage(Element: TPasType);
  1842. begin
  1843. AppendKw(CodeEl, 'type ');
  1844. AppendHyperlink(CodeEl, Element.Parent);
  1845. AppendSym(CodeEl, '.');
  1846. AppendText(CodeEl, UTF8Decode(Element.Name));
  1847. AppendSym(CodeEl, ' = ');
  1848. AppendTypeDecl(Element,TableEl,CodeEl)
  1849. end;
  1850. procedure CreateConstPage(Element: TPasConst);
  1851. begin
  1852. AppendKw(CodeEl, 'const ');
  1853. AppendHyperlink(CodeEl, Element.Parent);
  1854. AppendSym(CodeEl, '.');
  1855. AppendText(CodeEl, UTF8Decode(Element.Name));
  1856. if Assigned(Element.VarType) then
  1857. begin
  1858. AppendSym(CodeEl, ': ');
  1859. AppendType(CodeEl, TableEl, Element.VarType, False);
  1860. end;
  1861. AppendPasSHFragment(CodeEl, ' = ' + Element.Expr.GetDeclaration(True) + ';', 0);
  1862. end;
  1863. procedure CreatePropertyPage(Element: TPasProperty);
  1864. var
  1865. NeedBreak: Boolean;
  1866. T : TPasType;
  1867. A : TPasArgument;
  1868. I : integer;
  1869. begin
  1870. AppendKw(CodeEl, 'property ');
  1871. AppendHyperlink(CodeEl, Element.Parent);
  1872. AppendSym(CodeEl, '.');
  1873. AppendText(CodeEl, UTF8Decode(Element.Name));
  1874. if Assigned(Element.Args) and (Element.Args.Count>0) then
  1875. begin
  1876. AppendSym(CodeEl,'[');
  1877. For I:=0 to Element.Args.Count-1 do
  1878. begin
  1879. If I>0 then
  1880. AppendSym(CodeEl,',');
  1881. A:=TPasArgument(Element.Args[i]);
  1882. AppendText(CodeEl, UTF8Decode(A.Name));
  1883. AppendSym(CodeEl,': ');
  1884. if Assigned(A.ArgType) then
  1885. AppendText(CodeEl,UTF8Decode(A.ArgType.Name))
  1886. else
  1887. AppendText(CodeEl,'<Unknown>');
  1888. end;
  1889. AppendSym(CodeEl,']');
  1890. end;
  1891. T:=Element.ResolvedType;
  1892. if Assigned(T) then
  1893. begin
  1894. AppendSym(CodeEl, ' : ');
  1895. AppendType(CodeEl, TableEl, T, False);
  1896. end;
  1897. NeedBreak := False;
  1898. if Length(TPasProperty(Element).IndexValue) <> 0 then
  1899. begin
  1900. CreateEl(CodeEl, 'br');
  1901. AppendNbsp(CodeEl, 2);
  1902. AppendKw(CodeEl, 'index ');
  1903. AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
  1904. NeedBreak := True;
  1905. end;
  1906. if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
  1907. begin
  1908. CreateEl(CodeEl, 'br');
  1909. AppendNbsp(CodeEl, 2);
  1910. AppendKw(CodeEl, 'read ');
  1911. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).ReadAccessorName));
  1912. NeedBreak := True;
  1913. end;
  1914. if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
  1915. begin
  1916. CreateEl(CodeEl, 'br');
  1917. AppendNbsp(CodeEl, 2);
  1918. AppendKw(CodeEl, 'write ');
  1919. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).WriteAccessorName));
  1920. NeedBreak := True;
  1921. end;
  1922. if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
  1923. begin
  1924. CreateEl(CodeEl, 'br');
  1925. AppendNbsp(CodeEl, 2);
  1926. AppendKw(CodeEl, 'stored ');
  1927. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).StoredAccessorName));
  1928. NeedBreak := True;
  1929. end;
  1930. if Length(TPasProperty(Element).DefaultValue) <> 0 then
  1931. begin
  1932. CreateEl(CodeEl, 'br');
  1933. AppendNbsp(CodeEl, 2);
  1934. AppendKw(CodeEl, 'default ');
  1935. AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
  1936. NeedBreak := True;
  1937. end;
  1938. AppendSym(CodeEl, ';');
  1939. if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
  1940. begin
  1941. if NeedBreak then
  1942. begin
  1943. CreateEl(CodeEl, 'br');
  1944. AppendNbsp(CodeEl, 2);
  1945. end;
  1946. if TPasProperty(Element).IsDefault then
  1947. AppendKw(CodeEl, 'default')
  1948. else
  1949. AppendKw(CodeEl, 'nodefault');
  1950. AppendSym(CodeEl, ';');
  1951. end;
  1952. end;
  1953. var
  1954. s: String;
  1955. begin
  1956. AppendMenuBar(-1);
  1957. AppendTitle(UTF8Decode(AElement.FullName),AElement.Hints);
  1958. AppendShortDescr(CreatePara(ContentElement), AElement);
  1959. AppendText(CreateH2(ContentElement), SDocDeclaration);
  1960. AppendSourceRef(ContentElement,AElement);
  1961. TableEl := CreateTable(ContentElement);
  1962. TREl := CreateTR(TableEl);
  1963. CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
  1964. AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
  1965. if (AElement.Visibility<>visDefault) then
  1966. begin
  1967. s:=VisibilityNames[AElement.Visibility];
  1968. AppendKw(CodeEl, s);
  1969. end;
  1970. AppendText(CodeEl, ' ');
  1971. if AElement is TPasProperty then
  1972. CreatePropertyPage(TPasProperty(AElement))
  1973. else if AElement is TPasConst then
  1974. CreateConstPage(TPasConst(AElement))
  1975. else if (AElement is TPasVariable) then
  1976. CreateVarPage(TPasVariable(AElement))
  1977. else if AElement is TPasProcedureBase then
  1978. AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
  1979. else if AElement is TPasType then
  1980. CreateTypePage(TPasType(AElement))
  1981. else
  1982. AppendText(CreateWarning(ContentElement), '<' + AElement.ClassName + '>');
  1983. FinishElementPage(AElement);
  1984. end;
  1985. procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
  1986. var
  1987. TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
  1988. begin
  1989. AppendMenuBar(-1);
  1990. AppendTitle(AVar.FullName,AVar.Hints);
  1991. AppendShortDescr(CreatePara(ContentElement), AVar);
  1992. AppendText(CreateH2(ContentElement), SDocDeclaration);
  1993. AppendSourceRef(ContentElement,AVar);
  1994. TableEl := CreateTable(ContentElement);
  1995. TREl := CreateTR(TableEl);
  1996. TDEl := CreateTD(TREl);
  1997. CodeEl := CreateCode(CreatePara(TDEl));
  1998. AppendKw(CodeEl, 'var');
  1999. AppendText(CodeEl, ' ' + AVar.Name);
  2000. if Assigned(AVar.VarType) then
  2001. begin
  2002. AppendSym(CodeEl, ': ');
  2003. El := AppendType(CodeEl, TableEl, AVar.VarType, False);
  2004. end else
  2005. El := CodeEl;
  2006. if Length(AVar.Value) > 0 then
  2007. AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
  2008. else
  2009. AppendSym(El, ';');
  2010. FinishElementPage(AVar);
  2011. end;
  2012. procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
  2013. var
  2014. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2015. begin
  2016. AppendMenuBar(-1);
  2017. AppendTitle(UTF8Decode(AProc.Name),AProc.Hints);
  2018. AppendShortDescr(CreatePara(ContentElement), AProc);
  2019. AppendText(CreateH2(ContentElement), SDocDeclaration);
  2020. AppendSourceRef(ContentElement,AProc);
  2021. TableEl := CreateTable(ContentElement);
  2022. TREl := CreateTR(TableEl);
  2023. TDEl := CreateTD(TREl);
  2024. CodeEl := CreateCode(CreatePara(TDEl));
  2025. AppendProcDecl(CodeEl, TableEl, AProc);
  2026. FinishElementPage(AProc);
  2027. end;
  2028. function THTMLWriter.InterPretOption ( const Cmd, Arg: String ) : boolean;
  2029. Function ReadFile(aFileName : string) : TstringStream;
  2030. begin
  2031. aFileName:= SetDirSeparators(aFileName);
  2032. try
  2033. if copy(aFileName,1,1)<>'@' then
  2034. Result:=TStringStream.Create(aFileName)
  2035. else
  2036. begin
  2037. Delete(aFileName,1,1);
  2038. Result:=TStringStream.Create('');
  2039. Result.LoadFromFile(aFileName);
  2040. Result.Position:=0;
  2041. end;
  2042. except
  2043. Result.Free;
  2044. Raise;
  2045. end;
  2046. end;
  2047. begin
  2048. Result:=True;
  2049. if Cmd = '--html-search' then
  2050. SearchPage := Arg
  2051. else if Cmd = '--footer' then
  2052. FFooterHTML := ReadFile(Arg)
  2053. else if Cmd = '--header' then
  2054. FHeaderHTML := ReadFile(Arg)
  2055. else if Cmd = '--navigator' then
  2056. FNavigatorHTML := ReadFile(Arg)
  2057. else if Cmd = '--charset' then
  2058. CharSet := Arg
  2059. else if Cmd = '--index-colcount' then
  2060. IndexColCount := StrToIntDef(Arg,IndexColCount)
  2061. else if Cmd = '--image-url' then
  2062. BaseImageURL := Arg
  2063. else if Cmd = '--css-file' then
  2064. FCSSFile := arg
  2065. else if Cmd = '--footer-date' then
  2066. begin
  2067. FIncludeDateInFooter:=True;
  2068. FDateFormat:=Arg;
  2069. end
  2070. else if Cmd = '--disable-menu-brackets' then
  2071. FUseMenuBrackets:=False
  2072. else
  2073. Result:=inherited InterPretOption(Cmd, Arg);
  2074. end;
  2075. class procedure THTMLWriter.Usage(List: TStrings);
  2076. begin
  2077. List.add('--header=file');
  2078. List.Add(SHTMLUsageHeader);
  2079. List.add('--footer=file');
  2080. List.Add(SHTMLUsageFooter);
  2081. List.add('--navigator=file');
  2082. List.Add(SHTMLUsageNavigator);
  2083. List.Add('--footer-date[=Fmt]');
  2084. List.Add(SHTMLUsageFooterDate);
  2085. List.Add('--charset=set');
  2086. List.Add(SHTMLUsageCharset);
  2087. List.Add('--html-search=pagename');
  2088. List.Add(SHTMLHtmlSearch);
  2089. List.Add('--index-colcount=N');
  2090. List.Add(SHTMLIndexColcount);
  2091. List.Add('--image-url=url');
  2092. List.Add(SHTMLImageUrl);
  2093. List.Add('--disable-menu-brackets');
  2094. List.Add(SHTMLDisableMenuBrackets);
  2095. inherited Usage(List);
  2096. end;
  2097. class procedure THTMLWriter.SplitImport(var AFilename, ALinkPrefix: String);
  2098. var
  2099. i: integer;
  2100. begin
  2101. i := Pos(',', AFilename);
  2102. if i > 0 then
  2103. begin //split into filename and prefix
  2104. ALinkPrefix := Copy(AFilename,i+1,Length(AFilename));
  2105. SetLength(AFilename, i-1);
  2106. end
  2107. else if ALinkPrefix = '' then
  2108. begin //synthesize outdir\pgk.xct, ..\pkg
  2109. ALinkPrefix := '../' + ChangeFileExt(ExtractFileName(AFilename), '');
  2110. AFilename := ChangeFileExt(AFilename, '.xct');
  2111. end;
  2112. end;
  2113. class function THTMLWriter.FileNameExtension: String;
  2114. begin
  2115. result:='';
  2116. end;
  2117. // private methods
  2118. procedure THTMLWriter.SetOnTest(const AValue: TNotifyEvent);
  2119. begin
  2120. if FOnTest=AValue then exit;
  2121. FOnTest:=AValue;
  2122. end;
  2123. initialization
  2124. // Do not localize.
  2125. RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
  2126. finalization
  2127. UnRegisterWriter('html');
  2128. end.