MODULE FoxDocumentationHtml; (** AUTHOR ""; PURPOSE ""; *) IMPORT Tree := FoxDocumentationTree, Scanner := FoxDocumentationScanner, Streams,Strings, SYSTEM; CONST MaxLevel=256; TYPE ParagraphType=Tree.ParagraphType; ElementType= Tree.ElementType; Printer*= OBJECT VAR writer: Streams.Writer; chars: ARRAY MaxLevel OF CHAR; listLevel: LONGINT; currentLevel: LONGINT; printLabels: BOOLEAN; PROCEDURE &InitPrinter*(writer: Streams.Writer); BEGIN SELF.writer := writer; listLevel := 0; currentLevel := 0; printLabels := FALSE; END InitPrinter; PROCEDURE PrintLabel(section: Tree.Section); BEGIN writer.String('"#'); IF section.label = NIL THEN writer.String("_"); writer.Hex(SYSTEM.VAL(LONGINT,section),-8); ELSE WriteString(writer,section.label); END; writer.String('"') END PrintLabel; PROCEDURE Section*(section: Tree.Section); BEGIN IF section.label # NIL THEN writer.String(''); END; writer.String("
"); writer.String(""); Text(section.title); writer.Ln; writer.String(""); ParagraphList(section.contents); (* writer.String('

Top of page

'); *) 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 EndItem*(level: LONGINT); BEGIN WHILE listLevel > level DO ASSERT(chars[listLevel] # 0X); writer.String("");writer.Ln; chars[listLevel] := 0X; DEC(listLevel) END; END EndItem; PROCEDURE BeginItem*(level: LONGINT; c: CHAR); BEGIN IF (c # chars[level]) & (level > 0) THEN (* change from bullet to numbers or vice versa *) EndItem(level-1) ELSE EndItem(level); END; WHILE listLevel");writer.Ln; INC(listLevel); chars[listLevel] := c; END; END BeginItem; PROCEDURE Paragraph*(paragraph: Tree.Paragraph); VAR element: Tree.TextElement; BEGIN writer.Ln; CASE paragraph.type OF ParagraphType.Heading: EndItem(0); IF paragraph.label # NIL THEN writer.String(''); END; writer.String(""); Text(paragraph.text); writer.String(""); |ParagraphType.TextBlock: EndItem(0); writer.String("

"); Text(paragraph.text); writer.String("

"); |ParagraphType.Number: BeginItem(paragraph.level, 'o'); writer.String("
  • "); Text(paragraph.text); writer.String("
  • "); |ParagraphType.Description: BeginItem(listLevel+1(*paragraph.level*), 'd'); writer.String("
    "); Text(paragraph.description); writer.String("
    ");writer.Ln; writer.String("
    "); Text(paragraph.text); writer.String("
    ");writer.Ln; EndItem(listLevel); |ParagraphType.Bullet: BeginItem(paragraph.level, 'u'); writer.String("
  • "); Text(paragraph.text); writer.String("
  • "); |ParagraphType.Code: EndItem(0); writer.String("
    "); element := paragraph.text.GetElement(0); Text(paragraph.text); writer.String("
    "); |ParagraphType.Table: EndItem(0); writer.String(''); Text(paragraph.text); writer.String("
    "); |ParagraphType.Line: EndItem(0); 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; EndItem(0); END ParagraphList; PROCEDURE WriteString(writer: Streams.Writer; string: Strings.String); VAR i: LONGINT; c: CHAR; BEGIN IF string = NIL THEN RETURN END; i := 0; WHILE string[i] # 0X DO c := string[i]; IF c = '<' THEN writer.String("<") ELSIF c = '>' THEN writer.String(">") ELSIF c = Scanner.LF THEN writer.String("
    ") ELSE writer.Char(c); END; INC(i); END; END WriteString; PROCEDURE PrintText*(textElement: Tree.TextElement); BEGIN IF textElement.text.Length() = 0 THEN WriteString(writer,textElement.string) ELSE Text(textElement.text); END; END PrintText; PROCEDURE TextElement*(textElement: Tree.TextElement); VAR type: ElementType; BEGIN type := textElement.type; (* IF separator # 0X THEN writer.Char(separator) END; *) CASE textElement.type OF ElementType.Default : PrintText(textElement); |ElementType.Whitespace: writer.String(" "); |ElementType.Italic : writer.String(""); PrintText(textElement); writer.String(""); |ElementType.Bold : writer.String(""); PrintText(textElement); writer.String(""); |ElementType.Underline : writer.String(""); PrintText(textElement); writer.String(""); |ElementType.HeaderCell : writer.String(""); PrintText(textElement); writer.String(""); |ElementType.DataCell : writer.String(""); PrintText(textElement); writer.String(""); |ElementType.Row : writer.String(""); PrintText(textElement); writer.String(""); writer.Ln; |ElementType.Link: writer.String(''); IF textElement.text.Length()#0 THEN Text(textElement.text); ELSE WriteString( writer, textElement.string); END; writer.String(""); |ElementType.Label : writer.String(''); |ElementType.Code : writer.String(""); PrintText(textElement); 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; PROCEDURE Document*(document: Tree.Document); BEGIN currentLevel := 0; writer.String( \" \n"\ \" \n"\ \" \n"\); writer.String( \" "\); currentLevel := 1; printLabels := FALSE; (* writer.String("Contents"); *) ParagraphList(document.description); printLabels := TRUE; EndItem(0); SectionList(document.sections); writer.String(""); writer.Ln; END Document; END Printer; END FoxDocumentationHtml.