123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687 |
- {
- FPDoc - Free Pascal Documentation Tool
- Copyright (C) 2000 - 2003 by
- Areca Systems GmbH / Sebastian Guenther, [email protected]
- * LaTeX 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.
- }
- {$mode objfpc}
- {$H+}
- unit dw_LaTeX;
- interface
- uses DOM, dGlobals, PasTree;
- const
- LateXHighLight : Boolean = False;
- TexExtension : String = '.tex';
- Procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
- implementation
- uses SysUtils, Classes, dwLinear, dwriter;
- Type
- { TLaTeXWriter }
- TLaTeXWriter = class(TLinearWriter)
- protected
- FLink: String;
- FTableCount : Integer;
- FInVerbatim : Boolean;
- Inlist,
- TableRowStartFlag,
- TableCaptionWritten: Boolean;
- // Linear documentation methods overrides;
- procedure WriteLabel(Const S : String); override;
- procedure WriteIndex(Const S : String); override;
- Procedure WriteExampleFile(FN : String); override;
- Procedure StartProcedure; override;
- Procedure EndProcedure; override;
- Procedure StartProperty; override;
- Procedure EndProperty; override;
- Procedure StartSynopsis; override;
- Procedure StartDeclaration; override;
- Procedure StartVisibility; override;
- Procedure StartDescription; override;
- Procedure StartAccess; override;
- Procedure StartErrors; override;
- Procedure StartSeealso; override;
- Procedure EndSeealso; override;
- procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
- procedure WriteUnitEntry(UnitRef : TPasType); override;
- Procedure EndUnitOverview; override;
- function GetLabel(AElement: TPasElement): String; override;
- procedure StartListing(Frames: Boolean; const name: String); override;
- procedure EndListing; override;
- Function EscapeText(S : String) : String; override;
- Function StripText(S : String) : String; override;
- procedure WriteCommentLine; override;
- procedure WriteComment(Comment : String);override;
- procedure StartSection(SectionName : String);override;
- procedure StartSubSection(SubSectionName : String);override;
- procedure StartSubSubSection(SubSubSectionName : String);override;
- procedure StartChapter(ChapterName : String); override;
- procedure StartOverview(WithAccess : Boolean); override;
- procedure EndOverview; override;
- procedure WriteOverviewMember(ALabel,AName,Access,ADescr : String); override;
- procedure WriteOverviewMember(ALabel,AName,ADescr : String); override;
- Class Function FileNameExtension : String; override;
- // Description node conversion
- 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;
- // TFPDocWriter class methods
- Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
- end;
- function TLaTeXWriter.GetLabel(AElement: TPasElement): String;
- var
- i: Integer;
- begin
- if AElement.ClassType = TPasUnresolvedTypeRef then
- Result := Engine.ResolveLink(Module, AElement.Name)
- else
- begin
- Result := AElement.PathName;
- Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
- end;
- for i := 1 to Length(Result) do
- if Result[i] = '.' then
- Result[i] := ':';
- end;
- Function TLatexWriter.EscapeText(S : String) : String;
- var
- i: Integer;
- begin
- if FInVerBatim=True then
- Result:=S
- else
- begin
- SetLength(Result, 0);
- for i := 1 to Length(S) do
- case S[i] of
- '&','{','}','#','_','$','%': // Escape these characters
- Result := Result + '\' + S[i];
- '~','^':
- Result := Result + '\'+S[i]+' ';
- '\':
- Result:=Result+'$\backslash$'
- else
- Result := Result + S[i];
- end;
- end;
- end;
- Function TLatexWriter.StripText(S : String) : String;
- var
- I: Integer;
- begin
- SetLength(Result, 0);
- for i := 1 to Length(S) do
- If not (S[i] in ['&','{','}','#','_','$','%','''','~','^', '\']) then
- Result := Result + S[i];
- end;
- procedure TLaTeXWriter.DescrBeginBold;
- begin
- Write('\textbf{');
- end;
- procedure TLaTeXWriter.DescrEndBold;
- begin
- Write('}');
- end;
- procedure TLaTeXWriter.DescrBeginItalic;
- begin
- Write('\textit{');
- end;
- procedure TLaTeXWriter.DescrEndItalic;
- begin
- Write('}');
- end;
- procedure TLaTeXWriter.DescrBeginEmph;
- begin
- Write('\emph{');
- end;
- procedure TLaTeXWriter.DescrEndEmph;
- begin
- Write('}');
- end;
- procedure TLaTeXWriter.DescrWriteFileEl(const AText: DOMString);
- begin
- Write('\file{');
- DescrWriteText(AText);
- Write('}');
- end;
- procedure TLaTeXWriter.DescrWriteKeywordEl(const AText: DOMString);
- begin
- Write('\textbf{\\ttfamily ');
- DescrWriteText(AText);
- Write('}');
- end;
- procedure TLaTeXWriter.DescrWriteVarEl(const AText: DOMString);
- begin
- Write('\var{');
- DescrWriteText(AText);
- Write('}');
- end;
- procedure TLaTeXWriter.DescrBeginLink(const AId: DOMString);
- begin
- FLink := Engine.ResolveLink(Module, AId);
- // System.WriteLn('Link "', AId, '" => ', FLink);
- end;
- procedure TLaTeXWriter.DescrEndLink;
- begin
- WriteF(' (\pageref{%s})',[StripText(Flink)]);
- end;
- procedure TLaTeXWriter.DescrWriteLinebreak;
- begin
- WriteLn('\\');
- end;
- procedure TLaTeXWriter.DescrBeginParagraph;
- begin
- // Do nothing
- end;
- procedure TLaTeXWriter.DescrEndParagraph;
- begin
- WriteLn('');
- WriteLn('');
- end;
- procedure TLaTeXWriter.DescrBeginCode(HasBorder: Boolean;
- const AHighlighterName: String);
- begin
- StartListing(HasBorder,'');
- end;
- procedure TLaTeXWriter.DescrWriteCodeLine(const ALine: String);
- begin
- WriteLn(ALine);
- end;
- procedure TLaTeXWriter.DescrEndCode;
- begin
- EndListing
- end;
- procedure TLaTeXWriter.DescrBeginOrderedList;
- begin
- WriteLn('\begin{enumerate}');
- end;
- procedure TLaTeXWriter.DescrEndOrderedList;
- begin
- WriteLn('\end{enumerate}');
- end;
- procedure TLaTeXWriter.DescrBeginUnorderedList;
- begin
- WriteLn('\begin{itemize}');
- end;
- procedure TLaTeXWriter.DescrEndUnorderedList;
- begin
- WriteLn('\end{itemize}');
- end;
- procedure TLaTeXWriter.DescrBeginDefinitionList;
- begin
- WriteLn('\begin{description}');
- end;
- procedure TLaTeXWriter.DescrEndDefinitionList;
- begin
- WriteLn('\end{description}');
- end;
- procedure TLaTeXWriter.DescrBeginListItem;
- begin
- Write('\item ');
- end;
- procedure TLaTeXWriter.DescrEndListItem;
- begin
- WriteLn('');
- end;
- procedure TLaTeXWriter.DescrBeginDefinitionTerm;
- begin
- Write('\item[');
- end;
- procedure TLaTeXWriter.DescrEndDefinitionTerm;
- begin
- WriteLn(']');
- end;
- procedure TLaTeXWriter.DescrBeginDefinitionEntry;
- begin
- // Do nothing
- end;
- procedure TLaTeXWriter.DescrEndDefinitionEntry;
- begin
- WriteLn('');
- end;
- procedure TLaTeXWriter.DescrBeginSectionTitle;
- begin
- Write('\subsection{');
- end;
- procedure TLaTeXWriter.DescrBeginSectionBody;
- begin
- WriteLn('}');
- end;
- procedure TLaTeXWriter.DescrEndSection;
- begin
- // Do noting
- end;
- procedure TLaTeXWriter.DescrBeginRemark;
- begin
- WriteLn('\begin{remark}');
- end;
- procedure TLaTeXWriter.DescrEndRemark;
- begin
- WriteLn('\end{remark}');
- end;
- procedure TLaTeXWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
- var
- i: Integer;
- begin
- // !!!: How do we set the border?
- Write('\begin{FPCltable}{');
- for i := 1 to ColCount do
- Write('l');
- write('}{');
- TableCaptionWritten:=False;
- end;
- procedure TLaTeXWriter.DescrEndTable;
- begin
- WriteLn('\end{FPCltable}');
- end;
- procedure TLaTeXWriter.DescrBeginTableCaption;
- begin
- // Do nothing.
- end;
- procedure TLaTeXWriter.DescrEndTableCaption;
- begin
- Write('}{table');
- Inc(FTableCount);
- Write(IntToStr(FTableCount));
- Writeln('}');
- TableCaptionWritten := True;
- end;
- procedure TLaTeXWriter.DescrBeginTableHeadRow;
- begin
- if not TableCaptionWritten then
- DescrEndTableCaption;
- TableRowStartFlag := True;
- end;
- procedure TLaTeXWriter.DescrEndTableHeadRow;
- begin
- WriteLn('\\ \hline');
- end;
- procedure TLaTeXWriter.DescrBeginTableRow;
- begin
- if not TableCaptionWritten then
- DescrEndTableCaption;
- TableRowStartFlag := True;
- end;
- procedure TLaTeXWriter.DescrEndTableRow;
- begin
- WriteLn('\\');
- end;
- procedure TLaTeXWriter.DescrBeginTableCell;
- begin
- if TableRowStartFlag then
- TableRowStartFlag := False
- else
- Write(' & ');
- end;
- procedure TLaTeXWriter.DescrEndTableCell;
- begin
- // Do nothing
- end;
- procedure TLaTeXWriter.WriteLabel(const s: String);
- begin
- WriteLnF('\label{%s}', [LowerCase(StripText(s))]);
- end;
- procedure TLaTeXWriter.WriteIndex(const s : String);
- begin
- Write('\index{');
- Write(EscapeText(s));
- Writeln('}');
- end;
- procedure TLaTeXWriter.StartListing(Frames: Boolean; const name: String);
- begin
- FInVerbatim:=True;
- if Not LaTexHighLight then
- begin
- Writeln('');
- Writeln('\begin{verbatim}');
- end
- else
- if Frames then
- Writelnf('\begin{lstlisting}{%s}',[StripText(Name)])
- else
- Writelnf('\begin{lstlisting}[frame=]{%s}',[StripText(Name)]);
- end;
- procedure TLaTeXWriter.EndListing;
- begin
- FInVerbatim:=False;
- If LaTexHighLight then
- Writeln('\end{lstlisting}')
- else
- Writeln('\end{verbatim}')
- end;
- procedure TLatexWriter.WriteCommentLine;
- const
- CommentLine =
- '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
- begin
- Writeln(CommentLine);
- end;
- procedure TLatexWriter.WriteComment(Comment : String);
- begin
- Write('% ');
- Writeln(Comment);
- end;
- procedure TLatexWriter.StartChapter(ChapterName : String);
- begin
- WriteCommentLine;
- WriteComment(ChapterName);
- WriteCommentLine;
- Writeln('\chapter{'+EscapeText(ChapterName)+'}');
- end;
- procedure TLatexWriter.StartSection(SectionName : String);
- begin
- WriteCommentLine;
- WriteComment(SectionName);
- Writeln('\section{'+EscapeText(SectionName)+'}');
- end;
- procedure TLatexWriter.StartSubSection(SubSectionName : String);
- begin
- WriteComment(SubSectionName);
- Writeln('\subsection{'+EscapeText(SubSectionName)+'}');
- end;
- procedure TLatexWriter.StartSubSubSection(SubSubSectionName : String);
- begin
- Writeln('\subsubsection{'+EscapeText(SubSubSectionName)+'}');
- end;
- procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
- var
- Writer: TLaTeXWriter;
- begin
- Writer := TLaTeXWriter.Create(APackage, AEngine);
- try
- Writer.WriteDoc;
- finally
- Writer.Free;
- end;
- end;
- Procedure TLatexWriter.StartProcedure;
- begin
- Writeln('\begin{FPCList}');
- InList:=True;
- end;
- Procedure TLatexWriter.StartSynopsis;
- begin
- Writeln('\Synopsis');
- end;
- Procedure TLatexWriter.StartDeclaration;
- begin
- Writeln('\Declaration ');
- end;
- Procedure TLatexWriter.StartVisibility;
- begin
- Writeln('\Visibility');
- end;
- Procedure TLatexWriter.StartDescription;
- begin
- Writeln('\Description');
- end;
- Procedure TLatexWriter.StartErrors;
- begin
- Writeln('\Errors');
- end;
- Procedure TLatexWriter.StartAccess;
- begin
- Writeln('\Access')
- end;
- Procedure TLatexWriter.EndProcedure;
- begin
- InList:=False;
- Writeln('\end{FPCList}');
- end;
- Procedure TLatexWriter.StartProperty;
- begin
- Writeln('\begin{FPCList}');
- InList:=True;
- end;
- Procedure TLatexWriter.EndProperty;
- begin
- InList:=False;
- Writeln('\end{FPCList}');
- end;
- procedure TLateXWriter.WriteExampleFile(FN : String);
- begin
- If (FN<>'') then
- WritelnF('\FPCexample{%s}', [ChangeFileExt(FN,'')]);
- end;
- procedure TLatexWriter.StartOverview(WithAccess : Boolean);
- begin
- If WithAccess then
- begin
- WriteLn('\begin{tabularx}{\textwidth}{lllX}');
- WriteLnF('%s & %s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)])
- end
- else
- begin
- WriteLn('\begin{tabularx}{\textwidth}{llX}');
- WriteLnF('%s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocDescription)])
- end;
- end;
- procedure TLatexWriter.EndOverview;
- begin
- WriteLn('\hline');
- WriteLn('\end{tabularx}');
- end;
- procedure TLatexWriter.WriteOverviewMember(ALabel,AName,Access,ADescr : String);
- begin
- WriteLnF('\pageref{%s} & %s & %s & %s \\',[ALabel,AName,Access,ADescr]);
- end;
- procedure TLatexWriter.WriteOverviewMember(ALabel,AName,ADescr : String);
- begin
- WriteLnF('\pageref{%s} & %s & %s \\',[ALabel,AName,ADescr]);
- end;
- class function TLaTeXWriter.FileNameExtension: String;
- begin
- Result:=TexExtension;
- end;
- Procedure TLatexWriter.StartSeeAlso;
- begin
- If not InList then
- begin
- Writeln('');
- Writeln('\begin{FPCList}');
- end;
- Writeln('\SeeAlso');
- end;
- procedure TLaTeXWriter.EndSeealso;
- begin
- If Not InList then
- Writeln('\end{FPCList}');
- end;
- procedure TLatexWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
- begin
- WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
- [Format(SDocUsedUnitsByUnitXY, [AModuleName]), AModuleName]);
- WriteLn('Name & Page \\ \hline');
- end;
- procedure TLatexWriter.WriteUnitEntry(UnitRef : TPasType);
- begin
- WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
- [UnitRef.Name, UnitRef.Name, StripText(GetLabel(UnitRef))]);
- end;
- procedure TLatexWriter.EndUnitOverview;
- begin
- WriteLn('\end{FPCltable}');
- end;
- Function TLatexWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
- begin
- Result:=True;
- if (cmd= '--latex-highlight') then
- LatexHighLight:=True
- else if Cmd = '--latex-extension' then
- TexExtension:=Arg
- else
- Result:=False;
- end;
- initialization
- // Do not localize.
- RegisterWriter(TLaTeXWriter,'latex','Latex output using fpc.sty class.');
- finalization
- UnRegisterWriter('latex');
- end.
|