src/Tools/jEdit/src/token_markup.scala
changeset 43443 5d9693c2337e
parent 43440 a1db9a251a03
child 43452 5cf548485529
--- a/src/Tools/jEdit/src/token_markup.scala	Sat Jun 18 17:32:13 2011 +0200
+++ b/src/Tools/jEdit/src/token_markup.scala	Sat Jun 18 17:33:27 2011 +0200
@@ -16,7 +16,7 @@
 
 object Token_Markup
 {
-  /* extended jEdit syntax styles */
+  /* extended syntax styles */
 
   private val plain_range: Int = JEditToken.ID_COUNT
   private def check_range(i: Int) { require(0 <= i && i < plain_range) }
@@ -25,6 +25,43 @@
   def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte }
   val hidden: Byte = (3 * plain_range).toByte
 
+  // FIXME \\<^bsub> \\<^esub> \\<^bsup> \\<^esup>
+  // FIXME \\<^bold> \\<^loc>
+
+  private val ctrl_styles: Map[String, Byte => Byte] =
+    Map(
+      "\\<^sub>" -> subscript,
+      "\\<^sup>" -> superscript,
+      "\\<^isub>" -> subscript,
+      "\\<^isup>" -> superscript)
+
+  private def extended_styles(symbols: Symbol.Interpretation, text: CharSequence)
+    : Map[Text.Offset, Byte => Byte] =
+  {
+    if (Isabelle.extended_styles) {
+      var result = Map[Text.Offset, Byte => Byte]()
+      def mark(start: Text.Offset, stop: Text.Offset, style: Byte => Byte)
+      {
+        for (i <- start until stop) result += (i -> style)
+      }
+      var offset = 0
+      var ctrl = ""
+      for (sym <- Symbol.iterator(text).map(_.toString)) {
+        if (ctrl_styles.isDefinedAt(sym)) ctrl = sym
+        else if (ctrl != "") {
+          if (symbols.is_controllable(sym)) {
+            mark(offset - ctrl.length, offset, _ => hidden)
+            mark(offset, offset + sym.length, ctrl_styles(ctrl))
+          }
+          ctrl = ""
+        }
+        offset += sym.length
+      }
+      result
+    }
+    else Map.empty
+  }
+
 
   /* token marker */
 
@@ -55,11 +92,24 @@
         val (tokens, ctxt1) = syntax.scan_context(line, ctxt)
         val context1 = new Line_Context(ctxt1)
 
+        val extended = extended_styles(session.system.symbols, line)
+
         var offset = 0
         for (token <- tokens) {
           val style = Isabelle_Markup.token_markup(syntax, token)
           val length = token.source.length
-          handler.handleToken(line, style, offset, length, context1)
+          val end_offset = offset + length
+          if ((offset until end_offset) exists extended.isDefinedAt) {
+            for (i <- offset until end_offset) {
+              val style1 =
+                extended.get(i) match {
+                  case None => style
+                  case Some(ext) => ext(style)
+                }
+              handler.handleToken(line, style1, i, 1, context1)
+            }
+          }
+          else handler.handleToken(line, style, offset, length, context1)
           offset += length
         }
         handler.handleToken(line, JEditToken.END, line.count, 0, context1)