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
45 def span(cls: String, body: XML.Body): XML.Elem =
46 XML.Elem(Markup(SPAN, List((CLASS, cls))), body)
48 def user_font(font: String, txt: String): XML.Elem =
49 XML.Elem(Markup(SPAN, List((STYLE, "font-family: " + font))), List(XML.Text(txt)))
51 def hidden(txt: String): XML.Elem =
52 span(Markup.HIDDEN, List(XML.Text(txt)))
54 def sub(txt: String): XML.Elem = XML.elem("sub", List(XML.Text(txt)))
55 def sup(txt: String): XML.Elem = XML.elem("sup", List(XML.Text(txt)))
56 def bold(txt: String): XML.Elem = span("bold", List(XML.Text(txt)))
58 def spans(symbols: Symbol.Interpretation,
59 input: XML.Tree, original_data: Boolean = false): XML.Body =
61 def html_spans(tree: XML.Tree): XML.Body =
63 case XML.Elem(Markup(name, _), ts) =>
65 List(XML.Elem(Markup.Data, List(tree, span(name, ts.flatMap(html_spans)))))
66 else List(span(name, ts.flatMap(html_spans)))
68 val ts = new ListBuffer[XML.Tree]
69 val t = new StringBuilder
72 ts += XML.Text(t.toString)
76 def add(elem: XML.Tree) {
80 val syms = Symbol.iterator_string(txt)
81 while (syms.hasNext) {
83 def s2() = if (syms.hasNext) syms.next else ""
84 if (s1 == "\n") add(XML.elem(BR))
85 else if (s1 == "\\<^bsub>") t ++= s1 // FIXME
86 else if (s1 == "\\<^esub>") t ++= s1 // FIXME
87 else if (s1 == "\\<^bsup>") t ++= s1 // FIXME
88 else if (s1 == "\\<^esup>") t ++= s1 // FIXME
89 else if (symbols.is_subscript_decoded(s1)) { add(hidden(s1)); add(sub(s2())) }
90 else if (symbols.is_superscript_decoded(s1)) { add(hidden(s1)); add(sup(s2())) }
91 else if (symbols.is_bold_decoded(s1)) { add(hidden(s1)); add(bold(s2())) }
92 else if (symbols.fonts.isDefinedAt(s1)) { add(user_font(symbols.fonts(s1), s1)) }