| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164 | {$mode objfpc}{$H+}unit dwlinear;interfaceuses  Classes, SysUtils, DGlobals, dWriter, pastree, dom;Type  { TLinearWriter }  TLinearWriter = Class(TFPDocWriter)    FStream : TStream;    PackageName: String;    Module: TPasModule;    ModuleName: String;  Protected    // Writing support.    procedure Write(const s: String); virtual;    procedure WriteLn(const s: String); virtual;    procedure WriteF(const s: String; const Args: array of const);    procedure WriteLnF(const s: String; const Args: array of const);    Function  PushWriteContext(S : TStream) : TStream;    Procedure PopWriteContext(S : TSTream);    procedure WriteLabel(El: TPasElement);    procedure WriteIndex(El: TPasElement);    // Auxiliary routines    procedure SortElementList(List : TList);    procedure StartListing(Frames: Boolean);    Function  ShowMember(M : TPasElement) : boolean;    procedure StartChapter(ChapterName : String; ChapterLabel : String);    procedure StartSection(SectionName : String; SectionLabel : String);    procedure StartSubSection(SubSectionName : String; SubSectionLabel : String);    procedure StartSubSubSection(SubSubSectionName : String; SubSubSectionLabel : String);    Function  GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;    function  ConstValue(ConstDecl: TPasConst): String; virtual;    procedure ProcessSection(ASection: TPasSection); virtual;    // Procedures which MAY be overridden in descendents    procedure WriteBeginDocument; virtual;    procedure WriteEndDocument; virtual;    Function  EscapeText(S : String) : String; virtual;    Function  StripText(S : String) : String; virtual;    Procedure StartProcedure; Virtual;    Procedure EndProcedure; Virtual;    Procedure StartProperty; Virtual;    Procedure EndProperty; Virtual;    Procedure StartSynopsis; Virtual;    Procedure StartDeclaration; Virtual;    Procedure StartVisibility; Virtual;    Procedure StartDescription; Virtual;    Procedure StartAccess; Virtual;    Procedure StartErrors; Virtual;    Procedure StartSeealso; Virtual;    Procedure EndSeealso; Virtual;    // Procedures which MUST be overridden in descendents;    procedure WriteCommentLine; virtual; abstract;    procedure WriteComment(Comment : String); virtual; abstract;    function  GetLabel(AElement: TPasElement): String; virtual; abstract;    procedure WriteLabel(Const S : String); virtual; abstract;    procedure WriteIndex(Const S : String); virtual; abstract;    procedure StartChapter(ChapterName : String); virtual; abstract;    procedure StartSection(SectionName : String); virtual; abstract;    procedure StartSubSection(SubSectionName : String); virtual; abstract;    procedure StartSubSubSection(SubSubSectionName : String); virtual; abstract;    procedure StartListing(Frames: Boolean; const name: String); virtual; abstract;    procedure EndListing; virtual; abstract;    Procedure WriteExampleFile(FN : String); virtual; abstract;    procedure StartOverview(WithAccess : Boolean); virtual; Abstract;    procedure EndOverview; virtual; Abstract;    procedure WriteOverviewMember(ALabel,AName,Access,ADescr : String); virtual; Abstract;    procedure WriteOverviewMember(ALabel,AName,ADescr : String); virtual; Abstract;    procedure StartUnitOverview(AModuleName,AModuleLabel : String);virtual; Abstract;    procedure WriteUnitEntry(UnitRef : TPasType);virtual; Abstract;    procedure EndUnitOverview; virtual; Abstract;    Class Function FileNameExtension : String;virtual; Abstract;  Public    Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;    procedure WriteDoc; override;    // Linear Documentation writing methods.    Procedure ProcessPackage;    Procedure ProcessTopics(DocNode : TDocNode; Alevel : Integer);    procedure WriteResourceStrings(ASection: TPasSection);    procedure WriteUnitOverview(ASection: TPasSection);    procedure WriteVarsConstsTypes(ASection: TPasSection);    procedure WriteConsts(ASection: TPasSection);    procedure WriteTypes(ASection: TPasSection);    procedure WriteEnumElements(TypeDecl : TPasEnumType);    procedure WriteVars(ASection: TPasSection);    procedure WriteFunctionsAndProcedures(ASection: TPasSection);    procedure WriteProcedure(ProcDecl: TPasProcedureBase);    procedure WriteClasses(ASection: TPasSection);    procedure WriteClassDecl(ClassDecl: TPasClassType);    procedure WriteClassMethodOverview(ClassDecl: TPasClassType);    procedure WriteClassPropertyOverview(ClassDecl: TPasClassType);    procedure WriteProperty(PropDecl: TPasProperty);    procedure WriteExample(ADocNode: TDocNode);    procedure WriteSeeAlso(ADocNode: TDocNode);    Procedure WriteTopicNode(Node : TDocNode; Level : Integer);    // Overriden from fpdocwriter;    procedure DescrWriteText(const AText: DOMString); override;  end;implementation{ TLinearWriter }{ ---------------------------------------------------------------------  Writing support  ---------------------------------------------------------------------}Function TLinearWriter.PushWriteContext(S : TStream) : TStream;begin  Result:=FStream;  FStream:=S;end;Procedure TLinearWriter.PopWriteContext(S : TSTream);begin  FStream:=S;end;procedure TLinearWriter.Write(const s: String);Var  L : Integer;begin  L:=Length(S);  If (L>0) then    FStream.Write(PChar(S)^,L);end;procedure TLinearWriter.WriteF(const s: String; const Args: array of const);begin  Write(Format(S,Args));end;procedure TLinearWriter.WriteLn(const s: String);begin  Write(S);  Write(LineEnding);end;procedure TLinearWriter.WriteLnF(const s: String; const Args: array of const);begin  Write(Format(S,Args));  Write(LineEnding);end;procedure TLinearWriter.DescrWriteText(const AText: DOMString);begin  self.Write(EscapeText(AText));end;Function TLinearWriter.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;{ ---------------------------------------------------------------------  Auxiliary routines  ---------------------------------------------------------------------}procedure TLinearWriter.WriteLabel(El: TPasElement);begin  WriteLabel(GetLabel(El));end;procedure TLinearWriter.WriteIndex(El: TPasElement);begin  WriteIndex(EL.Name);end;procedure TLinearWriter.StartListing(Frames: Boolean);begin  StartListing(Frames,'');end;procedure TLinearWriter.StartChapter(ChapterName: String; ChapterLabel: String);begin  StartChapter(ChapterName);  WriteLabel(ChapterLabel);end;procedure TLinearWriter.StartSection(SectionName: String; SectionLabel: String);begin  StartSection(SectionName);  WriteLabel(SectionLabel);end;procedure TLinearWriter.StartSubSection(SubSectionName: String; SubSectionLabel: String);begin  StartSubSection(SubSectionName);  WriteLabel(SubSectionLabel);end;procedure TLinearWriter.StartSubSubSection(SubSubSectionName: String;  SubSubSectionLabel: String);begin  StartSubSubSection(SubSubSectionName);  WriteLabel(SubSubSectionLabel);end;{ ---------------------------------------------------------------------  Default implementations, may be overridden in descendents  ---------------------------------------------------------------------}Function  TLinearWriter.EscapeText(S : String) : String;begin  Result:=S;end;Function  TLinearWriter.StripText(S : String) : String;begin  Result:=S;end;Procedure TLinearWriter.StartProcedure;begin  Writeln(SDocProcedure+':');end;Procedure TLinearWriter.StartSynopsis;begin  Writeln('');  Writeln(SDocSynopsis+':');end;Procedure TLinearWriter.StartDeclaration;begin  Writeln('');  Writeln(SDocDeclaration+':');end;Procedure TLinearWriter.StartVisibility;begin  Writeln('');  Writeln(SDocVisibility+':');end;Procedure TLinearWriter.StartDescription;begin  Writeln('');  Writeln(SDocDescription+':');end;Procedure TLinearWriter.StartAccess;begin  Writeln('');  Writeln(SDocAccess+':');end;Procedure TLinearWriter.StartErrors;begin  Writeln('');  Writeln(SDocErrors+':');end;Procedure TLinearWriter.StartSeealso;begin  Writeln('');  Writeln(SDocSeeAlso+':');end;Procedure TLinearWriter.StartProperty;begin  Writeln('');  Writeln(SDocProperty+':');end;Procedure TLinearWriter.EndProcedure;begin  Writeln('');end;Procedure TLinearWriter.EndProperty;begin  Writeln('');end;procedure TLinearWriter.EndSeealso;begin  Writeln('');end;procedure TLinearWriter.WriteClassDecl(ClassDecl: TPasClassType);var  DocNode: TDocNode;  Vis: TPasMemberVisibilities;  Member: TPasElement;  i: Integer;begin  StartSection(ClassDecl.Name);  WriteLabel(ClassDecl);  WriteIndex(ClassDecl);  DocNode := Engine.FindDocNode(ClassDecl);  if Assigned(DocNode) and ((not IsDescrNodeEmpty(DocNode.Descr)) or    (not IsDescrNodeEmpty(DocNode.ShortDescr))) then  begin    StartSubSection(SDocDescription);    WriteDescr(ClassDecl);  end;  // Write method overview  WriteClassMethodOverView(ClassDecl);  // Write Property Overview;  WriteClassPropertyOverView(ClassDecl);  // Write method & property descriptions  // Determine visibilities  Vis := AllVisibilities;  if Engine.HidePrivate then    Exclude(Vis,visPrivate);  if Engine.HideProtected then    Exclude(Vis,visProtected);  for i := 0 to ClassDecl.Members.Count - 1 do    begin    Member := TPasElement(ClassDecl.Members[i]);    if ((Member.InheritsFrom(TPasProcedureBase)) and        (Member.Visibility in Vis)) then      WriteProcedure(TPasProcedureBase(Member));    end;  // properties.  for i := 0 to ClassDecl.Members.Count - 1 do    begin    Member := TPasElement(ClassDecl.Members[i]);    if ((Member.InheritsFrom(TPasProperty)) and        (Member.Visibility in Vis)) then      WriteProperty(TPasProperty(Member));    end;end;procedure TLinearWriter.WriteClassPropertyOverview(ClassDecl : TPasClassType);var  Member: TPasElement;  i: Integer;  L,N,S,A: String;  DocNode: TDocNode;  List : TStringList;begin  // Write property overview  List:=TStringList.Create;  Try    List.Sorted:=True;    for i := 0 to ClassDecl.Members.Count - 1 do      begin      Member := TPasElement(ClassDecl.Members[i]);      With Member do        if InheritsFrom(TPasProperty) and SHowMember(Member) then          List.AddObject(Member.Name,Member)      end;    If (List.Count>0) then      begin      StartSubSection(SDocPropertyOverview);      WriteLabel(GetLabel(ClassDecl) + ':Properties');      StartOverView(True);      For I:=0 to List.Count-1 do        begin        Member:=TPasElement(List.objects[i]);        L:=StripText(GetLabel(Member));        N:=EscapeText(Member.Name);        DocNode := Engine.FindDocNode(Member);        If Assigned(DocNode) then          S:=GetDescrString(Member, DocNode.ShortDescr)        else          S:='';        A:='';        if Length(TPasProperty(Member).ReadAccessorName) > 0 then          a := a + 'r';        if Length(TPasProperty(Member).WriteAccessorName) > 0 then          a := a + 'w';        if Length(TPasProperty(Member).StoredAccessorName) > 0 then          a := a + 's';        WriteOverviewMember(L,N,A,S);        end;      EndOverview;      end;  Finally    List.Free;  end;end;function TLinearWriter.ConstValue(ConstDecl: TPasConst): String;begin  if Assigned(ConstDecl) then    Result := ConstDecl.ClassName  else    Result := '<nil>';end;procedure TLinearWriter.WriteDoc;var  i : Integer;  DocNode : TDocNode;  L : TstringList;begin  PackageName := LowerCase(Copy(Package.Name, 2, 255));  If (Engine.OutPut='') then    Engine.Output:=PackageName+FileNameExtension;  FStream:=TFileStream.Create(Engine.Output,fmCreate);  try    WriteBeginDocument;    ProcessPackage;    L:=TStringList.Create;    Try      L.Sorted:=True;      // Sort modules.      For I:=0 to Package.Modules.Count-1 do        L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));      // Now create table.      for i:=0 to L.Count - 1 do        begin        Module := TPasModule(L.Objects[i]);        ModuleName := LowerCase(Module.Name);        WriteCommentLine;        StartChapter(Format(SDocUnitTitle, [Module.Name]));        WriteLabel(Module);        DocNode:=Engine.FindDocNode(Module);        If Assigned(DocNode) then          ProcessTopics(DocNode,1);        ProcessSection(Module.InterfaceSection);        end;    Finally      L.Free;    end;    WriteEndDocument;  finally    FSTream.Free;  end;end;procedure TLinearWriter.ProcessSection(ASection: TPasSection);begin  With ASection do    begin    SortElementList(UsesList);    SortElementList(Declarations);    SortElementList(ResStrings);    SortElementList(Types);    SortElementList(Consts);    SortElementList(Classes);    SortElementList(Functions);    SortElementList(Variables);    end;  WriteUnitOverView(ASection);  WriteVarsConstsTypes(ASection);  WriteFunctionsAndProcedures(ASection);  WriteClasses(ASection);end;procedure TLinearWriter.WriteVarsConstsTypes(ASection: TPasSection);begin  With Asection do    if (Consts.Count>0) or (Types.Count>0) or       (Variables.Count>0) or (ResStrings.Count>0) then      begin      StartSection(SDocConstsTypesVars, ModuleName+'ConstsTypesVars');      WriteResourceStrings(ASection);      WriteConsts(ASection);      WriteTypes(ASection);      WriteVars(ASection);      end;end;procedure TLinearWriter.WriteResourceStrings(ASection: TPasSection);var  ResStrDecl: TPasResString;  i: Integer;begin  if ASection.ResStrings.Count > 0 then  begin    StartSubSection(SDocResStrings,ModuleName+'ResStrings');    for i := 0 to ASection.ResStrings.Count - 1 do    begin      ResStrDecl := TPasResString(ASection.ResStrings[i]);      StartListing(false, '');      Writeln(ResStrDecl.GetDeclaration(True));      EndListing;      WriteLabel(ResStrDecl);      WriteIndex(ResStrDecl);      WriteDescr(ResStrDecl);    end;  end;end;procedure TLinearWriter.WriteUnitOverview(ASection: TPasSection);var  i: Integer;  UnitRef: TPasType;  DocNode: TDocNode;begin  if ASection.UsesList.Count > 0 then    begin    StartSection(SDocUsedUnits);    StartUnitOverview(Module.Name,ModuleName);    for i := 0 to ASection.UsesList.Count - 1 do      begin      UnitRef := TPasType(ASection.UsesList[i]);      WriteUnitEntry(UnitRef);      end;    EndUnitOverview;    end;  DocNode := Engine.FindDocNode(ASection.Parent);  if Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr) then    begin    StartSection(SDocOverview);    WriteDescr(ASection.Parent, DocNode.Descr);    end;end;Procedure TLinearWriter.ProcessPackage;var  DocNode: TDocNode;begin  DocNode:=Engine.FindDocNode(Package);  if Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr) then    begin    StartSection(SDocOverview);    WriteDescr(Package, DocNode.Descr);    end;  WriteSeeAlso(DocNode);  ProcessTopics(DocNode,1);end;Procedure TLinearWriter.ProcessTopics(DocNode : TDocNode; Alevel : Integer);Var  Node : TDocNode;begin  If Not Assigned(DocNode) then    Exit;  Node:=DocNode.FirstChild;  While Assigned(Node) do    begin    If Node.TopicNode then      WriteTopicNode(Node,ALevel);    Node:=Node.NextSibling;    end;end;Procedure TLinearWriter.WriteTopicNode(Node : TDocNode; Level : Integer);Var  Element : TTopicElement;  SubNode : TDocNode;  S : String;begin  Element:=FindTopicElement(Node);  If Not Assigned(Element) then    Exit;  S:=GetDescrString(Element,Node.ShortDescr);  Case Level of    1 : StartSection(S);    2 : StartSubSection(S);    3 : StartSubSubSection(S);  end;  WriteLabel(Element);  If Assigned(Node.Descr) then    WriteDescr(Element,Node.Descr);  WriteSeeAlso(Node);  If Level<3 then    begin    SubNode:=Node.FirstChild;    While Assigned(SubNode) do      begin      If SubNode.TopicNode then        WriteTopicNode(SubNode,Level+1);      SubNode:=SubNode.NextSibling;      end;    end;end;procedure TLinearWriter.WriteConsts(ASection: TPasSection);var  i: Integer;  ConstDecl: TPasConst;begin  if ASection.Consts.Count > 0 then    begin    StartSubSection(SDocConstants,EscapeText(ModuleName));    for i := 0 to ASection.Consts.Count - 1 do      begin      DescrBeginParaGraph;      ConstDecl := TPasConst(ASection.Consts[i]);      StartListing(False,'');      WriteLn(EscapeText(ConstDecl.GetDeclaration(True)));      EndListing;      WriteLabel(ConstDecl);      WriteIndex(ConstDecl);      WriteDescr(ConstDecl);      DescrEndParaGraph;      end;    end;end;procedure TLinearWriter.WriteEnumElements(TypeDecl : TPasEnumType);Var  EV : TPasEnumValue;  I : Integer;  DocNode : TDocNode;begin  With TypeDecl do    begin    SortElementList(Values);    DescrBeginTable(2,True);    DescrBeginTableCaption;      Writeln(EscapeText(Format(SDocValuesForEnum,[TypeDecl.Name])));    DescrEndTableCaption;    DescrBeginTableHeadRow;      DescrBeginTableCell;        Writeln(EscapeText(SDocValue));      DescrEndTableCell;      DescrBeginTableCell;        Writeln(EscapeText(SDocExplanation));      DescrEndTableCell;    DescrEndTableHeadRow;    For I:=0 to Values.Count-1 do      begin      EV:=TPasEnumValue(Values[i]);      DescrBeginTableRow;        DescrBeginTableCell;          Writeln(EscapeText(EV.Name));        DescrEndTableCell;        DescrBeginTableCell;          DocNode := Engine.FindDocNode(EV);          if Assigned(DocNode) and (not IsDescrNodeEmpty(DocNode.ShortDescr)) then            WriteDescr(EV,DocNode.ShortDescr);        DescrEndTableCell;      DescrEndTableRow;      end;    DescrEndTable;    end;end;procedure TLinearWriter.WriteTypes(ASection: TPasSection);var  i: Integer;  TypeDecl: TPasType;  DocNode : TDocNode;begin  if ASection.Types.Count > 0 then  begin    StartSubSection(SDocTypes,ModuleName+'Types');    for i := 0 to ASection.Types.Count - 1 do    begin      DescrBeginParaGraph;      TypeDecl := TPasType(ASection.Types[i]);      StartListing(False,'');      DocNode := Engine.FindDocNode(TypeDecl);      If Assigned(DocNode) and          Assigned(DocNode.Node) and          (Docnode.Node['opaque']='1') then          Writeln(TypeDecl.Name+' = '+SDocOpaque)      else             Writeln(EscapeText(TypeDecl.GetDeclaration(True)));      EndListing;      WriteLabel(TypeDecl);      WriteIndex(TypeDecl);      If TypeDecl is TPasEnumType then        begin        WriteENumElements(TypeDecl as TPasEnumType);        end;      WriteDescr(TypeDecl);      DescrEndParaGraph;    end;  end;end;procedure TLinearWriter.WriteVars(ASection: TPasSection);var  VarDecl: TPasVariable;  i: Integer;begin  if ASection.Variables.Count > 0 then  begin    StartSubsection(SDocVariables,ModuleName+'Variables');    for i := 0 to ASection.Variables.Count - 1 do    begin      DescrBeginParaGraph;      VarDecl := TPasVariable(ASection.Variables[i]);      StartListing(False,'');      WriteLn(EscapeText(VarDecl.GetDeclaration(True)));      EndListing;      WriteLabel(VarDecl);      WriteIndex(VarDecl);      WriteDescr(VarDecl);      DescrEndParaGraph;    end;  end;end;procedure TLinearWriter.WriteProcedure(ProcDecl : TPasProcedureBase);var  DocNode: TDocNode;  OP : TPasOverloadedProc;  i : integer;begin  With ProcDecl do    begin    if Not (Assigned(Parent) and Parent.InheritsFrom(TPasClassType)) then      begin      StartSubSection(Name);      WriteLabel(ProcDecl);      WriteIndex(ProcDecl);      end    else      begin // Parent assigned and hence method.      StartSubSection(Parent.Name+'.'+Name);      WriteLabel(ProcDecl);      WriteIndex(Parent.Name+'.'+Name);      end;    StartProcedure;    DocNode := Engine.FindDocNode(ProcDecl);    if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then      begin      StartSynopsis;      WriteDescr(ProcDecl, DocNode.ShortDescr);      end;    StartDeclaration;    StartListing(False);    if ClassType = TPasOverloadedProc then      begin      OP:=TPasOverloadedProc(ProcDecl);      for i := 0 to OP.Overloads.Count - 1 do        begin        WriteLn(TPasProcedure(OP.Overloads[i]).GetDeclaration(True));        end;      end    else      WriteLn(GetDeclaration(True));    EndListing;    If Assigned(Parent) then      begin      StartVisibility;      Writeln(VisibilityNames[Visibility])      end;    if Assigned(DocNode) and Assigned(DocNode.Descr) then      begin      StartDescription;      WriteDescr(ProcDecl);      end;    if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then      begin      StartErrors;      WriteDescr(ProcDecl, DocNode.ErrorsDoc);      end;    WriteSeeAlso(DocNode);    EndProcedure;    WriteExample(DocNode);    end;end;procedure TLinearWriter.WriteFunctionsAndProcedures(ASection: TPasSection);var  i: Integer;begin  if ASection.Functions.Count > 0 then    begin    StartSection(SDocProceduresAndFunctions,ModuleName+'Functions');    for i := 0 to ASection.Functions.Count - 1 do      WriteProcedure(TPasProcedureBase(ASection.Functions[i]));    end;end;procedure TLinearWriter.WriteExample(ADocNode: TDocNode);var  Example: TDOMElement;  S : string;begin  S:='';  if Assigned(ADocNode) then    begin    Example := ADocNode.FirstExample;    while Assigned(Example) do      begin      if IsExampleNode(Example) then        begin        if (S<>'') then // not first example, start new paragraph          DescrBeginParagraph;        s:=Engine.GetExampleFileName(Example);        if (S<>'') then          WriteExampleFile(S);        if Assigned(Example.NextSibling) then           DescrEndParaGraph;        end;      Example := TDomElement(Example.NextSibling);      end;    end;end;procedure TLinearWriter.WriteProperty(PropDecl : TPasProperty);var  DocNode: TDocNode;  S: String;begin  With PropDecl do    begin    StartSubSection(Parent.Name+'.'+Name);    WriteLabel(PropDecl);    WriteIndex(Parent.Name+'.'+Name);    StartProperty;    DocNode := Engine.FindDocNode(PropDecl);    if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then      begin      StartSynopsis;      WriteDescr(PropDecl, DocNode.ShortDescr);      end;    StartDeclaration;    StartListing(False);    WriteLn('Property '+GetDeclaration(True));    EndListing;    If Assigned(Parent) then      begin      StartVisibility;      Writeln(VisibilityNames[Visibility])      end;    StartAccess;    Setlength(S,0);    If Length(ReadAccessorName) > 0 then      S:='Read';    if Length(WriteAccessorName) > 0 then      begin      If S<>'' then        S:=S+',';      S:=S+'Write';      end;    Writeln(S);    if Assigned(DocNode) and Assigned(DocNode.Descr) then      begin      StartDescription;      WriteDescr(PropDecl);      end;    if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then      begin      StartErrors;      WriteDescr(PropDecl, DocNode.ErrorsDoc);      end;    WriteSeeAlso(DocNode);    EndProperty;    WriteExample(DocNode);    end;end;procedure TLinearWriter.WriteSeeAlso(ADocNode: TDocNode);var  Node: TDOMNode;  s: String;  First : Boolean;begin  if Not (Assigned(ADocNode) and Assigned(ADocNode.SeeAlso)) then    Exit;  Node := ADocNode.SeeAlso.FirstChild;  First:=True;  while Assigned(Node) do    begin    if IsLinkNode(Node) then      begin      If First then        begin        StartSeealso;        First:=False;        end      else        Writeln(',');      S:=TDomElement(Node)['id'];      DescrBeginLink(S);      Write(EscapeText(S));      DescrEndLink();      end;    Node:=Node.NextSibling;    end;  If Not First then    EndSeeAlsoend;Function CompareElements(P1,P2 : Pointer) : Integer;begin  Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);end;procedure TLinearWriter.SortElementList(List : TList);begin  List.Sort(@CompareElements);end;Function TLinearWriter.ShowMember(M : TPasElement) : boolean;begin  Result:=not ((M.Visibility=visPrivate) and Engine.HidePrivate);  If Result then    Result:=Not ((M.Visibility=visProtected) and Engine.HideProtected)end;procedure TLinearWriter.WriteClasses(ASection: TPasSection);var  i: Integer;begin  if (ASection.Classes.Count > 0) then    for i := 0 to ASection.Classes.Count - 1 do      WriteClassDecl(TPasClassType(ASection.Classes[i]));end;procedure TLinearWriter.WriteClassMethodOverview(ClassDecl: TPasClassType);var  Member : TPasElement;  i : Integer;  L,N,S : String;  DocNode : TDocNode;  List : TStringList;begin  List:=TStringList.Create;  Try    List.Sorted:=True;    for i := 0 to ClassDecl.Members.Count - 1 do      begin      Member := TPasElement(ClassDecl.Members[i]);      With Member do        if InheritsFrom(TPasProcedureBase) and ShowMember(Member) then      List.AddObject(Member.Name,Member);      end;    If List.Count>0 then      begin      StartSubSection(SDocMethodOverview);      WriteLabel(GetLabel(ClassDecl) + ':Methods');      StartOverview(False);      For I:=0 to List.Count-1 do        begin        Member:=TPasElement(List.Objects[i]);        L:=StripText(GetLabel(Member));        N:=EscapeText(Member.Name);        DocNode := Engine.FindDocNode(Member);        If Assigned(DocNode) then          S:=GetDescrString(Member, DocNode.ShortDescr)        else          S:='';        WriteOverviewMember(L,N,S);        end;      EndOverview;      end;  Finally    List.Free;  end;end;constructor TLinearWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);  procedure AddLabel(AElement: TPasElement);  begin    Engine.AddLink(AElement.PathName, GetLabel(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, GetLabel(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 ;  { Allocate labels for all elements for which we are going to create    documentation. This is needed for links to work correctly. }  // Allocate label for the package itself, if a name is given (i.e. <> '#')  if Length(Package.Name) > 1 then    begin    AddLabel(Package);    AddTopicPages(Package);    end;  for i := 0 to Package.Modules.Count - 1 do    ScanModule(TPasModule(Package.Modules[i]));end;procedure TLinearWriter.WriteBeginDocument;begin  WriteComment('This file has been created automatically by FPDoc.');  WriteComment('Linear output (c) 2005 Michael Van Canneyt');end;procedure TLinearWriter.WriteEndDocument;beginend;end.
 |