src/Tools/jEdit/src/bibtex_token_markup.scala
author wenzelm
Sat, 04 Oct 2014 18:05:30 +0200
changeset 58535 4815429974fe
parent 58531 454962877285
child 58537 207fb06aa189
permissions -rw-r--r--
more explicit comments;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58529
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/bibtex_token_markup.scala
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     3
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     4
Bibtex token markup.
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     5
*/
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     6
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     8
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
     9
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    10
import isabelle._
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    11
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    12
import org.gjt.sp.jedit.syntax.{Token => JEditToken, TokenMarker, TokenHandler, ParserRuleSet}
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    13
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    14
import javax.swing.text.Segment
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    15
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    16
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    17
object Bibtex_Token_Markup
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    18
{
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    19
  /* token style */
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    20
58530
7ee248f19ca9 clarified Chunk -- avoid ooddities;
wenzelm
parents: 58529
diff changeset
    21
  private def token_style(context: String, token: Bibtex.Token): Byte =
58529
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    22
    token.kind match {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    23
      case Bibtex.Token.Kind.COMMAND => JEditToken.KEYWORD2
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    24
      case Bibtex.Token.Kind.ENTRY => JEditToken.KEYWORD1
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    25
      case Bibtex.Token.Kind.KEYWORD => JEditToken.OPERATOR
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    26
      case Bibtex.Token.Kind.NAT => JEditToken.LITERAL2
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    27
      case Bibtex.Token.Kind.STRING => JEditToken.LITERAL1
58531
454962877285 more explicit chunk name;
wenzelm
parents: 58530
diff changeset
    28
      case Bibtex.Token.Kind.NAME => JEditToken.LABEL
58529
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    29
      case Bibtex.Token.Kind.IDENT =>
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    30
        if (Bibtex.is_month(token.source)) JEditToken.LITERAL3
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    31
        else
58530
7ee248f19ca9 clarified Chunk -- avoid ooddities;
wenzelm
parents: 58529
diff changeset
    32
          Bibtex.get_entry(context) match {
58529
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    33
            case Some(entry) if entry.is_required(token.source) => JEditToken.KEYWORD3
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    34
            case Some(entry) if entry.is_optional(token.source) => JEditToken.KEYWORD4
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    35
            case _ => JEditToken.DIGIT
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    36
          }
58535
4815429974fe more explicit comments;
wenzelm
parents: 58531
diff changeset
    37
      case Bibtex.Token.Kind.SPACE => JEditToken.NULL
4815429974fe more explicit comments;
wenzelm
parents: 58531
diff changeset
    38
      case Bibtex.Token.Kind.COMMENT => JEditToken.COMMENT1
58529
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    39
      case Bibtex.Token.Kind.ERROR => JEditToken.INVALID
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    40
    }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    41
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    42
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    43
  /* line context */
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    44
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    45
  private val context_rules = new ParserRuleSet("bibtex", "MAIN")
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    46
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    47
  private class Line_Context(context: Option[Bibtex.Line_Context])
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    48
    extends Token_Markup.Generic_Line_Context[Bibtex.Line_Context](context_rules, context)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    49
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    50
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    51
  /* token marker */
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    52
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    53
  class Marker extends TokenMarker
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    54
  {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    55
    override def markTokens(context: TokenMarker.LineContext,
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    56
        handler: TokenHandler, raw_line: Segment): TokenMarker.LineContext =
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    57
    {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    58
      val line_ctxt =
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    59
        context match {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    60
          case c: Line_Context => c.context
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    61
          case _ => Some(Bibtex.Ignored_Context)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    62
        }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    63
      val line = if (raw_line == null) new Segment else raw_line
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    64
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    65
      val context1 =
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    66
      {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    67
        val (styled_tokens, context1) =
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    68
          line_ctxt match {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    69
            case Some(ctxt) =>
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    70
              val (chunks, ctxt1) = Bibtex.parse_line(line, ctxt)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    71
              val styled_tokens =
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    72
                for { chunk <- chunks; tok <- chunk.tokens }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    73
                yield (token_style(chunk.kind, tok), tok.source)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    74
              (styled_tokens, new Line_Context(Some(ctxt1)))
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    75
            case None =>
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    76
              val styled_token = (JEditToken.NULL, line.subSequence(0, line.count).toString)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    77
              (List(styled_token), new Line_Context(None))
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    78
          }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    79
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    80
        var offset = 0
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    81
        for ((style, token) <- styled_tokens) {
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    82
          val length = token.length
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    83
          val end_offset = offset + length
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    84
          handler.handleToken(line, style, offset, length, context1)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    85
          offset += length
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    86
        }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    87
        handler.handleToken(line, JEditToken.END, line.count, 0, context1)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    88
        context1
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    89
      }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    90
      val context2 = context1.intern
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    91
      handler.setLineContext(context2)
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    92
      context2
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    93
    }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    94
  }
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    95
}
cd4439d8799c support for bibtex token markup;
wenzelm
parents:
diff changeset
    96