/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.deved.antlride.common.ui.text.partitions.rules;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IToken;
public abstract class AntlrBlockPartition extends AntlrAbstractPartition {
private Collection<String> fExclusionPatterns;
private String fStartBlockCharacter;
private String fEndBlockCharacter;
protected AntlrBlockPartition(IToken successToken,
char startBlockCharacter, char endBlockCharacter) {
super(successToken);
fExclusionPatterns = new ArrayList<String>();
fStartBlockCharacter = "" + startBlockCharacter;
fEndBlockCharacter = "" + endBlockCharacter;
}
protected AntlrBlockPartition(IToken successToken) {
this(successToken, '{', '}');
}
// public static void main(String[] args) {
// String text = "RCURLY='};";
// System.out.println(text.matches(".*'.*}.*'.*"));
// }
protected String[] isInIgnoreMode(String ch, ICharacterScanner scanner) {
if (ch.equals("'")) {
return new String[] { "'", "'", null };
}
if (ch.equals("\"")) {
return new String[] { "\"", "\"", null };
}
if (ch.equals("/")) {
consumeOne(scanner);
String nextChar = getTextReaded();
unread(scanner, 1);
if (nextChar.equals("/")) {
return new String[] { "//", "\n", null };
}
if (nextChar.equals("*")) {
return new String[] { "/*", "*/", null };
}
}
return null;
}
protected IToken doBlock(ICharacterScanner scanner) {
// StringBuilder partition = new StringBuilder();
try {
consumeOne(scanner);
int count = 1;
StringBuilder ignored = new StringBuilder();
while (!fEOF) {
String ch = getTextReaded();
// partition.append(ch);
String[] patterns = isInIgnoreMode(ch, scanner);
if (patterns != null) {
// 0=first pattern; 1=end pattern; 2=escape sequence
ignored.append(ch);
consumeOne(scanner);
String endSequence = patterns[1];
String escapeSequence = patterns[2];
String escapePattern = patterns[2] + endSequence;
String pattern = null;
while (!fEOF) {
String ich = getTextReaded();
ignored.append(ich);
// partition.append(ich);
pattern = ignored.toString();
if (pattern.endsWith(endSequence)) {
if (escapeSequence == null
|| !pattern.endsWith(escapePattern)) {
break;
}
}
consumeOne(scanner);
}
// System.out.println("IGNORED---" + ignored + "---");
ignored.setLength(0);
}
if (fExclusionPatterns.size() > 0) {
String word = getLastWordReaded(scanner);
if (excluded(ch) || excluded(word)) {
unread(scanner, word.length());
return fSuccessToken;
}
}
if (patterns == null) {
if (ch.equals(fEndBlockCharacter)) {
count--;
if (count == 0) {
return fSuccessToken;
}
} else if (ch.equals(fStartBlockCharacter)) {
count++;
}
}
consumeOne(scanner);
}
return fSuccessToken;
} finally {
// debugPartition();
// System.out.println(partition);
}
}
protected void addExclusionPattern(String pattern) {
fExclusionPatterns.add(pattern);
}
protected boolean excluded(String text) {
return fExclusionPatterns.contains(text);
}
protected void setStartBlockCharacter(char startBlockCharacter) {
fStartBlockCharacter = "" + startBlockCharacter;
}
protected void setEndBlockCharacter(char endBlockCharacter) {
fEndBlockCharacter = "" + endBlockCharacter;
}
}