src/Pure/Thy/html.scala
changeset 66018 9ce3720976dc
parent 66006 cec184536dfd
child 66040 f826ba18fe08
equal deleted inserted replaced
66017:57acac0fd29b 66018:9ce3720976dc
    24       Symbol.bsup -> "<sup>", Symbol.bsup_decoded -> "<sup>",
    24       Symbol.bsup -> "<sup>", Symbol.bsup_decoded -> "<sup>",
    25       Symbol.esup -> "</sup>", Symbol.esup_decoded -> "</sup>")
    25       Symbol.esup -> "</sup>", Symbol.esup_decoded -> "</sup>")
    26 
    26 
    27   def is_control(sym: Symbol.Symbol): Boolean = control.isDefinedAt(sym)
    27   def is_control(sym: Symbol.Symbol): Boolean = control.isDefinedAt(sym)
    28 
    28 
    29   def output(text: String, s: StringBuilder, hidden: Boolean)
    29   def output_char_permissive(c: Char, s: StringBuilder)
    30   {
    30   {
       
    31     c match {
       
    32       case '<' => s ++= "&lt;"
       
    33       case '>' => s ++= "&gt;"
       
    34       case '&' => s ++= "&amp;"
       
    35       case _ => s += c
       
    36     }
       
    37   }
       
    38 
       
    39   def output(text: String, s: StringBuilder, hidden: Boolean, permissive: Boolean)
       
    40   {
       
    41     def output_char(c: Char): Unit =
       
    42       if (permissive) output_char_permissive(c, s)
       
    43       else XML.output_char(c, s)
       
    44 
       
    45     def output_string(str: String): Unit =
       
    46       str.iterator.foreach(output_char)
       
    47 
    31     def output_hidden(body: => Unit): Unit =
    48     def output_hidden(body: => Unit): Unit =
    32       if (hidden) { s ++= "<span class=\"hidden\">"; body; s ++= "</span>" }
    49       if (hidden) { s ++= "<span class=\"hidden\">"; body; s ++= "</span>" }
    33 
    50 
    34     def output_symbol(sym: Symbol.Symbol): Unit =
    51     def output_symbol(sym: Symbol.Symbol): Unit =
    35       if (sym != "") {
    52       if (sym != "") {
    36         control_block.get(sym) match {
    53         control_block.get(sym) match {
    37           case Some(html) if html.startsWith("</") =>
    54           case Some(html) if html.startsWith("</") =>
    38             s ++= html; output_hidden(XML.output_string(sym, s))
    55             s ++= html; output_hidden(output_string(sym))
    39           case Some(html) =>
    56           case Some(html) =>
    40             output_hidden(XML.output_string(sym, s)); s ++= html
    57             output_hidden(output_string(sym)); s ++= html
    41           case None =>
    58           case None =>
    42             XML.output_string(sym, s)
    59             output_string(sym)
    43         }
    60         }
    44       }
    61       }
    45 
    62 
    46     var ctrl = ""
    63     var ctrl = ""
    47     for (sym <- Symbol.iterator(text)) {
    64     for (sym <- Symbol.iterator(text)) {
    61       }
    78       }
    62     }
    79     }
    63     output_symbol(ctrl)
    80     output_symbol(ctrl)
    64   }
    81   }
    65 
    82 
    66   def output(text: String): String = Library.make_string(output(text, _, hidden = false))
    83   def output(text: String): String =
       
    84     Library.make_string(output(text, _, hidden = false, permissive = true))
    67 
    85 
    68 
    86 
    69   /* output XML as HTML */
    87   /* output XML as HTML */
    70 
    88 
    71   private val structural_elements =
    89   private val structural_elements =
    76   {
    94   {
    77     def elem(markup: Markup)
    95     def elem(markup: Markup)
    78     {
    96     {
    79       s ++= markup.name
    97       s ++= markup.name
    80       for ((a, b) <- markup.properties) {
    98       for ((a, b) <- markup.properties) {
    81         s += ' '; s ++= a; s += '='; s += '"'; output(b, s, hidden); s += '"'
    99         s += ' '
       
   100         s ++= a
       
   101         s += '='
       
   102         s += '"'
       
   103         output(b, s, hidden = hidden, permissive = false)
       
   104         s += '"'
    82       }
   105       }
    83     }
   106     }
    84     def tree(t: XML.Tree): Unit =
   107     def tree(t: XML.Tree): Unit =
    85       t match {
   108       t match {
    86         case XML.Elem(markup, Nil) =>
   109         case XML.Elem(markup, Nil) =>
    90           s += '<'; elem(markup); s += '>'
   113           s += '<'; elem(markup); s += '>'
    91           ts.foreach(tree)
   114           ts.foreach(tree)
    92           s ++= "</"; s ++= markup.name; s += '>'
   115           s ++= "</"; s ++= markup.name; s += '>'
    93           if (structural_elements(markup.name)) s += '\n'
   116           if (structural_elements(markup.name)) s += '\n'
    94         case XML.Text(txt) =>
   117         case XML.Text(txt) =>
    95           output(txt, s, hidden)
   118           output(txt, s, hidden = hidden, permissive = true)
    96       }
   119       }
    97     body.foreach(tree)
   120     body.foreach(tree)
    98   }
   121   }
    99 
   122 
   100   def output(body: XML.Body, hidden: Boolean): String =
   123   def output(body: XML.Body, hidden: Boolean): String =