From 9ed95263c4174bf957e3e6fc2817e5f91729fe1e Mon Sep 17 00:00:00 2001 From: bobbylight Date: Sat, 6 Jul 2024 18:01:54 -0400 Subject: [PATCH] WIP: Better word wrap for plain text --- .../modes/PlainTextTokenMaker.flex | 2 +- .../modes/PlainTextTokenMaker.java | 671 +----------------- .../ui/rsyntaxtextarea/demo/DemoRootPane.java | 2 + .../ui/rsyntaxtextarea/demo/NoneExample.txt | 6 + 4 files changed, 24 insertions(+), 657 deletions(-) diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex index bfa059da6..3a187e9be 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex @@ -178,7 +178,7 @@ import org.fife.ui.rsyntaxtextarea.*; * * @param reader the new input stream */ - public final void yyreset(java.io.Reader reader) { + public final void yyreset(Reader reader) { // 's' has been updated. zzBuffer = s.array; /* diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java index ee25049ad..00a6048da 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java @@ -11,6 +11,7 @@ package org.fife.ui.rsyntaxtextarea.modes; import java.io.*; +import java.text.BreakIterator; import javax.swing.text.Segment; import org.fife.ui.rsyntaxtextarea.*; @@ -55,668 +56,26 @@ * */ -public class PlainTextTokenMaker extends AbstractJFlexTokenMaker { +public class PlainTextTokenMaker extends TokenMakerBase { - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** lexical states */ - public static final int YYINITIAL = 0; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED = - "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\1\6\1\4"+ - "\7\4\1\4\1\21\1\5\12\1\1\17\1\4\1\0\1\4\1\0"+ - "\2\4\32\1\1\4\1\0\1\4\1\0\1\4\1\0\4\1\1\16"+ - "\1\13\1\1\1\7\1\14\2\1\1\15\3\1\1\11\2\1\1\12"+ - "\1\10\2\1\1\20\3\1\3\0\1\4\53\0\1\1\12\0\1\1"+ - "\4\0\1\1\5\0\27\1\1\0\37\1\1\0\u01ca\1\4\0\14\1"+ - "\16\0\5\1\7\0\1\1\1\0\1\1\201\0\5\1\1\0\2\1"+ - "\2\0\4\1\10\0\1\1\1\0\3\1\1\0\1\1\1\0\24\1"+ - "\1\0\123\1\1\0\213\1\10\0\236\1\11\0\46\1\2\0\1\1"+ - "\7\0\47\1\110\0\33\1\5\0\3\1\55\0\53\1\25\0\12\1"+ - "\4\0\2\1\1\0\143\1\1\0\1\1\17\0\2\1\7\0\17\1"+ - "\2\0\1\1\20\0\1\1\1\0\36\1\35\0\131\1\13\0\1\1"+ - "\16\0\53\1\11\0\2\1\4\0\1\1\5\0\26\1\4\0\1\1"+ - "\11\0\1\1\3\0\1\1\27\0\31\1\107\0\1\1\1\0\13\1"+ - "\127\0\66\1\3\0\1\1\22\0\1\1\7\0\12\1\4\0\12\1"+ - "\1\0\7\1\1\0\7\1\5\0\10\1\2\0\2\1\2\0\26\1"+ - "\1\0\7\1\1\0\1\1\3\0\4\1\3\0\1\1\20\0\1\1"+ - "\15\0\2\1\1\0\3\1\4\0\14\1\23\0\6\1\4\0\2\1"+ - "\2\0\26\1\1\0\7\1\1\0\2\1\1\0\2\1\1\0\2\1"+ - "\37\0\4\1\1\0\1\1\7\0\12\1\2\0\3\1\20\0\11\1"+ - "\1\0\3\1\1\0\26\1\1\0\7\1\1\0\2\1\1\0\5\1"+ - "\3\0\1\1\22\0\1\1\17\0\2\1\4\0\12\1\25\0\10\1"+ - "\2\0\2\1\2\0\26\1\1\0\7\1\1\0\2\1\1\0\5\1"+ - "\3\0\1\1\36\0\2\1\1\0\3\1\4\0\12\1\1\0\1\1"+ - "\21\0\1\1\1\0\6\1\3\0\3\1\1\0\4\1\3\0\2\1"+ - "\1\0\1\1\1\0\2\1\3\0\2\1\3\0\3\1\3\0\14\1"+ - "\26\0\1\1\25\0\12\1\25\0\10\1\1\0\3\1\1\0\27\1"+ - "\1\0\12\1\1\0\5\1\3\0\1\1\32\0\2\1\6\0\2\1"+ - "\4\0\12\1\25\0\10\1\1\0\3\1\1\0\27\1\1\0\12\1"+ - "\1\0\5\1\3\0\1\1\40\0\1\1\1\0\2\1\4\0\12\1"+ - "\1\0\2\1\22\0\10\1\1\0\3\1\1\0\51\1\2\0\1\1"+ - "\20\0\1\1\21\0\2\1\4\0\12\1\12\0\6\1\5\0\22\1"+ - "\3\0\30\1\1\0\11\1\1\0\1\1\2\0\7\1\72\0\60\1"+ - "\1\0\2\1\14\0\7\1\11\0\12\1\47\0\2\1\1\0\1\1"+ - "\2\0\2\1\1\0\1\1\2\0\1\1\6\0\4\1\1\0\7\1"+ - "\1\0\3\1\1\0\1\1\1\0\1\1\2\0\2\1\1\0\4\1"+ - "\1\0\2\1\11\0\1\1\2\0\5\1\1\0\1\1\11\0\12\1"+ - "\2\0\4\1\40\0\1\1\37\0\12\1\26\0\10\1\1\0\44\1"+ - "\33\0\5\1\163\0\53\1\24\0\13\1\6\0\6\1\4\0\4\1"+ - "\3\0\1\1\3\0\2\1\7\0\3\1\4\0\15\1\14\0\1\1"+ - "\1\0\12\1\6\0\46\1\1\0\1\1\5\0\1\1\2\0\53\1"+ - "\1\0\u014d\1\1\0\4\1\2\0\7\1\1\0\1\1\1\0\4\1"+ - "\2\0\51\1\1\0\4\1\2\0\41\1\1\0\4\1\2\0\7\1"+ - "\1\0\1\1\1\0\4\1\2\0\17\1\1\0\71\1\1\0\4\1"+ - "\2\0\103\1\45\0\20\1\20\0\125\1\14\0\u026c\1\2\0\21\1"+ - "\1\0\32\1\5\0\113\1\25\0\15\1\1\0\4\1\16\0\22\1"+ - "\16\0\22\1\16\0\15\1\1\0\3\1\17\0\64\1\43\0\1\1"+ - "\4\0\1\1\3\0\12\1\46\0\12\1\6\0\130\1\10\0\51\1"+ - "\1\0\1\1\5\0\106\1\12\0\35\1\51\0\50\1\2\0\5\1"+ - "\13\0\54\1\25\0\7\1\10\0\12\1\46\0\27\1\11\0\65\1"+ - "\53\0\12\1\6\0\12\1\15\0\1\1\135\0\57\1\21\0\7\1"+ - "\4\0\12\1\51\0\36\1\15\0\70\1\32\0\44\1\34\0\12\1"+ - "\3\0\61\1\153\0\4\1\1\0\4\1\3\0\2\1\11\0\300\1"+ - "\100\0\u0116\1\2\0\6\1\2\0\46\1\2\0\6\1\2\0\10\1"+ - "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\37\1\2\0\65\1"+ - "\1\0\7\1\1\0\1\1\3\0\3\1\1\0\7\1\3\0\4\1"+ - "\2\0\6\1\4\0\15\1\5\0\3\1\1\0\7\1\164\0\1\1"+ - "\15\0\1\1\20\0\15\1\145\0\1\1\4\0\1\1\2\0\12\1"+ - "\1\0\1\1\3\0\5\1\6\0\1\1\1\0\1\1\1\0\1\1"+ - "\1\0\4\1\1\0\13\1\2\0\4\1\5\0\5\1\4\0\1\1"+ - "\64\0\2\1\u0a7b\0\57\1\1\0\57\1\1\0\205\1\6\0\4\1"+ - "\3\0\2\1\14\0\46\1\1\0\1\1\5\0\1\1\2\0\70\1"+ - "\7\0\1\1\20\0\27\1\11\0\7\1\1\0\7\1\1\0\7\1"+ - "\1\0\7\1\1\0\7\1\1\0\7\1\1\0\7\1\1\0\7\1"+ - "\120\0\1\1\u01d5\0\2\1\52\0\5\1\5\0\2\1\4\0\126\1"+ - "\6\0\3\1\1\0\132\1\1\0\4\1\5\0\51\1\3\0\136\1"+ - "\21\0\33\1\65\0\20\1\u0200\0\u19b6\1\112\0\u51cd\1\63\0\u048d\1"+ - "\103\0\56\1\2\0\u010d\1\3\0\34\1\24\0\57\1\20\0\31\1"+ - "\10\0\106\1\61\0\11\1\2\0\147\1\2\0\4\1\1\0\4\1"+ - "\14\0\13\1\115\0\12\1\1\0\3\1\1\0\4\1\1\0\27\1"+ - "\35\0\64\1\16\0\62\1\34\0\12\1\30\0\6\1\3\0\1\1"+ - "\4\0\46\1\12\0\27\1\31\0\35\1\7\0\57\1\34\0\13\1"+ - "\46\0\51\1\27\0\3\1\1\0\10\1\4\0\12\1\6\0\27\1"+ - "\3\0\1\1\5\0\60\1\1\0\1\1\3\0\2\1\2\0\5\1"+ - "\2\0\1\1\1\0\1\1\30\0\3\1\2\0\13\1\7\0\3\1"+ - "\14\0\6\1\2\0\6\1\2\0\6\1\11\0\7\1\1\0\7\1"+ - "\221\0\43\1\15\0\12\1\6\0\u2ba4\1\14\0\27\1\4\0\61\1"+ - "\u2104\0\u016e\1\2\0\152\1\46\0\7\1\14\0\5\1\5\0\1\1"+ - "\1\0\12\1\1\0\15\1\1\0\5\1\1\0\1\1\1\0\2\1"+ - "\1\0\2\1\1\0\154\1\41\0\u016b\1\22\0\100\1\2\0\66\1"+ - "\50\0\14\1\164\0\5\1\1\0\207\1\23\0\12\1\7\0\32\1"+ - "\6\0\32\1\13\0\131\1\3\0\6\1\2\0\6\1\2\0\6\1"+ - "\2\0\3\1\43\0"; - - /** - * Translates characters to character classes - */ - private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int [] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 = - "\1\0\2\1\1\2\1\3\14\1\1\0\1\4\2\0"; - - private static int [] zzUnpackAction() { - int [] result = new int[21]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /** - * Translates a state to a row index in the transition table - */ - private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); - - private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\22\0\44\0\22\0\66\0\110\0\132\0\154"+ - "\0\176\0\220\0\242\0\264\0\306\0\330\0\352\0\374"+ - "\0\u010e\0\u0120\0\u0132\0\u0144\0\u0132"; - - private static int [] zzUnpackRowMap() { - int [] result = new int[21]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackRowMap(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int high = packed.charAt(i++) << 16; - result[j++] = high | packed.charAt(i++); - } - return j; - } - - /** - * The transition table of the DFA - */ - private static final int [] ZZ_TRANS = zzUnpackTrans(); - - private static final String ZZ_TRANS_PACKED_0 = - "\1\2\1\3\1\4\1\5\3\2\1\6\3\3\1\7"+ - "\3\3\1\2\1\10\1\2\23\0\1\3\5\0\10\3"+ - "\1\0\1\3\4\0\1\5\17\0\1\3\5\0\1\3"+ - "\1\11\6\3\1\0\1\3\2\0\1\3\5\0\1\3"+ - "\1\12\3\3\1\13\2\3\1\0\1\3\2\0\1\3"+ - "\5\0\10\3\1\0\1\14\2\0\1\3\5\0\1\3"+ - "\1\15\6\3\1\0\1\3\2\0\1\3\5\0\2\3"+ - "\1\16\5\3\1\0\1\3\2\0\1\3\5\0\6\3"+ - "\1\17\1\3\1\0\1\3\2\0\1\3\5\0\10\3"+ - "\1\0\1\20\2\0\1\3\5\0\2\3\1\21\5\3"+ - "\1\0\1\3\2\0\1\3\5\0\10\3\1\22\1\3"+ - "\2\0\1\3\5\0\7\3\1\16\1\0\1\3\2\0"+ - "\1\3\5\0\10\3\1\0\1\3\1\23\1\0\1\3"+ - "\5\0\3\3\1\16\4\3\1\22\1\3\6\0\1\24"+ - "\15\0\1\23\2\0\1\25\12\23\1\25\1\23\1\25"+ - "\5\0\1\23\14\0"; - - private static int [] zzUnpackTrans() { - int [] result = new int[342]; - int offset = 0; - offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackTrans(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - value--; - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** - * ZZ_ATTRIBUTE[aState] contains the attributes of state aState - */ - private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); - - private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\1\0\1\11\1\1\1\11\15\1\1\0\1\1\2\0"; - - private static int [] zzUnpackAttribute() { - int [] result = new int[21]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAttribute(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /* user code: */ - - - /** - * Constructor. This must be here because JFlex does not generate a - * no-parameter constructor. - */ - public PlainTextTokenMaker() { - } - - - /** - * Adds the token specified to the current linked list of tokens. - * - * @param tokenType The token's type. - * @param link Whether this token is a hyperlink. - */ - private void addToken(int tokenType, boolean link) { - int so = zzStartRead + offsetShift; - super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link); - zzStartRead = zzMarkedPos; - } - - - /** - * Always returns TokenTypes.NULL, as there are no multiline - * tokens in properties files. - * - * @param text The line of tokens to examine. - * @param initialTokenType The token type to start with (i.e., the value - * of getLastTokenTypeOnLine for the line before - * text). - * @return TokenTypes.NULL. - */ - public int getLastTokenTypeOnLine(Segment text, int initialTokenType) { - return TokenTypes.NULL; - } - - - /** - * Returns the text to place at the beginning and end of a - * line to "comment" it in a this programming language. - * - * @return null, as there are no comments in plain text. - */ @Override - public String[] getLineCommentStartAndEnd(int languageIndex) { - return null; - } - - - /** - * Always returns false, as you never want "mark occurrences" - * working in plain text files. - * - * @param type The token type. - * @return Whether tokens of this type should have "mark occurrences" - * enabled. - */ - @Override - public boolean getMarkOccurrencesOfTokenType(int type) { - return false; - } - - - /** - * Returns the first token in the linked list of tokens generated - * from text. This method must be implemented by - * subclasses so they can correctly implement syntax highlighting. - * - * @param text The text from which to get tokens. - * @param initialTokenType The token type we should start with. - * @param startOffset The offset into the document at which - * text starts. - * @return The first Token in a linked list representing - * the syntax highlighted text. - */ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { - resetTokenList(); - this.offsetShift = -text.offset + startOffset; - - // Start off in the proper state. - s = text; - try { - yyreset(zzReader); - yybegin(YYINITIAL); - return yylex(); - } catch (IOException ioe) { - ioe.printStackTrace(); - return new TokenImpl(); - } + TokenImpl t = new TokenImpl(); + TokenImpl curr = t; - } - - - /** - * Refills the input buffer. - * - * @return true if EOF was reached, otherwise - * false. - */ - private boolean zzRefill() { - return zzCurrentPos>=s.offset+s.count; - } + BreakIterator boundary = BreakIterator.getLineInstance(); + boundary.setText(text); + int start = boundary.first(); + for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { + int type = Character.isWhitespace(text.charAt(start - text.offset)) ? TokenTypes.WHITESPACE : TokenTypes.IDENTIFIER; + TokenImpl newToken = new TokenImpl(text, start, end - 1, startOffset + start - text.offset, type, 0); + System.out.println(">>> " + newToken); + curr.setNextToken(newToken); + curr = newToken; + } - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to YY_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - // 's' has been updated. - zzBuffer = s.array; - /* - * We replaced the line below with the two below it because zzRefill - * no longer "refills" the buffer (since the way we do it, it's always - * "full" the first time through, since it points to the segment's - * array). So, we assign zzEndRead here. - */ - //zzStartRead = zzEndRead = s.offset; - zzStartRead = s.offset; - zzEndRead = zzStartRead + s.count - 1; - zzCurrentPos = zzMarkedPos = s.offset; - zzLexicalState = YYINITIAL; - zzReader = reader; - zzAtEOF = false; + return t.getNextToken() == null ? new TokenImpl() : t.getNextToken(); } - - - - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ - public PlainTextTokenMaker(java.io.Reader in) { - this.zzReader = in; - } - - /** - * Creates a new scanner. - * There is also java.io.Reader version of this constructor. - * - * @param in the java.io.Inputstream to read input from. - */ - public PlainTextTokenMaker(java.io.InputStream in) { - this(new java.io.InputStreamReader(in)); - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char [] zzUnpackCMap(String packed) { - char [] map = new char[0x10000]; - int i = 0; /* index in packed string */ - int j = 0; /* index in unpacked array */ - while (i < 1646) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do map[j++] = value; while (--count > 0); - } - return map; - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ - public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - - int [] zzTransL = ZZ_TRANS; - int [] zzRowMapL = ZZ_ROWMAP; - int [] zzAttrL = ZZ_ATTRIBUTE; - - while (true) { - zzMarkedPosL = zzMarkedPos; - - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = zzLexicalState; - - - zzForAction: { - while (true) { - - if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferL[zzCurrentPosL++]; - else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } - else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } - else { - zzInput = zzBufferL[zzCurrentPosL++]; - } - } - int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; - if (zzNext == -1) break zzForAction; - zzState = zzNext; - - int zzAttributes = zzAttrL[zzState]; - if ( (zzAttributes & 1) == 1 ) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ( (zzAttributes & 8) == 8 ) break zzForAction; - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 4: - { addToken(TokenTypes.IDENTIFIER, true); - } - case 5: break; - case 2: - { addNullToken(); return firstToken; - } - case 6: break; - case 1: - { addToken(TokenTypes.IDENTIFIER, false); - } - case 7: break; - case 3: - { addToken(TokenTypes.WHITESPACE, false); - } - case 8: break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - switch (zzLexicalState) { - case YYINITIAL: { - addNullToken(); return firstToken; - } - case 22: break; - default: - return null; - } - } - else { - zzScanError(ZZ_NO_MATCH); - } - } - } - } - - } diff --git a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java index 44f035e12..7a17958c4 100755 --- a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java +++ b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java @@ -242,6 +242,8 @@ private RSyntaxTextArea createTextArea() { textArea.setMarkOccurrences(true); textArea.setCodeFoldingEnabled(true); textArea.setClearWhitespaceLinesEnabled(false); + textArea.setWhitespaceVisible(true); + textArea.setFont(new java.awt.Font("Fira Code", Font.PLAIN, 12)); InputMap im = textArea.getInputMap(); ActionMap am = textArea.getActionMap(); diff --git a/RSyntaxTextAreaDemo/src/main/resources/org/fife/ui/rsyntaxtextarea/demo/NoneExample.txt b/RSyntaxTextAreaDemo/src/main/resources/org/fife/ui/rsyntaxtextarea/demo/NoneExample.txt index 8d74500cd..1a9acef5c 100644 --- a/RSyntaxTextAreaDemo/src/main/resources/org/fife/ui/rsyntaxtextarea/demo/NoneExample.txt +++ b/RSyntaxTextAreaDemo/src/main/resources/org/fife/ui/rsyntaxtextarea/demo/NoneExample.txt @@ -1 +1,7 @@ +This is a check for behavior of (sentences with words in parentheses). This is a check for behavior of (sentences with words in parentheses). This is a check for behavior of (sentences with words in parentheses). This is a check for behavior of (sentences with words in parentheses). + +This is a check, for better or worse, for other punctuations; does it work? This is a check, for better or worse, for other punctuations; does it work? This is a check, for better or worse, for other punctuations; does it work? This is a check, for better or worse, for other punctuations; does it work? + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig unnötig