package sbaz.manual
import Documents._

object EmitLatex {
  val out = Console

  def escape(text: String) = {
    (text.replaceAll("\\{","\\\\{")
         .replaceAll("}","\\\\}")
         .replaceAll("_","\\\\_"))
  }

  val seccmds = List(
    "\\section",
    "\\subsection",
    "\\subsubsection")
    

  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("\\emph{")
	  emitText(text)
	  out.print("}")
	}
	
	case Mono(text) => {
	  out.print("\\texttt{")
	  out.print(escape(text))
	  out.print("}")
	}


	case Quote(text) => {
	  out.print("``")
	  emitText(text)
	  out.print("''")
	}

        case BlockQuote(text) => {
	  out.println("\\begin{quote}")
	  emitText(text)
	  out.println("\\end{quote}")
	}

	case CodeSample(code) => {
          out.println("\\begin{quote}")
	  out.println("\\begin{verbatim}")
	  out.print(code)
	  out.println("\\end{verbatim}")
          out.println("\\end{quote}")
	}
      }

    def emitParagraph(para: Paragraph) =
      para match {
	case TextParagraph(text) => {
	  emitText(text)
          out.println
	  out.println
	}
	
	case lst:BulletList => {
	  out.println("\\begin{itemize}")
	  for(val item <- lst.items) {
	    out.print("\\item ")
	    emitText(item)
	    out.println
	  }
	  out.println("\\end{itemize}")
	}

	case lst:NumberedList => {
	  out.println("\\begin{enumerate}")
	  for(val item <- lst.items) {
	    out.print("\\item ")
	    emitText(item)
	    out.println
	  }
	  out.println("\\end{enumerate}")
	}

	case TitledPara(title, text) => {
	  out.println
	  out.print("\\paragraph*{" + escape(title) + "} ")
	  emitText(text)
	  out.println
	  out.println
	}


	case EmbeddedSection(sect) => emitSection(sect, depth+1)
      }

    
    out.print(seccmds(depth))
    out.println("{" + section.title + "}")
    section.paragraphs.foreach(emitParagraph)
  }

  def emitDocument(document: Document) = {
    out.println("\\documentclass{article}")
    out.println("\\usepackage{times}")
    out.println("\\topmargin=0in")
    out.println("\\oddsidemargin=0in")
    out.println("\\evensidemargin=0in")
    out.println("\\textwidth=6in")
    out.println("\\textheight=8.5in")

    out.println("\\begin{document}")
    
    if(document.title != null)
      out.println("\\title{" + document.title + "}")

    if(document.author != null)
      out.println("\\author{" + document.author + "}")

    if(document.date != null)
      out.println("\\date{" + document.date + "}")

    out.println("\\maketitle")

    document.sections.foreach(s => emitSection(s, 0))

    out.println("\\end{document}")
  }
  
  def main(args: Array[String]) = {
    emitDocument(Manual.wholeThing)
  }
}

