package sbaz.manual

object Documents {
  abstract class AbstractText {
    def &(more: AbstractText) = SeqText(this, more)
  }

  case class SeqText(components: AbstractText*) extends AbstractText
  case class Text(text: String) extends AbstractText
  case object MDash extends AbstractText
  case class Emph(contents: AbstractText) extends AbstractText
  case class Mono(text: String) extends AbstractText
  case class Quote(contents: AbstractText) extends AbstractText
  case class BlockQuote(contents: AbstractText) extends AbstractText
  implicit def str2text(str: String) = Text(str)
  case class CodeSample(text: String) extends AbstractText


  case class DefnItem(header: String, text: AbstractText)

  abstract class Paragraph
  case class TextParagraph(text: AbstractText) extends Paragraph
  implicit def text2para(txt: AbstractText):Paragraph = TextParagraph(txt)
  implicit def str2para(str: String) = text2para(str2text(str))

  case class BulletList(items: AbstractText*) extends Paragraph
  case class NumberedList(items: AbstractText*) extends Paragraph
  case class TitledPara(title: String, text: AbstractText) extends Paragraph

  case class EmbeddedSection(section: Section) extends Paragraph
  implicit def section2Para(section: Section) = EmbeddedSection(section)

  case class Section(title: String, paragraphs: Paragraph*)

  class Document {
    var title: String = null
    var author: String = null
    var date: String = null
    var sections: List[Section] = Nil
  }
}

