/*
* JBoss by Red Hat
* Copyright 2006-2009, Red Hat Middleware, LLC, and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.jboss.ide.eclipse.freemarker.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.MultiLineRule;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.Token;
import org.jboss.ide.eclipse.freemarker.editor.rules.DirectiveRule;
import org.jboss.ide.eclipse.freemarker.editor.rules.DirectiveRuleEnd;
import org.jboss.ide.eclipse.freemarker.editor.rules.GenericDirectiveRule;
import org.jboss.ide.eclipse.freemarker.editor.rules.GenericDirectiveRuleEnd;
import org.jboss.ide.eclipse.freemarker.editor.rules.InterpolationRule;
import org.jboss.ide.eclipse.freemarker.editor.rules.MacroInstanceRule;
import org.jboss.ide.eclipse.freemarker.editor.rules.MacroInstanceRuleEnd;
import org.jboss.ide.eclipse.freemarker.editor.rules.XmlRule;
/**
* @author <a href="mailto:joe@binamics.com">Joe Hudson</a>
*/
public class PartitionScanner extends RuleBasedPartitionScanner {
public final static String FTL_COMMENT = "__ftl_comment"; //$NON-NLS-1$
public final static String FTL_INCLUDE = "__ftl_include"; //$NON-NLS-1$
public final static String FTL_IMPORT = "__ftl_import"; //$NON-NLS-1$
public final static String FTL_ASSIGN = "__ftl_assign"; //$NON-NLS-1$
public final static String FTL_ASSIGN_END = "__ftl_assign_end"; //$NON-NLS-1$
public final static String FTL_LOCAL = "__ftl_local"; //$NON-NLS-1$
public final static String FTL_LOCAL_END = "__ftl_local_end"; //$NON-NLS-1$
public final static String FTL_GLOBAL = "__ftl_global"; //$NON-NLS-1$
public final static String FTL_GLOBAL_END = "__ftl_global_end"; //$NON-NLS-1$
public final static String FTL_BREAK = "__ftl_break"; //$NON-NLS-1$
public final static String FTL_NESTED = "__ftl_nested"; //$NON-NLS-1$
public final static String FTL_RETURN = "__ftl_return"; //$NON-NLS-1$
public final static String FTL_STOP = "__ftl_stop"; //$NON-NLS-1$
public final static String FTL_FTL_DIRECTIVE = "__ftl_ftl_directive"; //$NON-NLS-1$
public final static String FTL_FUNCTION_DIRECTIVE_START = "__ftl_function_directive_start"; //$NON-NLS-1$
public final static String FTL_FUNCTION_DIRECTIVE_END = "__ftl_function_directive_end"; //$NON-NLS-1$
public final static String FTL_LIST_DIRECTIVE_START = "__ftl_list_directive_start"; //$NON-NLS-1$
public final static String FTL_LIST_DIRECTIVE_END = "__ftl_list_directive_end"; //$NON-NLS-1$
public final static String FTL_MACRO_DIRECTIVE_START = "__ftl_macro_directive_start"; //$NON-NLS-1$
public final static String FTL_MACRO_DIRECTIVE_END = "__ftl_macro_directive_end"; //$NON-NLS-1$
public final static String FTL_MACRO_INSTANCE_START = "__ftl_macro_instance_start"; //$NON-NLS-1$
public final static String FTL_MACRO_INSTANCE_END = "__ftl_macro_instance_end"; //$NON-NLS-1$
public final static String FTL_SWITCH_DIRECTIVE_START = "__ftl_switch_directive_start"; //$NON-NLS-1$
public final static String FTL_SWITCH_DIRECTIVE_END = "__ftl_switch_directive_end"; //$NON-NLS-1$
public final static String FTL_CASE_DIRECTIVE_START = "__ftl_case_directive_start"; //$NON-NLS-1$
public final static String FTL_CASE_DEFAULT_START = "__ftl_case_default_start"; //$NON-NLS-1$
public final static String FTL_IF_DIRECTIVE_START = "__ftl_if_directive_start"; //$NON-NLS-1$
public final static String FTL_IF_DIRECTIVE_END = "__ftl_if_directive_end"; //$NON-NLS-1$
public final static String FTL_IF_ELSE_DIRECTIVE = "__ftl_if_else_directive"; //$NON-NLS-1$
public final static String FTL_ELSE_IF_DIRECTIVE = "__ftl_else_if_directive"; //$NON-NLS-1$
public final static String FTL_INTERPOLATION = "__ftl_interpolation"; //$NON-NLS-1$
public final static String FTL_DIRECTIVE = "__ftl_directive"; //$NON-NLS-1$
public final static String FTL_DIRECTIVE_END = "__ftl_directive_end"; //$NON-NLS-1$
public final static String XML_TAG = "__xml_tag"; //$NON-NLS-1$
public final static String XML_COMMENT = "__xml_comment"; //$NON-NLS-1$
public final static String STRING = "__string"; //$NON-NLS-1$
public final static String[] DIRECTIVES = {
FTL_INCLUDE, FTL_IMPORT, FTL_ASSIGN, FTL_ASSIGN_END, FTL_LOCAL, FTL_LOCAL_END, FTL_GLOBAL,
FTL_GLOBAL_END, FTL_BREAK, FTL_NESTED, FTL_RETURN, FTL_STOP, FTL_LIST_DIRECTIVE_START,
FTL_LIST_DIRECTIVE_END, FTL_IF_DIRECTIVE_START, FTL_ELSE_IF_DIRECTIVE, FTL_IF_ELSE_DIRECTIVE,
FTL_IF_DIRECTIVE_END, FTL_SWITCH_DIRECTIVE_START, FTL_SWITCH_DIRECTIVE_END, FTL_CASE_DIRECTIVE_START,
FTL_CASE_DEFAULT_START, FTL_MACRO_DIRECTIVE_START, FTL_MACRO_DIRECTIVE_END, FTL_MACRO_INSTANCE_START,
FTL_MACRO_INSTANCE_END, FTL_FTL_DIRECTIVE, FTL_FUNCTION_DIRECTIVE_START, FTL_FUNCTION_DIRECTIVE_END};
/**
* The array of partitions used.
*/
public static String[] PARTITIONS = {
IDocument.DEFAULT_CONTENT_TYPE,
FTL_COMMENT,
XML_TAG,
XML_COMMENT,
FTL_INTERPOLATION,
STRING,
FTL_DIRECTIVE,
FTL_DIRECTIVE_END,
};
static {
String[] pSub = new String[PARTITIONS.length + DIRECTIVES.length];
int i=0;
for (int j=0; j<DIRECTIVES.length; j++) {
pSub[i++] = DIRECTIVES[j];
}
for (int j=0; j<PARTITIONS.length; j++) {
pSub[i++] = PARTITIONS[j];
}
PARTITIONS = pSub;
}
/**
* Creates a new partition scanner.
*/
public PartitionScanner() {
List rules = new ArrayList();
IToken ftlComment = new Token(FTL_COMMENT);
rules.add(new MultiLineRule("<!--", "-->", new Token(XML_COMMENT))); //$NON-NLS-1$ //$NON-NLS-2$
rules.add(new MultiLineRule("<#--", "-->", ftlComment)); //$NON-NLS-1$ //$NON-NLS-2$
rules.add(new MultiLineRule("[#--", "--]", ftlComment)); //$NON-NLS-1$ //$NON-NLS-2$
rules.add(new DirectiveRule("ftl", new Token(FTL_FTL_DIRECTIVE))); //$NON-NLS-1$
rules.add(new DirectiveRule("if", new Token(FTL_IF_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRule("elseif", new Token(FTL_ELSE_IF_DIRECTIVE))); //$NON-NLS-1$
rules.add(new DirectiveRule("else", new Token(FTL_IF_ELSE_DIRECTIVE), true)); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("if", new Token(FTL_IF_DIRECTIVE_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("function", new Token(FTL_FUNCTION_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("function", new Token(FTL_FUNCTION_DIRECTIVE_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("list", new Token(FTL_LIST_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("list", new Token(FTL_LIST_DIRECTIVE_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("macro", new Token(FTL_MACRO_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("macro", new Token(FTL_MACRO_DIRECTIVE_END))); //$NON-NLS-1$
rules.add(new MacroInstanceRule(new Token(FTL_MACRO_INSTANCE_START)));
rules.add(new MacroInstanceRuleEnd(new Token(FTL_MACRO_INSTANCE_END)));
rules.add(new DirectiveRule("switch", new Token(FTL_SWITCH_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("switch", new Token(FTL_SWITCH_DIRECTIVE_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("case", new Token(FTL_CASE_DIRECTIVE_START))); //$NON-NLS-1$
rules.add(new DirectiveRule("default", new Token(FTL_CASE_DEFAULT_START))); //$NON-NLS-1$
rules.add(new DirectiveRule("assign", new Token(FTL_ASSIGN))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("assign", new Token(FTL_ASSIGN_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("local", new Token(FTL_LOCAL))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("local", new Token(FTL_LOCAL_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("global", new Token(FTL_GLOBAL))); //$NON-NLS-1$
rules.add(new DirectiveRuleEnd("global", new Token(FTL_GLOBAL_END))); //$NON-NLS-1$
rules.add(new DirectiveRule("include", new Token(FTL_INCLUDE))); //$NON-NLS-1$
rules.add(new DirectiveRule("import", new Token(FTL_IMPORT))); //$NON-NLS-1$
rules.add(new DirectiveRule("break", new Token(FTL_BREAK))); //$NON-NLS-1$
rules.add(new DirectiveRule("stop", new Token(FTL_STOP))); //$NON-NLS-1$
rules.add(new DirectiveRule("nested", new Token(FTL_NESTED))); //$NON-NLS-1$
rules.add(new DirectiveRule("return", new Token(FTL_RETURN))); //$NON-NLS-1$
rules.add(new GenericDirectiveRule(new Token(FTL_DIRECTIVE)));
rules.add(new GenericDirectiveRuleEnd(new Token(FTL_DIRECTIVE_END)));
rules.add(new InterpolationRule('$', new Token(FTL_INTERPOLATION)));
rules.add(new InterpolationRule('#', new Token(FTL_INTERPOLATION)));
rules.add(new XmlRule(new Token(XML_TAG)));
IPredicateRule[] result= new IPredicateRule[rules.size()];
rules.toArray(result);
setPredicateRules(result);
}
}