/* 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 ""
for (item <- lst.items) {
out print "- "
emitText(item)
out println "
"
}
out println "
"
case lst:NumberedList =>
out println ""
for (item <- lst.items) {
out print "- "
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)
}
}
}