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.Char(chars[listLevel]); writer.String("l>");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.