dw_html.pp 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944
  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. AppendKw(CodeEl, 'type ');
  1897. AppendText(CodeEl, AType.Name);
  1898. AppendSym(CodeEl, ' = ');
  1899. // Alias
  1900. if AType.ClassType = TPasAliasType then
  1901. begin
  1902. if Assigned(TPasAliasType(AType).DestType) then
  1903. AppendHyperlink(CodeEl, TPasAliasType(AType).DestType)
  1904. else
  1905. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1906. AppendSym(CodeEl, ';');
  1907. end else
  1908. // Class of
  1909. if AType.ClassType = TPasClassOfType then
  1910. begin
  1911. AppendKw(CodeEl, 'class of ');
  1912. AppendHyperlink(CodeEl, TPasClassOfType(AType).DestType);
  1913. AppendSym(CodeEl, ';');
  1914. end else
  1915. // Enumeration
  1916. if AType.ClassType = TPasEnumType then
  1917. begin
  1918. AppendSym(CodeEl, '(');
  1919. for i := 0 to TPasEnumType(AType).Values.Count - 1 do
  1920. begin
  1921. EnumValue := TPasEnumValue(TPasEnumType(AType).Values[i]);
  1922. TREl := CreateTR(TableEl);
  1923. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1924. AppendShortDescrCell(TREl, EnumValue);
  1925. AppendNbSp(CodeEl, 2);
  1926. s := EnumValue.Name;
  1927. if EnumValue.IsValueUsed then
  1928. s := s + ' = ' + IntToStr(EnumValue.Value);
  1929. if i < TPasEnumType(AType).Values.Count - 1 then
  1930. s := s + ',';
  1931. AppendPasSHFragment(CodeEl, s, 0);
  1932. end;
  1933. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  1934. end else
  1935. // Pointer type
  1936. if AType.ClassType = TPasPointerType then
  1937. begin
  1938. AppendSym(CodeEl, '^');
  1939. if Assigned(TPasPointerType(AType).DestType) then
  1940. AppendHyperlink(CodeEl, TPasPointerType(AType).DestType)
  1941. else
  1942. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  1943. AppendSym(CodeEl, ';');
  1944. end else
  1945. if AType.InheritsFrom(TPasProcedureType) then
  1946. begin
  1947. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  1948. AppendProcArgsSection(BodyElement, TPasProcedureType(AType));
  1949. end else
  1950. // Record
  1951. if AType.ClassType = TPasRecordType then
  1952. begin
  1953. if TPasRecordType(AType).IsPacked then
  1954. AppendKw(CodeEl, 'packed record')
  1955. else
  1956. AppendKw(CodeEl, 'record');
  1957. for i := 0 to TPasRecordType(AType).Members.Count - 1 do
  1958. begin
  1959. Variable := TPasVariable(TPasRecordType(AType).Members[i]);
  1960. TREl := CreateTR(TableEl);
  1961. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1962. AppendShortDescrCell(TREl, Variable);
  1963. AppendNbSp(CodeEl, 2);
  1964. AppendText(CodeEl, Variable.Name);
  1965. AppendSym(CodeEl, ': ');
  1966. AppendType(CodeEl, TableEl, Variable.VarType, False);
  1967. AppendSym(CodeEl, ';');
  1968. end;
  1969. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1970. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  1971. AppendKw(CodeEl, 'end');
  1972. AppendSym(CodeEl, ';');
  1973. end else
  1974. // Set
  1975. if AType.ClassType = TPasSetType then
  1976. begin
  1977. AppendKw(CodeEl, 'set of ');
  1978. if TPasSetType(AType).EnumType.ClassType = TPasEnumType then
  1979. begin
  1980. AppendSym(CodeEl, '(');
  1981. EnumType := TPasEnumType(TPasSetType(AType).EnumType);
  1982. for i := 0 to EnumType.Values.Count - 1 do
  1983. begin
  1984. EnumValue := TPasEnumValue(EnumType.Values[i]);
  1985. TREl := CreateTR(TableEl);
  1986. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1987. AppendShortDescrCell(TREl, EnumValue);
  1988. AppendNbSp(CodeEl, 2);
  1989. s := EnumValue.Name;
  1990. if EnumValue.IsValueUsed then
  1991. s := s + ' = ' + IntToStr(EnumValue.Value);
  1992. if i < EnumType.Values.Count - 1 then
  1993. s := s + ',';
  1994. AppendPasSHFragment(CodeEl, s, 0);
  1995. end;
  1996. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  1997. end else
  1998. begin
  1999. AppendHyperlink(CodeEl, TPasSetType(AType).EnumType);
  2000. AppendSym(CodeEl, ';');
  2001. end;
  2002. end else
  2003. // Type alias
  2004. if AType.ClassType = TPasTypeAliasType then
  2005. begin
  2006. AppendKw(CodeEl, 'type ');
  2007. AppendHyperlink(CodeEl, TPasTypeAliasType(AType).DestType);
  2008. AppendSym(CodeEl, ';');
  2009. end else
  2010. // Probably one of the simple types, which allowed in other places as wel...
  2011. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  2012. FinishElementPage(AType);
  2013. end;
  2014. function PropertyFilter(AMember: TPasElement): Boolean;
  2015. begin
  2016. Result := (AMember.ClassType = TPasProperty) and
  2017. (Copy(AMember.Name, 1, 2) <> 'On');
  2018. end;
  2019. function MethodFilter(AMember: TPasElement): Boolean;
  2020. begin
  2021. Result := AMember.InheritsFrom(TPasProcedureBase);
  2022. end;
  2023. function EventFilter(AMember: TPasElement): Boolean;
  2024. begin
  2025. Result := (AMember.ClassType = TPasProperty) and
  2026. (Copy(AMember.Name, 1, 2) = 'On');
  2027. end;
  2028. procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType;
  2029. ASubpageIndex: Integer);
  2030. type
  2031. TMemberFilter = function(AMember: TPasElement): Boolean;
  2032. var
  2033. ParaEl: TDOMElement;
  2034. procedure AppendMemberListLink(AListSubpageIndex: Integer;
  2035. const AText: DOMString);
  2036. var
  2037. LinkEl: TDOMElement;
  2038. begin
  2039. AppendText(ParaEl, '[');
  2040. LinkEl := CreateEl(ParaEl, 'a');
  2041. LinkEl['href'] :=
  2042. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex));
  2043. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2044. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2045. AppendText(LinkEl, AText);
  2046. AppendText(ParaEl, ' (');
  2047. LinkEl := CreateEl(ParaEl, 'a');
  2048. LinkEl['href'] :=
  2049. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex + 1));
  2050. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2051. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2052. AppendText(LinkEl, SDocByName);
  2053. AppendText(ParaEl, ')');
  2054. AppendText(ParaEl, '] ');
  2055. end;
  2056. procedure CreateMainPage;
  2057. var
  2058. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2059. DocNode: TDocNode;
  2060. Member: TPasElement;
  2061. CurVisibility: TPasMemberVisibility;
  2062. i: Integer;
  2063. s: String;
  2064. ThisClass: TPasClassType;
  2065. HaveSeenTObject: Boolean;
  2066. begin
  2067. AppendMenuBar(-1);
  2068. AppendTitle(AClass.Name);
  2069. ParaEl := CreatePara(BodyElement);
  2070. AppendMemberListLink(PropertiesByInheritanceSubindex, SDocProperties);
  2071. AppendMemberListLink(MethodsByInheritanceSubindex, SDocMethods);
  2072. AppendMemberListLink(EventsByInheritanceSubindex, SDocEvents);
  2073. AppendShortDescr(CreatePara(BodyElement), AClass);
  2074. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2075. AppendSourceRef(AClass);
  2076. TableEl := CreateTable(BodyElement);
  2077. TREl := CreateTR(TableEl);
  2078. TDEl := CreateTD(TREl);
  2079. CodeEl := CreateCode(CreatePara(TDEl));
  2080. AppendKw(CodeEl, 'type');
  2081. AppendText(CodeEl, ' ' + AClass.Name + ' ');
  2082. AppendSym(CodeEl, '=');
  2083. AppendText(CodeEl, ' ');
  2084. AppendKw(CodeEl, ObjKindNames[AClass.ObjKind]);
  2085. if Assigned(AClass.AncestorType) then
  2086. begin
  2087. AppendSym(CodeEl, '(');
  2088. AppendHyperlink(CodeEl, AClass.AncestorType);
  2089. AppendSym(CodeEl, ')');
  2090. end;
  2091. if AClass.Members.Count > 0 then
  2092. begin
  2093. CurVisibility := visDefault;
  2094. for i := 0 to AClass.Members.Count - 1 do
  2095. begin
  2096. Member := TPasElement(AClass.Members[i]);
  2097. if CurVisibility <> Member.Visibility then
  2098. begin
  2099. CurVisibility := Member.Visibility;
  2100. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2101. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2102. continue;
  2103. case CurVisibility of
  2104. visPrivate: s := 'private';
  2105. visProtected: s := 'protected';
  2106. visPublic: s := 'public';
  2107. visPublished: s := 'published';
  2108. visAutomated: s := 'automated';
  2109. end;
  2110. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
  2111. end else
  2112. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2113. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2114. continue;
  2115. TREl := CreateTR(TableEl);
  2116. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2117. AppendNbSp(CodeEl, 2);
  2118. AppendShortDescrCell(TREl, Member);
  2119. if Member.InheritsFrom(TPasProcedureBase) then
  2120. begin
  2121. AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
  2122. AppendHyperlink(CodeEl, Member);
  2123. if (Member.ClassType = TPasOverloadedProc) or
  2124. (TPasProcedure(Member).ProcType.Args.Count > 0) then
  2125. AppendSym(CodeEl, '();')
  2126. else
  2127. AppendSym(CodeEl, ';');
  2128. if Member.ClassType <> TPasOverloadedProc then
  2129. AppendProcExt(CodeEl, TPasProcedure(Member));
  2130. end else
  2131. if Member.ClassType = TPasVariable then
  2132. begin
  2133. AppendHyperlink(CodeEl, Member);
  2134. AppendSym(CodeEl, ': ');
  2135. AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
  2136. AppendSym(CodeEl, ';');
  2137. end else
  2138. if Member.ClassType = TPasProperty then
  2139. begin
  2140. AppendKw(CodeEl, 'property ');
  2141. AppendHyperlink(CodeEl, Member);
  2142. if Assigned(TPasProperty(Member).VarType) then
  2143. begin
  2144. AppendSym(CodeEl, ': ');
  2145. AppendHyperlink(CodeEl, TPasProperty(Member).VarType);
  2146. end;
  2147. AppendSym(CodeEl, ';');
  2148. if TPasProperty(Member).IsDefault then
  2149. begin
  2150. AppendKw(CodeEl, ' default');
  2151. AppendSym(CodeEl, ';');
  2152. end;
  2153. SetLength(s, 0);
  2154. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  2155. s := s + 'r';
  2156. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  2157. s := s + 'w';
  2158. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  2159. s := s + 's';
  2160. if Length(s) > 0 then
  2161. AppendText(CodeEl, ' [' + s + ']');
  2162. end else
  2163. AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
  2164. end;
  2165. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  2166. end;
  2167. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  2168. AppendKw(CodeEl, 'end');
  2169. AppendSym(CodeEl, ';');
  2170. AppendText(CreateH2(BodyElement), SDocInheritance);
  2171. TableEl := CreateTable(BodyElement);
  2172. HaveSeenTObject := AClass.ObjKind <> okClass;
  2173. ThisClass := AClass;
  2174. while True do
  2175. begin
  2176. TREl := CreateTR(TableEl);
  2177. TDEl := CreateTD_vtop(TREl);
  2178. TDEl['align'] := 'center';
  2179. CodeEl := CreateCode(CreatePara(TDEl));
  2180. AppendHyperlink(CodeEl, ThisClass);
  2181. AppendShortDescrCell(TREl, ThisClass);
  2182. if HaveSeenTObject or (CompareText(ThisClass.Name, 'TObject') = 0) then
  2183. HaveSeenTObject := True
  2184. else
  2185. begin
  2186. TDEl := CreateTD(CreateTR(TableEl));
  2187. TDEl['align'] := 'center';
  2188. AppendText(TDEl, '|');
  2189. end;
  2190. if Assigned(ThisClass.AncestorType) then
  2191. begin
  2192. if ThisClass.AncestorType.InheritsFrom(TPasClassType) then
  2193. ThisClass := TPasClassType(ThisClass.AncestorType)
  2194. else
  2195. begin
  2196. TDEl := CreateTD(CreateTR(TableEl));
  2197. TDEl['align'] := 'center';
  2198. AppendText(CreateCode(CreatePara(TDEl)), ThisClass.AncestorType.Name);
  2199. if CompareText(ThisClass.AncestorType.Name, 'TObject') = 0 then
  2200. HaveSeenTObject := True
  2201. else
  2202. begin
  2203. TDEl := CreateTD(CreateTR(TableEl));
  2204. TDEl['align'] := 'center';
  2205. AppendText(TDEl, '?');
  2206. end;
  2207. break;
  2208. end
  2209. end else
  2210. break;
  2211. end;
  2212. if not HaveSeenTObject then
  2213. begin
  2214. TDEl := CreateTD(CreateTR(TableEl));
  2215. TDEl['align'] := 'center';
  2216. AppendText(CreateCode(CreatePara(TDEl)), 'TObject');
  2217. end;
  2218. FinishElementPage(AClass);
  2219. end;
  2220. procedure CreateInheritanceSubpage(AFilter: TMemberFilter);
  2221. var
  2222. ThisClass: TPasClassType;
  2223. i: Integer;
  2224. Member: TPasElement;
  2225. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2226. begin
  2227. TableEl := CreateTable(BodyElement);
  2228. ThisClass := AClass;
  2229. while True do
  2230. begin
  2231. TREl := CreateTR(TableEl);
  2232. TDEl := CreateTD(TREl);
  2233. TDEl['colspan'] := '3';
  2234. CreateTD(TREl);
  2235. LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
  2236. if Assigned(LinkEl) then
  2237. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2238. '''; return false;';
  2239. for i := 0 to ThisClass.Members.Count - 1 do
  2240. begin
  2241. Member := TPasElement(ThisClass.Members[i]);
  2242. if ((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2243. ((Member.Visibility = visProtected) and Engine.HideProtected) or
  2244. not AFilter(Member) then
  2245. continue;
  2246. TREl := CreateTR(TableEl);
  2247. ParaEl := CreatePara(CreateTD(TREl));
  2248. case Member.Visibility of
  2249. visPrivate:
  2250. AppendText(ParaEl, 'pv');
  2251. visProtected:
  2252. AppendText(ParaEl, 'pt');
  2253. visPublished:
  2254. AppendText(ParaEl, 'pl');
  2255. end;
  2256. AppendNbSp(ParaEl, 1);
  2257. ParaEl := CreateTD(TREl);
  2258. if (Member.ClassType = TPasProperty) and
  2259. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2260. begin
  2261. AppendText(ParaEl, 'ro');
  2262. AppendNbSp(ParaEl, 1);
  2263. end;
  2264. LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
  2265. if Assigned(LinkEl) then
  2266. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2267. '''; return false;';
  2268. end;
  2269. if (not Assigned(ThisClass.AncestorType)) or
  2270. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2271. break;
  2272. ThisClass := TPasClassType(ThisClass.AncestorType);
  2273. AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
  2274. end;
  2275. end;
  2276. procedure CreateSortedSubpage(AFilter: TMemberFilter);
  2277. var
  2278. List: TList;
  2279. ThisClass: TPasClassType;
  2280. i, j: Integer;
  2281. Member: TPasElement;
  2282. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2283. begin
  2284. List := TList.Create;
  2285. try
  2286. ThisClass := AClass;
  2287. while True do
  2288. begin
  2289. for i := 0 to ThisClass.Members.Count - 1 do
  2290. begin
  2291. Member := TPasElement(ThisClass.Members[i]);
  2292. if (not (((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2293. ((Member.Visibility = visProtected) and Engine.HideProtected))) and
  2294. AFilter(Member) then
  2295. begin
  2296. j := 0;
  2297. while (j < List.Count) and
  2298. (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
  2299. Inc(j);
  2300. List.Insert(j, Member);
  2301. end;
  2302. end;
  2303. if (not Assigned(ThisClass.AncestorType)) or
  2304. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2305. break;
  2306. ThisClass := TPasClassType(ThisClass.AncestorType);
  2307. end;
  2308. TableEl := CreateTable(BodyElement);
  2309. for i := 0 to List.Count - 1 do
  2310. begin
  2311. Member := TPasElement(List[i]);
  2312. TREl := CreateTR(TableEl);
  2313. ParaEl := CreatePara(CreateTD(TREl));
  2314. case Member.Visibility of
  2315. visPrivate:
  2316. AppendText(ParaEl, 'pv');
  2317. visProtected:
  2318. AppendText(ParaEl, 'pt');
  2319. visPublished:
  2320. AppendText(ParaEl, 'pl');
  2321. end;
  2322. AppendNbSp(ParaEl, 1);
  2323. ParaEl := CreatePara(CreateTD(TREl));
  2324. if (Member.ClassType = TPasProperty) and
  2325. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2326. begin
  2327. AppendText(ParaEl, 'ro');
  2328. AppendNbSp(ParaEl, 1);
  2329. end;
  2330. TDEl := CreateTD(TREl);
  2331. TDEl['nowrap'] := 'nowrap';
  2332. ParaEl := CreatePara(TDEl);
  2333. LinkEl := AppendHyperlink(ParaEl, Member);
  2334. if Assigned(LinkEl) then
  2335. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2336. '''; return false;';
  2337. AppendText(ParaEl, ' (');
  2338. LinkEl := AppendHyperlink(ParaEl, Member.Parent);
  2339. if Assigned(LinkEl) then
  2340. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2341. '''; return false;';
  2342. AppendText(ParaEl, ')');
  2343. end;
  2344. finally
  2345. List.Free;
  2346. end;
  2347. end;
  2348. begin
  2349. case ASubpageIndex of
  2350. 0:
  2351. CreateMainPage;
  2352. PropertiesByInheritanceSubindex:
  2353. CreateInheritanceSubpage(@PropertyFilter);
  2354. PropertiesByNameSubindex:
  2355. CreateSortedSubpage(@PropertyFilter);
  2356. MethodsByInheritanceSubindex:
  2357. CreateInheritanceSubpage(@MethodFilter);
  2358. MethodsByNameSubindex:
  2359. CreateSortedSubpage(@MethodFilter);
  2360. EventsByInheritanceSubindex:
  2361. CreateInheritanceSubpage(@EventFilter);
  2362. EventsByNameSubindex:
  2363. CreateSortedSubpage(@EventFilter);
  2364. end;
  2365. end;
  2366. procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
  2367. var
  2368. TableEl, TREl, CodeEl: TDOMElement;
  2369. procedure CreateVarPage(Element: TPasVariable);
  2370. begin
  2371. AppendHyperlink(CodeEl, Element.Parent);
  2372. AppendSym(CodeEl, '.');
  2373. AppendText(CodeEl, Element.Name);
  2374. if Assigned(Element.VarType) then
  2375. begin
  2376. AppendSym(CodeEl, ': ');
  2377. AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
  2378. end;
  2379. end;
  2380. procedure CreatePropertyPage(Element: TPasProperty);
  2381. var
  2382. NeedBreak: Boolean;
  2383. begin
  2384. AppendKw(CodeEl, 'property ');
  2385. AppendHyperlink(CodeEl, Element.Parent);
  2386. AppendSym(CodeEl, '.');
  2387. AppendText(CodeEl, Element.Name);
  2388. if Assigned(Element.VarType) then
  2389. begin
  2390. AppendSym(CodeEl, ': ');
  2391. AppendType(CodeEl, TableEl, Element.VarType, False);
  2392. end;
  2393. NeedBreak := False;
  2394. if Length(TPasProperty(Element).IndexValue) <> 0 then
  2395. begin
  2396. CreateEl(CodeEl, 'br');
  2397. AppendNbsp(CodeEl, 2);
  2398. AppendKw(CodeEl, 'index ');
  2399. AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
  2400. NeedBreak := True;
  2401. end;
  2402. if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
  2403. begin
  2404. CreateEl(CodeEl, 'br');
  2405. AppendNbsp(CodeEl, 2);
  2406. AppendKw(CodeEl, 'read ');
  2407. AppendText(CodeEl, TPasProperty(Element).ReadAccessorName);
  2408. NeedBreak := True;
  2409. end;
  2410. if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
  2411. begin
  2412. CreateEl(CodeEl, 'br');
  2413. AppendNbsp(CodeEl, 2);
  2414. AppendKw(CodeEl, 'write ');
  2415. AppendText(CodeEl, TPasProperty(Element).WriteAccessorName);
  2416. NeedBreak := True;
  2417. end;
  2418. if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
  2419. begin
  2420. CreateEl(CodeEl, 'br');
  2421. AppendNbsp(CodeEl, 2);
  2422. AppendKw(CodeEl, 'stored ');
  2423. AppendText(CodeEl, TPasProperty(Element).StoredAccessorName);
  2424. NeedBreak := True;
  2425. end;
  2426. if Length(TPasProperty(Element).DefaultValue) <> 0 then
  2427. begin
  2428. CreateEl(CodeEl, 'br');
  2429. AppendNbsp(CodeEl, 2);
  2430. AppendKw(CodeEl, 'default ');
  2431. AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
  2432. NeedBreak := True;
  2433. end;
  2434. AppendSym(CodeEl, ';');
  2435. if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
  2436. begin
  2437. if NeedBreak then
  2438. begin
  2439. CreateEl(CodeEl, 'br');
  2440. AppendNbsp(CodeEl, 2);
  2441. end;
  2442. if TPasProperty(Element).IsDefault then
  2443. AppendKw(CodeEl, 'default')
  2444. else
  2445. AppendKw(CodeEl, 'nodefault');
  2446. AppendSym(CodeEl, ';');
  2447. end;
  2448. end;
  2449. var
  2450. s: String;
  2451. DocNode: TDocNode;
  2452. begin
  2453. AppendMenuBar(-1);
  2454. AppendTitle(AElement.FullName);
  2455. AppendShortDescr(CreatePara(BodyElement), AElement);
  2456. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2457. AppendSourceRef(AElement);
  2458. TableEl := CreateTable(BodyElement);
  2459. TREl := CreateTR(TableEl);
  2460. CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
  2461. AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
  2462. case AElement.Visibility of
  2463. visPrivate: s := 'private';
  2464. visProtected: s := 'protected';
  2465. visPublic: s := 'public';
  2466. visPublished: s := 'published';
  2467. visAutomated: s := 'automated';
  2468. else s := '';
  2469. end;
  2470. if Length(s) > 0 then
  2471. AppendKw(CodeEl, s);
  2472. AppendText(CodeEl, ' ');
  2473. if AElement.ClassType = TPasVariable then
  2474. CreateVarPage(TPasVariable(AElement))
  2475. else if AElement.InheritsFrom(TPasProcedureBase) then
  2476. AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
  2477. else if AElement.ClassType = TPasProperty then
  2478. CreatePropertyPage(TPasProperty(AElement))
  2479. else
  2480. AppendText(CreateWarning(BodyElement), '<' + AElement.ClassName + '>');
  2481. FinishElementPage(AElement);
  2482. end;
  2483. procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
  2484. var
  2485. TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
  2486. DocNode: TDocNode;
  2487. begin
  2488. AppendMenuBar(-1);
  2489. AppendTitle(AVar.FullName);
  2490. AppendShortDescr(CreatePara(BodyElement), AVar);
  2491. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2492. AppendSourceRef(AVar);
  2493. TableEl := CreateTable(BodyElement);
  2494. TREl := CreateTR(TableEl);
  2495. TDEl := CreateTD(TREl);
  2496. CodeEl := CreateCode(CreatePara(TDEl));
  2497. AppendKw(CodeEl, 'var');
  2498. AppendText(CodeEl, ' ' + AVar.Name);
  2499. if Assigned(AVar.VarType) then
  2500. begin
  2501. AppendSym(CodeEl, ': ');
  2502. El := AppendType(CodeEl, TableEl, AVar.VarType, False);
  2503. end else
  2504. El := CodeEl;
  2505. if Length(AVar.Value) > 0 then
  2506. AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
  2507. else
  2508. AppendSym(El, ';');
  2509. FinishElementPage(AVar);
  2510. end;
  2511. procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
  2512. var
  2513. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2514. begin
  2515. AppendMenuBar(-1);
  2516. AppendTitle(AProc.Name);
  2517. AppendShortDescr(CreatePara(BodyElement), AProc);
  2518. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2519. AppendSourceRef(AProc);
  2520. TableEl := CreateTable(BodyElement);
  2521. TREl := CreateTR(TableEl);
  2522. TDEl := CreateTD(TREl);
  2523. CodeEl := CreateCode(CreatePara(TDEl));
  2524. AppendProcDecl(CodeEl, TableEl, AProc);
  2525. FinishElementPage(AProc);
  2526. end;
  2527. Function THTMLWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
  2528. begin
  2529. Result:=True;
  2530. if Cmd = '--html-search' then
  2531. SearchPage := Arg
  2532. else
  2533. Result:=False;
  2534. end;
  2535. procedure THTMLWriter.WriteDoc;
  2536. begin
  2537. WriteLn(Format(SWritingPages, [PageCount]));
  2538. WriteHTMLPages;
  2539. end;
  2540. // private methods
  2541. function THTMLWriter.GetPageCount: Integer;
  2542. begin
  2543. Result := PageInfos.Count;
  2544. end;
  2545. procedure THTMLWriter.SetOnTest(const AValue: TNotifyEvent);
  2546. begin
  2547. if FOnTest=AValue then exit;
  2548. FOnTest:=AValue;
  2549. end;
  2550. procedure THTMLWriter.CreateAllocator;
  2551. begin
  2552. FAllocator:=TLongNameFileAllocator.Create('.html');
  2553. end;
  2554. procedure THTMWriter.CreateAllocator;
  2555. begin
  2556. FAllocator:=TShortNameFileAllocator.Create('.htm');
  2557. end;
  2558. initialization
  2559. // Do not localize.
  2560. RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
  2561. RegisterWriter(THTMWriter,'htm','HTM (8.3 filenames) output using fpdoc.css stylesheet.');
  2562. finalization
  2563. UnRegisterWriter('html');
  2564. UnRegisterWriter('htm');
  2565. end.
  2566. {
  2567. $Log$
  2568. Revision 1.14 2005-01-12 21:11:41 michael
  2569. + New structure for writers. Implemented TXT writer
  2570. Revision 1.13 2005/01/09 15:59:50 michael
  2571. + Split out latex writer to linear and latex writer
  2572. Revision 1.12 2004/12/20 19:01:11 peter
  2573. * typo
  2574. Revision 1.11 2004/12/20 16:28:56 michael
  2575. + Fixed HTML path
  2576. Revision 1.10 2004/10/22 19:58:35 michael
  2577. + Sort list of modules in package page
  2578. Revision 1.9 2004/08/31 09:40:05 michael
  2579. + Lookup using string, not widestring
  2580. Revision 1.8 2004/08/28 18:04:49 michael
  2581. + Added context to topic pages
  2582. Revision 1.7 2004/07/25 22:40:13 michael
  2583. + Strip path from sourcefilename in generated docs
  2584. Revision 1.6 2004/06/06 10:53:02 michael
  2585. + Added Topic support
  2586. Revision 1.5 2003/11/28 12:51:37 sg
  2587. * Added support for source references
  2588. Revision 1.4 2003/04/22 00:00:05 sg
  2589. * Fixed bug in path building for links to elements which don't have their
  2590. own page, but their parent element has
  2591. Revision 1.3 2003/04/17 14:15:24 sg
  2592. * Added writing of array ranges
  2593. Revision 1.2 2003/03/18 19:28:44 michael
  2594. + Some changes to output handling, more suitable for tex output
  2595. Revision 1.1 2003/03/17 23:03:20 michael
  2596. + Initial import in CVS
  2597. Revision 1.15 2003/03/13 22:02:13 sg
  2598. * New version with many bugfixes and our own parser (now independent of the
  2599. compiler source)
  2600. Revision 1.14 2002/11/15 19:46:32 sg
  2601. * Added support for classes and objects (formerly all objects have been
  2602. written als classes)
  2603. Revision 1.13 2002/05/24 00:13:22 sg
  2604. * much improved new version, including many linking and output fixes
  2605. Revision 1.12 2002/03/12 10:58:36 sg
  2606. * reworked linking engine and internal structure
  2607. Revision 1.11 2002/01/20 11:19:55 michael
  2608. + Added link attribute and property to TFPElement
  2609. Revision 1.10 2001/12/21 11:25:13 sg
  2610. * The parser can now unget two tokens from the scanner
  2611. * Added parsing and HTML output of range types
  2612. * Procedure/function variable bugfixes
  2613. Revision 1.9 2001/12/17 22:34:04 sg
  2614. * Fixed typo in output for menu bar
  2615. Revision 1.8 2001/12/17 13:41:17 jonas
  2616. * OsPathSeparator -> PathDelim
  2617. }