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