/* * Copyright (c) 2004-2005 Hans Kratz. * Geert Bevin . * All Rights Reserved. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ import java.io.IOException; %% %class RIFEXmlHighlighter %unicode %pack %buffer 128 %public %int %{ /* styles */ public static final byte PLAIN_STYLE = 1; public static final byte CHAR_DATA = 2; public static final byte TAG_SYMBOLS = 3; public static final byte COMMENT = 4; public static final byte ATTRIBUTE_VALUE = 5; public static final byte ATTRIBUTE_NAME = 6; public static final byte PROCESSING_INSTRUCTION = 7; public static final byte TAG_NAME = 8; public static final byte RIFE_TAG = 9; public static final byte RIFE_NAME = 10; /* Highlighter implementation */ public int getStyleCount() { return 10; } public byte getStartState() { return YYINITIAL+1; } public byte getCurrentState() { return (byte) (yystate()+1); } public void setState(byte newState) { yybegin(newState-1); } public byte getNextToken() { try { return (byte) yylex(); } catch (IOException e) { throw new InternalError(); } } public int getTokenLength() { return yylength(); } public RIFEXmlHighlighter() { } private int mReturningState; private int mReturningStateTag; %} /* main character classes */ WhiteSpace = [ \t\f] WhiteSpaceNewline = [ \t\f\n\r] /* identifiers */ Letter = ([:jletterdigit:]|"."|"-"|"_"|":") Name = ([:jletter:]|"_"|":") {Letter}* RifeBeginStartComment = ("") RifeEndComment = ("") RifeBeginStartCompact = ("[!"{WhiteSpaceNewline}*("V"|"B"|"BV"|"I")) RifeBeginStopCompact = ("]") RifeEndCompact = ("[!/"{WhiteSpaceNewline}*("V"|"B"|"BV"){WhiteSpaceNewline}*"]") RifeBeginStartVelocity = ("${"{WhiteSpaceNewline}*("v"|"b"|"bv"|"i")) RifeBeginStopVelocity = ("}") RifeEndVelocity = ("${/"{WhiteSpaceNewline}*("v"|"b"|"bv"){WhiteSpaceNewline}*"}") RifeBeginStartRegular = ("") RifeEndRegular = ("") %state IN_RIFE_TAG_COMMENT, IN_RIFE_TAG_COMPACT, IN_RIFE_TAG_VELOCITY, IN_RIFE_TAG_REGULAR, IN_RIFE_NAME_SINGLEQUOTED, IN_RIFE_NAME_QUOTED, IN_RIFE_NAME, IN_COMMENT, TAG_START, IN_TAG, IN_SINGLE_QUOTE_STRING, IN_DOUBLE_QUOTE_STRING, IN_PROCESSING_INSTRUCTION, IN_CDATA_SECTION %% { // tokens... "<" { yybegin(TAG_START); return TAG_SYMBOLS; } " { {Name} { yybegin(IN_TAG); return TAG_NAME; } ">" { yybegin(YYINITIAL); return TAG_SYMBOLS; } . { yybegin(IN_TAG); return PLAIN_STYLE; } } { {RifeBeginStartComment} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMMENT); return RIFE_TAG; } {RifeEndComment} { return RIFE_TAG; } {RifeBeginStartCompact} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMPACT); return RIFE_TAG; } {RifeEndCompact} { return RIFE_TAG; } {RifeBeginStartVelocity} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_VELOCITY); return RIFE_TAG; } {RifeEndVelocity} { return RIFE_TAG; } {RifeBeginStartRegular} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_REGULAR); return RIFE_TAG; } {RifeEndRegular} { return RIFE_TAG; } "/>" { yybegin(YYINITIAL); return TAG_SYMBOLS; } ">" { yybegin(YYINITIAL); return TAG_SYMBOLS; } "=" { return TAG_SYMBOLS; } {Name} { return ATTRIBUTE_NAME; } "\'" { yybegin(IN_SINGLE_QUOTE_STRING); return ATTRIBUTE_VALUE; } "\"" { yybegin(IN_DOUBLE_QUOTE_STRING); return ATTRIBUTE_VALUE; } . { return PLAIN_STYLE; } } { {RifeBeginStartComment} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMMENT); return RIFE_TAG; } {RifeEndComment} { return RIFE_TAG; } {RifeBeginStartCompact} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMPACT); return RIFE_TAG; } {RifeEndCompact} { return RIFE_TAG; } {RifeBeginStartVelocity} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_VELOCITY); return RIFE_TAG; } {RifeEndVelocity} { return RIFE_TAG; } {RifeBeginStartRegular} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_REGULAR); return RIFE_TAG; } {RifeEndRegular} { return RIFE_TAG; } [^\'\n\[\]<>{}]* { return ATTRIBUTE_VALUE; } \[ { return ATTRIBUTE_VALUE; } \] { return ATTRIBUTE_VALUE; } \n { return ATTRIBUTE_VALUE; } \' { yybegin(IN_TAG); return ATTRIBUTE_VALUE; } . { yybegin(IN_TAG); return TAG_SYMBOLS; } } { {RifeBeginStartComment} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMMENT); return RIFE_TAG; } {RifeEndComment} { return RIFE_TAG; } {RifeBeginStartCompact} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_COMPACT); return RIFE_TAG; } {RifeEndCompact} { return RIFE_TAG; } {RifeBeginStartVelocity} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_VELOCITY); return RIFE_TAG; } {RifeEndVelocity} { return RIFE_TAG; } {RifeBeginStartRegular} { mReturningState = yystate(); yybegin(IN_RIFE_TAG_REGULAR); return RIFE_TAG; } {RifeEndRegular} { return RIFE_TAG; } [^\"\n\[\]<>{}]* { return ATTRIBUTE_VALUE; } \[ { return ATTRIBUTE_VALUE; } \] { return ATTRIBUTE_VALUE; } \n { return ATTRIBUTE_VALUE; } \" { yybegin(IN_TAG); return ATTRIBUTE_VALUE; } . { yybegin(IN_TAG); return TAG_SYMBOLS; } } { ([^?\n]| "?"+ [^>?\n])* (\n | "?"\n) { return PROCESSING_INSTRUCTION; } ([^?\n]| "?"+ [^>?\n])* "?"+ ">" { yybegin(YYINITIAL); return PROCESSING_INSTRUCTION; } } { [^\]\n]* { return CHAR_DATA; } "]]>" { yybegin(YYINITIAL); return CHAR_DATA; } . { return CHAR_DATA; } } { [^\-\n]* { return COMMENT; } "-->" { yybegin(YYINITIAL); return COMMENT; } . { return COMMENT; } } { [^\-\>\']* { return RIFE_TAG; } {RifeBeginStopComment} { yybegin(mReturningState); return RIFE_TAG; } "\'" { mReturningStateTag = yystate(); yybegin(IN_RIFE_NAME_SINGLEQUOTED); return RIFE_NAME; } . { return RIFE_TAG; } } { [^\]\']* { return RIFE_TAG; } {RifeBeginStopCompact} { yybegin(mReturningState); return RIFE_TAG; } "\'" { mReturningStateTag = yystate(); yybegin(IN_RIFE_NAME_SINGLEQUOTED); return RIFE_NAME; } . { return RIFE_TAG; } } { {RifeBeginStopVelocity} { yybegin(mReturningState); return RIFE_TAG; } [^\s\t\}]* { mReturningStateTag = yystate(); yybegin(IN_RIFE_NAME); return RIFE_NAME; } . { return RIFE_TAG; } } { [^\>\"]* { return RIFE_TAG; } {RifeBeginStopRegular} { yybegin(mReturningState); return RIFE_TAG; } "\"" { mReturningStateTag = yystate(); yybegin(IN_RIFE_NAME_QUOTED); return RIFE_NAME; } . { return RIFE_TAG; } } { \' { yybegin(mReturningStateTag); return RIFE_NAME; } . { return RIFE_NAME; } } { \" { yybegin(mReturningStateTag); return RIFE_NAME; } . { return RIFE_NAME; } } { {RifeBeginStopVelocity} { yybegin(mReturningState); return RIFE_TAG; } . { return RIFE_NAME; } } /* error fallback */ .|\n { return PLAIN_STYLE; }