dw_html.pp 70 KB

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