dw_html.pp 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958
  1. {
  2. $Id$
  3. FPDoc - Free Pascal Documentation Tool
  4. Copyright (C) 2000 - 2003 by
  5. Areca Systems GmbH / Sebastian Guenther, [email protected]
  6. * HTML/XHTML output generator
  7. See the file COPYING, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. }
  13. {$mode objfpc}
  14. {$H+}
  15. unit dw_HTML;
  16. interface
  17. uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
  18. const
  19. // Subpage indices for modules
  20. ResstrSubindex = 1;
  21. ConstsSubindex = 2;
  22. TypesSubindex = 3;
  23. ClassesSubindex = 4;
  24. ProcsSubindex = 5;
  25. VarsSubindex = 6;
  26. // Maybe needed later for topic overview ??
  27. TopicsSubIndex = 7;
  28. // Subpage indices for classes
  29. PropertiesByInheritanceSubindex = 1;
  30. PropertiesByNameSubindex = 2;
  31. MethodsByInheritanceSubindex = 3;
  32. MethodsByNameSubindex = 4;
  33. EventsByInheritanceSubindex = 5;
  34. EventsByNameSubindex = 6;
  35. type
  36. TFileAllocator = class
  37. public
  38. procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); virtual;
  39. function GetFilename(AElement: TPasElement;
  40. ASubindex: Integer): String; virtual; abstract;
  41. function GetRelativePathToTop(AElement: TPasElement): String; virtual;
  42. function GetCSSFilename(ARelativeTo: TPasElement): DOMString; virtual;
  43. end;
  44. TShortNameFileAllocator = class(TFileAllocator)
  45. private
  46. FExtension: String;
  47. public
  48. constructor Create(const AExtension: String);
  49. procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); override;
  50. property Extension: String read FExtension;
  51. end;
  52. TLongNameFileAllocator = class(TFileAllocator)
  53. private
  54. FExtension: String;
  55. public
  56. constructor Create(const AExtension: String);
  57. function GetFilename(AElement: TPasElement;
  58. ASubindex: Integer): String; override;
  59. function GetRelativePathToTop(AElement: TPasElement): String; override;
  60. property Extension: String read FExtension;
  61. end;
  62. TPageInfo = class
  63. Element: TPasElement;
  64. SubpageIndex: Integer;
  65. end;
  66. { THTMLWriter }
  67. THTMLWriter = class(TFPDocWriter)
  68. private
  69. FOnTest: TNotifyEvent;
  70. FPackage: TPasPackage;
  71. function GetPageCount: Integer;
  72. procedure SetOnTest(const AValue: TNotifyEvent);
  73. protected
  74. FAllocator: TFileAllocator;
  75. Procedure CreateAllocator; virtual;
  76. CurDirectory: String; // relative to curdir of process
  77. BaseDirectory: String; // relative path to package base directory
  78. PageInfos: TObjectList; // list of TPageInfo objects
  79. Doc: THTMLDocument;
  80. BodyElement, TitleElement: TDOMElement;
  81. Module: TPasModule;
  82. OutputNodeStack: TList;
  83. CurOutputNode: TDOMNode;
  84. InsideHeadRow, DoPasHighlighting: Boolean;
  85. HighlighterFlags: Byte;
  86. function ResolveLinkID(const Name: String): DOMString;
  87. function ResolveLinkWithinPackage(AElement: TPasElement;
  88. ASubpageIndex: Integer): String;
  89. // Helper functions for creating DOM elements
  90. function CreateEl(Parent: TDOMNode; const AName: DOMString): THTMLElement;
  91. function CreatePara(Parent: TDOMNode): THTMLElement;
  92. function CreateH1(Parent: TDOMNode): THTMLElement;
  93. function CreateH2(Parent: TDOMNode): THTMLElement;
  94. function CreateH3(Parent: TDOMNode): THTMLElement;
  95. function CreateTable(Parent: TDOMNode): THTMLElement;
  96. function CreateContentTable(Parent: TDOMNode): THTMLElement;
  97. function CreateTR(Parent: TDOMNode): THTMLElement;
  98. function CreateTD(Parent: TDOMNode): THTMLElement;
  99. function CreateTD_vtop(Parent: TDOMNode): THTMLElement;
  100. function CreateLink(Parent: TDOMNode; const AHRef: DOMString): THTMLElement;
  101. function CreateAnchor(Parent: TDOMNode; const AName: DOMString): THTMLElement;
  102. function CreateCode(Parent: TDOMNode): THTMLElement;
  103. function CreateWarning(Parent: TDOMNode): THTMLElement;
  104. // Description node conversion
  105. procedure PushOutputNode(ANode: TDOMNode);
  106. procedure PopOutputNode;
  107. procedure DescrWriteText(const AText: DOMString); override;
  108. procedure DescrBeginBold; override;
  109. procedure DescrEndBold; override;
  110. procedure DescrBeginItalic; override;
  111. procedure DescrEndItalic; override;
  112. procedure DescrBeginEmph; override;
  113. procedure DescrEndEmph; override;
  114. procedure DescrWriteFileEl(const AText: DOMString); override;
  115. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  116. procedure DescrWriteVarEl(const AText: DOMString); override;
  117. procedure DescrBeginLink(const AId: DOMString); override;
  118. procedure DescrEndLink; override;
  119. procedure DescrWriteLinebreak; override;
  120. procedure DescrBeginParagraph; override;
  121. procedure DescrEndParagraph; override;
  122. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  123. procedure DescrWriteCodeLine(const ALine: String); override;
  124. procedure DescrEndCode; override;
  125. procedure DescrBeginOrderedList; override;
  126. procedure DescrEndOrderedList; override;
  127. procedure DescrBeginUnorderedList; override;
  128. procedure DescrEndUnorderedList; override;
  129. procedure DescrBeginDefinitionList; override;
  130. procedure DescrEndDefinitionList; override;
  131. procedure DescrBeginListItem; override;
  132. procedure DescrEndListItem; override;
  133. procedure DescrBeginDefinitionTerm; override;
  134. procedure DescrEndDefinitionTerm; override;
  135. procedure DescrBeginDefinitionEntry; override;
  136. procedure DescrEndDefinitionEntry; override;
  137. procedure DescrBeginSectionTitle; override;
  138. procedure DescrBeginSectionBody; override;
  139. procedure DescrEndSection; override;
  140. procedure DescrBeginRemark; override;
  141. procedure DescrEndRemark; override;
  142. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  143. procedure DescrEndTable; override;
  144. procedure DescrBeginTableCaption; override;
  145. procedure DescrEndTableCaption; override;
  146. procedure DescrBeginTableHeadRow; override;
  147. procedure DescrEndTableHeadRow; override;
  148. procedure DescrBeginTableRow; override;
  149. procedure DescrEndTableRow; override;
  150. procedure DescrBeginTableCell; override;
  151. procedure DescrEndTableCell; override;
  152. procedure AppendText(Parent: TDOMNode; const AText: DOMString);
  153. procedure AppendNbSp(Parent: TDOMNode; ACount: Integer);
  154. procedure AppendSym(Parent: TDOMNode; const AText: DOMString);
  155. procedure AppendKw(Parent: TDOMNode; const AText: DOMString);
  156. function AppendPasSHFragment(Parent: TDOMNode; const AText: String;
  157. AShFlags: Byte): Byte;
  158. Procedure AppendShortDescr(AContext : TPasElement;Parent: TDOMNode; DocNode : TDocNode);
  159. procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
  160. procedure AppendDescr(AContext: TPasElement; Parent: TDOMNode;
  161. DescrNode: TDOMElement; AutoInsertBlock: Boolean);
  162. procedure AppendDescrSection(AContext: TPasElement; Parent: TDOMNode;
  163. DescrNode: TDOMElement; const ATitle: DOMString);
  164. procedure AppendShortDescrCell(Parent: TDOMNode; Element: TPasElement);
  165. function AppendHyperlink(Parent: TDOMNode; Element: TPasElement): TDOMElement;
  166. function AppendType(CodeEl, TableEl: TDOMElement;
  167. Element: TPasType; Expanded: Boolean): TDOMElement;
  168. function AppendProcType(CodeEl, TableEl: TDOMElement;
  169. Element: TPasProcedureType; Indent: Integer): TDOMElement;
  170. procedure AppendProcExt(CodeEl: TDOMElement; Element: TPasProcedure);
  171. procedure AppendProcDecl(CodeEl, TableEl: TDOMElement;
  172. Element: TPasProcedureBase);
  173. procedure AppendProcArgsSection(Parent: TDOMNode;
  174. Element: TPasProcedureType);
  175. procedure AppendTitle(const AText: DOMString);
  176. procedure AppendMenuBar(ASubpageIndex: Integer);
  177. procedure AppendTopicMenuBar(Topic : TTopicElement);
  178. procedure AppendSourceRef(AElement: TPasElement);
  179. procedure FinishElementPage(AElement: TPasElement);
  180. Procedure AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
  181. Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
  182. procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
  183. procedure CreatePackagePageBody;
  184. Procedure CreateTopicPageBody(AElement : TTopicElement);
  185. procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
  186. procedure CreateConstPageBody(AConst: TPasConst);
  187. procedure CreateTypePageBody(AType: TPasType);
  188. procedure CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
  189. procedure CreateClassMemberPageBody(AElement: TPasElement);
  190. procedure CreateVarPageBody(AVar: TPasVariable);
  191. procedure CreateProcPageBody(AProc: TPasProcedureBase);
  192. Procedure CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
  193. public
  194. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  195. destructor Destroy; override;
  196. // Single-page generation
  197. function CreateHTMLPage(AElement: TPasElement;
  198. ASubpageIndex: Integer): TXMLDocument;
  199. function CreateXHTMLPage(AElement: TPasElement;
  200. ASubpageIndex: Integer): TXMLDocument;
  201. // For producing complete package documentation
  202. procedure WriteHTMLPages;
  203. procedure WriteXHTMLPages;
  204. SearchPage: String;
  205. property Allocator: TFileAllocator read FAllocator;
  206. property Package: TPasPackage read FPackage;
  207. property PageCount: Integer read GetPageCount;
  208. property OnTest: TNotifyEvent read FOnTest write SetOnTest;
  209. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  210. Procedure WriteDoc; override;
  211. end;
  212. THTMWriter = class(THTMLWriter)
  213. Protected
  214. Procedure CreateAllocator; override;
  215. end;
  216. implementation
  217. uses SysUtils, XHTML, XMLWrite, HTMWrite, sh_pas;
  218. Function FixHTMLpath(S : String) : STring;
  219. begin
  220. Result:=StringReplace(S,'\','/',[rfReplaceAll]);
  221. end;
  222. procedure TFileAllocator.AllocFilename(AElement: TPasElement;
  223. ASubindex: Integer);
  224. begin
  225. end;
  226. function TFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
  227. begin
  228. SetLength(Result, 0);
  229. end;
  230. function TFileAllocator.GetCSSFilename(ARelativeTo: TPasElement): DOMString;
  231. begin
  232. Result := GetRelativePathToTop(ARelativeTo) + 'fpdoc.css';
  233. end;
  234. constructor TShortNameFileAllocator.Create(const AExtension: String);
  235. begin
  236. inherited Create;
  237. FExtension := AExtension;
  238. end;
  239. procedure TShortNameFileAllocator.AllocFilename(AElement: TPasElement;
  240. ASubindex: Integer);
  241. begin
  242. // !!!: Add element to file list
  243. end;
  244. constructor TLongNameFileAllocator.Create(const AExtension: String);
  245. begin
  246. inherited Create;
  247. FExtension := AExtension;
  248. end;
  249. function TLongNameFileAllocator.GetFilename(AElement: TPasElement;
  250. ASubindex: Integer): String;
  251. var
  252. i: Integer;
  253. begin
  254. if AElement.ClassType = TPasPackage then
  255. Result := 'index'
  256. else if AElement.ClassType = TPasModule then
  257. Result := LowerCase(AElement.Name) + PathDelim + 'index'
  258. else
  259. begin
  260. Result := LowerCase(AElement.PathName);
  261. i := 1;
  262. if (Length(Result)>0) and (Result[1]='#') then
  263. begin
  264. while Result[i] <> '.' do
  265. Inc(i);
  266. Result:=Copy(Result,i+1,Length(Result));
  267. end;
  268. i := 1;
  269. while (I<=Length(Result)) and (Result[i]<>'.') do
  270. Inc(i);
  271. If (I<=Length(Result)) and (I>0) then
  272. Result[i]:= PathDelim;
  273. end;
  274. if ASubindex > 0 then
  275. Result := Result + '-' + IntToStr(ASubindex);
  276. Result := Result + Extension;
  277. end;
  278. function TLongNameFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
  279. begin
  280. if (AElement.ClassType=TPasPackage) then
  281. Result := ''
  282. else if (AElement.ClassType=TTopicElement) then
  283. begin
  284. If (AElement.Parent.ClassType=TTopicElement) then
  285. Result:='../'+GetRelativePathToTop(AElement.Parent)
  286. else if (AElement.Parent.ClassType=TPasPackage) then
  287. Result:=''
  288. else if (AElement.Parent.ClassType=TPasModule) then
  289. Result:='../';
  290. end
  291. else
  292. Result := '../';
  293. end;
  294. constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  295. procedure AddPage(AElement: TPasElement; ASubpageIndex: Integer);
  296. var
  297. PageInfo: TPageInfo;
  298. begin
  299. PageInfo := TPageInfo.Create;
  300. PageInfo.Element := AElement;
  301. PageInfo.SubpageIndex := ASubpageIndex;
  302. PageInfos.Add(PageInfo);
  303. Allocator.AllocFilename(AElement, ASubpageIndex);
  304. if ASubpageIndex = 0 then
  305. Engine.AddLink(AElement.PathName,
  306. Allocator.GetFilename(AElement, ASubpageIndex));
  307. end;
  308. procedure AddTopicPages(AElement: TPasElement);
  309. var
  310. PreviousTopic,
  311. TopicElement : TTopicElement;
  312. PageInfo : TPageInfo;
  313. DocNode,
  314. TopicNode : TDocNode;
  315. begin
  316. DocNode:=Engine.FindDocNode(AElement);
  317. If not Assigned(DocNode) then
  318. exit;
  319. TopicNode:=DocNode.FirstChild;
  320. PreviousTopic:=Nil;
  321. While Assigned(TopicNode) do
  322. begin
  323. If TopicNode.TopicNode then
  324. begin
  325. TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
  326. Topics.Add(TopicElement);
  327. TopicElement.TopicNode:=TopicNode;
  328. TopicElement.Previous:=PreviousTopic;
  329. If Assigned(PreviousTopic) then
  330. PreviousTopic.Next:=TopicElement;
  331. PreviousTopic:=TopicElement;
  332. if AElement is TTopicElement then
  333. TTopicElement(AElement).SubTopics.Add(TopicElement);
  334. PageInfo := TPageInfo.Create;
  335. PageInfo.Element := TopicElement;
  336. PageInfo.SubpageIndex := 0;
  337. PageInfos.Add(PageInfo);
  338. Allocator.AllocFilename(TopicElement,0);
  339. Engine.AddLink(TopicElement.PathName, Allocator.GetFilename(TopicElement,0));
  340. if AElement is TTopicElement then
  341. TTopicElement(AElement).SubTopics.Add(TopicElement)
  342. else // Only one level of recursion.
  343. AddTopicPages(TopicElement);
  344. end;
  345. TopicNode:=TopicNode.NextSibling;
  346. end;
  347. end;
  348. procedure AddPages(AElement: TPasElement; ASubpageIndex: Integer;
  349. AList: TList);
  350. var
  351. i: Integer;
  352. begin
  353. if AList.Count > 0 then
  354. begin
  355. AddPage(AElement, ASubpageIndex);
  356. for i := 0 to AList.Count - 1 do
  357. AddPage(TPasElement(AList[i]), 0);
  358. end;
  359. end;
  360. procedure ScanModule(AModule: TPasModule);
  361. var
  362. i, j, k: Integer;
  363. s: String;
  364. ClassEl: TPasClassType;
  365. FPEl, AncestorMemberEl: TPasElement;
  366. DocNode: TDocNode;
  367. DidAutolink: Boolean;
  368. begin
  369. AddPage(AModule, 0);
  370. AddTopicPages(AModule);
  371. with AModule do
  372. begin
  373. if InterfaceSection.ResStrings.Count > 0 then
  374. begin
  375. AddPage(AModule, ResstrSubindex);
  376. s := Allocator.GetFilename(AModule, ResstrSubindex);
  377. for i := 0 to InterfaceSection.ResStrings.Count - 1 do
  378. with TPasResString(InterfaceSection.ResStrings[i]) do
  379. Engine.AddLink(PathName, s + '#' + LowerCase(Name));
  380. end;
  381. AddPages(AModule, ConstsSubindex, InterfaceSection.Consts);
  382. AddPages(AModule, TypesSubindex, InterfaceSection.Types);
  383. if InterfaceSection.Classes.Count > 0 then
  384. begin
  385. AddPage(AModule, ClassesSubindex);
  386. for i := 0 to InterfaceSection.Classes.Count - 1 do
  387. begin
  388. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  389. AddPage(ClassEl, 0);
  390. // !!!: Only add when there are items
  391. AddPage(ClassEl, PropertiesByInheritanceSubindex);
  392. AddPage(ClassEl, PropertiesByNameSubindex);
  393. AddPage(ClassEl, MethodsByInheritanceSubindex);
  394. AddPage(ClassEl, MethodsByNameSubindex);
  395. AddPage(ClassEl, EventsByInheritanceSubindex);
  396. AddPage(ClassEl, EventsByNameSubindex);
  397. for j := 0 to ClassEl.Members.Count - 1 do
  398. begin
  399. FPEl := TPasElement(ClassEl.Members[j]);
  400. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  401. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  402. continue;
  403. DocNode := Engine.FindDocNode(FPEl);
  404. if not Assigned(DocNode) then
  405. begin
  406. DidAutolink := False;
  407. if Assigned(ClassEl.AncestorType) and
  408. (ClassEl.AncestorType.ClassType = TPasClassType) then
  409. begin
  410. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  411. begin
  412. AncestorMemberEl :=
  413. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  414. if AncestorMemberEl.Name = FPEl.Name then
  415. begin
  416. DocNode := Engine.FindDocNode(AncestorMemberEl);
  417. if Assigned(DocNode) then
  418. begin
  419. DidAutolink := True;
  420. Engine.AddLink(FPEl.PathName,
  421. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  422. break;
  423. end;
  424. end;
  425. end;
  426. end;
  427. if not DidAutolink then
  428. AddPage(FPEl, 0);
  429. end else
  430. AddPage(FPEl, 0);
  431. end;
  432. end;
  433. end;
  434. AddPages(AModule, ProcsSubindex, InterfaceSection.Functions);
  435. AddPages(AModule, VarsSubindex, InterfaceSection.Variables);
  436. end;
  437. end;
  438. var
  439. i: Integer;
  440. begin
  441. inherited ;
  442. CreateAllocator;
  443. FPackage := APackage;
  444. OutputNodeStack := TList.Create;
  445. PageInfos := TObjectList.Create;
  446. // Allocate page for the package itself, if a name is given (i.e. <> '#')
  447. if Length(Package.Name) > 1 then
  448. begin
  449. AddPage(Package, 0);
  450. AddTopicPages(Package);
  451. end;
  452. for i := 0 to Package.Modules.Count - 1 do
  453. ScanModule(TPasModule(Package.Modules[i]));
  454. end;
  455. destructor THTMLWriter.Destroy;
  456. begin
  457. PageInfos.Free;
  458. OutputNodeStack.Free;
  459. inherited Destroy;
  460. end;
  461. function THTMLWriter.CreateHTMLPage(AElement: TPasElement;
  462. ASubpageIndex: Integer): TXMLDocument;
  463. var
  464. HTMLEl: THTMLHtmlElement;
  465. HeadEl: THTMLHeadElement;
  466. El: TDOMElement;
  467. begin
  468. Doc := THTMLDocument.Create;
  469. Result := Doc;
  470. Doc.AppendChild(Doc.CreateProcessingInstruction(
  471. 'DOCTYPE', 'HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"'));
  472. HTMLEl := Doc.CreateHtmlElement;
  473. Doc.AppendChild(HTMLEl);
  474. HeadEl := Doc.CreateHeadElement;
  475. HTMLEl.AppendChild(HeadEl);
  476. El := Doc.CreateElement('meta');
  477. HeadEl.AppendChild(El);
  478. El['http-equiv'] := 'Content-Type';
  479. El['content'] := 'text/html; charset=iso8859-1';
  480. TitleElement := Doc.CreateElement('title');
  481. HeadEl.AppendChild(TitleElement);
  482. El := Doc.CreateElement('link');
  483. BodyElement := Doc.CreateElement('body');
  484. HTMLEl.AppendChild(BodyElement);
  485. CreatePageBody(AElement, ASubpageIndex);
  486. HeadEl.AppendChild(El);
  487. El['rel'] := 'stylesheet';
  488. El['type'] := 'text/css';
  489. El['href'] := FixHtmlPath(Allocator.GetCSSFilename(AElement));
  490. end;
  491. function THTMLWriter.CreateXHTMLPage(AElement: TPasElement;
  492. ASubpageIndex: Integer): TXMLDocument;
  493. begin
  494. Result := nil;
  495. end;
  496. procedure CreatePath(const AFilename: String);
  497. var
  498. EndIndex: Integer;
  499. Path: String;
  500. begin
  501. EndIndex := Length(AFilename);
  502. if EndIndex = 0 then
  503. exit;
  504. while not (AFilename[EndIndex] in DirSeparators) do
  505. begin
  506. Dec(EndIndex);
  507. if EndIndex = 0 then
  508. exit;
  509. end;
  510. Path := Copy(AFilename, 1, EndIndex - 1);
  511. if not FileExists(Path) then
  512. begin
  513. CreatePath(Path);
  514. MkDir(Path);
  515. end;
  516. end;
  517. procedure THTMLWriter.WriteHTMLPages;
  518. var
  519. i: Integer;
  520. PageDoc: TXMLDocument;
  521. Filename: String;
  522. begin
  523. if Engine.Output <> '' then
  524. Engine.Output := IncludeTrailingBackSlash(Engine.Output);
  525. for i := 0 to PageInfos.Count - 1 do
  526. with TPageInfo(PageInfos[i]) do
  527. begin
  528. PageDoc := CreateHTMLPage(Element, SubpageIndex);
  529. try
  530. Filename := Engine.Output + Allocator.GetFilename(Element, SubpageIndex);
  531. CreatePath(Filename);
  532. WriteHTMLFile(PageDoc, Filename);
  533. finally
  534. PageDoc.Free;
  535. end;
  536. end;
  537. end;
  538. procedure THTMLWriter.WriteXHTMLPages;
  539. begin
  540. end;
  541. {procedure THTMLWriter.CreateDoc(const ATitle: DOMString;
  542. AElement: TPasElement; const AFilename: String);
  543. var
  544. El: TDOMElement;
  545. DocInfo: TDocInfo;
  546. CSSName: String;
  547. begin
  548. Doc := TXHTMLDocument.Create;
  549. with TXHTMLDocument(Doc) do
  550. begin
  551. Encoding := 'ISO8859-1';
  552. CSSName := 'fpdoc.css';
  553. if Assigned(Module) then
  554. CSSName := '../' + CSSName;
  555. $IFNDEF ver1_0
  556. StylesheetType := 'text/css';
  557. StylesheetHRef := CSSName;
  558. $ENDIF
  559. CreateRoot(xhtmlStrict);
  560. with RequestHeadElement do
  561. begin
  562. AppendText(RequestTitleElement, ATitle);
  563. El := CreateElement('link');
  564. AppendChild(El);
  565. El['rel'] := 'stylesheet';
  566. El['type'] := 'text/css';
  567. El['href'] := FixHtmlPath(CSSName);
  568. end;
  569. Self.BodyElement := RequestBodyElement('en');
  570. end;
  571. if Length(AFilename) > 0 then
  572. begin
  573. DocInfo := TDocInfo.Create;
  574. DocInfos.Add(DocInfo);
  575. DocInfo.Element := AElement;
  576. DocInfo.Filename := AFilename;
  577. end;
  578. end;
  579. }
  580. { Used for:
  581. - <link> elements in descriptions
  582. - "see also" entries
  583. - AppendHyperlink (for unresolved parse tree element links)
  584. }
  585. function THTMLWriter.ResolveLinkID(const Name: String): DOMString;
  586. var
  587. i: Integer;
  588. ThisPackage: TLinkNode;
  589. begin
  590. if Length(Name) = 0 then
  591. begin
  592. SetLength(Result, 0);
  593. exit;
  594. end;
  595. if Name[1] = '#' then
  596. Result := Engine.FindAbsoluteLink(Name)
  597. else
  598. begin
  599. SetLength(Result, 0);
  600. { Try all packages }
  601. ThisPackage := Engine.RootLinkNode.FirstChild;
  602. while Assigned(ThisPackage) do
  603. begin
  604. Result := Engine.FindAbsoluteLink(ThisPackage.Name + '.' + Name);
  605. if Length(Result) = 0 then
  606. begin
  607. if Assigned(Module) then
  608. Result := Engine.FindAbsoluteLink(Module.PathName + '.' + Name);
  609. // WriteLn('Searching for ', Module.PathName + '.' + Name, ' => ', Result);
  610. if Length(Result) = 0 then
  611. for i := Length(Name) downto 1 do
  612. if Name[i] = '.' then
  613. begin
  614. Result := ResolveLinkID(Copy(Name, 1, i - 1));
  615. exit;
  616. end;
  617. end;
  618. ThisPackage := ThisPackage.NextSibling;
  619. end;
  620. end;
  621. if Length(Result) > 0 then
  622. if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
  623. Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
  624. else
  625. Result := BaseDirectory + Result;
  626. end;
  627. function THTMLWriter.ResolveLinkWithinPackage(AElement: TPasElement;
  628. ASubpageIndex: Integer): String;
  629. var
  630. ParentEl: TPasElement;
  631. begin
  632. ParentEl := AElement;
  633. while Assigned(ParentEl) and not (ParentEl.ClassType = TPasPackage) do
  634. ParentEl := ParentEl.Parent;
  635. if Assigned(ParentEl) and (TPasPackage(ParentEl) = Engine.Package) then
  636. begin
  637. Result := Allocator.GetFilename(AElement, ASubpageIndex);
  638. if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
  639. Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
  640. else
  641. Result := BaseDirectory + Result;
  642. end else
  643. SetLength(Result, 0);
  644. end;
  645. function THTMLWriter.CreateEl(Parent: TDOMNode;
  646. const AName: DOMString): THTMLElement;
  647. begin
  648. Result := Doc.CreateElement(AName);
  649. Parent.AppendChild(Result);
  650. end;
  651. function THTMLWriter.CreatePara(Parent: TDOMNode): THTMLElement;
  652. begin
  653. Result := CreateEl(Parent, 'p');
  654. end;
  655. function THTMLWriter.CreateH1(Parent: TDOMNode): THTMLElement;
  656. begin
  657. Result := CreateEl(Parent, 'h1');
  658. end;
  659. function THTMLWriter.CreateH2(Parent: TDOMNode): THTMLElement;
  660. begin
  661. Result := CreateEl(Parent, 'h2');
  662. end;
  663. function THTMLWriter.CreateH3(Parent: TDOMNode): THTMLElement;
  664. begin
  665. Result := CreateEl(Parent, 'h3');
  666. end;
  667. function THTMLWriter.CreateTable(Parent: TDOMNode): THTMLElement;
  668. begin
  669. Result := CreateEl(Parent, 'table');
  670. Result['cellspacing'] := '0';
  671. Result['cellpadding'] := '0';
  672. end;
  673. function THTMLWriter.CreateContentTable(Parent: TDOMNode): THTMLElement;
  674. begin
  675. Result := CreateEl(Parent, 'table');
  676. end;
  677. function THTMLWriter.CreateTR(Parent: TDOMNode): THTMLElement;
  678. begin
  679. Result := CreateEl(Parent, 'tr');
  680. end;
  681. function THTMLWriter.CreateTD(Parent: TDOMNode): THTMLElement;
  682. begin
  683. Result := CreateEl(Parent, 'td');
  684. end;
  685. function THTMLWriter.CreateTD_vtop(Parent: TDOMNode): THTMLElement;
  686. begin
  687. Result := CreateEl(Parent, 'td');
  688. Result['valign'] := 'top';
  689. end;
  690. function THTMLWriter.CreateLink(Parent: TDOMNode;
  691. const AHRef: DOMString): THTMLElement;
  692. begin
  693. Result := CreateEl(Parent, 'a');
  694. Result['href'] := FixHtmlPath(AHRef);
  695. end;
  696. function THTMLWriter.CreateAnchor(Parent: TDOMNode;
  697. const AName: DOMString): THTMLElement;
  698. begin
  699. Result := CreateEl(Parent, 'a');
  700. Result['name'] := AName;
  701. end;
  702. function THTMLWriter.CreateCode(Parent: TDOMNode): THTMLElement;
  703. begin
  704. Result := CreateEl(CreateEl(Parent, 'tt'), 'nobr');
  705. end;
  706. function THTMLWriter.CreateWarning(Parent: TDOMNode): THTMLElement;
  707. begin
  708. Result := CreateEl(Parent, 'span');
  709. Result['class'] := 'warning';
  710. end;
  711. procedure THTMLWriter.PushOutputNode(ANode: TDOMNode);
  712. begin
  713. OutputNodeStack.Add(CurOutputNode);
  714. CurOutputNode := ANode;
  715. end;
  716. procedure THTMLWriter.PopOutputNode;
  717. begin
  718. CurOutputNode := TDOMNode(OutputNodeStack[OutputNodeStack.Count - 1]);
  719. OutputNodeStack.Delete(OutputNodeStack.Count - 1);
  720. end;
  721. procedure THTMLWriter.DescrWriteText(const AText: DOMString);
  722. begin
  723. AppendText(CurOutputNode, AText);
  724. end;
  725. procedure THTMLWriter.DescrBeginBold;
  726. begin
  727. PushOutputNode(CreateEl(CurOutputNode, 'b'));
  728. end;
  729. procedure THTMLWriter.DescrEndBold;
  730. begin
  731. PopOutputNode;
  732. end;
  733. procedure THTMLWriter.DescrBeginItalic;
  734. begin
  735. PushOutputNode(CreateEl(CurOutputNode, 'i'));
  736. end;
  737. procedure THTMLWriter.DescrEndItalic;
  738. begin
  739. PopOutputNode;
  740. end;
  741. procedure THTMLWriter.DescrBeginEmph;
  742. begin
  743. PushOutputNode(CreateEl(CurOutputNode, 'em'));
  744. end;
  745. procedure THTMLWriter.DescrEndEmph;
  746. begin
  747. PopOutputNode;
  748. end;
  749. procedure THTMLWriter.DescrWriteFileEl(const AText: DOMString);
  750. var
  751. NewEl: TDOMElement;
  752. begin
  753. NewEl := CreateEl(CurOutputNode, 'span');
  754. NewEl['class'] := 'file';
  755. AppendText(NewEl, AText);
  756. end;
  757. procedure THTMLWriter.DescrWriteKeywordEl(const AText: DOMString);
  758. var
  759. NewEl: TDOMElement;
  760. begin
  761. NewEl := CreateEl(CurOutputNode, 'span');
  762. NewEl['class'] := 'kw';
  763. AppendText(NewEl, AText);
  764. end;
  765. procedure THTMLWriter.DescrWriteVarEl(const AText: DOMString);
  766. begin
  767. AppendText(CreateEl(CurOutputNode, 'var'), AText);
  768. end;
  769. procedure THTMLWriter.DescrBeginLink(const AId: DOMString);
  770. var
  771. a,s: String;
  772. begin
  773. a:=AId;
  774. s := ResolveLinkID(a);
  775. if Length(s) = 0 then
  776. begin
  777. WriteLn(Format(SErrUnknownLinkID, [a]));
  778. PushOutputNode(CreateEl(CurOutputNode, 'b'));
  779. end else
  780. PushOutputNode(CreateLink(CurOutputNode, s));
  781. end;
  782. procedure THTMLWriter.DescrEndLink;
  783. begin
  784. PopOutputNode;
  785. end;
  786. procedure THTMLWriter.DescrWriteLinebreak;
  787. begin
  788. CreateEl(CurOutputNode, 'br');
  789. end;
  790. procedure THTMLWriter.DescrBeginParagraph;
  791. begin
  792. PushOutputNode(CreatePara(CurOutputNode));
  793. end;
  794. procedure THTMLWriter.DescrEndParagraph;
  795. begin
  796. PopOutputNode;
  797. end;
  798. procedure THTMLWriter.DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String);
  799. begin
  800. DoPasHighlighting := (AHighlighterName = '') or (AHighlighterName = 'Pascal');
  801. HighlighterFlags := 0;
  802. PushOutputNode(CreateEl(CurOutputNode, 'pre'));
  803. end;
  804. procedure THTMLWriter.DescrWriteCodeLine(const ALine: String);
  805. begin
  806. if DoPasHighlighting then
  807. begin
  808. HighlighterFlags := AppendPasSHFragment(CurOutputNode, ALine,
  809. HighlighterFlags);
  810. AppendText(CurOutputNode, #10);
  811. end else
  812. AppendText(CurOutputNode, ALine + #10);
  813. end;
  814. procedure THTMLWriter.DescrEndCode;
  815. begin
  816. PopOutputNode;
  817. end;
  818. procedure THTMLWriter.DescrBeginOrderedList;
  819. begin
  820. PushOutputNode(CreateEl(CurOutputNode, 'ol'));
  821. end;
  822. procedure THTMLWriter.DescrEndOrderedList;
  823. begin
  824. PopOutputNode;
  825. end;
  826. procedure THTMLWriter.DescrBeginUnorderedList;
  827. begin
  828. PushOutputNode(CreateEl(CurOutputNode, 'ul'));
  829. end;
  830. procedure THTMLWriter.DescrEndUnorderedList;
  831. begin
  832. PopOutputNode;
  833. end;
  834. procedure THTMLWriter.DescrBeginDefinitionList;
  835. begin
  836. PushOutputNode(CreateEl(CurOutputNode, 'dl'));
  837. end;
  838. procedure THTMLWriter.DescrEndDefinitionList;
  839. begin
  840. PopOutputNode;
  841. end;
  842. procedure THTMLWriter.DescrBeginListItem;
  843. begin
  844. PushOutputNode(CreateEl(CurOutputNode, 'li'));
  845. end;
  846. procedure THTMLWriter.DescrEndListItem;
  847. begin
  848. PopOutputNode;
  849. end;
  850. procedure THTMLWriter.DescrBeginDefinitionTerm;
  851. begin
  852. PushOutputNode(CreateEl(CurOutputNode, 'dt'));
  853. end;
  854. procedure THTMLWriter.DescrEndDefinitionTerm;
  855. begin
  856. PopOutputNode;
  857. end;
  858. procedure THTMLWriter.DescrBeginDefinitionEntry;
  859. begin
  860. PushOutputNode(CreateEl(CurOutputNode, 'dd'));
  861. end;
  862. procedure THTMLWriter.DescrEndDefinitionEntry;
  863. begin
  864. PopOutputNode;
  865. end;
  866. procedure THTMLWriter.DescrBeginSectionTitle;
  867. begin
  868. PushOutputNode(CreateEl(CurOutputNode, 'h3'));
  869. end;
  870. procedure THTMLWriter.DescrBeginSectionBody;
  871. begin
  872. PopOutputNode;
  873. end;
  874. procedure THTMLWriter.DescrEndSection;
  875. begin
  876. end;
  877. procedure THTMLWriter.DescrBeginRemark;
  878. var
  879. NewEl, TDEl: TDOMElement;
  880. begin
  881. NewEl := CreateEl(CurOutputNode, 'table');
  882. NewEl['width'] := '100%';
  883. NewEl['border'] := '0';
  884. NewEl['CellSpacing'] := '0';
  885. NewEl['class'] := 'remark';
  886. NewEl := CreateTR(NewEl);
  887. TDEl := CreateTD(NewEl);
  888. TDEl['valign'] := 'top';
  889. TDEl['class'] := 'pre';
  890. AppendText(CreateEl(TDEl, 'b'), SDocRemark);
  891. PushOutputNode(CreateTD(NewEl));
  892. end;
  893. procedure THTMLWriter.DescrEndRemark;
  894. begin
  895. PopOutputNode;
  896. end;
  897. procedure THTMLWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  898. var
  899. Table: TDOMElement;
  900. begin
  901. Table := CreateEl(CurOutputNode, 'table');
  902. Table['border'] := IntToStr(Ord(HasBorder));
  903. PushOutputNode(Table);
  904. end;
  905. procedure THTMLWriter.DescrEndTable;
  906. begin
  907. PopOutputNode;
  908. end;
  909. procedure THTMLWriter.DescrBeginTableCaption;
  910. begin
  911. PushOutputNode(CreateEl(CurOutputNode, 'caption'));
  912. end;
  913. procedure THTMLWriter.DescrEndTableCaption;
  914. begin
  915. PopOutputNode;
  916. end;
  917. procedure THTMLWriter.DescrBeginTableHeadRow;
  918. begin
  919. PushOutputNode(CreateTr(CurOutputNode));
  920. InsideHeadRow := True;
  921. end;
  922. procedure THTMLWriter.DescrEndTableHeadRow;
  923. begin
  924. InsideHeadRow := False;
  925. PopOutputNode;
  926. end;
  927. procedure THTMLWriter.DescrBeginTableRow;
  928. begin
  929. PushOutputNode(CreateTR(CurOutputNode));
  930. end;
  931. procedure THTMLWriter.DescrEndTableRow;
  932. begin
  933. PopOutputNode;
  934. end;
  935. procedure THTMLWriter.DescrBeginTableCell;
  936. begin
  937. if InsideHeadRow then
  938. PushOutputNode(CreateEl(CurOutputNode, 'th'))
  939. else
  940. PushOutputNode(CreateTD(CurOutputNode));
  941. end;
  942. procedure THTMLWriter.DescrEndTableCell;
  943. begin
  944. PopOutputNode;
  945. end;
  946. procedure THTMLWriter.AppendText(Parent: TDOMNode; const AText: DOMString);
  947. begin
  948. Parent.AppendChild(Doc.CreateTextNode(AText));
  949. end;
  950. procedure THTMLWriter.AppendNbSp(Parent: TDOMNode; ACount: Integer);
  951. begin
  952. while ACount > 0 do
  953. begin
  954. Parent.AppendChild(Doc.CreateEntityReference('nbsp'));
  955. Dec(ACount);
  956. end;
  957. end;
  958. procedure THTMLWriter.AppendSym(Parent: TDOMNode; const AText: DOMString);
  959. var
  960. El: TDOMElement;
  961. begin
  962. El := CreateEl(Parent, 'span');
  963. El['class'] := 'sym';
  964. AppendText(El, AText);
  965. end;
  966. procedure THTMLWriter.AppendKw(Parent: TDOMNode; const AText: DOMString);
  967. var
  968. El: TDOMElement;
  969. begin
  970. El := CreateEl(Parent, 'span');
  971. El['class'] := 'kw';
  972. AppendText(El, AText);
  973. end;
  974. function THTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
  975. const AText: String; AShFlags: Byte): Byte;
  976. var
  977. CurParent: TDOMNode;
  978. Line, Last, p: PChar;
  979. IsInSpecial: Boolean;
  980. El: TDOMElement;
  981. begin
  982. GetMem(Line, Length(AText) * 3 + 4);
  983. DoPascalHighlighting(AShFlags, PChar(AText), Line);
  984. Result := AShFlags;
  985. CurParent := Parent;
  986. IsInSpecial := False;
  987. Last := Line;
  988. p := Line;
  989. while p[0] <> #0 do
  990. begin
  991. if p[0] = LF_ESCAPE then
  992. begin
  993. p[0] := #0;
  994. AppendText(CurParent, Last);
  995. if IsInSpecial then
  996. CurParent := Parent;
  997. case Ord(p[1]) of
  998. shDefault:
  999. IsInSpecial := False;
  1000. shInvalid:
  1001. begin
  1002. El := CreateEl(CurParent, 'font');
  1003. El['color'] := 'red';
  1004. CurParent := El;
  1005. IsInSpecial := True;
  1006. end;
  1007. shSymbol:
  1008. begin
  1009. El := CreateEl(CurParent, 'span');
  1010. El['class'] := 'sym';
  1011. CurParent := El;
  1012. IsInSpecial := True;
  1013. end;
  1014. shKeyword:
  1015. begin
  1016. El := CreateEl(CurParent, 'span');
  1017. El['class'] := 'kw';
  1018. CurParent := El;
  1019. IsInSpecial := True;
  1020. end;
  1021. shComment:
  1022. begin
  1023. El := CreateEl(CurParent, 'span');
  1024. El['class'] := 'cmt';
  1025. CurParent := El;
  1026. IsInSpecial := True;
  1027. end;
  1028. shDirective:
  1029. begin
  1030. El := CreateEl(CurParent, 'span');
  1031. El['class'] := 'dir';
  1032. CurParent := El;
  1033. IsInSpecial := True;
  1034. end;
  1035. shNumbers:
  1036. begin
  1037. El := CreateEl(CurParent, 'span');
  1038. El['class'] := 'num';
  1039. CurParent := El;
  1040. IsInSpecial := True;
  1041. end;
  1042. shCharacters:
  1043. begin
  1044. El := CreateEl(CurParent, 'span');
  1045. El['class'] := 'chr';
  1046. CurParent := El;
  1047. IsInSpecial := True;
  1048. end;
  1049. shStrings:
  1050. begin
  1051. El := CreateEl(CurParent, 'span');
  1052. El['class'] := 'str';
  1053. CurParent := El;
  1054. IsInSpecial := True;
  1055. end;
  1056. shAssembler:
  1057. begin
  1058. El := CreateEl(CurParent, 'span');
  1059. El['class'] := 'asm';
  1060. CurParent := El;
  1061. IsInSpecial := True;
  1062. end;
  1063. end;
  1064. Last := p + 2;
  1065. end;
  1066. Inc(p);
  1067. end;
  1068. if Last <> p then
  1069. AppendText(CurParent, Last);
  1070. FreeMem(Line);
  1071. end;
  1072. Procedure THTMLWriter.AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode : TDocNode);
  1073. begin
  1074. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  1075. begin
  1076. PushOutputNode(Parent);
  1077. try
  1078. if not ConvertShort(AContext,TDomElement(DocNode.ShortDescr)) then
  1079. WriteLn(SErrInvalidShortDescr);
  1080. finally
  1081. PopOutputNode;
  1082. end;
  1083. end;
  1084. end;
  1085. procedure THTMLWriter.AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
  1086. begin
  1087. AppendShortDescr(Element,Parent,Engine.FindDocNode(Element));
  1088. end;
  1089. procedure THTMLWriter.AppendDescr(AContext: TPasElement; Parent: TDOMNode;
  1090. DescrNode: TDOMElement; AutoInsertBlock: Boolean);
  1091. begin
  1092. if Assigned(DescrNode) then
  1093. begin
  1094. PushOutputNode(Parent);
  1095. try
  1096. ConvertDescr(AContext, DescrNode, AutoInsertBlock);
  1097. finally
  1098. PopOutputNode;
  1099. end;
  1100. end;
  1101. end;
  1102. procedure THTMLWriter.AppendDescrSection(AContext: TPasElement;
  1103. Parent: TDOMNode; DescrNode: TDOMElement; const ATitle: DOMString);
  1104. begin
  1105. if not IsDescrNodeEmpty(DescrNode) then
  1106. begin
  1107. If (ATitle<>'') then // Can be empty for topic.
  1108. AppendText(CreateH2(Parent), ATitle);
  1109. AppendDescr(AContext, Parent, DescrNode, True);
  1110. end;
  1111. end;
  1112. procedure THTMLWriter.AppendShortDescrCell(Parent: TDOMNode;
  1113. Element: TPasElement);
  1114. var
  1115. ParaEl: TDOMElement;
  1116. begin
  1117. if Assigned(Engine.FindShortDescr(Element)) then
  1118. begin
  1119. AppendNbSp(CreatePara(CreateTD(Parent)), 2);
  1120. ParaEl := CreatePara(CreateTD(Parent));
  1121. ParaEl['class'] := 'cmt';
  1122. AppendShortDescr(ParaEl, Element);
  1123. end;
  1124. end;
  1125. function THTMLWriter.AppendHyperlink(Parent: TDOMNode;
  1126. Element: TPasElement): TDOMElement;
  1127. var
  1128. s: String;
  1129. UnitList: TList;
  1130. i: Integer;
  1131. ThisPackage: TLinkNode;
  1132. begin
  1133. if Assigned(Element) then
  1134. begin
  1135. if Element.InheritsFrom(TPasUnresolvedTypeRef) then
  1136. begin
  1137. s := ResolveLinkID(Element.Name);
  1138. if Length(s) = 0 then
  1139. begin
  1140. { Try all packages }
  1141. ThisPackage := Engine.RootLinkNode.FirstChild;
  1142. while Assigned(ThisPackage) do
  1143. begin
  1144. s := ResolveLinkID(ThisPackage.Name + '.' + Element.Name);
  1145. if Length(s) > 0 then
  1146. break;
  1147. ThisPackage := ThisPackage.NextSibling;
  1148. end;
  1149. if Length(s) = 0 then
  1150. begin
  1151. { Okay, then we have to try all imported units of the current module }
  1152. UnitList := Module.InterfaceSection.UsesList;
  1153. for i := UnitList.Count - 1 downto 0 do
  1154. begin
  1155. { Try all packages }
  1156. ThisPackage := Engine.RootLinkNode.FirstChild;
  1157. while Assigned(ThisPackage) do
  1158. begin
  1159. s := ResolveLinkID(ThisPackage.Name + '.' +
  1160. TPasType(UnitList[i]).Name + '.' + Element.Name);
  1161. if Length(s) > 0 then
  1162. break;
  1163. ThisPackage := ThisPackage.NextSibling;
  1164. end;
  1165. if Length(s) > 0 then
  1166. break;
  1167. end;
  1168. end;
  1169. end;
  1170. end else
  1171. s := ResolveLinkID(Element.PathName);
  1172. if Length(s) > 0 then
  1173. begin
  1174. Result := CreateLink(Parent, s);
  1175. AppendText(Result, Element.Name);
  1176. end else
  1177. begin
  1178. Result := nil;
  1179. AppendText(Parent, Element.Name);
  1180. end;
  1181. end else
  1182. begin
  1183. Result := nil;
  1184. AppendText(CreateWarning(Parent), '<NIL>');
  1185. end;
  1186. end;
  1187. { Returns the new CodeEl, which will be the old CodeEl in most cases }
  1188. function THTMLWriter.AppendType(CodeEl, TableEl: TDOMElement;
  1189. Element: TPasType; Expanded: Boolean): TDOMElement;
  1190. begin
  1191. Result := CodeEl;
  1192. if not Assigned(Element) then
  1193. AppendText(CreateWarning(CodeEl), '<NIL>')
  1194. else if (not Expanded) and (Length(Element.Name) > 0) then
  1195. AppendHyperlink(CodeEl, Element)
  1196. else
  1197. // Array
  1198. if Element.ClassType = TPasArrayType then
  1199. begin
  1200. AppendPasSHFragment(CodeEl,
  1201. 'array [' + TPasArrayType(Element).IndexRange + '] of ', 0);
  1202. Result := AppendType(CodeEl, TableEl, TPasArrayType(Element).ElType, False);
  1203. end else
  1204. // Procedure or funtion type
  1205. if Element.InheritsFrom(TPasProcedureType) then
  1206. begin
  1207. AppendKw(CodeEl, TPasProcedureType(Element).TypeName);
  1208. Result := AppendProcType(CodeEl, TableEl, TPasProcedureType(Element), 0)
  1209. end else
  1210. // Range type
  1211. if Element.InheritsFrom(TPasRangeType) then
  1212. AppendPasSHFragment(CodeEl, TPasRangeType(Element).RangeStart + '..' +
  1213. TPasRangeType(Element).RangeEnd, 0)
  1214. else
  1215. // Other types
  1216. AppendHyperlink(CodeEl, Element);
  1217. end;
  1218. function THTMLWriter.AppendProcType(CodeEl, TableEl: TDOMElement;
  1219. Element: TPasProcedureType; Indent: Integer): TDOMElement;
  1220. function CreateIndentedCodeEl(Indent: Integer): TDOMElement;
  1221. begin
  1222. Result := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1223. AppendNbSp(Result, Indent);
  1224. end;
  1225. var
  1226. i: Integer;
  1227. Arg: TPasArgument;
  1228. begin
  1229. if Element.Args.Count > 0 then
  1230. begin
  1231. AppendSym(CodeEl, '(');
  1232. for i := 0 to Element.Args.Count - 1 do
  1233. begin
  1234. Arg := TPasArgument(Element.Args[i]);
  1235. CodeEl := CreateIndentedCodeEl(Indent + 2);
  1236. case Arg.Access of
  1237. argConst: AppendKw(CodeEl, 'const ');
  1238. argVar: AppendKw(CodeEl, 'var ');
  1239. argOut: AppendKw(CodeEl, 'out ');
  1240. end;
  1241. AppendText(CodeEl, Arg.Name);
  1242. if Assigned(Arg.ArgType) then
  1243. begin
  1244. AppendSym(CodeEl, ': ');
  1245. CodeEl := AppendType(CodeEl, TableEl, Arg.ArgType, False);
  1246. end;
  1247. if Length(Arg.Value) > 0 then
  1248. AppendPasSHFragment(CodeEl, ' = ' + Arg.Value, 0);
  1249. if i < Element.Args.Count - 1 then
  1250. AppendSym(CodeEl, ';');
  1251. end;
  1252. if Element.InheritsFrom(TPasFunctionType) or Element.IsOfObject then
  1253. begin
  1254. CodeEl := CreateIndentedCodeEl(Indent);
  1255. if Element.InheritsFrom(TPasFunctionType) then
  1256. begin
  1257. AppendSym(CodeEl, '):');
  1258. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  1259. end else
  1260. AppendSym(CodeEl, ')');
  1261. if Element.IsOfObject then
  1262. begin
  1263. AppendText(CodeEl, ' '); // Don't remove
  1264. AppendKw(CodeEl, 'of object');
  1265. end;
  1266. end else
  1267. if Indent > 0 then
  1268. AppendSym(CodeEl, ')')
  1269. else
  1270. begin
  1271. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1272. AppendSym(CodeEl, ')');
  1273. end;
  1274. end else
  1275. begin
  1276. { Procedure or function without arguments }
  1277. if Element.InheritsFrom(TPasFunctionType) then
  1278. begin
  1279. AppendSym(CodeEl, ': ');
  1280. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  1281. end;
  1282. if Element.IsOfObject then
  1283. AppendKw(CodeEl, ' of object');
  1284. end;
  1285. Result := CodeEl;
  1286. end;
  1287. procedure THTMLWriter.AppendProcExt(CodeEl: TDOMElement;
  1288. Element: TPasProcedure);
  1289. procedure AppendExt(const Ext: String);
  1290. begin
  1291. AppendKw(CodeEl, ' ' + Ext);
  1292. AppendSym(CodeEl, ';');
  1293. end;
  1294. begin
  1295. if Element.IsVirtual then
  1296. AppendExt('virtual');
  1297. if Element.IsDynamic then
  1298. AppendExt('dynamic');
  1299. if Element.IsAbstract then
  1300. AppendExt('abstract');
  1301. if Element.IsOverride then
  1302. AppendExt('override');
  1303. if Element.IsOverload then
  1304. AppendExt('overload');
  1305. if Element.IsMessage then
  1306. AppendExt('message');
  1307. end;
  1308. { Used in two places:
  1309. - Page for the method of a class
  1310. - Page for a tandalone procedure or function. }
  1311. procedure THTMLWriter.AppendProcDecl(CodeEl, TableEl: TDOMElement;
  1312. Element: TPasProcedureBase);
  1313. procedure WriteVariant(AProc: TPasProcedure);
  1314. begin
  1315. AppendProcArgsSection(TableEl.ParentNode, AProc.ProcType);
  1316. AppendKw(CodeEl, AProc.TypeName);
  1317. if Element.Parent.ClassType = TPasClassType then
  1318. begin
  1319. AppendText(CodeEl, ' ');
  1320. AppendHyperlink(CodeEl, Element.Parent);
  1321. AppendSym(CodeEl, '.');
  1322. AppendText(CodeEl, AProc.Name);
  1323. end else
  1324. AppendText(CodeEl, ' ' + AProc.FullName);
  1325. CodeEl := AppendProcType(CodeEl, TableEl, AProc.ProcType, 0);
  1326. AppendSym(CodeEl, ';');
  1327. AppendProcExt(CodeEl, AProc);
  1328. end;
  1329. var
  1330. i: Integer;
  1331. begin
  1332. if Element.ClassType = TPasOverloadedProc then
  1333. for i := 0 to TPasOverloadedProc(Element).Overloads.Count - 1 do
  1334. begin
  1335. if i > 0 then
  1336. begin
  1337. CreateEl(CodeEl, 'br');
  1338. CreateEl(CodeEl, 'br');
  1339. end;
  1340. WriteVariant(TPasProcedure(TPasOverloadedProc(Element).Overloads[i]));
  1341. end
  1342. else
  1343. WriteVariant(TPasProcedure(Element));
  1344. end;
  1345. procedure THTMLWriter.AppendProcArgsSection(Parent: TDOMNode;
  1346. Element: TPasProcedureType);
  1347. var
  1348. HasFullDescr, IsFirst: Boolean;
  1349. ResultEl: TPasResultElement;
  1350. ArgTableEl, TREl: TDOMElement;
  1351. DocNode: TDocNode;
  1352. i: Integer;
  1353. Arg: TPasArgument;
  1354. begin
  1355. IsFirst := True;
  1356. for i := 0 to Element.Args.Count - 1 do
  1357. begin
  1358. Arg := TPasArgument(Element.Args[i]);
  1359. if IsDescrNodeEmpty(Engine.FindShortDescr(Arg)) then
  1360. continue;
  1361. if IsFirst then
  1362. begin
  1363. IsFirst := False;
  1364. AppendText(CreateH2(Parent), SDocArguments);
  1365. ArgTableEl := CreateTable(Parent);
  1366. end;
  1367. TREl := CreateTR(ArgTableEl);
  1368. AppendText(CreateCode(CreatePara(CreateTD_vtop(TREl))), Arg.Name);
  1369. AppendShortDescrCell(TREl, Arg);
  1370. end;
  1371. if Element.ClassType = TPasFunctionType then
  1372. begin
  1373. ResultEl := TPasFunctionType(Element).ResultEl;
  1374. DocNode := Engine.FindDocNode(ResultEl);
  1375. HasFullDescr := Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr);
  1376. if HasFullDescr or
  1377. (Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.ShortDescr)) then
  1378. begin
  1379. AppendText(CreateH2(Parent), SDocFunctionResult);
  1380. if HasFullDescr then
  1381. AppendDescr(ResultEl, Parent, DocNode.Descr, True)
  1382. else
  1383. AppendDescr(ResultEl, CreatePara(Parent), DocNode.ShortDescr, False);
  1384. end;
  1385. end;
  1386. end;
  1387. procedure THTMLWriter.AppendTitle(const AText: DOMString);
  1388. begin
  1389. AppendText(TitleElement, AText);
  1390. AppendText(CreateH1(BodyElement), AText);
  1391. end;
  1392. procedure THTMLWriter.AppendTopicMenuBar(Topic : TTopicElement);
  1393. var
  1394. TableEl, TREl, ParaEl, TitleEl: TDOMElement;
  1395. procedure AddLink(El : TPasElement; const AName: String);
  1396. begin
  1397. AppendText(ParaEl, '[');
  1398. AppendText(CreateLink(ParaEl, ResolveLinkWithinPackage(El,0)),AName);
  1399. AppendText(ParaEl, ']');
  1400. end;
  1401. begin
  1402. TableEl := CreateEl(BodyElement, 'table');
  1403. TableEl['cellpadding'] := '4';
  1404. TableEl['cellspacing'] := '0';
  1405. TableEl['border'] := '0';
  1406. TableEl['width'] := '100%';
  1407. TableEl['class'] := 'bar';
  1408. TREl := CreateTR(TableEl);
  1409. ParaEl := CreateEl(CreateTD(TREl), 'b');
  1410. If Assigned(Topic.Previous) then
  1411. AddLink(Topic.Previous,SDocPrevious);
  1412. If Assigned(Topic.Parent) then
  1413. AddLink(Topic.Parent,SDocUp);
  1414. if Assigned(Topic.Next) then
  1415. AddLink(Topic.Next,SDocNext);
  1416. if Length(SearchPage) > 0 then
  1417. begin
  1418. AppendText(ParaEl, '[');
  1419. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  1420. AppendText(ParaEl, ']');
  1421. end;
  1422. ParaEl := CreateTD(TREl);
  1423. ParaEl['align'] := 'right';
  1424. TitleEl := CreateEl(ParaEl, 'span');
  1425. TitleEl['class'] := 'bartitle';
  1426. if Assigned(Module) then
  1427. AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
  1428. if Assigned(Package) then
  1429. begin
  1430. AppendText(TitleEl, ' (');
  1431. AppendHyperlink(TitleEl, Package);
  1432. AppendText(TitleEl, ')');
  1433. end;
  1434. end;
  1435. procedure THTMLWriter.AppendMenuBar(ASubpageIndex: Integer);
  1436. var
  1437. TableEl, TREl, ParaEl, TitleEl: TDOMElement;
  1438. procedure AddLink(ALinkSubpageIndex: Integer; const AName: String);
  1439. begin
  1440. AppendText(ParaEl, '[');
  1441. if ALinkSubpageIndex = ASubpageIndex then
  1442. AppendText(ParaEl, AName)
  1443. else
  1444. AppendText(
  1445. CreateLink(ParaEl, ResolveLinkWithinPackage(Module, ALinkSubpageIndex)),
  1446. AName);
  1447. AppendText(ParaEl, ']');
  1448. end;
  1449. begin
  1450. TableEl := CreateEl(BodyElement, 'table');
  1451. TableEl['cellpadding'] := '4';
  1452. TableEl['cellspacing'] := '0';
  1453. TableEl['border'] := '0';
  1454. TableEl['width'] := '100%';
  1455. TableEl['class'] := 'bar';
  1456. TREl := CreateTR(TableEl);
  1457. ParaEl := CreateEl(CreateTD(TREl), 'b');
  1458. if Assigned(Module) then
  1459. begin
  1460. AddLink(0, SDocOverview);
  1461. if Module.InterfaceSection.ResStrings.Count > 0 then
  1462. AddLink(ResstrSubindex, SDocResStrings);
  1463. if Module.InterfaceSection.Consts.Count > 0 then
  1464. AddLink(ConstsSubindex, SDocConstants);
  1465. if Module.InterfaceSection.Types.Count > 0 then
  1466. AddLink(TypesSubindex, SDocTypes);
  1467. if Module.InterfaceSection.Classes.Count > 0 then
  1468. AddLink(ClassesSubindex, SDocClasses);
  1469. if Module.InterfaceSection.Functions.Count > 0 then
  1470. AddLink(ProcsSubindex, SDocProceduresAndFunctions);
  1471. if Module.InterfaceSection.Variables.Count > 0 then
  1472. AddLink(VarsSubindex, SDocVariables);
  1473. end;
  1474. if Length(SearchPage) > 0 then
  1475. begin
  1476. AppendText(ParaEl, '[');
  1477. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  1478. AppendText(ParaEl, ']');
  1479. end;
  1480. ParaEl := CreateTD(TREl);
  1481. ParaEl['align'] := 'right';
  1482. TitleEl := CreateEl(ParaEl, 'span');
  1483. TitleEl['class'] := 'bartitle';
  1484. if Assigned(Module) then
  1485. AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
  1486. if Assigned(Package) then
  1487. begin
  1488. AppendText(TitleEl, ' (');
  1489. AppendHyperlink(TitleEl, Package);
  1490. AppendText(TitleEl, ')');
  1491. end;
  1492. end;
  1493. procedure THTMLWriter.AppendSourceRef(AElement: TPasElement);
  1494. begin
  1495. AppendText(CreatePara(BodyElement), Format(SDocSourcePosition,
  1496. [ExtractFileName(AElement.SourceFilename), AElement.SourceLinenumber]));
  1497. end;
  1498. Procedure THTMLWriter.AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
  1499. var
  1500. Node: TDOMNode;
  1501. TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
  1502. l,s: String;
  1503. f: Text;
  1504. IsFirstSeeAlso : Boolean;
  1505. begin
  1506. if Not (Assigned(DocNode) and Assigned(DocNode.SeeAlso)) then
  1507. Exit;
  1508. IsFirstSeeAlso := True;
  1509. Node:=DocNode.SeeAlso.FirstChild;
  1510. While Assigned(Node) do
  1511. begin
  1512. if (Node.NodeType=ELEMENT_NODE) and (Node.NodeName='link') then
  1513. begin
  1514. if IsFirstSeeAlso then
  1515. begin
  1516. IsFirstSeeAlso := False;
  1517. AppendText(CreateH2(BodyElement), SDocSeeAlso);
  1518. TableEl := CreateTable(BodyElement);
  1519. end;
  1520. El:=TDOMElement(Node);
  1521. TREl:=CreateTR(TableEl);
  1522. ParaEl:=CreatePara(CreateTD_vtop(TREl));
  1523. l:=El['id'];
  1524. s:= ResolveLinkID(l);
  1525. if Length(s)=0 then
  1526. begin
  1527. WriteLn(Format(SErrUnknownLinkID, [l]));
  1528. NewEl := CreateEl(ParaEl,'b')
  1529. end
  1530. else
  1531. NewEl := CreateLink(ParaEl,s);
  1532. AppendText(NewEl,El['id']);
  1533. l:=El['id'];
  1534. DescrEl := Engine.FindShortDescr(AElement.GetModule,L);
  1535. if Assigned(DescrEl) then
  1536. begin
  1537. AppendNbSp(CreatePara(CreateTD(TREl)), 2);
  1538. ParaEl := CreatePara(CreateTD(TREl));
  1539. ParaEl['class'] := 'cmt';
  1540. PushOutputNode(ParaEl);
  1541. try
  1542. ConvertShort(AElement, DescrEl);
  1543. finally
  1544. PopOutputNode;
  1545. end;
  1546. end;
  1547. end; // Link node
  1548. Node := Node.NextSibling;
  1549. end; // While
  1550. end;
  1551. Procedure THTMLWriter.AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
  1552. var
  1553. Node: TDOMNode;
  1554. // TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
  1555. s: String;
  1556. f: Text;
  1557. begin
  1558. if not (Assigned(DocNode) and Assigned(DocNode.FirstExample)) then
  1559. Exit;
  1560. Node := DocNode.FirstExample;
  1561. while Assigned(Node) do
  1562. begin
  1563. if (Node.NodeType = ELEMENT_NODE) and (Node.NodeName = 'example') then
  1564. begin
  1565. AppendText(CreateH2(BodyElement), SDocExample);
  1566. try
  1567. Assign(f, Engine.GetExampleFilename(TDOMElement(Node)));
  1568. Reset(f);
  1569. try
  1570. PushOutputNode(BodyElement);
  1571. DescrBeginCode(False, TDOMElement(Node)['highlighter']);
  1572. while not EOF(f) do
  1573. begin
  1574. ReadLn(f, s);
  1575. DescrWriteCodeLine(s);
  1576. end;
  1577. DescrEndCode;
  1578. PopOutputNode;
  1579. finally
  1580. Close(f);
  1581. end;
  1582. except
  1583. on e: Exception do
  1584. begin
  1585. e.Message := '[example] ' + e.Message;
  1586. raise;
  1587. end;
  1588. end;
  1589. end;
  1590. Node := Node.NextSibling;
  1591. end;
  1592. end;
  1593. procedure THTMLWriter.FinishElementPage(AElement: TPasElement);
  1594. var
  1595. DocNode: TDocNode;
  1596. begin
  1597. DocNode := Engine.FindDocNode(AElement);
  1598. If Assigned(DocNode) then
  1599. begin
  1600. // Description
  1601. if Assigned(DocNode.Descr) then
  1602. AppendDescrSection(AElement, BodyElement, DocNode.Descr, SDocDescription);
  1603. // Append "Errors" section
  1604. if Assigned(DocNode.ErrorsDoc) then
  1605. AppendDescrSection(AElement, BodyElement, DocNode.ErrorsDoc, SDocErrors);
  1606. // Append "See also" section
  1607. AppendSeeAlsoSection(AElement,DocNode);
  1608. // Append examples, if present
  1609. AppendExampleSection(AElement,DocNode);
  1610. end;
  1611. end;
  1612. Procedure THTMLWriter.CreateTopicPageBody(AElement : TTopicElement);
  1613. var
  1614. DocNode: TDocNode;
  1615. TableEl, TREl: TDOMElement;
  1616. I : Integer;
  1617. S : String;
  1618. begin
  1619. AppendTopicMenuBar(AElement);
  1620. DocNode:=AElement.TopicNode;
  1621. if Assigned(DocNode) then // should always be true, but we're being careful.
  1622. begin
  1623. AppendShortDescr(AElement,TitleElement, DocNode);
  1624. AppendShortDescr(AElement,CreateH2(BodyElement), DocNode);
  1625. if Assigned(DocNode.Descr) then
  1626. AppendDescrSection(AElement, BodyElement, DocNode.Descr, '');
  1627. AppendSeeAlsoSection(AElement,DocNode);
  1628. CreateTopicLinks(DocNode,AElement);
  1629. AppendExampleSection(AElement,DocNode);
  1630. end;
  1631. end;
  1632. procedure THTMLWriter.CreatePageBody(AElement: TPasElement;
  1633. ASubpageIndex: Integer);
  1634. var
  1635. i: Integer;
  1636. Element: TPasElement;
  1637. begin
  1638. CurDirectory := Allocator.GetFilename(AElement, ASubpageIndex);
  1639. i := Length(CurDirectory);
  1640. while (i > 0) and not (CurDirectory[i] in DirSeparators) do
  1641. Dec(i);
  1642. CurDirectory := Copy(CurDirectory, 1, i);
  1643. BaseDirectory := Allocator.GetRelativePathToTop(AElement);
  1644. if AElement.ClassType = TPasPackage then
  1645. CreatePackagePageBody
  1646. else
  1647. begin
  1648. Element := AElement;
  1649. while (Element<>Nil) and (Element.ClassType<>TPasModule) do
  1650. Element := Element.Parent;
  1651. Module := TPasModule(Element);
  1652. if AElement.ClassType = TPasModule then
  1653. CreateModulePageBody(TPasModule(AElement), ASubpageIndex)
  1654. else if AElement.Parent.InheritsFrom(TPasClassType) then
  1655. CreateClassMemberPageBody(AElement)
  1656. else if AElement.ClassType = TPasConst then
  1657. CreateConstPageBody(TPasConst(AElement))
  1658. else if AElement.InheritsFrom(TPasClassType) then
  1659. CreateClassPageBody(TPasClassType(AElement), ASubpageIndex)
  1660. else if AElement.InheritsFrom(TPasType) then
  1661. CreateTypePageBody(TPasType(AElement))
  1662. else if AElement.ClassType = TPasVariable then
  1663. CreateVarPageBody(TPasVariable(AElement))
  1664. else if AElement.InheritsFrom(TPasProcedureBase) then
  1665. CreateProcPageBody(TPasProcedure(AElement))
  1666. else if AElement.ClassType = TTopicELement then
  1667. CreateTopicPageBody(TTopicElement(AElement))
  1668. end;
  1669. end;
  1670. procedure THTMLWriter.CreatePackagePageBody;
  1671. var
  1672. DocNode: TDocNode;
  1673. TableEl, TREl: TDOMElement;
  1674. i: Integer;
  1675. ThisModule: TPasModule;
  1676. L : TStringList;
  1677. begin
  1678. AppendMenuBar(0);
  1679. AppendTitle(Format(SDocPackageTitle, [Copy(Package.Name, 2, 256)]));
  1680. AppendShortDescr(CreatePara(BodyElement), Package);
  1681. AppendText(CreateH2(BodyElement), SDocUnits);
  1682. TableEl := CreateTable(BodyElement);
  1683. L:=TStringList.Create;
  1684. Try
  1685. L.Sorted:=True;
  1686. // Sort modules.
  1687. For I:=0 to Package.Modules.Count-1 do
  1688. L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
  1689. // Now create table.
  1690. for i:=0 to L.Count - 1 do
  1691. begin
  1692. ThisModule := TPasModule(L.Objects[i]);
  1693. TREl := CreateTR(TableEl);
  1694. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisModule);
  1695. AppendShortDescrCell(TREl, ThisModule);
  1696. end;
  1697. Finally
  1698. L.Free;
  1699. end;
  1700. DocNode := Engine.FindDocNode(Package);
  1701. if Assigned(DocNode) then
  1702. begin
  1703. if Assigned(DocNode.Descr) then
  1704. AppendDescrSection(nil, BodyElement, DocNode.Descr, SDocDescription);
  1705. CreateTopicLinks(DocNode,Package);
  1706. end;
  1707. end;
  1708. Procedure THTMLWriter.CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
  1709. var
  1710. DocNode: TDocNode;
  1711. TableEl, TREl: TDOMElement;
  1712. First : Boolean;
  1713. ThisTopic: TPasElement;
  1714. begin
  1715. DocNode:=Node.FirstChild;
  1716. First:=True;
  1717. While Assigned(DocNode) do
  1718. begin
  1719. If DocNode.TopicNode then
  1720. begin
  1721. if first then
  1722. begin
  1723. First:=False;
  1724. AppendText(CreateH2(BodyElement), SDocRelatedTopics);
  1725. TableEl := CreateTable(BodyElement);
  1726. end;
  1727. TREl := CreateTR(TableEl);
  1728. ThisTopic:=FindTopicElement(DocNode);
  1729. if Assigned(ThisTopic) then
  1730. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisTopic);
  1731. AppendShortDescrCell(TREl, ThisTopic);
  1732. end;
  1733. DocNode:=DocNode.NextSibling;
  1734. end;
  1735. end;
  1736. procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
  1737. ASubpageIndex: Integer);
  1738. procedure CreateMainPage;
  1739. var
  1740. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1741. i: Integer;
  1742. UnitRef: TPasType;
  1743. DocNode: TDocNode;
  1744. begin
  1745. AppendMenuBar(0);
  1746. AppendTitle(Format(SDocUnitTitle, [AModule.Name]));
  1747. AppendShortDescr(CreatePara(BodyElement), AModule);
  1748. if AModule.InterfaceSection.UsesList.Count > 0 then
  1749. begin
  1750. TableEl := CreateTable(BodyElement);
  1751. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'uses');
  1752. for i := 0 to AModule.InterfaceSection.UsesList.Count - 1 do
  1753. begin
  1754. UnitRef := TPasType(AModule.InterfaceSection.UsesList[i]);
  1755. DocNode := Engine.FindDocNode(UnitRef);
  1756. if Assigned(DocNode) and DocNode.IsSkipped then
  1757. continue;
  1758. TREl := CreateTR(TableEl);
  1759. TDEl := CreateTD_vtop(TREl);
  1760. CodeEl := CreateCode(CreatePara(TDEl));
  1761. AppendNbSp(CodeEl, 2);
  1762. AppendHyperlink(CodeEl, UnitRef);
  1763. if i < AModule.InterfaceSection.UsesList.Count - 1 then
  1764. AppendSym(CodeEl, ',')
  1765. else
  1766. AppendSym(CodeEl, ';');
  1767. AppendText(CodeEl, ' '); // Space for descriptions
  1768. AppendShortDescrCell(TREl, UnitRef);
  1769. end;
  1770. end;
  1771. DocNode := Engine.FindDocNode(AModule);
  1772. if Assigned(DocNode) then
  1773. begin
  1774. if Assigned(DocNode.Descr) then
  1775. AppendDescrSection(AModule, BodyElement, DocNode.Descr, SDocOverview);
  1776. CreateTopicLinks(DocNode,AModule);
  1777. end;
  1778. end;
  1779. procedure CreateSimpleSubpage(const ATitle: DOMString; AList: TList);
  1780. var
  1781. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1782. i, j: Integer;
  1783. Decl: TPasElement;
  1784. SortedList: TList;
  1785. DocNode: TDocNode;
  1786. S : String;
  1787. begin
  1788. AppendMenuBar(ASubpageIndex);
  1789. S:=ATitle;
  1790. AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, S]));
  1791. SortedList := TList.Create;
  1792. try
  1793. for i := 0 to AList.Count - 1 do
  1794. begin
  1795. Decl := TPasElement(AList[i]);
  1796. DocNode := Engine.FindDocNode(Decl);
  1797. if (not Assigned(DocNode)) or (not DocNode.IsSkipped) then
  1798. begin
  1799. j := 0;
  1800. while (j < SortedList.Count) and (CompareText(
  1801. TPasElement(SortedList[j]).PathName, Decl.PathName) < 0) do
  1802. Inc(j);
  1803. SortedList.Insert(j, Decl);
  1804. end;
  1805. end;
  1806. TableEl := CreateTable(BodyElement);
  1807. for i := 0 to SortedList.Count - 1 do
  1808. begin
  1809. Decl := TPasElement(SortedList[i]);
  1810. TREl := CreateTR(TableEl);
  1811. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1812. AppendHyperlink(CodeEl, Decl);
  1813. AppendShortDescrCell(TREl, Decl);
  1814. end;
  1815. finally
  1816. SortedList.Free;
  1817. end;
  1818. end;
  1819. procedure CreateResStringsPage;
  1820. var
  1821. ParaEl: TDOMElement;
  1822. i, j: Integer;
  1823. Decl: TPasResString;
  1824. DocNode: TDocNode;
  1825. begin
  1826. AppendMenuBar(ResstrSubindex);
  1827. AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, SDocResStrings]));
  1828. for i := 0 to AModule.InterfaceSection.ResStrings.Count - 1 do
  1829. begin
  1830. Decl := TPasResString(AModule.InterfaceSection.ResStrings[i]);
  1831. CreateEl(BodyElement, 'a')['name'] := LowerCase(Decl.Name);
  1832. ParaEl := CreatePara(BodyElement);
  1833. AppendText(CreateCode(ParaEl), Decl.Name);
  1834. CreateEl(ParaEl, 'br');
  1835. AppendText(ParaEl, Decl.Value);
  1836. end;
  1837. end;
  1838. begin
  1839. case ASubpageIndex of
  1840. 0:
  1841. CreateMainPage;
  1842. ResstrSubindex:
  1843. CreateResStringsPage;
  1844. ConstsSubindex:
  1845. CreateSimpleSubpage(SDocConstants, AModule.InterfaceSection.Consts);
  1846. TypesSubindex:
  1847. CreateSimpleSubpage(SDocTypes, AModule.InterfaceSection.Types);
  1848. ClassesSubindex:
  1849. CreateSimpleSubpage(SDocClasses, AModule.InterfaceSection.Classes);
  1850. ProcsSubindex:
  1851. CreateSimpleSubpage(SDocProceduresAndFunctions, AModule.InterfaceSection.Functions);
  1852. VarsSubindex:
  1853. CreateSimpleSubpage(SDocVariables, AModule.InterfaceSection.Variables);
  1854. end;
  1855. end;
  1856. procedure THTMLWriter.CreateConstPageBody(AConst: TPasConst);
  1857. var
  1858. TableEl, CodeEl: TDOMElement;
  1859. begin
  1860. AppendMenuBar(-1);
  1861. AppendTitle(AConst.Name);
  1862. AppendShortDescr(CreatePara(BodyElement), AConst);
  1863. AppendText(CreateH2(BodyElement), SDocDeclaration);
  1864. AppendSourceRef(AConst);
  1865. TableEl := CreateTable(BodyElement);
  1866. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1867. AppendKw(CodeEl, 'const');
  1868. AppendText(CodeEl, ' ' + AConst.Name);
  1869. if Assigned(AConst.VarType) then
  1870. begin
  1871. AppendSym(CodeEl, ': ');
  1872. AppendType(CodeEl, TableEl, AConst.VarType, False);
  1873. end;
  1874. AppendPasSHFragment(CodeEl, ' = ' + AConst.Value + ';', 0);
  1875. FinishElementPage(AConst);
  1876. end;
  1877. procedure THTMLWriter.CreateTypePageBody(AType: TPasType);
  1878. var
  1879. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  1880. DocNode: TDocNode;
  1881. i: Integer;
  1882. s: String;
  1883. EnumType: TPasEnumType;
  1884. EnumValue: TPasEnumValue;
  1885. Variable: TPasVariable;
  1886. begin
  1887. AppendMenuBar(-1);
  1888. AppendTitle(AType.Name);
  1889. AppendShortDescr(CreatePara(BodyElement), AType);
  1890. AppendText(CreateH2(BodyElement), SDocDeclaration);
  1891. AppendSourceRef(AType);
  1892. TableEl := CreateTable(BodyElement);
  1893. TREl := CreateTR(TableEl);
  1894. TDEl := CreateTD(TREl);
  1895. CodeEl := CreateCode(CreatePara(TDEl));
  1896. DocNode := Engine.FindDocNode(AType);
  1897. AppendKw(CodeEl, 'type ');
  1898. AppendText(CodeEl, AType.Name);
  1899. AppendSym(CodeEl, ' = ');
  1900. If Assigned(DocNode) and
  1901. Assigned(DocNode.Node) and
  1902. (Docnode.Node['opaque']='1') then
  1903. AppendText(CodeEl,SDocOpaque)
  1904. else
  1905. begin
  1906. // Alias
  1907. if AType.ClassType = TPasAliasType then
  1908. begin
  1909. if Assigned(TPasAliasType(AType).DestType) then
  1910. AppendHyperlink(CodeEl, TPasAliasType(AType).DestType)
  1911. else
  1912. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1913. AppendSym(CodeEl, ';');
  1914. end else
  1915. // Class of
  1916. if AType.ClassType = TPasClassOfType then
  1917. begin
  1918. AppendKw(CodeEl, 'class of ');
  1919. AppendHyperlink(CodeEl, TPasClassOfType(AType).DestType);
  1920. AppendSym(CodeEl, ';');
  1921. end else
  1922. // Enumeration
  1923. if AType.ClassType = TPasEnumType then
  1924. begin
  1925. AppendSym(CodeEl, '(');
  1926. for i := 0 to TPasEnumType(AType).Values.Count - 1 do
  1927. begin
  1928. EnumValue := TPasEnumValue(TPasEnumType(AType).Values[i]);
  1929. TREl := CreateTR(TableEl);
  1930. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1931. AppendShortDescrCell(TREl, EnumValue);
  1932. AppendNbSp(CodeEl, 2);
  1933. s := EnumValue.Name;
  1934. if EnumValue.IsValueUsed then
  1935. s := s + ' = ' + IntToStr(EnumValue.Value);
  1936. if i < TPasEnumType(AType).Values.Count - 1 then
  1937. s := s + ',';
  1938. AppendPasSHFragment(CodeEl, s, 0);
  1939. end;
  1940. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  1941. end else
  1942. // Pointer type
  1943. if AType.ClassType = TPasPointerType then
  1944. begin
  1945. AppendSym(CodeEl, '^');
  1946. if Assigned(TPasPointerType(AType).DestType) then
  1947. AppendHyperlink(CodeEl, TPasPointerType(AType).DestType)
  1948. else
  1949. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1950. AppendSym(CodeEl, ';');
  1951. end else
  1952. if AType.InheritsFrom(TPasProcedureType) then
  1953. begin
  1954. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  1955. AppendProcArgsSection(BodyElement, TPasProcedureType(AType));
  1956. end else
  1957. // Record
  1958. if AType.ClassType = TPasRecordType then
  1959. begin
  1960. if TPasRecordType(AType).IsPacked then
  1961. AppendKw(CodeEl, 'packed record')
  1962. else
  1963. AppendKw(CodeEl, 'record');
  1964. for i := 0 to TPasRecordType(AType).Members.Count - 1 do
  1965. begin
  1966. Variable := TPasVariable(TPasRecordType(AType).Members[i]);
  1967. TREl := CreateTR(TableEl);
  1968. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1969. AppendShortDescrCell(TREl, Variable);
  1970. AppendNbSp(CodeEl, 2);
  1971. AppendText(CodeEl, Variable.Name);
  1972. AppendSym(CodeEl, ': ');
  1973. AppendType(CodeEl, TableEl, Variable.VarType, False);
  1974. AppendSym(CodeEl, ';');
  1975. end;
  1976. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1977. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  1978. AppendKw(CodeEl, 'end');
  1979. AppendSym(CodeEl, ';');
  1980. end else
  1981. // Set
  1982. if AType.ClassType = TPasSetType then
  1983. begin
  1984. AppendKw(CodeEl, 'set of ');
  1985. if TPasSetType(AType).EnumType.ClassType = TPasEnumType then
  1986. begin
  1987. AppendSym(CodeEl, '(');
  1988. EnumType := TPasEnumType(TPasSetType(AType).EnumType);
  1989. for i := 0 to EnumType.Values.Count - 1 do
  1990. begin
  1991. EnumValue := TPasEnumValue(EnumType.Values[i]);
  1992. TREl := CreateTR(TableEl);
  1993. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1994. AppendShortDescrCell(TREl, EnumValue);
  1995. AppendNbSp(CodeEl, 2);
  1996. s := EnumValue.Name;
  1997. if EnumValue.IsValueUsed then
  1998. s := s + ' = ' + IntToStr(EnumValue.Value);
  1999. if i < EnumType.Values.Count - 1 then
  2000. s := s + ',';
  2001. AppendPasSHFragment(CodeEl, s, 0);
  2002. end;
  2003. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  2004. end else
  2005. begin
  2006. AppendHyperlink(CodeEl, TPasSetType(AType).EnumType);
  2007. AppendSym(CodeEl, ';');
  2008. end;
  2009. end else
  2010. // Type alias
  2011. if AType.ClassType = TPasTypeAliasType then
  2012. begin
  2013. AppendKw(CodeEl, 'type ');
  2014. AppendHyperlink(CodeEl, TPasTypeAliasType(AType).DestType);
  2015. AppendSym(CodeEl, ';');
  2016. end else
  2017. // Probably one of the simple types, which allowed in other places as wel...
  2018. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  2019. end;
  2020. FinishElementPage(AType);
  2021. end;
  2022. function PropertyFilter(AMember: TPasElement): Boolean;
  2023. begin
  2024. Result := (AMember.ClassType = TPasProperty) and
  2025. (Copy(AMember.Name, 1, 2) <> 'On');
  2026. end;
  2027. function MethodFilter(AMember: TPasElement): Boolean;
  2028. begin
  2029. Result := AMember.InheritsFrom(TPasProcedureBase);
  2030. end;
  2031. function EventFilter(AMember: TPasElement): Boolean;
  2032. begin
  2033. Result := (AMember.ClassType = TPasProperty) and
  2034. (Copy(AMember.Name, 1, 2) = 'On');
  2035. end;
  2036. procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType;
  2037. ASubpageIndex: Integer);
  2038. type
  2039. TMemberFilter = function(AMember: TPasElement): Boolean;
  2040. var
  2041. ParaEl: TDOMElement;
  2042. procedure AppendMemberListLink(AListSubpageIndex: Integer;
  2043. const AText: DOMString);
  2044. var
  2045. LinkEl: TDOMElement;
  2046. begin
  2047. AppendText(ParaEl, '[');
  2048. LinkEl := CreateEl(ParaEl, 'a');
  2049. LinkEl['href'] :=
  2050. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex));
  2051. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2052. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2053. AppendText(LinkEl, AText);
  2054. AppendText(ParaEl, ' (');
  2055. LinkEl := CreateEl(ParaEl, 'a');
  2056. LinkEl['href'] :=
  2057. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex + 1));
  2058. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2059. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2060. AppendText(LinkEl, SDocByName);
  2061. AppendText(ParaEl, ')');
  2062. AppendText(ParaEl, '] ');
  2063. end;
  2064. procedure CreateMainPage;
  2065. var
  2066. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2067. DocNode: TDocNode;
  2068. Member: TPasElement;
  2069. CurVisibility: TPasMemberVisibility;
  2070. i: Integer;
  2071. s: String;
  2072. ThisClass: TPasClassType;
  2073. HaveSeenTObject: Boolean;
  2074. begin
  2075. AppendMenuBar(-1);
  2076. AppendTitle(AClass.Name);
  2077. ParaEl := CreatePara(BodyElement);
  2078. AppendMemberListLink(PropertiesByInheritanceSubindex, SDocProperties);
  2079. AppendMemberListLink(MethodsByInheritanceSubindex, SDocMethods);
  2080. AppendMemberListLink(EventsByInheritanceSubindex, SDocEvents);
  2081. AppendShortDescr(CreatePara(BodyElement), AClass);
  2082. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2083. AppendSourceRef(AClass);
  2084. TableEl := CreateTable(BodyElement);
  2085. TREl := CreateTR(TableEl);
  2086. TDEl := CreateTD(TREl);
  2087. CodeEl := CreateCode(CreatePara(TDEl));
  2088. AppendKw(CodeEl, 'type');
  2089. AppendText(CodeEl, ' ' + AClass.Name + ' ');
  2090. AppendSym(CodeEl, '=');
  2091. AppendText(CodeEl, ' ');
  2092. AppendKw(CodeEl, ObjKindNames[AClass.ObjKind]);
  2093. if Assigned(AClass.AncestorType) then
  2094. begin
  2095. AppendSym(CodeEl, '(');
  2096. AppendHyperlink(CodeEl, AClass.AncestorType);
  2097. AppendSym(CodeEl, ')');
  2098. end;
  2099. if AClass.Members.Count > 0 then
  2100. begin
  2101. CurVisibility := visDefault;
  2102. for i := 0 to AClass.Members.Count - 1 do
  2103. begin
  2104. Member := TPasElement(AClass.Members[i]);
  2105. if CurVisibility <> Member.Visibility then
  2106. begin
  2107. CurVisibility := Member.Visibility;
  2108. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2109. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2110. continue;
  2111. case CurVisibility of
  2112. visPrivate: s := 'private';
  2113. visProtected: s := 'protected';
  2114. visPublic: s := 'public';
  2115. visPublished: s := 'published';
  2116. visAutomated: s := 'automated';
  2117. end;
  2118. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
  2119. end else
  2120. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2121. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2122. continue;
  2123. TREl := CreateTR(TableEl);
  2124. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2125. AppendNbSp(CodeEl, 2);
  2126. AppendShortDescrCell(TREl, Member);
  2127. if Member.InheritsFrom(TPasProcedureBase) then
  2128. begin
  2129. AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
  2130. AppendHyperlink(CodeEl, Member);
  2131. if (Member.ClassType = TPasOverloadedProc) or
  2132. (TPasProcedure(Member).ProcType.Args.Count > 0) then
  2133. AppendSym(CodeEl, '();')
  2134. else
  2135. AppendSym(CodeEl, ';');
  2136. if Member.ClassType <> TPasOverloadedProc then
  2137. AppendProcExt(CodeEl, TPasProcedure(Member));
  2138. end else
  2139. if Member.ClassType = TPasVariable then
  2140. begin
  2141. AppendHyperlink(CodeEl, Member);
  2142. AppendSym(CodeEl, ': ');
  2143. AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
  2144. AppendSym(CodeEl, ';');
  2145. end else
  2146. if Member.ClassType = TPasProperty then
  2147. begin
  2148. AppendKw(CodeEl, 'property ');
  2149. AppendHyperlink(CodeEl, Member);
  2150. if Assigned(TPasProperty(Member).VarType) then
  2151. begin
  2152. AppendSym(CodeEl, ': ');
  2153. AppendHyperlink(CodeEl, TPasProperty(Member).VarType);
  2154. end;
  2155. AppendSym(CodeEl, ';');
  2156. if TPasProperty(Member).IsDefault then
  2157. begin
  2158. AppendKw(CodeEl, ' default');
  2159. AppendSym(CodeEl, ';');
  2160. end;
  2161. SetLength(s, 0);
  2162. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  2163. s := s + 'r';
  2164. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  2165. s := s + 'w';
  2166. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  2167. s := s + 's';
  2168. if Length(s) > 0 then
  2169. AppendText(CodeEl, ' [' + s + ']');
  2170. end else
  2171. AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
  2172. end;
  2173. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  2174. end;
  2175. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  2176. AppendKw(CodeEl, 'end');
  2177. AppendSym(CodeEl, ';');
  2178. AppendText(CreateH2(BodyElement), SDocInheritance);
  2179. TableEl := CreateTable(BodyElement);
  2180. HaveSeenTObject := AClass.ObjKind <> okClass;
  2181. ThisClass := AClass;
  2182. while True do
  2183. begin
  2184. TREl := CreateTR(TableEl);
  2185. TDEl := CreateTD_vtop(TREl);
  2186. TDEl['align'] := 'center';
  2187. CodeEl := CreateCode(CreatePara(TDEl));
  2188. AppendHyperlink(CodeEl, ThisClass);
  2189. AppendShortDescrCell(TREl, ThisClass);
  2190. if HaveSeenTObject or (CompareText(ThisClass.Name, 'TObject') = 0) then
  2191. HaveSeenTObject := True
  2192. else
  2193. begin
  2194. TDEl := CreateTD(CreateTR(TableEl));
  2195. TDEl['align'] := 'center';
  2196. AppendText(TDEl, '|');
  2197. end;
  2198. if Assigned(ThisClass.AncestorType) then
  2199. begin
  2200. if ThisClass.AncestorType.InheritsFrom(TPasClassType) then
  2201. ThisClass := TPasClassType(ThisClass.AncestorType)
  2202. else
  2203. begin
  2204. TDEl := CreateTD(CreateTR(TableEl));
  2205. TDEl['align'] := 'center';
  2206. AppendText(CreateCode(CreatePara(TDEl)), ThisClass.AncestorType.Name);
  2207. if CompareText(ThisClass.AncestorType.Name, 'TObject') = 0 then
  2208. HaveSeenTObject := True
  2209. else
  2210. begin
  2211. TDEl := CreateTD(CreateTR(TableEl));
  2212. TDEl['align'] := 'center';
  2213. AppendText(TDEl, '?');
  2214. end;
  2215. break;
  2216. end
  2217. end else
  2218. break;
  2219. end;
  2220. if not HaveSeenTObject then
  2221. begin
  2222. TDEl := CreateTD(CreateTR(TableEl));
  2223. TDEl['align'] := 'center';
  2224. AppendText(CreateCode(CreatePara(TDEl)), 'TObject');
  2225. end;
  2226. FinishElementPage(AClass);
  2227. end;
  2228. procedure CreateInheritanceSubpage(AFilter: TMemberFilter);
  2229. var
  2230. ThisClass: TPasClassType;
  2231. i: Integer;
  2232. Member: TPasElement;
  2233. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2234. begin
  2235. TableEl := CreateTable(BodyElement);
  2236. ThisClass := AClass;
  2237. while True do
  2238. begin
  2239. TREl := CreateTR(TableEl);
  2240. TDEl := CreateTD(TREl);
  2241. TDEl['colspan'] := '3';
  2242. CreateTD(TREl);
  2243. LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
  2244. if Assigned(LinkEl) then
  2245. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2246. '''; return false;';
  2247. for i := 0 to ThisClass.Members.Count - 1 do
  2248. begin
  2249. Member := TPasElement(ThisClass.Members[i]);
  2250. if ((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2251. ((Member.Visibility = visProtected) and Engine.HideProtected) or
  2252. not AFilter(Member) then
  2253. continue;
  2254. TREl := CreateTR(TableEl);
  2255. ParaEl := CreatePara(CreateTD(TREl));
  2256. case Member.Visibility of
  2257. visPrivate:
  2258. AppendText(ParaEl, 'pv');
  2259. visProtected:
  2260. AppendText(ParaEl, 'pt');
  2261. visPublished:
  2262. AppendText(ParaEl, 'pl');
  2263. end;
  2264. AppendNbSp(ParaEl, 1);
  2265. ParaEl := CreateTD(TREl);
  2266. if (Member.ClassType = TPasProperty) and
  2267. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2268. begin
  2269. AppendText(ParaEl, 'ro');
  2270. AppendNbSp(ParaEl, 1);
  2271. end;
  2272. LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
  2273. if Assigned(LinkEl) then
  2274. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2275. '''; return false;';
  2276. end;
  2277. if (not Assigned(ThisClass.AncestorType)) or
  2278. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2279. break;
  2280. ThisClass := TPasClassType(ThisClass.AncestorType);
  2281. AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
  2282. end;
  2283. end;
  2284. procedure CreateSortedSubpage(AFilter: TMemberFilter);
  2285. var
  2286. List: TList;
  2287. ThisClass: TPasClassType;
  2288. i, j: Integer;
  2289. Member: TPasElement;
  2290. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2291. begin
  2292. List := TList.Create;
  2293. try
  2294. ThisClass := AClass;
  2295. while True do
  2296. begin
  2297. for i := 0 to ThisClass.Members.Count - 1 do
  2298. begin
  2299. Member := TPasElement(ThisClass.Members[i]);
  2300. if (not (((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2301. ((Member.Visibility = visProtected) and Engine.HideProtected))) and
  2302. AFilter(Member) then
  2303. begin
  2304. j := 0;
  2305. while (j < List.Count) and
  2306. (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
  2307. Inc(j);
  2308. List.Insert(j, Member);
  2309. end;
  2310. end;
  2311. if (not Assigned(ThisClass.AncestorType)) or
  2312. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2313. break;
  2314. ThisClass := TPasClassType(ThisClass.AncestorType);
  2315. end;
  2316. TableEl := CreateTable(BodyElement);
  2317. for i := 0 to List.Count - 1 do
  2318. begin
  2319. Member := TPasElement(List[i]);
  2320. TREl := CreateTR(TableEl);
  2321. ParaEl := CreatePara(CreateTD(TREl));
  2322. case Member.Visibility of
  2323. visPrivate:
  2324. AppendText(ParaEl, 'pv');
  2325. visProtected:
  2326. AppendText(ParaEl, 'pt');
  2327. visPublished:
  2328. AppendText(ParaEl, 'pl');
  2329. end;
  2330. AppendNbSp(ParaEl, 1);
  2331. ParaEl := CreatePara(CreateTD(TREl));
  2332. if (Member.ClassType = TPasProperty) and
  2333. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2334. begin
  2335. AppendText(ParaEl, 'ro');
  2336. AppendNbSp(ParaEl, 1);
  2337. end;
  2338. TDEl := CreateTD(TREl);
  2339. TDEl['nowrap'] := 'nowrap';
  2340. ParaEl := CreatePara(TDEl);
  2341. LinkEl := AppendHyperlink(ParaEl, Member);
  2342. if Assigned(LinkEl) then
  2343. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2344. '''; return false;';
  2345. AppendText(ParaEl, ' (');
  2346. LinkEl := AppendHyperlink(ParaEl, Member.Parent);
  2347. if Assigned(LinkEl) then
  2348. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2349. '''; return false;';
  2350. AppendText(ParaEl, ')');
  2351. end;
  2352. finally
  2353. List.Free;
  2354. end;
  2355. end;
  2356. begin
  2357. case ASubpageIndex of
  2358. 0:
  2359. CreateMainPage;
  2360. PropertiesByInheritanceSubindex:
  2361. CreateInheritanceSubpage(@PropertyFilter);
  2362. PropertiesByNameSubindex:
  2363. CreateSortedSubpage(@PropertyFilter);
  2364. MethodsByInheritanceSubindex:
  2365. CreateInheritanceSubpage(@MethodFilter);
  2366. MethodsByNameSubindex:
  2367. CreateSortedSubpage(@MethodFilter);
  2368. EventsByInheritanceSubindex:
  2369. CreateInheritanceSubpage(@EventFilter);
  2370. EventsByNameSubindex:
  2371. CreateSortedSubpage(@EventFilter);
  2372. end;
  2373. end;
  2374. procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
  2375. var
  2376. TableEl, TREl, CodeEl: TDOMElement;
  2377. procedure CreateVarPage(Element: TPasVariable);
  2378. begin
  2379. AppendHyperlink(CodeEl, Element.Parent);
  2380. AppendSym(CodeEl, '.');
  2381. AppendText(CodeEl, Element.Name);
  2382. if Assigned(Element.VarType) then
  2383. begin
  2384. AppendSym(CodeEl, ': ');
  2385. AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
  2386. end;
  2387. end;
  2388. procedure CreatePropertyPage(Element: TPasProperty);
  2389. var
  2390. NeedBreak: Boolean;
  2391. begin
  2392. AppendKw(CodeEl, 'property ');
  2393. AppendHyperlink(CodeEl, Element.Parent);
  2394. AppendSym(CodeEl, '.');
  2395. AppendText(CodeEl, Element.Name);
  2396. if Assigned(Element.VarType) then
  2397. begin
  2398. AppendSym(CodeEl, ': ');
  2399. AppendType(CodeEl, TableEl, Element.VarType, False);
  2400. end;
  2401. NeedBreak := False;
  2402. if Length(TPasProperty(Element).IndexValue) <> 0 then
  2403. begin
  2404. CreateEl(CodeEl, 'br');
  2405. AppendNbsp(CodeEl, 2);
  2406. AppendKw(CodeEl, 'index ');
  2407. AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
  2408. NeedBreak := True;
  2409. end;
  2410. if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
  2411. begin
  2412. CreateEl(CodeEl, 'br');
  2413. AppendNbsp(CodeEl, 2);
  2414. AppendKw(CodeEl, 'read ');
  2415. AppendText(CodeEl, TPasProperty(Element).ReadAccessorName);
  2416. NeedBreak := True;
  2417. end;
  2418. if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
  2419. begin
  2420. CreateEl(CodeEl, 'br');
  2421. AppendNbsp(CodeEl, 2);
  2422. AppendKw(CodeEl, 'write ');
  2423. AppendText(CodeEl, TPasProperty(Element).WriteAccessorName);
  2424. NeedBreak := True;
  2425. end;
  2426. if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
  2427. begin
  2428. CreateEl(CodeEl, 'br');
  2429. AppendNbsp(CodeEl, 2);
  2430. AppendKw(CodeEl, 'stored ');
  2431. AppendText(CodeEl, TPasProperty(Element).StoredAccessorName);
  2432. NeedBreak := True;
  2433. end;
  2434. if Length(TPasProperty(Element).DefaultValue) <> 0 then
  2435. begin
  2436. CreateEl(CodeEl, 'br');
  2437. AppendNbsp(CodeEl, 2);
  2438. AppendKw(CodeEl, 'default ');
  2439. AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
  2440. NeedBreak := True;
  2441. end;
  2442. AppendSym(CodeEl, ';');
  2443. if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
  2444. begin
  2445. if NeedBreak then
  2446. begin
  2447. CreateEl(CodeEl, 'br');
  2448. AppendNbsp(CodeEl, 2);
  2449. end;
  2450. if TPasProperty(Element).IsDefault then
  2451. AppendKw(CodeEl, 'default')
  2452. else
  2453. AppendKw(CodeEl, 'nodefault');
  2454. AppendSym(CodeEl, ';');
  2455. end;
  2456. end;
  2457. var
  2458. s: String;
  2459. DocNode: TDocNode;
  2460. begin
  2461. AppendMenuBar(-1);
  2462. AppendTitle(AElement.FullName);
  2463. AppendShortDescr(CreatePara(BodyElement), AElement);
  2464. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2465. AppendSourceRef(AElement);
  2466. TableEl := CreateTable(BodyElement);
  2467. TREl := CreateTR(TableEl);
  2468. CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
  2469. AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
  2470. case AElement.Visibility of
  2471. visPrivate: s := 'private';
  2472. visProtected: s := 'protected';
  2473. visPublic: s := 'public';
  2474. visPublished: s := 'published';
  2475. visAutomated: s := 'automated';
  2476. else s := '';
  2477. end;
  2478. if Length(s) > 0 then
  2479. AppendKw(CodeEl, s);
  2480. AppendText(CodeEl, ' ');
  2481. if AElement.ClassType = TPasVariable then
  2482. CreateVarPage(TPasVariable(AElement))
  2483. else if AElement.InheritsFrom(TPasProcedureBase) then
  2484. AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
  2485. else if AElement.ClassType = TPasProperty then
  2486. CreatePropertyPage(TPasProperty(AElement))
  2487. else
  2488. AppendText(CreateWarning(BodyElement), '<' + AElement.ClassName + '>');
  2489. FinishElementPage(AElement);
  2490. end;
  2491. procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
  2492. var
  2493. TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
  2494. DocNode: TDocNode;
  2495. begin
  2496. AppendMenuBar(-1);
  2497. AppendTitle(AVar.FullName);
  2498. AppendShortDescr(CreatePara(BodyElement), AVar);
  2499. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2500. AppendSourceRef(AVar);
  2501. TableEl := CreateTable(BodyElement);
  2502. TREl := CreateTR(TableEl);
  2503. TDEl := CreateTD(TREl);
  2504. CodeEl := CreateCode(CreatePara(TDEl));
  2505. AppendKw(CodeEl, 'var');
  2506. AppendText(CodeEl, ' ' + AVar.Name);
  2507. if Assigned(AVar.VarType) then
  2508. begin
  2509. AppendSym(CodeEl, ': ');
  2510. El := AppendType(CodeEl, TableEl, AVar.VarType, False);
  2511. end else
  2512. El := CodeEl;
  2513. if Length(AVar.Value) > 0 then
  2514. AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
  2515. else
  2516. AppendSym(El, ';');
  2517. FinishElementPage(AVar);
  2518. end;
  2519. procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
  2520. var
  2521. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2522. begin
  2523. AppendMenuBar(-1);
  2524. AppendTitle(AProc.Name);
  2525. AppendShortDescr(CreatePara(BodyElement), AProc);
  2526. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2527. AppendSourceRef(AProc);
  2528. TableEl := CreateTable(BodyElement);
  2529. TREl := CreateTR(TableEl);
  2530. TDEl := CreateTD(TREl);
  2531. CodeEl := CreateCode(CreatePara(TDEl));
  2532. AppendProcDecl(CodeEl, TableEl, AProc);
  2533. FinishElementPage(AProc);
  2534. end;
  2535. Function THTMLWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
  2536. begin
  2537. Result:=True;
  2538. if Cmd = '--html-search' then
  2539. SearchPage := Arg
  2540. else
  2541. Result:=False;
  2542. end;
  2543. procedure THTMLWriter.WriteDoc;
  2544. begin
  2545. WriteLn(Format(SWritingPages, [PageCount]));
  2546. WriteHTMLPages;
  2547. end;
  2548. // private methods
  2549. function THTMLWriter.GetPageCount: Integer;
  2550. begin
  2551. Result := PageInfos.Count;
  2552. end;
  2553. procedure THTMLWriter.SetOnTest(const AValue: TNotifyEvent);
  2554. begin
  2555. if FOnTest=AValue then exit;
  2556. FOnTest:=AValue;
  2557. end;
  2558. procedure THTMLWriter.CreateAllocator;
  2559. begin
  2560. FAllocator:=TLongNameFileAllocator.Create('.html');
  2561. end;
  2562. procedure THTMWriter.CreateAllocator;
  2563. begin
  2564. FAllocator:=TShortNameFileAllocator.Create('.htm');
  2565. end;
  2566. initialization
  2567. // Do not localize.
  2568. RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
  2569. RegisterWriter(THTMWriter,'htm','HTM (8.3 filenames) output using fpdoc.css stylesheet.');
  2570. finalization
  2571. UnRegisterWriter('html');
  2572. UnRegisterWriter('htm');
  2573. end.
  2574. {
  2575. $Log$
  2576. Revision 1.16 2005-05-04 08:38:58 michael
  2577. + Added support for opaque types
  2578. Revision 1.15 2005/02/14 17:13:38 peter
  2579. * truncate log
  2580. Revision 1.14 2005/01/12 21:11:41 michael
  2581. + New structure for writers. Implemented TXT writer
  2582. Revision 1.13 2005/01/09 15:59:50 michael
  2583. + Split out latex writer to linear and latex writer
  2584. Revision 1.12 2004/12/20 19:01:11 peter
  2585. * typo
  2586. Revision 1.11 2004/12/20 16:28:56 michael
  2587. + Fixed HTML path
  2588. Revision 1.10 2004/10/22 19:58:35 michael
  2589. + Sort list of modules in package page
  2590. Revision 1.9 2004/08/31 09:40:05 michael
  2591. + Lookup using string, not widestring
  2592. Revision 1.8 2004/08/28 18:04:49 michael
  2593. + Added context to topic pages
  2594. Revision 1.7 2004/07/25 22:40:13 michael
  2595. + Strip path from sourcefilename in generated docs
  2596. Revision 1.6 2004/06/06 10:53:02 michael
  2597. + Added Topic support
  2598. Revision 1.5 2003/11/28 12:51:37 sg
  2599. * Added support for source references
  2600. Revision 1.4 2003/04/22 00:00:05 sg
  2601. * Fixed bug in path building for links to elements which don't have their
  2602. own page, but their parent element has
  2603. Revision 1.3 2003/04/17 14:15:24 sg
  2604. * Added writing of array ranges
  2605. Revision 1.2 2003/03/18 19:28:44 michael
  2606. + Some changes to output handling, more suitable for tex output
  2607. Revision 1.1 2003/03/17 23:03:20 michael
  2608. + Initial import in CVS
  2609. Revision 1.15 2003/03/13 22:02:13 sg
  2610. * New version with many bugfixes and our own parser (now independent of the
  2611. compiler source)
  2612. Revision 1.14 2002/11/15 19:46:32 sg
  2613. * Added support for classes and objects (formerly all objects have been
  2614. written als classes)
  2615. Revision 1.13 2002/05/24 00:13:22 sg
  2616. * much improved new version, including many linking and output fixes
  2617. Revision 1.12 2002/03/12 10:58:36 sg
  2618. * reworked linking engine and internal structure
  2619. Revision 1.11 2002/01/20 11:19:55 michael
  2620. + Added link attribute and property to TFPElement
  2621. Revision 1.10 2001/12/21 11:25:13 sg
  2622. * The parser can now unget two tokens from the scanner
  2623. * Added parsing and HTML output of range types
  2624. * Procedure/function variable bugfixes
  2625. Revision 1.9 2001/12/17 22:34:04 sg
  2626. * Fixed typo in output for menu bar
  2627. Revision 1.8 2001/12/17 13:41:17 jonas
  2628. * OsPathSeparator -> PathDelim
  2629. }