implement Man2html; include "draw.m"; include "sys.m"; include "bufio.m"; include "parseman.m"; parser: Parseman; FONT_ROMAN, FONT_BOLD, FONT_ITALIC: import parser; Man2html : module { init : fn (ctxt : ref Draw->Context, argv : list of string); # Viewman signature... textwidth : fn (text : Parseman->Text) : int; }; sys : Sys; bufio : Bufio; Iobuf : import bufio; output : ref Iobuf; init(nil : ref Draw->Context, argv : list of string) { sys = load Sys Sys->PATH; bufio = load Bufio Bufio->PATH; if (bufio == nil) { sys->print("cannot load Bufio module: %r\n"); raise "fail:init"; } stdout := sys->fildes(1); output = bufio->fopen(stdout, Sys->OWRITE); parser = load Parseman "/dis/parseman.dis"; parser->init(); argv = tl argv; for (; argv != nil ; argv = tl argv) { fname := hd argv; fd := sys->open(fname, Sys->OREAD); if (fd == nil) { sys->print("cannot open %s: %r\n", fname); continue; } vm := load Viewman SELF; m := Parseman->Metrics(55, 1, 1, 1, 1, 5, 2); datachan := chan of list of (int, Parseman->Text); spawn parser->parseman(fd, m, 1, vm, datachan); output.puts("
");
for (;;) {
line := <- datachan;
if (line == nil)
break;
setline(line);
}
output.flush();
output.puts("");
}
output.close();
}
textwidth(text : Parseman->Text) : int
{
return len text.text;
}
inpara := 0;
prevailindent := 0;
setline(line : list of (int, Parseman->Text))
{
offset := 0;
str : string;
for (; line != nil; line = tl line) {
(indent, txt) := hd line;
str = txt.text;
while (offset < indent) {
output.putc(' ');
offset++;
}
case txt.font {
FONT_ITALIC => str = "" + str + "";
FONT_BOLD => str = "" + str + "";
};
case txt.heading {
1 =>
str = "" + str + "";
2 =>
str = "" + str + "";
};
if(txt.link != nil && txt.text[0] == '(')
str = "" + str + "";
else if(txt.link != nil && txt.link[0:4] == "http")
str = "" + str + "";
output.puts(str);
offset += len txt.text;
}
output.putc('\n');
}