1 /* Title: Pure/Thy/html.scala
9 import scala.collection.mutable.ListBuffer
16 def encode(text: String): String =
18 val s = new StringBuilder
19 for (c <- text.iterator) c match {
20 case '<' => s ++= "<"
21 case '>' => s ++= ">"
22 case '&' => s ++= "&"
23 case '"' => s ++= """
24 case '\'' => s ++= "'"
25 case '\n' => s ++= "<br/>"
32 // common elements and attributes
44 def span(cls: String, body: List[XML.Tree]): XML.Elem =
45 XML.Elem(SPAN, List((CLASS, cls)), body)
47 def hidden(txt: String): XML.Elem =
48 span(Markup.HIDDEN, List(XML.Text(txt)))
50 def sub(txt: String): XML.Elem = XML.elem("sub", List(XML.Text(txt)))
51 def sup(txt: String): XML.Elem = XML.elem("sup", List(XML.Text(txt)))
53 def spans(tree: XML.Tree): List[XML.Tree] =
55 case XML.Elem(name, _, ts) =>
56 List(XML.elem(Markup.DATA, List(tree, span(name, ts.flatMap(spans)))))
58 val ts = new ListBuffer[XML.Tree]
59 val t = new StringBuilder
62 ts += XML.Text(t.toString)
66 def add(elem: XML.Tree) {
70 val syms = Symbol.iterator(txt).map(_.toString)
71 while (syms.hasNext) {
73 def s2() = if (syms.hasNext) syms.next else ""
75 case "\n" => add(XML.elem(BR))
76 case "\\<^bsub>" => t ++= s1 // FIXME
77 case "\\<^esub>" => t ++= s1 // FIXME
78 case "\\<^bsup>" => t ++= s1 // FIXME
79 case "\\<^esup>" => t ++= s1 // FIXME
80 case "\\<^sub>" | "\\<^isub>" => add(hidden(s1)); add(sub(s2()))
81 case "\\<^sup>" | "\\<^isup>" => add(hidden(s1)); add(sup(s2()))
82 case "\\<^bold>" => add(hidden(s1)); add(span("bold", List(XML.Text(s2()))))
83 case "\\<^loc>" => add(hidden(s1)); add(span("loc", List(XML.Text(s2()))))