Package org.kacprzak.eclipse.django_editor.editors.dj

Source Code of org.kacprzak.eclipse.django_editor.editors.dj.DjangoVariableRule

package org.kacprzak.eclipse.django_editor.editors.dj;

import java.util.HashMap;
import java.util.Map;

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.IWordDetector;
import org.eclipse.jface.text.rules.Token;
import org.kacprzak.eclipse.django_editor.editors.ColorProvider;
import org.kacprzak.eclipse.django_editor.editors.GenericWordDetector;
import org.kacprzak.eclipse.django_editor.preferences.IDjangoPrefs;

/**
* @author Zbigniew Kacprzak
*/
public class DjangoVariableRule implements IRule, IDjangoSyntax {

    protected IWordDetector     wordDetector;
    protected IToken         defaultToken;
    protected IToken         delimiterToken;
    protected IToken        userFilterToken;
    protected IToken        filterToken;
    protected Map<String, IToken>   ruleWords = new HashMap<String, IToken>();
    private StringBuffer       strBuffer = new StringBuffer();

  public DjangoVariableRule(ColorProvider colorProvider) {
    wordDetector   = new GenericWordDetector();
        defaultToken   = colorProvider.getToken(IDjangoPrefs.DJVARIABLE_COLOR, IDjangoPrefs.DJVARIABLE_STYLE);
        delimiterToken   = colorProvider.getToken(IDjangoPrefs.DJDELIMITER_COLOR, IDjangoPrefs.DJDELIMITER_STYLE);
        filterToken    = colorProvider.getToken(IDjangoPrefs.DJFILTER_COLOR, IDjangoPrefs.DJFILTER_STYLE);
        userFilterToken = colorProvider.getToken(IDjangoPrefs.DJUSRFILTER_COLOR, IDjangoPrefs.DJUSRFILTER_STYLE);

        setKeywords();
  }

    public void setKeywords() {
    for(String word: IDjangoSyntax.FILTERS) {
      ruleWords.put(word, filterToken);
    }
    }

    private boolean isTagDelimiterStart(char c) {
      return c == '{' || c == '}';
    }

    private boolean prevWasFilterDelimiter = false;
    private boolean insideDjangoTag = false;

  @Override
  public IToken evaluate(ICharacterScanner scanner) {
        char ch = (char) scanner.read();
        if (isTagDelimiterStart(ch)) {
            char nch = (char) scanner.read();
            if (ch == '{' && nch == '{') {
              insideDjangoTag = true;
              return delimiterToken;
            } else if (ch == '}' && nch == '}') {
              insideDjangoTag = false;
              prevWasFilterDelimiter = false;
              return delimiterToken;
            }
            scanner.unread();

        } else if (insideDjangoTag && ch == '|') {
          prevWasFilterDelimiter = true;
       
        } else if ( insideDjangoTag && wordDetector.isWordStart(ch)) {
          strBuffer = new StringBuffer();
            do {
              strBuffer.append(ch);
                ch = (char) scanner.read();
            } while ( ((int) ch) != ICharacterScanner.EOF && wordDetector.isWordPart(ch) );
            scanner.unread();

            String str = strBuffer.toString();
            IToken token= (IToken) ruleWords.get(str);
            if (token != null && prevWasFilterDelimiter) {
                return token;
            }

            if (prevWasFilterDelimiter)
              return userFilterToken;

            prevWasFilterDelimiter = false;
            return defaultToken;

        } else {
          prevWasFilterDelimiter = false;
        }

        scanner.unread();
        return Token.UNDEFINED;
  }
}
TOP

Related Classes of org.kacprzak.eclipse.django_editor.editors.dj.DjangoVariableRule

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.