package sbaz.manual import Documents._ object EmitHtml { val out = Console def escape(text: String) = { text.replaceAll("&", "&") .replaceAll("<", "<") } def emitSection(section: Section, depth: int): Unit = { def emitText(text: AbstractText): Unit = text match { case seq:SeqText => seq.components.foreach(emitText) case Text(text) => out.print(escape(text)) case MDash => out.print("—") case Emph(text) => { out.print("") emitText(text) out.print("") } case Mono(text) => { out.print("") out.print(escape(text)) out.print("") } case Quote(text) => { out.print("\"") emitText(text) out.print("\"") } case BlockQuote(text) => { out.println("
") emitText(text) out.println("
") } case CodeSample(code) => { out.print("
")
	  out.print(escape(code))
	  out.println("
") } } def emitParagraph(para: Paragraph) = para match { case TextParagraph(text) => { out.print("

") emitText(text) } case lst:BulletList => { out.println("

") } case lst:NumberedList => { out.println("
    ") for(val item <- lst.items) { out.print("
  1. ") emitText(item) } out.println("
") } case TitledPara(title, text) => { out.println("

" + escape(title) + "") emitText(text) } case EmbeddedSection(sect) => emitSection(sect, depth+1) } out.println("" + section.title + "") section.paragraphs.foreach(emitParagraph) } def emitDocument(document: Document) = { out.println("") if(document.title != null) out.println("

" + document.title + "

") if(document.author != null) out.println("

" + document.author + "

") if(document.date != null) out.println("

" + document.date + "

") document.sections.foreach(s => emitSection(s, 1)) out.println("") } def main(args: Array[String]) = { emitDocument(Manual.wholeThing) } }