/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.django_templates.comon.parsing; import java.io.IOException; import org.python.pydev.django_templates.common.parsing.lexer.DjangoTemplatesTokens; import beaver.Symbol; import com.aptana.editor.common.parsing.CompositeParser; import com.aptana.editor.common.parsing.CompositeParserScanner; import com.aptana.parsing.IParseState; import com.aptana.parsing.WorkingParseResult; import com.aptana.parsing.ast.IParseNode; import com.aptana.parsing.ast.ParseNode; import com.aptana.parsing.ast.ParseRootNode; public abstract class DjParser extends CompositeParser { private String language; public DjParser(CompositeParserScanner defaultScanner, String primaryParserLanguage, String language) { super(defaultScanner, primaryParserLanguage); this.language = language; } @Override protected IParseNode processEmbeddedlanguage(IParseState parseState, WorkingParseResult working) throws Exception { String source = parseState.getSource(); int startingOffset = parseState.getStartingOffset(); IParseNode root = new ParseRootNode(new ParseNode[0], startingOffset, startingOffset + source.length() - 1) { public String getLanguage() { return language; } }; advance(); short id = getCurrentSymbol().getId(); while (id != DjangoTemplatesTokens.EOF) { // only cares about django templates tokens switch (id) { case DjangoTemplatesTokens.DJ_START: processDjBlock(root); break; } advance(); id = getCurrentSymbol().getId(); } return root; } private void processDjBlock(IParseNode root) throws IOException, Exception { Symbol startTag = getCurrentSymbol(); advance(); // finds the entire django templates block int start = getCurrentSymbol().getStart(); int end = start; short id = getCurrentSymbol().getId(); while (id != DjangoTemplatesTokens.DJ_END && id != DjangoTemplatesTokens.EOF) { end = getCurrentSymbol().getEnd(); advance(); id = getCurrentSymbol().getId(); } ParseNode parseNode = new ParseNode() { public String getLanguage() { return language; } }; parseNode.setLocation(start, end); Symbol endTag = getCurrentSymbol(); DjangoTemplatesNode node = new DjangoTemplatesNode(language, parseNode, startTag.value.toString(), endTag.value.toString()); node.setLocation(startTag.getStart(), endTag.getEnd()); root.addChild(node); } }