FoxDocumentationPrinter.Mod 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. MODULE FoxDocumentationPrinter; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT Tree := FoxDocumentationTree, Scanner := FoxDocumentationScanner, Streams;
  3. CONST debug=FALSE;
  4. TYPE
  5. ParagraphType=Tree.ParagraphType;
  6. ElementType= Tree.ElementType;
  7. Printer*= OBJECT
  8. VAR writer: Streams.Writer;
  9. PROCEDURE &InitPrinter*(writer: Streams.Writer);
  10. BEGIN SELF.writer := writer
  11. END InitPrinter;
  12. PROCEDURE Section*(section: Tree.Section);
  13. BEGIN
  14. IF debug THEN writer.Ln; writer.String("//// Section with level "); writer.Int(section.level,1); writer.String("//// "); END;
  15. writer.Ln;
  16. Chars("@", section.level);
  17. IF section.label # NIL THEN writer.String(section.label^) END;
  18. Text(section.title); writer.Ln;
  19. ParagraphList(section.contents);
  20. END Section;
  21. PROCEDURE SectionList*(sections: Tree.Sections);
  22. VAR i: LONGINT;
  23. BEGIN
  24. FOR i := 0 TO sections.Length()-1 DO
  25. Section(sections.GetSection(i));
  26. END;
  27. END SectionList;
  28. PROCEDURE Document*(document: Tree.Document);
  29. BEGIN
  30. ParagraphList(document.description);
  31. SectionList(document.sections);
  32. END Document;
  33. PROCEDURE Chars*(c: CHAR; rep: LONGINT);
  34. BEGIN
  35. WHILE rep>0 DO writer.Char(c); DEC(rep) END;
  36. END Chars;
  37. PROCEDURE Paragraph*(paragraph: Tree.Paragraph);
  38. BEGIN
  39. IF debug THEN
  40. writer.Ln;
  41. writer.String("//// paragraph of type ");
  42. CASE paragraph.type OF
  43. ParagraphType.Heading: writer.String("Heading");
  44. |ParagraphType.TextBlock: writer.String("TextBlock");
  45. |ParagraphType.Number: writer.String("Number");
  46. |ParagraphType.Bullet: writer.String("Bullet")
  47. |ParagraphType.Code: writer.String("Code")
  48. |ParagraphType.Table: writer.String("Table");
  49. |ParagraphType.Line: writer.String("Line");
  50. |ParagraphType.Description: writer.String("Description")
  51. END;
  52. writer.String("//// ");
  53. END;
  54. writer.Ln;
  55. CASE paragraph.type OF
  56. ParagraphType.Heading: Chars('=', paragraph.level);
  57. IF paragraph.label # NIL THEN writer.String(paragraph.label^); END;
  58. Text(paragraph.text);
  59. |ParagraphType.Description: writer.String("#"); Text(paragraph.description); writer.String("#"); Text(paragraph.text);
  60. |ParagraphType.TextBlock: Text(paragraph.text);
  61. |ParagraphType.Number: Chars('#', paragraph.level); Text(paragraph.text);
  62. |ParagraphType.Bullet: Chars('*', paragraph.level); Text(paragraph.text);
  63. |ParagraphType.Code: writer.String("{{{"); writer.Ln; Text(paragraph.text); writer.Ln; writer.String("}}}");
  64. |ParagraphType.Table: Text(paragraph.text);
  65. |ParagraphType.Line: writer.String("----");
  66. ELSE HALT(200)
  67. END;
  68. writer.Ln;
  69. END Paragraph;
  70. PROCEDURE ParagraphList*(paragraphs: Tree.Paragraphs);
  71. VAR i: LONGINT;
  72. BEGIN
  73. FOR i := 0 TO paragraphs.Length()-1 DO
  74. Paragraph(paragraphs.GetParagraph(i))
  75. END;
  76. END ParagraphList;
  77. PROCEDURE PrintText*(textElement: Tree.TextElement; separator: CHAR);
  78. BEGIN
  79. IF textElement.text.Length() = 0 THEN
  80. IF textElement.string # NIL THEN
  81. writer.String(textElement.string^);
  82. END;
  83. ELSE
  84. Text(textElement.text);
  85. END;
  86. END PrintText;
  87. PROCEDURE TextElement*(textElement: Tree.TextElement);
  88. BEGIN
  89. IF debug THEN
  90. writer.Ln; writer.String("//// TextElement:");
  91. CASE textElement.type OF
  92. ElementType.Default : writer.String("Default")
  93. |ElementType.Italic : writer.String("Italic")
  94. |ElementType.Bold : writer.String("Bold")
  95. |ElementType.HeaderCell : writer.String("HeaderCell")
  96. |ElementType.DataCell : writer.String("DataCell")
  97. |ElementType.Row : writer.String("Row")
  98. |ElementType.Link : writer.String("Link")
  99. |ElementType.WeakLink : writer.String("Link")
  100. |ElementType.Label : writer.String("Label")
  101. |ElementType.Code : writer.String("Code")
  102. |ElementType.LineBreak : writer.String("LineBreak")
  103. ELSE END;
  104. writer.String("//// ");
  105. END;
  106. (*
  107. IF separator # 0X THEN
  108. writer.Char(separator)
  109. END;
  110. *)
  111. CASE textElement.type OF
  112. ElementType.Default : PrintText(textElement,0X);
  113. |ElementType.Whitespace: writer.String(" ");
  114. |ElementType.Italic : writer.String("/"); PrintText(textElement,0X); writer.String("/");
  115. |ElementType.Underline : writer.String("_"); PrintText(textElement,0X); writer.String("_");
  116. |ElementType.Bold : writer.String("*"); PrintText(textElement,0X); writer.String("*");
  117. |ElementType.HeaderCell : writer.String("|="); PrintText(textElement,' ');
  118. |ElementType.DataCell : writer.String("|"); PrintText(textElement,' ');
  119. |ElementType.Row : PrintText(textElement,0X); writer.Ln;
  120. |ElementType.Link, ElementType.WeakLink :
  121. writer.String("[["); writer.String(textElement.string^);
  122. IF textElement.text.Length()#0 THEN
  123. writer.String("|"); Text(textElement.text);
  124. END;
  125. writer.String("]]");
  126. |ElementType.Label : writer.String("<<"); writer.String(textElement.string^); writer.String(">>");
  127. |ElementType.Code : writer.String("{{{"); PrintText(textElement,0X); writer.String("}}}");
  128. |ElementType.LineBreak : writer.String("\\");
  129. END;
  130. END TextElement;
  131. PROCEDURE Text*(text: Tree.Text);
  132. VAR element: Tree.TextElement; i: LONGINT;
  133. BEGIN
  134. FOR i := 0 TO text.Length()-1 DO
  135. element := text.GetElement(i);
  136. TextElement(element);
  137. END;
  138. END Text;
  139. END Printer;
  140. END FoxDocumentationPrinter.