123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- MODULE FoxDocumentationPrinter; (** AUTHOR ""; PURPOSE ""; *)
- IMPORT Tree := FoxDocumentationTree, Scanner := FoxDocumentationScanner, Streams;
- CONST debug=FALSE;
- TYPE
- ParagraphType=Tree.ParagraphType;
- ElementType= Tree.ElementType;
- Printer*= OBJECT
- VAR writer: Streams.Writer;
- PROCEDURE &InitPrinter*(writer: Streams.Writer);
- BEGIN SELF.writer := writer
- END InitPrinter;
- PROCEDURE Section*(section: Tree.Section);
- BEGIN
- IF debug THEN writer.Ln; writer.String("//// Section with level "); writer.Int(section.level,1); writer.String("//// "); END;
- writer.Ln;
- Chars("@", section.level);
- IF section.label # NIL THEN writer.String(section.label^) END;
- Text(section.title); writer.Ln;
- ParagraphList(section.contents);
- END Section;
- PROCEDURE SectionList*(sections: Tree.Sections);
- VAR i: LONGINT;
- BEGIN
- FOR i := 0 TO sections.Length()-1 DO
- Section(sections.GetSection(i));
- END;
- END SectionList;
- PROCEDURE Document*(document: Tree.Document);
- BEGIN
- ParagraphList(document.description);
- SectionList(document.sections);
- END Document;
- PROCEDURE Chars*(c: CHAR; rep: LONGINT);
- BEGIN
- WHILE rep>0 DO writer.Char(c); DEC(rep) END;
- END Chars;
- PROCEDURE Paragraph*(paragraph: Tree.Paragraph);
- BEGIN
- IF debug THEN
- writer.Ln;
- writer.String("//// paragraph of type ");
- CASE paragraph.type OF
- ParagraphType.Heading: writer.String("Heading");
- |ParagraphType.TextBlock: writer.String("TextBlock");
- |ParagraphType.Number: writer.String("Number");
- |ParagraphType.Bullet: writer.String("Bullet")
- |ParagraphType.Code: writer.String("Code")
- |ParagraphType.Table: writer.String("Table");
- |ParagraphType.Line: writer.String("Line");
- |ParagraphType.Description: writer.String("Description")
- END;
- writer.String("//// ");
- END;
- writer.Ln;
- CASE paragraph.type OF
- ParagraphType.Heading: Chars('=', paragraph.level);
- IF paragraph.label # NIL THEN writer.String(paragraph.label^); END;
- Text(paragraph.text);
- |ParagraphType.Description: writer.String("#"); Text(paragraph.description); writer.String("#"); Text(paragraph.text);
- |ParagraphType.TextBlock: Text(paragraph.text);
- |ParagraphType.Number: Chars('#', paragraph.level); Text(paragraph.text);
- |ParagraphType.Bullet: Chars('*', paragraph.level); Text(paragraph.text);
- |ParagraphType.Code: writer.String("{{{"); writer.Ln; Text(paragraph.text); writer.Ln; writer.String("}}}");
- |ParagraphType.Table: Text(paragraph.text);
- |ParagraphType.Line: writer.String("----");
- ELSE HALT(200)
- END;
- writer.Ln;
- END Paragraph;
- PROCEDURE ParagraphList*(paragraphs: Tree.Paragraphs);
- VAR i: LONGINT;
- BEGIN
- FOR i := 0 TO paragraphs.Length()-1 DO
- Paragraph(paragraphs.GetParagraph(i))
- END;
- END ParagraphList;
- PROCEDURE PrintText*(textElement: Tree.TextElement; separator: CHAR);
- BEGIN
- IF textElement.text.Length() = 0 THEN
- IF textElement.string # NIL THEN
- writer.String(textElement.string^);
- END;
- ELSE
- Text(textElement.text);
- END;
- END PrintText;
- PROCEDURE TextElement*(textElement: Tree.TextElement);
- BEGIN
- IF debug THEN
- writer.Ln; writer.String("//// TextElement:");
- CASE textElement.type OF
- ElementType.Default : writer.String("Default")
- |ElementType.Italic : writer.String("Italic")
- |ElementType.Bold : writer.String("Bold")
- |ElementType.HeaderCell : writer.String("HeaderCell")
- |ElementType.DataCell : writer.String("DataCell")
- |ElementType.Row : writer.String("Row")
- |ElementType.Link : writer.String("Link")
- |ElementType.WeakLink : writer.String("Link")
- |ElementType.Label : writer.String("Label")
- |ElementType.Code : writer.String("Code")
- |ElementType.LineBreak : writer.String("LineBreak")
- ELSE END;
- writer.String("//// ");
- END;
- (*
- IF separator # 0X THEN
- writer.Char(separator)
- END;
- *)
- CASE textElement.type OF
- ElementType.Default : PrintText(textElement,0X);
- |ElementType.Whitespace: writer.String(" ");
- |ElementType.Italic : writer.String("/"); PrintText(textElement,0X); writer.String("/");
- |ElementType.Underline : writer.String("_"); PrintText(textElement,0X); writer.String("_");
- |ElementType.Bold : writer.String("*"); PrintText(textElement,0X); writer.String("*");
- |ElementType.HeaderCell : writer.String("|="); PrintText(textElement,' ');
- |ElementType.DataCell : writer.String("|"); PrintText(textElement,' ');
- |ElementType.Row : PrintText(textElement,0X); writer.Ln;
- |ElementType.Link, ElementType.WeakLink :
- writer.String("[["); writer.String(textElement.string^);
- IF textElement.text.Length()#0 THEN
- writer.String("|"); Text(textElement.text);
- END;
- writer.String("]]");
- |ElementType.Label : writer.String("<<"); writer.String(textElement.string^); writer.String(">>");
- |ElementType.Code : writer.String("{{{"); PrintText(textElement,0X); writer.String("}}}");
- |ElementType.LineBreak : writer.String("\\");
- END;
- END TextElement;
- PROCEDURE Text*(text: Tree.Text);
- VAR element: Tree.TextElement; i: LONGINT;
- BEGIN
- FOR i := 0 TO text.Length()-1 DO
- element := text.GetElement(i);
- TextElement(element);
- END;
- END Text;
- END Printer;
- END FoxDocumentationPrinter.
|