### Eclipse Workspace Patch 1.0 #P org.xwiki.eclipse.ui Index: src/main/java/org/xwiki/eclipse/ui/editors/scanners/rules/RegExRule.java =================================================================== --- src/main/java/org/xwiki/eclipse/ui/editors/scanners/rules/RegExRule.java (revision 25261) +++ src/main/java/org/xwiki/eclipse/ui/editors/scanners/rules/RegExRule.java (working copy) @@ -20,92 +20,64 @@ */ package org.xwiki.eclipse.ui.editors.scanners.rules; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.HashMap; +import java.util.Iterator; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; -import org.xwiki.eclipse.ui.editors.utils.CharacterScannerCharSequence; -/** - * This rule is capable of detecting a sequence that matches against a given regular expression. - */ public class RegExRule implements IRule { - /** - * The regular expression pattern. - */ - private Pattern pattern; - - /** - * The token to be returned if the a match is found. - */ - private IToken token; + private HashMap hashMap; - /** - * Optional constraint on the starting column. - */ private int columnConstraint; - /** - * Constructor - * - * @param patternString The regular expression defining the pattern. - * @param token The token to be returned on success. - */ - public RegExRule(String patternString, IToken token) + public RegExRule() { - pattern = Pattern.compile(patternString); - this.token = token; + hashMap = new HashMap(); columnConstraint = -1; } - /* - * (non-Javadoc) - * @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner) - */ public IToken evaluate(ICharacterScanner scanner) { - /* Wrap the character scanner into a char sequence to be used later for pattern matching. */ - CharacterScannerCharSequence charSequence = new CharacterScannerCharSequence(scanner); - - /* If there is a column constraint, check that it is satisfied. */ if (columnConstraint != -1) { - if (charSequence.getColumn() != columnConstraint) { - /* - * On failure, push all the read character back into the scanner, so that other rules can process them. - */ - charSequence.unread(); + if (scanner.getColumn() != columnConstraint) { return Token.UNDEFINED; } } - - Matcher matcher = pattern.matcher(charSequence); - - if (matcher.lookingAt()) { - /* Push all the characters that are not part of the match back to the scanner. */ - charSequence.unread(charSequence.length() - matcher.end()); - return token; + int c; + int n = 1; + StringBuffer localBuffer = new StringBuffer(); + while ((c = scanner.read()) != ICharacterScanner.EOF) { + n++; + localBuffer.append((char) c); + Iterator iter = hashMap.keySet().iterator(); + while (iter.hasNext()) { + String patternString = iter.next(); + IToken token = hashMap.get(patternString); + if (localBuffer.toString().matches(patternString)) { + // System.out.println("returning token for " + localBuffer.toString().replaceAll("\\n", "\\\\n") + // + " and pattern: " + patternString.replaceAll("\\n", "\\\\n")); + return token; + } + } } - - /* - * On failure, push all the read character back to the scanner, so that other rules can process them. - */ - charSequence.unread(); - + while (n > 0) { + scanner.unread(); + n--; + } return Token.UNDEFINED; } - /** - * Set the column constraint. - * - * @param columnConstraint The column at which the matched sequence should start. - */ + public void add(String patternString, IToken token) + { + hashMap.put(patternString, token); + } + public void setColumnConstraint(int columnConstraint) { this.columnConstraint = columnConstraint; } - } Index: src/main/java/org/xwiki/eclipse/ui/editors/Constants.java =================================================================== --- src/main/java/org/xwiki/eclipse/ui/editors/Constants.java (revision 25249) +++ src/main/java/org/xwiki/eclipse/ui/editors/Constants.java (working copy) @@ -23,7 +23,7 @@ public class Constants { public static final String LIST_BULLET_PATTERN = - "\\*+ |11*\\. |1\\**\\. |a\\. |A\\. |i\\. |I\\. |g\\. |h\\. |k\\. "; + "\\n\\*+ |\\n11*\\. |\\n1\\**\\. |\\na\\. |\\nA\\. |\\ni\\. |\\nI\\. |\\ng\\. |\\nh\\. |\\nk\\. "; public static final String DEFINITION_TERM_PATTERN = ":*; .+|:+ .+"; Index: src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiPartitionScanner.java =================================================================== --- src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiPartitionScanner.java (revision 25261) +++ src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiPartitionScanner.java (working copy) @@ -62,7 +62,7 @@ List rules = new ArrayList(); rules.add(new MultiLineRule("{{html}}", "{{/html}}", htmlToken)); - rules.add(new MultiLineRule("{code}", "{code}", codeToken)); + rules.add(new MultiLineRule("{code", "{code}", codeToken)); rules.add(new MultiLineRule("{pre}", "{/pre}", preToken)); rules.add(new MultiLineRule("{{{", "}}}", preToken)); rules.add(new MultiLineRule("{table}", "{table}", tableToken)); Index: src/main/java/org/xwiki/eclipse/ui/editors/utils/CharacterScannerCharSequence.java =================================================================== --- src/main/java/org/xwiki/eclipse/ui/editors/utils/CharacterScannerCharSequence.java (revision 25206) +++ src/main/java/org/xwiki/eclipse/ui/editors/utils/CharacterScannerCharSequence.java (working copy) @@ -1,122 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional - * information regarding copyright ownership. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - * - */ -package org.xwiki.eclipse.ui.editors.utils; - -import org.eclipse.jface.text.rules.ICharacterScanner; - -/** - * This class implements a CharSequence that is backed by an ICharacterScanner. It is used as a bridge for using Java - * regex pattern matching with IRules that use ICharacterScanners for the evaluation. - */ -public class CharacterScannerCharSequence implements CharSequence -{ - /** - * The buffer used for buffering characters read from scanner. - */ - private StringBuffer buffer; - - /** - * The source scanner. - */ - private ICharacterScanner scanner; - - /** - * The column of the first character that will be read from the scanner. - */ - private int column; - - public CharacterScannerCharSequence(ICharacterScanner scanner) - { - this.scanner = scanner; - - buffer = new StringBuffer(); - - column = scanner.getColumn(); - - /* Buffer all the characters */ - int c; - while ((c = scanner.read()) != ICharacterScanner.EOF) { - buffer.append((char) c); - } - } - - /** - * @return The column of the first character of this sequence. - */ - public int getColumn() - { - return column; - } - - /* - * (non-Javadoc) - * @see java.lang.CharSequence#charAt(int) - */ - public char charAt(int index) - { - return buffer.charAt(index); - } - - /* - * (non-Javadoc) - * @see java.lang.CharSequence#length() - */ - public int length() - { - return buffer.length(); - } - - /* - * (non-Javadoc) - * @see java.lang.CharSequence#subSequence(int, int) - */ - public CharSequence subSequence(int start, int end) - { - return buffer.subSequence(start, end); - } - - /** - * Push back all the buffered characters to the scanner. - */ - public void unread() - { - unread(buffer.length()); - } - - /** - * Push back characters to the scanner. - * - * @param n The number of characters to push back. - */ - public void unread(int n) - { - for (int i = 0; i <= n; i++) { - scanner.unread(); - } - } - - @Override - public String toString() - { - return buffer.toString(); - } - -} Index: src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiMarkupScanner.java =================================================================== --- src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiMarkupScanner.java (revision 25261) +++ src/main/java/org/xwiki/eclipse/ui/editors/scanners/XWikiMarkupScanner.java (working copy) @@ -63,63 +63,6 @@ List rules = new ArrayList(); - /* RegEx rules work better with respect to SingleLineRules */ - RegExRule regExRule = new RegExRule("1 .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("= .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("1.1 .*\n?", heading2Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("== .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("1.1.1 .*\n?", heading3Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("=== .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("1.1.1.1 .*\n?", heading4Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("==== .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("1.1.1.1.1 .*\n?", heading5Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("===== .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("1.1.1.1.1.1 .*\n?", heading6Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule("====== .*\n?", heading1Token); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule(Constants.LIST_BULLET_PATTERN, listBulletToken); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - - regExRule = new RegExRule(Constants.DEFINITION_TERM_PATTERN, definitionTermToken); - regExRule.setColumnConstraint(0); - rules.add(regExRule); - rules.add(new SingleLineRule("**", "**", boldToken, '\\')); rules.add(new SingleLineRule("*", "*", boldToken, '\\')); rules.add(new SingleLineRule("~~", "~~", italicToken, '\\')); @@ -139,6 +82,18 @@ rules.add(new BalancedParenthesisRule('$', identifierToken)); + RegExRule regExRule = new RegExRule(); + regExRule.setColumnConstraint(0); + regExRule.add("1 .*\n|= .*\n", heading1Token); + regExRule.add("1.1 .*\n|== .*\n", heading2Token); + regExRule.add("1.1.1 .*\n|=== .*\n", heading3Token); + regExRule.add("1.1.1.1 .*\n|==== .*\n", heading4Token); + regExRule.add("1.1.1.1.1 .*\n|===== .*\n", heading5Token); + regExRule.add("1.1.1.1.1.1 .*\n|====== .*\n", heading6Token); + regExRule.add(Constants.LIST_BULLET_PATTERN, listBulletToken); + regExRule.add(Constants.DEFINITION_TERM_PATTERN, definitionTermToken); + rules.add(regExRule); + setRules(rules.toArray(new IRule[rules.size()])); } }