wenzelm@43414: /* Title: Tools/jEdit/src/token_markup.scala wenzelm@43414: Author: Makarius wenzelm@43414: wenzelm@43414: Outer syntax token markup. wenzelm@43414: */ wenzelm@43414: wenzelm@43414: package isabelle.jedit wenzelm@43414: wenzelm@43414: wenzelm@43414: import isabelle._ wenzelm@43414: wenzelm@43414: import org.gjt.sp.jedit.Buffer wenzelm@43414: import org.gjt.sp.jedit.syntax.{Token => JToken, TokenMarker, TokenHandler, ParserRuleSet} wenzelm@43414: import javax.swing.text.Segment wenzelm@43414: wenzelm@43414: wenzelm@43414: object Token_Markup wenzelm@43414: { wenzelm@43414: /* extended jEdit syntax styles */ wenzelm@43414: wenzelm@43414: private val plain_range: Int = JToken.ID_COUNT wenzelm@43414: private def check_range(i: Int) { require(0 <= i && i < plain_range) } wenzelm@43414: wenzelm@43414: def subscript(i: Byte): Byte = { check_range(i); (i + plain_range).toByte } wenzelm@43414: def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte } wenzelm@43414: val hidden: Byte = (3 * plain_range).toByte wenzelm@43414: wenzelm@43414: wenzelm@43414: /* token marker */ wenzelm@43414: wenzelm@43414: private val isabelle_rules = new ParserRuleSet("isabelle", "MAIN") wenzelm@43414: wenzelm@43429: private class Line_Context(val context: Scan.Context) wenzelm@43429: extends TokenMarker.LineContext(isabelle_rules, null) wenzelm@43414: { wenzelm@43414: override def hashCode: Int = context.hashCode wenzelm@43414: override def equals(that: Any): Boolean = wenzelm@43414: that match { wenzelm@43414: case other: Line_Context => context == other.context wenzelm@43414: case _ => false wenzelm@43414: } wenzelm@43414: } wenzelm@43414: wenzelm@43414: def token_marker(session: Session, buffer: Buffer): TokenMarker = wenzelm@43414: new TokenMarker { wenzelm@43429: override def markTokens(context: TokenMarker.LineContext, wenzelm@43414: handler: TokenHandler, line: Segment): TokenMarker.LineContext = wenzelm@43414: { wenzelm@43416: val syntax = session.current_syntax() wenzelm@43429: val ctxt = wenzelm@43429: context match { wenzelm@43429: case c: Line_Context => c.context wenzelm@43429: case _ => Scan.Finished wenzelm@43429: } wenzelm@43416: val (tokens, ctxt1) = syntax.scan_context(line, ctxt) wenzelm@43429: val context1 = new Line_Context(ctxt1) wenzelm@43414: wenzelm@43416: var offset = 0 wenzelm@43416: for (token <- tokens) { wenzelm@43416: val style = Isabelle_Markup.token_markup(syntax, token) wenzelm@43416: val length = token.source.length wenzelm@43416: handler.handleToken(line, style, offset, length, context1) wenzelm@43416: offset += length wenzelm@43414: } wenzelm@43416: handler.handleToken(line, JToken.END, line.count, 0, context1) wenzelm@43416: wenzelm@43416: val context2 = context1.intern wenzelm@43416: handler.setLineContext(context2) wenzelm@43416: context2 wenzelm@43414: } wenzelm@43414: } wenzelm@43414: } wenzelm@43414: