src/Tools/jEdit/src/token_markup.scala
author wenzelm
Sat, 18 Jun 2011 17:33:27 +0200
changeset 43443 5d9693c2337e
parent 43440 a1db9a251a03
child 43452 5cf548485529
permissions -rw-r--r--
basic support for extended syntax styles: sub/superscript;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/token_markup.scala
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     3
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     4
Outer syntax token markup.
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     5
*/
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     6
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     8
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
     9
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    10
import isabelle._
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    11
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    12
import org.gjt.sp.jedit.Buffer
43440
a1db9a251a03 tuned signature;
wenzelm
parents: 43429
diff changeset
    13
import org.gjt.sp.jedit.syntax.{Token => JEditToken, TokenMarker, TokenHandler, ParserRuleSet}
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    14
import javax.swing.text.Segment
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    15
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    16
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    17
object Token_Markup
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    18
{
43443
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    19
  /* extended syntax styles */
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    20
43440
a1db9a251a03 tuned signature;
wenzelm
parents: 43429
diff changeset
    21
  private val plain_range: Int = JEditToken.ID_COUNT
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    22
  private def check_range(i: Int) { require(0 <= i && i < plain_range) }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    23
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    24
  def subscript(i: Byte): Byte = { check_range(i); (i + plain_range).toByte }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    25
  def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    26
  val hidden: Byte = (3 * plain_range).toByte
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    27
43443
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    28
  // FIXME \\<^bsub> \\<^esub> \\<^bsup> \\<^esup>
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    29
  // FIXME \\<^bold> \\<^loc>
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    30
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    31
  private val ctrl_styles: Map[String, Byte => Byte] =
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    32
    Map(
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    33
      "\\<^sub>" -> subscript,
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    34
      "\\<^sup>" -> superscript,
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    35
      "\\<^isub>" -> subscript,
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    36
      "\\<^isup>" -> superscript)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    37
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    38
  private def extended_styles(symbols: Symbol.Interpretation, text: CharSequence)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    39
    : Map[Text.Offset, Byte => Byte] =
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    40
  {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    41
    if (Isabelle.extended_styles) {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    42
      var result = Map[Text.Offset, Byte => Byte]()
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    43
      def mark(start: Text.Offset, stop: Text.Offset, style: Byte => Byte)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    44
      {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    45
        for (i <- start until stop) result += (i -> style)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    46
      }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    47
      var offset = 0
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    48
      var ctrl = ""
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    49
      for (sym <- Symbol.iterator(text).map(_.toString)) {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    50
        if (ctrl_styles.isDefinedAt(sym)) ctrl = sym
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    51
        else if (ctrl != "") {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    52
          if (symbols.is_controllable(sym)) {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    53
            mark(offset - ctrl.length, offset, _ => hidden)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    54
            mark(offset, offset + sym.length, ctrl_styles(ctrl))
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    55
          }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    56
          ctrl = ""
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    57
        }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    58
        offset += sym.length
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    59
      }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    60
      result
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    61
    }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    62
    else Map.empty
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    63
  }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    64
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    65
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    66
  /* token marker */
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    67
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    68
  private val isabelle_rules = new ParserRuleSet("isabelle", "MAIN")
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    69
43429
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    70
  private class Line_Context(val context: Scan.Context)
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    71
    extends TokenMarker.LineContext(isabelle_rules, null)
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    72
  {
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    73
    override def hashCode: Int = context.hashCode
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    74
    override def equals(that: Any): Boolean =
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    75
      that match {
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    76
        case other: Line_Context => context == other.context
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    77
        case _ => false
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    78
      }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    79
  }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    80
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    81
  def token_marker(session: Session, buffer: Buffer): TokenMarker =
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    82
    new TokenMarker {
43429
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    83
      override def markTokens(context: TokenMarker.LineContext,
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    84
          handler: TokenHandler, line: Segment): TokenMarker.LineContext =
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    85
      {
43416
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
    86
        val syntax = session.current_syntax()
43429
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    87
        val ctxt =
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    88
          context match {
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    89
            case c: Line_Context => c.context
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    90
            case _ => Scan.Finished
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    91
          }
43416
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
    92
        val (tokens, ctxt1) = syntax.scan_context(line, ctxt)
43429
095f90f8dca3 simplified Line_Context (again);
wenzelm
parents: 43416
diff changeset
    93
        val context1 = new Line_Context(ctxt1)
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
    94
43443
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    95
        val extended = extended_styles(session.system.symbols, line)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
    96
43416
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
    97
        var offset = 0
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
    98
        for (token <- tokens) {
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
    99
          val style = Isabelle_Markup.token_markup(syntax, token)
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   100
          val length = token.source.length
43443
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   101
          val end_offset = offset + length
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   102
          if ((offset until end_offset) exists extended.isDefinedAt) {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   103
            for (i <- offset until end_offset) {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   104
              val style1 =
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   105
                extended.get(i) match {
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   106
                  case None => style
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   107
                  case Some(ext) => ext(style)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   108
                }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   109
              handler.handleToken(line, style1, i, 1, context1)
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   110
            }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   111
          }
5d9693c2337e basic support for extended syntax styles: sub/superscript;
wenzelm
parents: 43440
diff changeset
   112
          else handler.handleToken(line, style, offset, length, context1)
43416
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   113
          offset += length
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
   114
        }
43440
a1db9a251a03 tuned signature;
wenzelm
parents: 43429
diff changeset
   115
        handler.handleToken(line, JEditToken.END, line.count, 0, context1)
43416
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   116
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   117
        val context2 = context1.intern
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   118
        handler.setLineContext(context2)
e730cdd97dcf more precise imitatation of original TokenMarker: no locking, interned context etc.;
wenzelm
parents: 43414
diff changeset
   119
        context2
43414
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
   120
      }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
   121
    }
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
   122
}
f0770743b7ec static token markup, based on outer syntax only;
wenzelm
parents:
diff changeset
   123