48 span(Markup.HIDDEN, List(XML.Text(txt))) |
48 span(Markup.HIDDEN, List(XML.Text(txt))) |
49 |
49 |
50 def sub(txt: String): XML.Elem = XML.elem("sub", 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))) |
51 def sup(txt: String): XML.Elem = XML.elem("sup", List(XML.Text(txt))) |
52 |
52 |
53 def spans(tree: XML.Tree): List[XML.Tree] = |
53 def spans(input: XML.Tree, original_data: Boolean = false): List[XML.Tree] = |
54 tree match { |
54 { |
55 case XML.Elem(Markup(name, _), ts) => |
55 def html_spans(tree: XML.Tree): List[XML.Tree] = |
56 List(XML.Elem(Markup.Data, List(tree, span(name, ts.flatMap(spans))))) |
56 tree match { |
57 case XML.Text(txt) => |
57 case XML.Elem(Markup(name, _), ts) => |
58 val ts = new ListBuffer[XML.Tree] |
58 if (original_data) |
59 val t = new StringBuilder |
59 List(XML.Elem(Markup.Data, List(tree, span(name, ts.flatMap(html_spans))))) |
60 def flush() { |
60 else List(span(name, ts.flatMap(html_spans))) |
61 if (!t.isEmpty) { |
61 case XML.Text(txt) => |
62 ts += XML.Text(t.toString) |
62 val ts = new ListBuffer[XML.Tree] |
63 t.clear |
63 val t = new StringBuilder |
|
64 def flush() { |
|
65 if (!t.isEmpty) { |
|
66 ts += XML.Text(t.toString) |
|
67 t.clear |
|
68 } |
64 } |
69 } |
65 } |
70 def add(elem: XML.Tree) { |
66 def add(elem: XML.Tree) { |
71 flush() |
|
72 ts += elem |
|
73 } |
|
74 val syms = Symbol.iterator(txt).map(_.toString) |
|
75 while (syms.hasNext) { |
|
76 val s1 = syms.next |
|
77 def s2() = if (syms.hasNext) syms.next else "" |
|
78 s1 match { |
|
79 case "\n" => add(XML.elem(BR)) |
|
80 case "\\<^bsub>" => t ++= s1 // FIXME |
|
81 case "\\<^esub>" => t ++= s1 // FIXME |
|
82 case "\\<^bsup>" => t ++= s1 // FIXME |
|
83 case "\\<^esup>" => t ++= s1 // FIXME |
|
84 case "\\<^sub>" | "\\<^isub>" => add(hidden(s1)); add(sub(s2())) |
|
85 case "\\<^sup>" | "\\<^isup>" => add(hidden(s1)); add(sup(s2())) |
|
86 case "\\<^bold>" => add(hidden(s1)); add(span("bold", List(XML.Text(s2())))) |
|
87 case "\\<^loc>" => add(hidden(s1)); add(span("loc", List(XML.Text(s2())))) |
|
88 case _ => t ++= s1 |
|
89 } |
|
90 } |
67 flush() |
91 flush() |
68 ts += elem |
92 ts.toList |
69 } |
93 } |
70 val syms = Symbol.iterator(txt).map(_.toString) |
94 html_spans(input) |
71 while (syms.hasNext) { |
95 } |
72 val s1 = syms.next |
|
73 def s2() = if (syms.hasNext) syms.next else "" |
|
74 s1 match { |
|
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())))) |
|
84 case _ => t ++= s1 |
|
85 } |
|
86 } |
|
87 flush() |
|
88 ts.toList |
|
89 } |
|
90 } |
96 } |