mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 12:11:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1004 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			1004 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
| 
 | |
|     FPDoc  -  Free Pascal Documentation Tool
 | |
|     Copyright (C) 2005 by Michael Van Canneyt
 | |
| 
 | |
|     * Template output generator
 | |
| 
 | |
|     See the file COPYING, included in this distribution,
 | |
|     for details about the copyright.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | |
| }
 | |
| {
 | |
|   Usage: change the constants below. Do a search&replace where TTemplateWriter
 | |
|   is changed to TMyFormatWriter (replace MyFormat with whatever you need)
 | |
|   and fill in all methods.
 | |
| 
 | |
|   If your format is linear (i.e. not some hyperlinked format, split in several
 | |
|   output files), you should take the dw_lintmpl template instead. It will take
 | |
|   care of all needed structure.
 | |
| 
 | |
| }
 | |
| {$mode objfpc}
 | |
| {$H+}
 | |
| unit dw_template;
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, SysUtils, DGlobals, dWriter, pastree, dom;
 | |
| 
 | |
| Const
 | |
|   { Change this into the name of your writer}
 | |
|   TemplateName = 'template';
 | |
|   { Comprehensible description goes here:}
 | |
|   STemplateUsageWriterDescr = 'Writes output in template format';
 | |
|   { Extension for the template }
 | |
|   TTemplateExtension = '.tpl';
 | |
| 
 | |
| Type
 | |
|   { TTemplateWriter }
 | |
| 
 | |
|   TTemplateWriter = Class(TFPDocWriter)
 | |
|     ModuleName,             // Current module name
 | |
|     PackageName: String;    // Package name
 | |
|     FStream : TStream;      // Current output stream.
 | |
|     Module: TPasModule;     // Current module.
 | |
|   Protected
 | |
|     // Writing support.
 | |
|     { various routines to Write to stream. }
 | |
|     procedure Write(const s: String);
 | |
|     procedure WriteF(const s: String; const Args: array of const);
 | |
|     procedure WriteLn(const s: String);
 | |
|     procedure WriteLnF(const s: String; const Args: array of const);
 | |
|     { Replace current write stream with S, return current stream. }
 | |
|     Function  PushWriteContext(S : TStream) : TStream;
 | |
|     { Replace current write stream with S }
 | |
|     Procedure PopWriteContext(S : TSTream);
 | |
|     { make sure text is interpretable: escape all special characters in some way.}
 | |
|     Function  EscapeText(const s : String) : String;
 | |
|     { Sort a list of TPasElements }
 | |
|     procedure SortElementList(List : TList);
 | |
|     { Writes a description node to a stream, returns the result as a string }
 | |
|     Function  GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
 | |
|     { Determine value for constant }
 | |
|     function  ConstValue(ConstDecl: TPasConst): String; virtual;
 | |
|     { Write the contents of an example file }
 | |
|     Procedure WriteExampleFile(FN : String); virtual;
 | |
|     { Write all example files, found in ADocNode. }
 | |
|     procedure WriteExample(ADocNode: TDocNode);
 | |
|     { Convert a TPasElement to a valid label for this backend }
 | |
|     function ElementToLabel(AElement : TPasElement) : String;
 | |
|   Public
 | |
|     Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
 | |
|     procedure WriteDoc; override;
 | |
|     // Documentation writing methods.
 | |
|     // Package
 | |
|     Procedure WritePackagePage;
 | |
|     // Topic refs
 | |
|     Procedure ProcessTopics(DocNode : TDocNode; Subs : Boolean);
 | |
|     // Single topic page.
 | |
|     Procedure WriteTopicPage(Parent,Node : TDocNode);
 | |
|     // Process a Module (=unit)
 | |
|     procedure ProcessModule(AModule: TPasModule);
 | |
|     // Write Unit description.
 | |
|     procedure WriteUnitPage(AModule: TPasModule);
 | |
|     // Do all resource strings in a unit.
 | |
|     procedure WriteUnitResourceStrings(ASection: TPasSection);
 | |
|     // Do all constants in a unit.
 | |
|     procedure WriteUnitConsts(ASection: TPasSection);
 | |
|     // Do all types in a unit.
 | |
|     procedure WriteUnitTypes(ASection: TPasSection);
 | |
|     // Do all variables in a unit.
 | |
