dw_html.pp 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365
  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 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. begin
  289. if Element.Args.Count > 0 then
  290. begin
  291. AppendSym(CodeEl, '(');
  292. for i := 0 to Element.Args.Count - 1 do
  293. begin
  294. Arg := TPasArgument(Element.Args[i]);
  295. CodeEl := CreateIndentedCodeEl(Indent + 2);
  296. case Arg.Access of
  297. argConst: AppendKw(CodeEl, 'const ');
  298. argVar: AppendKw(CodeEl, 'var ');
  299. argOut: AppendKw(CodeEl, 'out ');
  300. end;
  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. var
  1583. ParaEl,TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1584. i: Integer;
  1585. ThisInterface,
  1586. ThisClass: TPasClassType;
  1587. ThisTreeNode: TPasElementNode;
  1588. begin
  1589. //WriteLn('@ClassPageBody.CreateMainPage Class=', AClass.Name);
  1590. AppendMenuBar(-1);
  1591. AppendTitle(UTF8Decode(AClass.Name),AClass.Hints);
  1592. ParaEl := CreatePara(ContentElement);
  1593. AppendClassMemberListLink(aClass,ParaEl,PropertiesByInheritanceSubindex, UTF8Decode(SDocProperties));
  1594. AppendClassMemberListLink(aClass,ParaEl,MethodsByInheritanceSubindex, UTF8Decode(SDocMethods));
  1595. AppendClassMemberListLink(aClass,ParaEl,EventsByInheritanceSubindex, UTF8Decode(SDocEvents));
  1596. AppendShortDescr(CreatePara(ContentElement), AClass);
  1597. AppendText(CreateH2(ContentElement), UTF8Decode(SDocDeclaration));
  1598. AppendSourceRef(ContentElement,AClass);
  1599. TableEl := CreateTable(ContentElement);
  1600. TREl := CreateTR(TableEl);
  1601. TDEl := CreateTD(TREl);
  1602. CodeEl := CreateCode(CreatePara(TDEl));
  1603. AppendKw(CodeEl, 'type');
  1604. if AClass.GenericTemplateTypes.Count>0 then
  1605. AppendKw(CodeEl, ' generic ');
  1606. AppendText(CodeEl, ' ' + UTF8Decode(AClass.Name) + ' ');
  1607. if AClass.GenericTemplateTypes.Count>0 then
  1608. AppendGenericTypes(CodeEl,AClass.GenericTemplateTypes,false);
  1609. AppendSym(CodeEl, '=');
  1610. AppendText(CodeEl, ' ');
  1611. AppendKw(CodeEl, UTF8Decode(ObjKindNames[AClass.ObjKind]));
  1612. if Assigned(AClass.AncestorType) then
  1613. begin
  1614. AppendSym(CodeEl, '(');
  1615. AppendHyperlink(CodeEl, AClass.AncestorType);
  1616. if AClass.Interfaces.count>0 Then
  1617. begin
  1618. for i:=0 to AClass.interfaces.count-1 do
  1619. begin
  1620. AppendSym(CodeEl, ', ');
  1621. AppendHyperlink(CodeEl,TPasClassType(AClass.Interfaces[i]));
  1622. end;
  1623. end;
  1624. AppendSym(CodeEl, ')');
  1625. end;
  1626. CreateMemberDeclarations(AClass, AClass.Members,TableEl, not AClass.IsShortDefinition);
  1627. AppendText(CreateH2(ContentElement), UTF8Decode(SDocInheritance));
  1628. TableEl := CreateTable(ContentElement);
  1629. // Now we are using only TreeClass for show inheritance
  1630. ThisClass := AClass; ThisTreeNode := Nil;
  1631. if AClass.ObjKind = okInterface then
  1632. ThisTreeNode := TreeInterface.GetPasElNode(AClass)
  1633. else
  1634. ThisTreeNode := TreeClass.GetPasElNode(AClass);
  1635. while True do
  1636. begin
  1637. TREl := CreateTR(TableEl);
  1638. TDEl := CreateTD_vtop(TREl);
  1639. TDEl['align'] := 'center';
  1640. CodeEl := CreateCode(CreatePara(TDEl));
  1641. // Show class item
  1642. if Assigned(ThisClass) Then
  1643. AppendHyperlink(CodeEl, ThisClass);
  1644. //else
  1645. // AppendHyperlink(CodeEl, ThisTreeNode);
  1646. // Show links to class interfaces
  1647. if Assigned(ThisClass) and (ThisClass.Interfaces.count>0) then
  1648. begin
  1649. for i:=0 to ThisClass.interfaces.count-1 do
  1650. begin
  1651. ThisInterface:=TPasClassType(ThisClass.Interfaces[i]);
  1652. AppendText(CodeEl,',');
  1653. AppendHyperlink(CodeEl, ThisInterface);
  1654. end;
  1655. end;
  1656. // short class description
  1657. if Assigned(ThisClass) then
  1658. AppendShortDescrCell(TREl, ThisClass);
  1659. if Assigned(ThisTreeNode) then
  1660. if Assigned(ThisTreeNode.ParentNode) then
  1661. begin
  1662. TDEl := CreateTD(CreateTR(TableEl));
  1663. TDEl['align'] := 'center';
  1664. AppendText(TDEl, '|');
  1665. ThisClass := ThisTreeNode.ParentNode.Element;
  1666. ThisTreeNode := ThisTreeNode.ParentNode;
  1667. end
  1668. else
  1669. begin
  1670. ThisClass := nil;
  1671. ThisTreeNode:= nil;
  1672. break;
  1673. end
  1674. else
  1675. break;
  1676. end;
  1677. FinishElementPage(AClass);
  1678. end;
  1679. procedure THTMLWriter.CreateClassInheritanceSubpage(aClass : TPasClassType; AFilter: TMemberFilter);
  1680. var
  1681. ThisClass: TPasClassType;
  1682. i: Integer;
  1683. Member: TPasElement;
  1684. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  1685. begin
  1686. TableEl := CreateTable(ContentElement);
  1687. ThisClass := AClass;
  1688. while True do
  1689. begin
  1690. TREl := CreateTR(TableEl);
  1691. TDEl := CreateTD(TREl);
  1692. TDEl['colspan'] := '3';
  1693. CreateTD(TREl);
  1694. LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
  1695. if Assigned(LinkEl) then
  1696. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1697. '''; return false;';
  1698. for i := 0 to ThisClass.Members.Count - 1 do
  1699. begin
  1700. Member := TPasElement(ThisClass.Members[i]);
  1701. if Not (Engine.ShowElement(Member) and AFilter(Member)) then
  1702. continue;
  1703. TREl := CreateTR(TableEl);
  1704. ParaEl := CreatePara(CreateTD(TREl));
  1705. case Member.Visibility of
  1706. visPrivate:
  1707. AppendText(ParaEl, 'pv');
  1708. visProtected:
  1709. AppendText(ParaEl, 'pt');
  1710. visPublished:
  1711. AppendText(ParaEl, 'pl');
  1712. else
  1713. end;
  1714. AppendNbSp(ParaEl, 1);
  1715. ParaEl := CreateTD(TREl);
  1716. if (Member.ClassType = TPasProperty) and
  1717. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  1718. begin
  1719. AppendText(ParaEl, 'ro');
  1720. AppendNbSp(ParaEl, 1);
  1721. end;
  1722. LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
  1723. if Assigned(LinkEl) then
  1724. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1725. '''; return false;';
  1726. end;
  1727. if (not Assigned(ThisClass.AncestorType)) or
  1728. (not (ThisClass.AncestorType.ClassType.inheritsfrom(TPasClassType))) then
  1729. break;
  1730. ThisClass := TPasClassType(ThisClass.AncestorType);
  1731. AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
  1732. end;
  1733. end;
  1734. procedure THTMLWriter.CreateClassSortedSubpage(AClass: TPasClassType; AFilter: TMemberFilter);
  1735. var
  1736. List: TFPList;
  1737. ThisClass: TPasClassType;
  1738. i, j: Integer;
  1739. Member: TPasElement;
  1740. ParaEl, TableEl, TREl, TDEl, LinkEl: TDOMElement;
  1741. begin
  1742. List := TFPList.Create;
  1743. try
  1744. ThisClass := AClass;
  1745. while True do
  1746. begin
  1747. for i := 0 to ThisClass.Members.Count - 1 do
  1748. begin
  1749. Member := TPasElement(ThisClass.Members[i]);
  1750. if Engine.ShowElement(Member) and AFilter(Member) then
  1751. begin
  1752. j := 0;
  1753. while (j < List.Count) and
  1754. (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
  1755. Inc(j);
  1756. List.Insert(j, Member);
  1757. end;
  1758. end;
  1759. if (not Assigned(ThisClass.AncestorType)) or
  1760. (not (ThisClass.AncestorType.ClassType.inheritsfrom(TPasClassType))) then
  1761. break;
  1762. ThisClass := TPasClassType(ThisClass.AncestorType);
  1763. end;
  1764. TableEl := CreateTable(ContentElement);
  1765. for i := 0 to List.Count - 1 do
  1766. begin
  1767. Member := TPasElement(List[i]);
  1768. TREl := CreateTR(TableEl);
  1769. ParaEl := CreatePara(CreateTD(TREl));
  1770. case Member.Visibility of
  1771. visPrivate:
  1772. AppendText(ParaEl, 'pv');
  1773. visProtected:
  1774. AppendText(ParaEl, 'pt');
  1775. visPublished:
  1776. AppendText(ParaEl, 'pl');
  1777. else
  1778. end;
  1779. AppendNbSp(ParaEl, 1);
  1780. ParaEl := CreatePara(CreateTD(TREl));
  1781. if (Member.ClassType = TPasProperty) and
  1782. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  1783. begin
  1784. AppendText(ParaEl, 'ro');
  1785. AppendNbSp(ParaEl, 1);
  1786. end;
  1787. TDEl := CreateTD(TREl);
  1788. TDEl['nowrap'] := 'nowrap';
  1789. ParaEl := CreatePara(TDEl);
  1790. LinkEl := AppendHyperlink(ParaEl, Member);
  1791. if Assigned(LinkEl) then
  1792. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1793. '''; return false;';
  1794. AppendText(ParaEl, ' (');
  1795. LinkEl := AppendHyperlink(ParaEl, Member.Parent);
  1796. if Assigned(LinkEl) then
  1797. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  1798. '''; return false;';
  1799. AppendText(ParaEl, ')');
  1800. end;
  1801. finally
  1802. List.Free;
  1803. end;
  1804. end;
  1805. procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
  1806. begin
  1807. case ASubpageIndex of
  1808. 0:
  1809. CreateClassMainPage(aClass);
  1810. PropertiesByInheritanceSubindex:
  1811. CreateClassInheritanceSubpage(aClass,@PropertyFilter);
  1812. PropertiesByNameSubindex:
  1813. CreateClassSortedSubpage(aClass,@PropertyFilter);
  1814. MethodsByInheritanceSubindex:
  1815. CreateClassInheritanceSubpage(aClass,@MethodFilter);
  1816. MethodsByNameSubindex:
  1817. CreateClassSortedSubpage(aClass,@MethodFilter);
  1818. EventsByInheritanceSubindex:
  1819. CreateClassInheritanceSubpage(aClass,@EventFilter);
  1820. EventsByNameSubindex:
  1821. CreateClassSortedSubpage(aClass,@EventFilter);
  1822. end;
  1823. end;
  1824. procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
  1825. var
  1826. TableEl, TREl, CodeEl: TDOMElement;
  1827. procedure CreateVarPage(Element: TPasVariable);
  1828. begin
  1829. AppendHyperlink(CodeEl, Element.Parent);
  1830. AppendSym(CodeEl, '.');
  1831. AppendText(CodeEl, UTF8Decode(Element.Name));
  1832. if Assigned(Element.VarType) then
  1833. begin
  1834. AppendSym(CodeEl, ' : ');
  1835. AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
  1836. end;
  1837. end;
  1838. procedure CreateTypePage(Element: TPasType);
  1839. begin
  1840. AppendKw(CodeEl, 'type ');
  1841. AppendHyperlink(CodeEl, Element.Parent);
  1842. AppendSym(CodeEl, '.');
  1843. AppendText(CodeEl, UTF8Decode(Element.Name));
  1844. AppendSym(CodeEl, ' = ');
  1845. AppendTypeDecl(Element,TableEl,CodeEl)
  1846. end;
  1847. procedure CreateConstPage(Element: TPasConst);
  1848. begin
  1849. AppendKw(CodeEl, 'const ');
  1850. AppendHyperlink(CodeEl, Element.Parent);
  1851. AppendSym(CodeEl, '.');
  1852. AppendText(CodeEl, UTF8Decode(Element.Name));
  1853. if Assigned(Element.VarType) then
  1854. begin
  1855. AppendSym(CodeEl, ': ');
  1856. AppendType(CodeEl, TableEl, Element.VarType, False);
  1857. end;
  1858. AppendPasSHFragment(CodeEl, ' = ' + Element.Expr.GetDeclaration(True) + ';', 0);
  1859. end;
  1860. procedure CreatePropertyPage(Element: TPasProperty);
  1861. var
  1862. NeedBreak: Boolean;
  1863. T : TPasType;
  1864. A : TPasArgument;
  1865. I : integer;
  1866. begin
  1867. AppendKw(CodeEl, 'property ');
  1868. AppendHyperlink(CodeEl, Element.Parent);
  1869. AppendSym(CodeEl, '.');
  1870. AppendText(CodeEl, UTF8Decode(Element.Name));
  1871. if Assigned(Element.Args) and (Element.Args.Count>0) then
  1872. begin
  1873. AppendSym(CodeEl,'[');
  1874. For I:=0 to Element.Args.Count-1 do
  1875. begin
  1876. If I>0 then
  1877. AppendSym(CodeEl,',');
  1878. A:=TPasArgument(Element.Args[i]);
  1879. AppendText(CodeEl, UTF8Decode(A.Name));
  1880. AppendSym(CodeEl,': ');
  1881. if Assigned(A.ArgType) then
  1882. AppendText(CodeEl,UTF8Decode(A.ArgType.Name))
  1883. else
  1884. AppendText(CodeEl,'<Unknown>');
  1885. end;
  1886. AppendSym(CodeEl,']');
  1887. end;
  1888. T:=Element.ResolvedType;
  1889. if Assigned(T) then
  1890. begin
  1891. AppendSym(CodeEl, ' : ');
  1892. AppendType(CodeEl, TableEl, T, False);
  1893. end;
  1894. NeedBreak := False;
  1895. if Length(TPasProperty(Element).IndexValue) <> 0 then
  1896. begin
  1897. CreateEl(CodeEl, 'br');
  1898. AppendNbsp(CodeEl, 2);
  1899. AppendKw(CodeEl, 'index ');
  1900. AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
  1901. NeedBreak := True;
  1902. end;
  1903. if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
  1904. begin
  1905. CreateEl(CodeEl, 'br');
  1906. AppendNbsp(CodeEl, 2);
  1907. AppendKw(CodeEl, 'read ');
  1908. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).ReadAccessorName));
  1909. NeedBreak := True;
  1910. end;
  1911. if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
  1912. begin
  1913. CreateEl(CodeEl, 'br');
  1914. AppendNbsp(CodeEl, 2);
  1915. AppendKw(CodeEl, 'write ');
  1916. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).WriteAccessorName));
  1917. NeedBreak := True;
  1918. end;
  1919. if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
  1920. begin
  1921. CreateEl(CodeEl, 'br');
  1922. AppendNbsp(CodeEl, 2);
  1923. AppendKw(CodeEl, 'stored ');
  1924. AppendText(CodeEl, UTF8Decode(TPasProperty(Element).StoredAccessorName));
  1925. NeedBreak := True;
  1926. end;
  1927. if Length(TPasProperty(Element).DefaultValue) <> 0 then
  1928. begin
  1929. CreateEl(CodeEl, 'br');
  1930. AppendNbsp(CodeEl, 2);
  1931. AppendKw(CodeEl, 'default ');
  1932. AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
  1933. NeedBreak := True;
  1934. end;
  1935. AppendSym(CodeEl, ';');
  1936. if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
  1937. begin
  1938. if NeedBreak then
  1939. begin
  1940. CreateEl(CodeEl, 'br');
  1941. AppendNbsp(CodeEl, 2);
  1942. end;
  1943. if TPasProperty(Element).IsDefault then
  1944. AppendKw(CodeEl, 'default')
  1945. else
  1946. AppendKw(CodeEl, 'nodefault');
  1947. AppendSym(CodeEl, ';');
  1948. end;
  1949. end;
  1950. var
  1951. s: String;
  1952. begin
  1953. AppendMenuBar(-1);
  1954. AppendTitle(UTF8Decode(AElement.FullName),AElement.Hints);
  1955. AppendShortDescr(CreatePara(ContentElement), AElement);
  1956. AppendText(CreateH2(ContentElement), SDocDeclaration);
  1957. AppendSourceRef(ContentElement,AElement);
  1958. TableEl := CreateTable(ContentElement);
  1959. TREl := CreateTR(TableEl);
  1960. CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
  1961. AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
  1962. if (AElement.Visibility<>visDefault) then
  1963. begin
  1964. s:=VisibilityNames[AElement.Visibility];
  1965. AppendKw(CodeEl, s);
  1966. end;
  1967. AppendText(CodeEl, ' ');
  1968. if AElement is TPasProperty then
  1969. CreatePropertyPage(TPasProperty(AElement))
  1970. else if AElement is TPasConst then
  1971. CreateConstPage(TPasConst(AElement))
  1972. else if (AElement is TPasVariable) then
  1973. CreateVarPage(TPasVariable(AElement))
  1974. else if AElement is TPasProcedureBase then
  1975. AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
  1976. else if AElement is TPasType then
  1977. CreateTypePage(TPasType(AElement))
  1978. else
  1979. AppendText(CreateWarning(ContentElement), '<' + AElement.ClassName + '>');
  1980. FinishElementPage(AElement);
  1981. end;
  1982. procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
  1983. var
  1984. TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
  1985. begin
  1986. AppendMenuBar(-1);
  1987. AppendTitle(AVar.FullName,AVar.Hints);
  1988. AppendShortDescr(CreatePara(ContentElement), AVar);
  1989. AppendText(CreateH2(ContentElement), SDocDeclaration);
  1990. AppendSourceRef(ContentElement,AVar);
  1991. TableEl := CreateTable(ContentElement);
  1992. TREl := CreateTR(TableEl);
  1993. TDEl := CreateTD(TREl);
  1994. CodeEl := CreateCode(CreatePara(TDEl));
  1995. AppendKw(CodeEl, 'var');
  1996. AppendText(CodeEl, ' ' + AVar.Name);
  1997. if Assigned(AVar.VarType) then
  1998. begin
  1999. AppendSym(CodeEl, ': ');
  2000. El := AppendType(CodeEl, TableEl, AVar.VarType, False);
  2001. end else
  2002. El := CodeEl;
  2003. if Length(AVar.Value) > 0 then
  2004. AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
  2005. else
  2006. AppendSym(El, ';');
  2007. FinishElementPage(AVar);
  2008. end;
  2009. procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
  2010. var
  2011. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2012. begin
  2013. AppendMenuBar(-1);
  2014. AppendTitle(UTF8Decode(AProc.Name),AProc.Hints);
  2015. AppendShortDescr(CreatePara(ContentElement), AProc);
  2016. AppendText(CreateH2(ContentElement), SDocDeclaration);
  2017. AppendSourceRef(ContentElement,AProc);
  2018. TableEl := CreateTable(ContentElement);
  2019. TREl := CreateTR(TableEl);
  2020. TDEl := CreateTD(TREl);
  2021. CodeEl := CreateCode(CreatePara(TDEl));
  2022. AppendProcDecl(CodeEl, TableEl, AProc);
  2023. FinishElementPage(AProc);
  2024. end;
  2025. function THTMLWriter.InterPretOption ( const Cmd, Arg: String ) : boolean;
  2026. Function ReadFile(aFileName : string) : TstringStream;
  2027. begin
  2028. aFileName:= SetDirSeparators(aFileName);
  2029. try
  2030. if copy(aFileName,1,1)<>'@' then
  2031. Result:=TStringStream.Create(aFileName)
  2032. else
  2033. begin
  2034. Delete(aFileName,1,1);
  2035. Result:=TStringStream.Create('');
  2036. Result.LoadFromFile(aFileName);
  2037. Result.Position:=0;
  2038. end;
  2039. except
  2040. Result.Free;
  2041. Raise;
  2042. end;
  2043. end;
  2044. begin
  2045. Result:=True;
  2046. if Cmd = '--html-search' then
  2047. SearchPage := Arg
  2048. else if Cmd = '--footer' then
  2049. FFooterHTML := ReadFile(Arg)
  2050. else if Cmd = '--header' then
  2051. FHeaderHTML := ReadFile(Arg)
  2052. else if Cmd = '--navigator' then
  2053. FNavigatorHTML := ReadFile(Arg)
  2054. else if Cmd = '--charset' then
  2055. CharSet := Arg
  2056. else if Cmd = '--index-colcount' then
  2057. IndexColCount := StrToIntDef(Arg,IndexColCount)
  2058. else if Cmd = '--image-url' then
  2059. BaseImageURL := Arg
  2060. else if Cmd = '--css-file' then
  2061. FCSSFile := arg
  2062. else if Cmd = '--footer-date' then
  2063. begin
  2064. FIncludeDateInFooter:=True;
  2065. FDateFormat:=Arg;
  2066. end
  2067. else if Cmd = '--disable-menu-brackets' then
  2068. FUseMenuBrackets:=False
  2069. else
  2070. Result:=inherited InterPretOption(Cmd, Arg);
  2071. end;
  2072. class procedure THTMLWriter.Usage(List: TStrings);
  2073. begin
  2074. List.add('--header=file');
  2075. List.Add(SHTMLUsageHeader);
  2076. List.add('--footer=file');
  2077. List.Add(SHTMLUsageFooter);
  2078. List.add('--navigator=file');
  2079. List.Add(SHTMLUsageNavigator);
  2080. List.Add('--footer-date[=Fmt]');
  2081. List.Add(SHTMLUsageFooterDate);
  2082. List.Add('--charset=set');
  2083. List.Add(SHTMLUsageCharset);
  2084. List.Add('--html-search=pagename');
  2085. List.Add(SHTMLHtmlSearch);
  2086. List.Add('--index-colcount=N');
  2087. List.Add(SHTMLIndexColcount);
  2088. List.Add('--image-url=url');
  2089. List.Add(SHTMLImageUrl);
  2090. List.Add('--disable-menu-brackets');
  2091. List.Add(SHTMLDisableMenuBrackets);
  2092. inherited Usage(List);
  2093. end;
  2094. class procedure THTMLWriter.SplitImport(var AFilename, ALinkPrefix: String);
  2095. var
  2096. i: integer;
  2097. begin
  2098. i := Pos(',', AFilename);
  2099. if i > 0 then
  2100. begin //split into filename and prefix
  2101. ALinkPrefix := Copy(AFilename,i+1,Length(AFilename));
  2102. SetLength(AFilename, i-1);
  2103. end
  2104. else if ALinkPrefix = '' then
  2105. begin //synthesize outdir\pgk.xct, ..\pkg
  2106. ALinkPrefix := '../' + ChangeFileExt(ExtractFileName(AFilename), '');
  2107. AFilename := ChangeFileExt(AFilename, '.xct');
  2108. end;
  2109. end;
  2110. class function THTMLWriter.FileNameExtension: String;
  2111. begin
  2112. result:='';
  2113. end;
  2114. // private methods
  2115. procedure THTMLWriter.SetOnTest(const AValue: TNotifyEvent);
  2116. begin
  2117. if FOnTest=AValue then exit;
  2118. FOnTest:=AValue;
  2119. end;
  2120. initialization
  2121. // Do not localize.
  2122. RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
  2123. finalization
  2124. UnRegisterWriter('html');
  2125. end.