wenzelm@33984
|
1 |
/* Title: Pure/Thy/html.scala
|
wenzelm@33984
|
2 |
Author: Makarius
|
wenzelm@33984
|
3 |
|
wenzelm@33984
|
4 |
Basic HTML output.
|
wenzelm@33984
|
5 |
*/
|
wenzelm@33984
|
6 |
|
wenzelm@33984
|
7 |
package isabelle
|
wenzelm@33984
|
8 |
|
wenzelm@34009
|
9 |
import scala.collection.mutable.ListBuffer
|
wenzelm@34009
|
10 |
|
wenzelm@34009
|
11 |
|
wenzelm@33984
|
12 |
object HTML
|
wenzelm@33984
|
13 |
{
|
wenzelm@33984
|
14 |
// common elements and attributes
|
wenzelm@33984
|
15 |
|
wenzelm@33984
|
16 |
val BODY = "body"
|
wenzelm@33984
|
17 |
val DIV = "div"
|
wenzelm@33984
|
18 |
val SPAN = "span"
|
wenzelm@33984
|
19 |
val BR = "br"
|
wenzelm@34009
|
20 |
val PRE = "pre"
|
wenzelm@33984
|
21 |
val CLASS = "class"
|
wenzelm@33984
|
22 |
|
wenzelm@33984
|
23 |
|
wenzelm@33984
|
24 |
// document markup
|
wenzelm@33984
|
25 |
|
wenzelm@34011
|
26 |
def span(cls: String, body: List[XML.Tree]): XML.Elem =
|
wenzelm@34011
|
27 |
XML.Elem(SPAN, List((CLASS, cls)), body)
|
wenzelm@34011
|
28 |
|
wenzelm@34011
|
29 |
def hidden(txt: String): XML.Elem =
|
wenzelm@34011
|
30 |
span(Markup.HIDDEN, List(XML.Text(txt)))
|
wenzelm@34011
|
31 |
|
wenzelm@34011
|
32 |
def sub(txt: String): XML.Elem = XML.elem("sub", List(XML.Text(txt)))
|
wenzelm@34011
|
33 |
def sup(txt: String): XML.Elem = XML.elem("sup", List(XML.Text(txt)))
|
wenzelm@34011
|
34 |
|
wenzelm@33984
|
35 |
def spans(tree: XML.Tree): List[XML.Tree] =
|
wenzelm@33984
|
36 |
tree match {
|
wenzelm@34051
|
37 |
case XML.Elem(name, _, ts) =>
|
wenzelm@34051
|
38 |
List(XML.elem(Markup.DATA, List(tree, span(name, ts.flatMap(spans)))))
|
wenzelm@34009
|
39 |
case XML.Text(txt) =>
|
wenzelm@34009
|
40 |
val ts = new ListBuffer[XML.Tree]
|
wenzelm@34009
|
41 |
val t = new StringBuilder
|
wenzelm@34011
|
42 |
def flush() {
|
wenzelm@34009
|
43 |
if (!t.isEmpty) {
|
wenzelm@34009
|
44 |
ts + XML.Text(t.toString)
|
wenzelm@34009
|
45 |
t.clear
|
wenzelm@34009
|
46 |
}
|
wenzelm@33984
|
47 |
}
|
wenzelm@34011
|
48 |
def add(elem: XML.Tree) {
|
wenzelm@34011
|
49 |
flush()
|
wenzelm@34011
|
50 |
ts + elem
|
wenzelm@34011
|
51 |
}
|
wenzelm@34011
|
52 |
val syms = Symbol.elements(txt)
|
wenzelm@34011
|
53 |
while (syms.hasNext) {
|
wenzelm@34011
|
54 |
val s1 = syms.next
|
wenzelm@34015
|
55 |
def s2() = if (syms.hasNext) syms.next else ""
|
wenzelm@34011
|
56 |
s1 match {
|
wenzelm@34011
|
57 |
case "\n" => add(XML.elem(BR))
|
wenzelm@34011
|
58 |
case "\\<^bsub>" => t ++ s1 // FIXME
|
wenzelm@34011
|
59 |
case "\\<^esub>" => t ++ s1 // FIXME
|
wenzelm@34011
|
60 |
case "\\<^bsup>" => t ++ s1 // FIXME
|
wenzelm@34011
|
61 |
case "\\<^esup>" => t ++ s1 // FIXME
|
wenzelm@34015
|
62 |
case "\\<^sub>" | "\\<^isub>" => add(hidden(s1)); add(sub(s2()))
|
wenzelm@34015
|
63 |
case "\\<^sup>" | "\\<^isup>" => add(hidden(s1)); add(sup(s2()))
|
wenzelm@34015
|
64 |
case "\\<^bold>" => add(hidden(s1)); add(span("bold", List(XML.Text(s2()))))
|
wenzelm@34015
|
65 |
case "\\<^loc>" => add(hidden(s1)); add(span("loc", List(XML.Text(s2()))))
|
wenzelm@34011
|
66 |
case _ => t ++ s1
|
wenzelm@34009
|
67 |
}
|
wenzelm@34009
|
68 |
}
|
wenzelm@34011
|
69 |
flush()
|
wenzelm@34009
|
70 |
ts.toList
|
wenzelm@33984
|
71 |
}
|
wenzelm@33984
|
72 |
}
|