|     procedure WriteUnitVars(ASection: TPasSection);
 | |
|     // Do all classes in a unit.
 | |
|     procedure WriteUnitClasses(ASection: TPasSection);
 | |
|     // Do all functions and procedures in a unit.
 | |
|     procedure WriteUnitFunctionsAndProcedures(ASection: TPasSection);
 | |
|     // Write elements of an enumeration type
 | |
|     procedure WriteEnumElements(TypeDecl : TPasEnumType);
 | |
|     // Write class documentation
 | |
|     procedure WriteClassPage(ClassDecl: TPasClassType);
 | |
|     // Write procedure/function documentation
 | |
|     procedure WriteProcedurePage(ProcDecl: TPasProcedureBase);
 | |
|     // Write procedure/function arguments documentation
 | |
|     procedure AppendProcedureArgsSection(Element: TPasProcedureType);
 | |
|     // Write function result documentation
 | |
|     procedure AppendFunctionResultSection(Element: TPasFunctionType);
 | |
|     // Write class property  documentation
 | |
|     procedure WritePropertyPage(PropDecl: TPasProperty);
 | |
|     // To be Overriden from fpdocwriter;
 | |
|     procedure DescrWriteText(const AText: DOMString); override;
 | |
|     procedure DescrBeginBold; override;
 | |
|     procedure DescrEndBold; override;
 | |
|     procedure DescrBeginItalic; override;
 | |
|     procedure DescrEndItalic; override;
 | |
|     procedure DescrBeginEmph; override;
 | |
|     procedure DescrEndEmph; override;
 | |
|     procedure DescrWriteFileEl(const AText: DOMString); override;
 | |
|     procedure DescrWriteKeywordEl(const AText: DOMString); override;
 | |
|     procedure DescrWriteVarEl(const AText: DOMString); override;
 | |
|     procedure DescrBeginLink(const AId: DOMString); override;
 | |
|     procedure DescrEndLink; override;
 | |
|     procedure DescrWriteLinebreak; override;
 | |
|     procedure DescrBeginParagraph; override;
 | |
|     procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
 | |
|     procedure DescrWriteCodeLine(const ALine: String); override;
 | |
|     procedure DescrEndCode; override;
 | |
|     procedure DescrEndParagraph; override;
 | |
|     procedure DescrBeginOrderedList; override;
 | |
|     procedure DescrEndOrderedList; override;
 | |
|     procedure DescrBeginUnorderedList; override;
 | |
|     procedure DescrEndUnorderedList; override;
 | |
|     procedure DescrBeginDefinitionList; override;
 | |
|     procedure DescrEndDefinitionList; override;
 | |
|     procedure DescrBeginListItem; override;
 | |
|     procedure DescrEndListItem; override;
 | |
|     procedure DescrBeginDefinitionTerm; override;
 | |
|     procedure DescrEndDefinitionTerm; override;
 | |
|     procedure DescrBeginDefinitionEntry; override;
 | |
|     procedure DescrEndDefinitionEntry; override;
 | |
|     procedure DescrBeginSectionTitle; override;
 | |
|     procedure DescrBeginSectionBody; override;
 | |
|     procedure DescrEndSection; override;
 | |
|     procedure DescrBeginRemark; override;
 | |
|     procedure DescrEndRemark; override;
 | |
|     procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
 | |
|     procedure DescrEndTable; override;
 | |
|     procedure DescrBeginTableCaption; override;
 | |
|     procedure DescrEndTableCaption; override;
 | |
|     procedure DescrBeginTableHeadRow; override;
 | |
|     procedure DescrEndTableHeadRow; override;
 | |
|     procedure DescrBeginTableRow; override;
 | |
|     procedure DescrEndTableRow; override;
 | |
|     procedure DescrBeginTableCell; override;
 | |
|     procedure DescrEndTableCell; override;
 | |
|     // Handle options.
 | |
|     Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
 | |
|     // Provide feedback about usage of this backend.
 | |
|     Class procedure Usage(List: TStrings); override;
 | |
|     // For info only. See linear writer for an example.
 | |
|     Class Function FileNameExtension : String; override;
 | |
|   end;
 | |
| 
 | |
| implementation
 | |
| 
 | |
| { TTemplateWriter }
 | |
| 
 | |
| constructor TTemplateWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
 | |
