/* NSC -- new Scala compiler * Copyright 2005-2013 LAMP/EPFL * @author Stephane Micheloud * Adapted from Lex Spoon's sbaz manual */ package scala.tools.docutil object EmitHtml { import scala.xml.{Node, NodeBuffer, NodeSeq, XML} import ManPage._ val out = Console def escape(text: String) = text.replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") /* */ def emitSection(section: Section, depth: Int) { def emitPara(text: AbstractText) { out println "
" emitText(text) out println "\n
" } def emitText(text: AbstractText) { text match { case seq:SeqText => seq.components foreach emitText case seq:SeqPara => seq.components foreach emitPara case Text(text) => out print escape(text) case BSlash => out print "\\" case MDash => out print "—" case NDash => out print "–" case Bold(text) => out print "" emitText(text) out print "" case Italic(text) => out print "" emitText(text) out print "" case Emph(text) => out print "" emitText(text) out print "" case Mono(text) => out print "" emitText(text) out print "" case Quote(text) => out print "\"" emitText(text) out print "\"" case DefinitionList(definitions @ _*) => out println "
" for (d <- definitions) { out println "
" emitText(d.term) out println "\n
" out println "
" emitText(d.description) out println "
" } out println "
" case Link(label, url) => out.print("") emitText(label) out print "" case _ => sys.error("unknown text node: " + text) } } def emitParagraph(para: Paragraph) { para match { case TextParagraph(text) => out println "

" emitText(text) out println "

" case BlockQuote(text) => out println "

" emitText(text) out println "

" case CodeSample(text) => out print "
"
          out print escape(text)
          out println "
" case lst:BulletList => out println "" case lst:NumberedList => out println "
    " for (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) case _ => sys.error("unknown paragraph node: " + para) } } val name = section.title.replaceAll("\\p{Space}", "_").toLowerCase() out.println("\n" + section.title + "") section.paragraphs foreach emitParagraph } private def emit3columns(col1: String, col2: String, col3: String) { out println "
" out println col1 out println "
" out println "
" out println col3 out println "
" out println "
" out println col2 out println "
" } private def emitHeader(col1: String, col2: String, col3: String) { out println "" out println "
" emit3columns(col1, col2, col3) out println "
" } private def emitFooter(col1: String, col2: String, col3: String) { out println "" out println "
" emit3columns(col1, col2, col3) out println "
" } def emitDocument(document: Document) { out.println("") out.println("") out.println("\n") out println "" out.println("" + document.title + " man page") out.println("") out.println("") out.println("") out println "" out println "\n" out println "" val name = document.title + "(" + document.category.id + ")" emitHeader(name, "" + document.category, name) document.sections foreach (s => emitSection(s, 3)) emitFooter("version " + document.version, document.date, name) out println "" out println "" } def main(args: Array[String]) = args match{ case Array(classname) => emitHtml(classname) case Array(classname, file, _*) => emitHtml(classname, new java.io.FileOutputStream(file)) case _ => sys.exit(1) } def emitHtml(classname: String, outStream: java.io.OutputStream = out.out) { if(outStream != out.out) out setOut outStream try { val cl = this.getClass.getClassLoader() val clasz = cl loadClass classname val meth = clasz getDeclaredMethod "manpage" val doc = meth.invoke(null).asInstanceOf[Document] emitDocument(doc) } catch { case ex: Exception => ex.printStackTrace() System.err println "Error in EmitManPage" sys.exit(1) } } }