src/Pure/Thy/html.scala
changeset 38690 796904799f4d
parent 38487 968844caaff9
child 38867 d163f0f28e8c
     1.1 --- a/src/Pure/Thy/html.scala	Mon Aug 16 12:33:52 2010 +0200
     1.2 +++ b/src/Pure/Thy/html.scala	Mon Aug 16 16:24:22 2010 +0200
     1.3 @@ -50,41 +50,47 @@
     1.4    def sub(txt: String): XML.Elem = XML.elem("sub", List(XML.Text(txt)))
     1.5    def sup(txt: String): XML.Elem = XML.elem("sup", List(XML.Text(txt)))
     1.6  
     1.7 -  def spans(tree: XML.Tree): List[XML.Tree] =
     1.8 -    tree match {
     1.9 -      case XML.Elem(Markup(name, _), ts) =>
    1.10 -        List(XML.Elem(Markup.Data, List(tree, span(name, ts.flatMap(spans)))))
    1.11 -      case XML.Text(txt) =>
    1.12 -        val ts = new ListBuffer[XML.Tree]
    1.13 -        val t = new StringBuilder
    1.14 -        def flush() {
    1.15 -          if (!t.isEmpty) {
    1.16 -            ts += XML.Text(t.toString)
    1.17 -            t.clear
    1.18 +  def spans(input: XML.Tree, original_data: Boolean = false): List[XML.Tree] =
    1.19 +  {
    1.20 +    def html_spans(tree: XML.Tree): List[XML.Tree] =
    1.21 +      tree match {
    1.22 +        case XML.Elem(Markup(name, _), ts) =>
    1.23 +          if (original_data)
    1.24 +            List(XML.Elem(Markup.Data, List(tree, span(name, ts.flatMap(html_spans)))))
    1.25 +          else List(span(name, ts.flatMap(html_spans)))
    1.26 +        case XML.Text(txt) =>
    1.27 +          val ts = new ListBuffer[XML.Tree]
    1.28 +          val t = new StringBuilder
    1.29 +          def flush() {
    1.30 +            if (!t.isEmpty) {
    1.31 +              ts += XML.Text(t.toString)
    1.32 +              t.clear
    1.33 +            }
    1.34            }
    1.35 -        }
    1.36 -        def add(elem: XML.Tree) {
    1.37 +          def add(elem: XML.Tree) {
    1.38 +            flush()
    1.39 +            ts += elem
    1.40 +          }
    1.41 +          val syms = Symbol.iterator(txt).map(_.toString)
    1.42 +          while (syms.hasNext) {
    1.43 +            val s1 = syms.next
    1.44 +            def s2() = if (syms.hasNext) syms.next else ""
    1.45 +            s1 match {
    1.46 +              case "\n" => add(XML.elem(BR))
    1.47 +              case "\\<^bsub>" => t ++= s1  // FIXME
    1.48 +              case "\\<^esub>" => t ++= s1  // FIXME
    1.49 +              case "\\<^bsup>" => t ++= s1  // FIXME
    1.50 +              case "\\<^esup>" => t ++= s1  // FIXME
    1.51 +              case "\\<^sub>" | "\\<^isub>" => add(hidden(s1)); add(sub(s2()))
    1.52 +              case "\\<^sup>" | "\\<^isup>" => add(hidden(s1)); add(sup(s2()))
    1.53 +              case "\\<^bold>" => add(hidden(s1)); add(span("bold", List(XML.Text(s2()))))
    1.54 +              case "\\<^loc>" => add(hidden(s1)); add(span("loc", List(XML.Text(s2()))))
    1.55 +              case _ => t ++= s1
    1.56 +            }
    1.57 +          }
    1.58            flush()
    1.59 -          ts += elem
    1.60 -        }
    1.61 -        val syms = Symbol.iterator(txt).map(_.toString)
    1.62 -        while (syms.hasNext) {
    1.63 -          val s1 = syms.next
    1.64 -          def s2() = if (syms.hasNext) syms.next else ""
    1.65 -          s1 match {
    1.66 -            case "\n" => add(XML.elem(BR))
    1.67 -            case "\\<^bsub>" => t ++= s1  // FIXME
    1.68 -            case "\\<^esub>" => t ++= s1  // FIXME
    1.69 -            case "\\<^bsup>" => t ++= s1  // FIXME
    1.70 -            case "\\<^esup>" => t ++= s1  // FIXME
    1.71 -            case "\\<^sub>" | "\\<^isub>" => add(hidden(s1)); add(sub(s2()))
    1.72 -            case "\\<^sup>" | "\\<^isup>" => add(hidden(s1)); add(sup(s2()))
    1.73 -            case "\\<^bold>" => add(hidden(s1)); add(span("bold", List(XML.Text(s2()))))
    1.74 -            case "\\<^loc>" => add(hidden(s1)); add(span("loc", List(XML.Text(s2()))))
    1.75 -            case _ => t ++= s1
    1.76 -          }
    1.77 -        }
    1.78 -        flush()
    1.79 -        ts.toList
    1.80 -    }
    1.81 +          ts.toList
    1.82 +      }
    1.83 +    html_spans(input)
    1.84 +  }
    1.85  }