| 
 | |
|   procedure AddLabel(AElement: TPasElement);
 | |
|   begin
 | |
|     Engine.AddLink(AElement.PathName, ElementToLabel(AElement));
 | |
|   end;
 | |
| 
 | |
|   procedure AddList(AElement: TPasElement; AList: TList);
 | |
|   var
 | |
|     i: Integer;
 | |
|   begin
 | |
|     for i := 0 to AList.Count - 1 do
 | |
|       AddLabel(TPasElement(AList[i]));
 | |
|   end;
 | |
| 
 | |
|   procedure AddTopicPages(AElement: TPasElement);
 | |
| 
 | |
|   var
 | |
|     PreviousTopic,
 | |
|     TopicElement : TTopicElement;
 | |
|     DocNode,
 | |
|     TopicNode : TDocNode;
 | |
| 
 | |
|   begin
 | |
|     DocNode:=Engine.FindDocNode(AElement);
 | |
|     If not Assigned(DocNode) then
 | |
|       exit;
 | |
|     TopicNode:=DocNode.FirstChild;
 | |
|     PreviousTopic:=Nil;
 | |
|     While Assigned(TopicNode) do
 | |
|       begin
 | |
|       If TopicNode.TopicNode then
 | |
|         begin
 | |
|         TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
 | |
|         Topics.Add(TopicElement);
 | |
|         TopicElement.TopicNode:=TopicNode;
 | |
|         TopicElement.Previous:=PreviousTopic;
 | |
|         If Assigned(PreviousTopic) then
 | |
|           PreviousTopic.Next:=TopicElement;
 | |
|         PreviousTopic:=TopicElement;
 | |
|         if AElement is TTopicElement then
 | |
|           TTopicElement(AElement).SubTopics.Add(TopicElement);
 | |
|         Engine.AddLink(TopicElement.PathName, ElementToLabel(TopicElement));
 | |
|         if AElement is TTopicElement then
 | |
|           TTopicElement(AElement).SubTopics.Add(TopicElement)
 | |
|         else // Only one level of recursion.
 | |
|           AddTopicPages(TopicElement);
 | |
|         end;
 | |
|       TopicNode:=TopicNode.NextSibling;
 | |
|       end;
 | |
|   end;
 | |
| 
 | |
|   procedure ScanModule(AModule: TPasModule);
 | |
|   var
 | |
|     i, j, k: Integer;
 | |
|     ClassEl: TPasClassType;
 | |
|     FPEl, AncestorMemberEl: TPasElement;
 | |
|     DocNode: TDocNode;
 | |
|     DidAutolink: Boolean;
 | |
|   begin
 | |
|     AddLabel(AModule);
 | |
|     AddTopicPages(AModule);
 | |
|     with AModule do
 | |
|     begin
 | |
|       AddList(AModule, InterfaceSection.ResStrings);
 | |
|       AddList(AModule, InterfaceSection.Consts);
 | |
|       AddList(AModule, InterfaceSection.Types);
 | |
|       if InterfaceSection.Classes.Count > 0 then
 | |
|       begin
 | |
|         for i := 0 to InterfaceSection.Classes.Count - 1 do
 | |
|         begin
 | |
|           ClassEl := TPasClassType(InterfaceSection.Classes[i]);
 | |
|           AddLabel(ClassEl);
 | |
| 
 | |
|           for j := 0 to ClassEl.Members.Count - 1 do
 | |
|           begin
 | |
|             FPEl := TPasElement(ClassEl.Members[j]);
 | |
|             if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
 | |
|               ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
 | |
|               continue;
 | |
| 
 | |
|             DocNode := Engine.FindDocNode(FPEl);
 | |
|             if not Assigned(DocNode) then
 | |
|             begin
 | |
|               DidAutolink := False;
 | |
|               if Assigned(ClassEl.AncestorType) and
 | |
|                 (ClassEl.AncestorType.ClassType = TPasClassType) then
 | |
|               begin
 | |
|                 for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
 | |
|                 begin
 | |
|                   AncestorMemberEl :=
 | |
|                     TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
 | |
|                   if AncestorMemberEl.Name = FPEl.Name then
 | |
|                   begin
 | |
|                     DocNode := Engine.FindDocNode(AncestorMemberEl);
 | |
