FoxDocumentationHtml.Mod 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. MODULE FoxDocumentationHtml; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT Tree := FoxDocumentationTree, Scanner := FoxDocumentationScanner, Streams,Strings, SYSTEM;
  3. CONST MaxLevel=256;
  4. TYPE
  5. ParagraphType=Tree.ParagraphType;
  6. ElementType= Tree.ElementType;
  7. Printer*= OBJECT
  8. VAR writer: Streams.Writer;
  9. chars: ARRAY MaxLevel OF CHAR; listLevel: LONGINT;
  10. currentLevel: LONGINT; printLabels: BOOLEAN;
  11. PROCEDURE &InitPrinter*(writer: Streams.Writer);
  12. BEGIN SELF.writer := writer; listLevel := 0; currentLevel := 0; printLabels := FALSE;
  13. END InitPrinter;
  14. PROCEDURE PrintLabel(section: Tree.Section);
  15. BEGIN
  16. writer.String('"#'); IF section.label = NIL THEN writer.String("_"); writer.Hex(SYSTEM.VAL(LONGINT,section),-8); ELSE WriteString(writer,section.label); END; writer.String('"')
  17. END PrintLabel;
  18. PROCEDURE Section*(section: Tree.Section);
  19. BEGIN
  20. IF section.label # NIL THEN
  21. writer.String('<a name="'); WriteString(writer, section.label); writer.String('"></a>');
  22. END;
  23. writer.String("<hr>");
  24. writer.String("<h"); writer.Int(section.level,0); writer.String(" id="); PrintLabel(section); writer.String(">");
  25. Text(section.title); writer.Ln;
  26. writer.String("</h"); writer.Int(section.level,1); writer.String(">");
  27. ParagraphList(section.contents);
  28. (*
  29. writer.String('<p><a href="#top"> Top of page </a></p>');
  30. *)
  31. END Section;
  32. PROCEDURE SectionList*(sections: Tree.Sections);
  33. VAR i: LONGINT;
  34. BEGIN
  35. FOR i := 0 TO sections.Length()-1 DO
  36. Section(sections.GetSection(i));
  37. END;
  38. END SectionList;
  39. PROCEDURE EndItem*(level: LONGINT);
  40. BEGIN
  41. WHILE listLevel > level DO
  42. ASSERT(chars[listLevel] # 0X);
  43. writer.String("</"); writer.Char(chars[listLevel]); writer.String("l>");writer.Ln;
  44. chars[listLevel] := 0X;
  45. DEC(listLevel)
  46. END;
  47. END EndItem;
  48. PROCEDURE BeginItem*(level: LONGINT; c: CHAR);
  49. BEGIN
  50. IF (c # chars[level]) & (level > 0) THEN (* change from bullet to numbers or vice versa *)
  51. EndItem(level-1)
  52. ELSE
  53. EndItem(level);
  54. END;
  55. WHILE listLevel<level DO
  56. writer.String("<"); writer.Char(c); writer.String("l>");writer.Ln;
  57. INC(listLevel);
  58. chars[listLevel] := c;
  59. END;
  60. END BeginItem;
  61. PROCEDURE Paragraph*(paragraph: Tree.Paragraph);
  62. VAR element: Tree.TextElement;
  63. BEGIN
  64. writer.Ln;
  65. CASE paragraph.type OF
  66. ParagraphType.Heading:
  67. EndItem(0);
  68. IF paragraph.label # NIL THEN
  69. writer.String('<a name="'); WriteString(writer, paragraph.label); writer.String('"></a>');
  70. END;
  71. writer.String("<h"); writer.Int(currentLevel + paragraph.level,0); writer.String(">"); Text(paragraph.text);
  72. writer.String("</h"); writer.Int(currentLevel + paragraph.level,0); writer.String(">");
  73. |ParagraphType.TextBlock:
  74. EndItem(0);
  75. writer.String("<p>"); Text(paragraph.text); writer.String("</p>");
  76. |ParagraphType.Number:
  77. BeginItem(paragraph.level, 'o');
  78. writer.String("<li>");
  79. Text(paragraph.text);
  80. writer.String("</li>");
  81. |ParagraphType.Description:
  82. BeginItem(listLevel+1(*paragraph.level*), 'd');
  83. writer.String("<dt><strong>"); Text(paragraph.description); writer.String("</strong></dt>");writer.Ln;
  84. writer.String("<dd>"); Text(paragraph.text); writer.String("</dd>");writer.Ln;
  85. EndItem(listLevel);
  86. |ParagraphType.Bullet:
  87. BeginItem(paragraph.level, 'u');
  88. writer.String("<li>");
  89. Text(paragraph.text);
  90. writer.String("</li>");
  91. |ParagraphType.Code:
  92. EndItem(0);
  93. writer.String("<pre>"); element := paragraph.text.GetElement(0); Text(paragraph.text); writer.String("</pre>");
  94. |ParagraphType.Table:
  95. EndItem(0);
  96. writer.String('<table>'); Text(paragraph.text); writer.String("</table>");
  97. |ParagraphType.Line:
  98. EndItem(0);
  99. writer.String("<hr/>");
  100. ELSE HALT(200)
  101. END;
  102. writer.Ln;
  103. END Paragraph;
  104. PROCEDURE ParagraphList*(paragraphs: Tree.Paragraphs);
  105. VAR i: LONGINT;
  106. BEGIN
  107. FOR i := 0 TO paragraphs.Length()-1 DO
  108. Paragraph(paragraphs.GetParagraph(i))
  109. END;
  110. EndItem(0);
  111. END ParagraphList;
  112. PROCEDURE WriteString(writer: Streams.Writer; string: Strings.String);
  113. VAR i: LONGINT; c: CHAR;
  114. BEGIN
  115. IF string = NIL THEN RETURN END;
  116. i := 0;
  117. WHILE string[i] # 0X DO
  118. c := string[i];
  119. IF c = '<' THEN writer.String("&lt")
  120. ELSIF c = '>' THEN writer.String("&gt")
  121. ELSIF c = Scanner.LF THEN writer.String("<BR>")
  122. ELSE
  123. writer.Char(c);
  124. END;
  125. INC(i);
  126. END;
  127. END WriteString;
  128. PROCEDURE PrintText*(textElement: Tree.TextElement);
  129. BEGIN
  130. IF textElement.text.Length() = 0 THEN
  131. WriteString(writer,textElement.string)
  132. ELSE
  133. Text(textElement.text);
  134. END;
  135. END PrintText;
  136. PROCEDURE TextElement*(textElement: Tree.TextElement);
  137. VAR type: ElementType;
  138. BEGIN
  139. type := textElement.type;
  140. (*
  141. IF separator # 0X THEN
  142. writer.Char(separator)
  143. END;
  144. *)
  145. CASE textElement.type OF
  146. ElementType.Default : PrintText(textElement);
  147. |ElementType.Whitespace: writer.String(" ");
  148. |ElementType.Italic : writer.String("<em>"); PrintText(textElement); writer.String("</em>");
  149. |ElementType.Bold : writer.String("<strong>"); PrintText(textElement); writer.String("</strong>");
  150. |ElementType.Underline : writer.String("<u>"); PrintText(textElement); writer.String("</u>");
  151. |ElementType.HeaderCell : writer.String("<th align='left'>"); PrintText(textElement); writer.String("</th>");
  152. |ElementType.DataCell : writer.String("<td>"); PrintText(textElement); writer.String("</td>");
  153. |ElementType.Row : writer.String("<tr>"); PrintText(textElement); writer.String("</tr>"); writer.Ln;
  154. |ElementType.Link:
  155. writer.String('<a href="'); writer.String("#"); WriteString(writer,textElement.string); writer.String('">');
  156. IF textElement.text.Length()#0 THEN
  157. Text(textElement.text);
  158. ELSE WriteString( writer, textElement.string);
  159. END;
  160. writer.String("</a>");
  161. |ElementType.Label :
  162. writer.String('<a name="'); WriteString(writer, textElement.string); writer.String('"></a>');
  163. |ElementType.Code : writer.String("<code>"); PrintText(textElement); writer.String("</code>");
  164. |ElementType.LineBreak : writer.String("<br>");
  165. END;
  166. END TextElement;
  167. PROCEDURE Text*(text: Tree.Text);
  168. VAR element: Tree.TextElement; i: LONGINT;
  169. BEGIN
  170. FOR i := 0 TO text.Length()-1 DO
  171. element := text.GetElement(i);
  172. TextElement(element);
  173. END;
  174. END Text;
  175. PROCEDURE Document*(document: Tree.Document);
  176. BEGIN
  177. currentLevel := 0;
  178. writer.String(
  179. \"<?xml version=\"1.0\" encoding=\"UTF-8\" ?> \n"\
  180. \"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> \n"\
  181. \"<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title> \n"\);
  182. writer.String(
  183. \"<style>
  184. normal {
  185. font-family: Helvetica, Sans-Serif;
  186. }
  187. .bold {
  188. font-family: Helvetica, Sans-Serif;
  189. }
  190. H1 {
  191. color: #550088
  192. }
  193. H2 {
  194. font-family: Helvetica, Sans-Serif;
  195. color: #550088
  196. }
  197. H3 {
  198. font-family: Helvetica, Sans-Serif;
  199. color: #550088
  200. }
  201. H4 {
  202. font-family: Helvetica, Sans-Serif;
  203. color: #550088
  204. }
  205. A {
  206. color: #550088
  207. }
  208. </style>
  209. </head>
  210. <body>
  211. "\);
  212. currentLevel := 1; printLabels := FALSE;
  213. (*
  214. writer.String("<h"); writer.Int(currentLevel+1,1); writer.String(">Contents</h"); writer.Int(currentLevel+1,0); writer.String(">");
  215. *)
  216. ParagraphList(document.description);
  217. printLabels := TRUE; EndItem(0);
  218. SectionList(document.sections);
  219. writer.String("</body></html>"); writer.Ln;
  220. END Document;
  221. END Printer;
  222. END FoxDocumentationHtml.