|                     if Assigned(DocNode) then
 | |
|                     begin
 | |
|                       DidAutolink := True;
 | |
|                       Engine.AddLink(FPEl.PathName,
 | |
|                         Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
 | |
|                       break;
 | |
|                     end;
 | |
|                   end;
 | |
|                 end;
 | |
|               end;
 | |
|               if not DidAutolink then
 | |
|                 AddLabel(FPEl);
 | |
|             end else
 | |
|               AddLabel(FPEl);
 | |
|           end;
 | |
|         end;
 | |
|       end;
 | |
|       AddList(AModule, InterfaceSection.Functions);
 | |
|       AddList(AModule, InterfaceSection.Variables);
 | |
|     end;
 | |
|   end;
 | |
| 
 | |
| var
 | |
|   i: Integer;
 | |
| begin
 | |
|   inherited;
 | |
|   if Length(Package.Name) > 1 then
 | |
|     AddTopicPages(Package);
 | |
|   for i := 0 to Package.Modules.Count - 1 do
 | |
|     ScanModule(TPasModule(Package.Modules[i]));
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Writing support
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| Function TTemplateWriter.PushWriteContext(S : TStream) : TStream;
 | |
| 
 | |
| begin
 | |
|   Result:=FStream;
 | |
|   FStream:=S;
 | |
| end;
 | |
| 
 | |
| Procedure TTemplateWriter.PopWriteContext(S : TSTream);
 | |
| 
 | |
| begin
 | |
|   FStream:=S;
 | |
| end;
 | |
| 
 | |
| function TTemplateWriter.EscapeText(const s: String): String;
 | |
| begin
 | |
|   Result:=S;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.Write(const s: String);
 | |
| 
 | |
| Var
 | |
|   L : Integer;
 | |
| 
 | |
| begin
 | |
|   L:=Length(S);
 | |
|   If (L>0) then
 | |
|     FStream.Write(PChar(S)^,L);
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TTemplateWriter.WriteF(const s: String; const Args: array of const);
 | |
| begin
 | |
|   Write(Format(S,Args));
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteLn(const s: String);
 | |
| 
 | |
| begin
 | |
|   Write(S);
 | |
|   Write(LineEnding);
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteLnF(const s: String; const Args: array of const);
 | |
| begin
 | |
|   Write(Format(S,Args));
 | |
|   Write(LineEnding);
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteText(const AText: DOMString);
 | |
| 
 | |
| begin
 | |
|   Self.Write(EscapeText(AText));
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginBold;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndBold;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginItalic;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndItalic;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginEmph;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndEmph;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteFileEl(const AText: DOMString);
 | |
| 
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteKeywordEl(const AText: DOMString);
 | |
| 
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteVarEl(const AText: DOMString);
 | |
| 
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginLink(const AId: DOMString);
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndLink;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteLinebreak;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginParagraph;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginCode(HasBorder: Boolean;
 | |
|   const AHighlighterName: String);
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrWriteCodeLine(const ALine: String);
 | |
| begin
 | |
|   Writeln(ALine);
 | |
|   DescrWriteLinebreak;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndCode;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndParagraph;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginOrderedList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndOrderedList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginUnorderedList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndUnorderedList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginDefinitionList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndDefinitionList;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginListItem;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndListItem;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginDefinitionTerm;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndDefinitionTerm;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginDefinitionEntry;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndDefinitionEntry;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginSectionTitle;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginSectionBody;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndSection;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginRemark;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndRemark;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndTable;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginTableCaption;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndTableCaption;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginTableHeadRow;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndTableHeadRow;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginTableRow;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndTableRow;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrBeginTableCell;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.DescrEndTableCell;
 | |
| begin
 | |
| end;
 | |
| 
 | |
| function TTemplateWriter.InterPretOption(const Cmd, Arg: String): boolean;
 | |
| begin
 | |
|   Result:=False;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Function TTemplateWriter.GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
 | |
| 
 | |
| Var
 | |
|   S : TStringStream;
 | |
|   F : TStream;
 | |
| 
 | |
| begin
 | |
|   Result:='';
 | |
|   if Assigned(DescrNode) then
 | |
|     begin
 | |
|     S:=TStringStream.Create('');
 | |
|     Try
 | |
|       F:=PushWriteContext(S);
 | |
|       Try
 | |
|         ConvertDescr(AContext, DescrNode, False);
 | |
|         Result:=S.DataString;
 | |
|       FInally
 | |
|         PopWriteContext(F);
 | |
|       end;
 | |
|     finally
 | |
|       S.FRee;
 | |
|     end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| function TTemplateWriter.ConstValue(ConstDecl: TPasConst): String;
 | |
| begin
 | |
|   if Assigned(ConstDecl) then
 | |
|     Result := ConstDecl.ClassName
 | |
|   else
 | |
|     Result := '<nil>';
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TTemplateWriter.WriteExample(ADocNode: TDocNode);
 | |
| 
 | |
| var
 | |
|   Example: TDOMElement;
 | |
|   S : string;
 | |
| 
 | |
| begin
 | |
|   // Template, change as needed.
 | |
|   S:='';
 | |
|   if Assigned(ADocNode) then
 | |
|     begin
 | |
|     Example := ADocNode.FirstExample;
 | |
|     If Assigned(Example) then
 | |
|       begin
 | |
|       while Assigned(Example) do
 | |
|         begin
 | |
|         s:=Engine.GetExampleFileName(Example);
 | |
|         if (s<>'') then
 | |
|           WriteExampleFile(S);
 | |
|         DescrEndParaGraph;
 | |
|         Repeat
 | |
|           Example := TDomElement(Example.NextSibling);
 | |
|         until (Example=Nil) or ((Example.NodeType=ELEMENT_NODE) and (Example.NodeName='example'));
 | |
|         end;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteExampleFile(FN : String);
 | |
| 
 | |
| Var
 | |
|   L : TStringList;
 | |
|   I : Integer;
 | |
| 
 | |
| begin
 | |
|   // Template, change as needed.
 | |
|   If (FN<>'') and FileExists(FN) then
 | |
|     begin
 | |
|     L:=TStringList.Create;
 | |
|     Try
 | |
|       L.LoadFromFile(FN);
 | |
|       For I:=0 to L.Count-1 do
 | |
|         DescrWriteCodeLine(L[i]);
 | |
|     finally
 | |
|       L.Free;
 | |
|     end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Actual man page writing
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteDoc;
 | |
| 
 | |
| var
 | |
|   i : Integer;
 | |
|   L : TstringList;
 | |
|   DocNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   PackageName := LowerCase(Copy(Package.Name, 2, 255));
 | |
|   WritePackagePage;
 | |
|   L:=TStringList.Create;
 | |
|   Try
 | |
|     // Sort modules.
 | |
|     For I:=0 to Package.Modules.Count-1 do
 | |
|       L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
 | |
|     L.Sorted:=True;
 | |
|     for i:=0 to L.Count - 1 do
 | |
|       ProcessModule(TPasModule(L.Objects[i]));
 | |
|   Finally
 | |
|     L.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Package man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| 
 | |
| Procedure TTemplateWriter.WritePackagePage;
 | |
| 
 | |
| var
 | |
|   DocNode: TDocNode;
 | |
|   L : TStringList;
 | |
| 
 | |
| begin
 | |
|   DocNode:=Engine.FindDocNode(Package);
 | |
|   // Write topics
 | |
|   ProcessTopics(DocNode,True);
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Topic support
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| 
 | |
| Procedure TTemplateWriter.ProcessTopics(DocNode : TDocNode; Subs : Boolean);
 | |
| 
 | |
| Var
 | |
|   Node,SubNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   If Not Assigned(DocNode) then
 | |
|     Exit;
 | |
|   Node:=DocNode.FirstChild;
 | |
|   While Assigned(Node) do
 | |
|     begin
 | |
|     If Node.TopicNode then
 | |
|       begin
 | |
|       WriteTopicPage(DocNode,Node);
 | |
|       If Subs then
 | |
|         begin
 | |
|         SubNode:=DocNode.FirstChild;
 | |
|         While Assigned(SubNode) do
 | |
|         If SubNode.TopicNode then
 | |
|            WriteTopicPage(Node,SubNode);
 | |
|         end;
 | |
|       end;
 | |
|     Node:=Node.NextSibling;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Procedure TTemplateWriter.WriteTopicPage(Parent,Node : TDocNode);
 | |
| 
 | |
| Var
 | |
|   Element : TTopicElement;
 | |
| 
 | |
| begin
 | |
|   Element:=FindTopicElement(Node);
 | |
|   If Not Assigned(Element) then
 | |
|     Exit;
 | |
|   // Write topic here
 | |
| end;
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Module man pages
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.ProcessModule(AModule : TPasModule);
 | |
| 
 | |
| begin
 | |
|   With AModule do
 | |
|     begin
 | |
|     Module:=AModule;
 | |
|     ModuleName:=Name;
 | |
|     With InterfaceSection do
 | |
|       begin
 | |
|       SortElementList(Declarations);
 | |
|       SortElementList(Types);
 | |
|       SortElementList(Consts);
 | |
|       SortElementList(Classes);
 | |
|       SortElementList(Functions);
 | |
|       SortElementList(Variables);
 | |
|       SortElementList(ResStrings);
 | |
|       end;
 | |
|     WriteUnitPage(AModule);
 | |
|     WriteUnitResourceStrings(InterfaceSection);
 | |
|     WriteUnitConsts(InterfaceSection);
 | |
|     WriteUnitTypes(InterfaceSection);
 | |
|     WriteUnitVars(InterfaceSection);
 | |
|     WriteUnitFunctionsAndProcedures(InterfaceSection);
 | |
|     WriteUnitClasses(InterfaceSection);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitPage(AModule : TPasModule);
 | |
| 
 | |
| Var
 | |
|   DocNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   DocNode:=Engine.FindDocNode(AModule);
 | |
|   // Write unit stuff here.
 | |
| end;
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Classes man pages
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitClasses(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   i: Integer;
 | |
| 
 | |
| begin
 | |
|   if (ASection.Classes.Count > 0) then
 | |
|     begin
 | |
|     for i := 0 to ASection.Classes.Count - 1 do
 | |
|       WriteClassPage(TPasClassType(ASection.Classes[i]));
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteClassPage(ClassDecl: TPasClassType);
 | |
| 
 | |
| var
 | |
|   DocNode: TDocNode;
 | |
| 
 | |
| begin
 | |
|   DocNode:=Engine.FindDocNode(ClassDecl);
 | |
|   // Write class here.
 | |
| end;
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Resource strings man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitResourceStrings(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   I : Integer;
 | |
|   ResStrDecl : TPasResString;
 | |
|   DocNode: TDocNode;
 | |
| 
 | |
| begin
 | |
|   for i := 0 to ASection.ResStrings.Count - 1 do
 | |
|     begin
 | |
|     ResStrDecl := TPasResString(ASection.ResStrings[i]);
 | |
|     DocNode:=Engine.FindDocNode(ResStrDecl);
 | |
|     { Write docu for resource string.}
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Constants man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitConsts(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   i: Integer;
 | |
|   ConstDecl: TPasConst;
 | |
|   DocNode: TDocNode;
 | |
| 
 | |
| begin
 | |
|   for i := 0 to ASection.Consts.Count - 1 do
 | |
|     begin
 | |
|     ConstDecl := TPasConst(ASection.Consts[i]);
 | |
|     DocNode:=Engine.FindDocNode(ConstDecl);
 | |
|     { Write docu for constant }
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Types man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitTypes(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   i: Integer;
 | |
|   TypeDecl: TPasType;
 | |
|   DocNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   for i := 0 to ASection.Types.Count - 1 do
 | |
|     begin
 | |
|     TypeDecl := TPasType(ASection.Types[i]);
 | |
|     DocNode:=Engine.FindDocNode(TypeDecl);
 | |
|     { Write docu for type }
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteEnumElements(TypeDecl : TPasEnumType);
 | |
| 
 | |
| Var
 | |
|   EV : TPasEnumValue;
 | |
|   I : Integer;
 | |
|   DocNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   With TypeDecl do
 | |
|     begin
 | |
|     SortElementList(Values);
 | |
|     For I:=0 to Values.Count-1 do
 | |
|       begin
 | |
|       EV:=TPasEnumValue(Values[i]);
 | |
|       DocNode := Engine.FindDocNode(EV);
 | |
|       { write docu per enumeration constant as needed }
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Variables man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitVars(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   VarDecl: TPasVariable;
 | |
|   i: Integer;
 | |
|   DocNode : TDocNode;
 | |
| 
 | |
| begin
 | |
|   for i := 0 to ASection.Variables.Count - 1 do
 | |
|     begin
 | |
|     VarDecl := TPasVariable(ASection.Variables[i]);
 | |
|     DocNode:=Engine.FindDocNode(VarDecl);
 | |
|     { Write docu for variable }
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Procedure/Function/Method man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WriteUnitFunctionsAndProcedures(ASection: TPasSection);
 | |
| 
 | |
| var
 | |
|   i       : Integer;
 | |
| 
 | |
| begin
 | |
|   // Pages for all identifiers.
 | |
|   for i := 0 to ASection.Functions.Count - 1 do
 | |
|     WriteProcedurePage(TPasProcedure(ASection.Functions[i]));
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.WriteProcedurePage(ProcDecl : TPasProcedureBase);
 | |
| 
 | |
| var
 | |
|   DocNode: TDocNode;
 | |
|   OP : TPasOverloadedProc;
 | |
|   i : integer;
 | |
|   D,N : String;
 | |
| begin
 | |
|   DocNode := Engine.FindDocNode(ProcDecl);
 | |
|   // Write arguments, if any.
 | |
|   AppendProcedureArgsSection(TPasProcedure(ProcDecl).ProcType);
 | |
|   If ProcDecl is TPasFunction then
 | |
|     AppendProcedureArgsSection(TPasFunction(ProcDecl).ProcType);
 | |
|   // Examples, is present
 | |
|   WriteExample(DocNode);
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.AppendProcedureArgsSection(Element: TPasProcedureType);
 | |
| 
 | |
| var
 | |
|   DocNode: TDocNode;
 | |
|   i: Integer;
 | |
|   Arg: TPasArgument;
 | |
| 
 | |
| begin
 | |
|   If Not Assigned(Element) then
 | |
|     exit;
 | |
|   for i := 0 to Element.Args.Count - 1 do
 | |
|     begin
 | |
|     Arg := TPasArgument(Element.Args[i]);
 | |
|     DocNode:=Engine.FindDocNode(Arg);
 | |
|     // Write docu for argument.
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.AppendFunctionResultSection(Element: TPasFunctionType);
 | |
| 
 | |
| Var
 | |
|   ResultEl: TPasResultElement;
 | |
|   DocNode: TDocNode;
 | |
| 
 | |
| begin
 | |
|   If Not Assigned(Element) then
 | |
|     exit;
 | |
|   ResultEl := TPasFunctionType(Element).ResultEl;
 | |
|   DocNode := Engine.FindDocNode(ResultEl);
 | |
|   // Write docu for result.
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|   Property man page
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| procedure TTemplateWriter.WritePropertyPage(PropDecl : TPasProperty);
 | |
| 
 | |
| var
 | |
|   DocNode: TDocNode;
 | |
|   N,D: String;
 | |
| 
 | |
| begin
 | |
|   DocNode := Engine.FindDocNode(PropDecl);
 | |
|   // Write docu for property.
 | |
| end;
 | |
| 
 | |
| 
 | |
| Function CompareElements(P1,P2 : Pointer) : Integer;
 | |
| 
 | |
| begin
 | |
|   Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);
 | |
| end;
 | |
| 
 | |
| procedure TTemplateWriter.SortElementList(List : TList);
 | |
| 
 | |
| begin
 | |
|   List.Sort(@CompareElements);
 | |
| end;
 | |
| 
 | |
| function TTemplateWriter.FileNameExtension: String;
 | |
| begin
 | |
|   Result:=TTemplateExtension;
 | |
| end;
 | |
| 
 | |
| Class procedure TTemplateWriter.Usage(List: TStrings);
 | |
| begin
 | |
| end;
 | |
| 
 | |
| function TTemplateWriter.ElementToLabel(AElement : TPasElement) : String;
 | |
| 
 | |
| begin
 | |
|   // Convert AElement to a valid label for cross-referencing.
 | |
| end;
 | |
| 
 | |
| 
 | |
| initialization
 | |
|   // Do not localize.
 | |
|   RegisterWriter(TTemplateWriter,TemplateName,STemplateUsageWriterDescr);
 | |
| finalization
 | |
|   UnRegisterWriter(TemplateName);
 | |
| end.
 | 
