From 862c05f10026929a87e0c3ef5366dd7f237634ff Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 9 Jul 2010 17:57:01 +0400 Subject: [PATCH] support for |e and |c zen-coding filters, "|xsl" suffix should be filter but not generator --- .../src/META-INF/XmlPlugin.xml | 1 + .../template/zencoding/ZenCodingTemplate.java | 52 ++++++++++-- .../filters/CommentZenCodingFilter.java | 72 ++++++++++++++++ .../filters/EscapeZenCodingFilter.java | 46 ++++++++++ ...Generator.java => XslZenCodingFilter.java} | 60 +++++++------ .../zencoding/filters/ZenCodingFilter.java | 66 ++++++++++++++ .../zencoding/filters/ZenCodingGenerator.java | 2 +- .../zencoding/nodes/GenerationNode.java | 85 +++++++++++++++---- 8 files changed, 330 insertions(+), 54 deletions(-) create mode 100644 xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/CommentZenCodingFilter.java create mode 100644 xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/EscapeZenCodingFilter.java rename xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/{XslZenCodingGenerator.java => XslZenCodingFilter.java} (58%) create mode 100644 xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingFilter.java diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index 8185e9468794..084e08c7287d 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -41,6 +41,7 @@ interface="com.intellij.javaee.ImplicitNamespaceDescriptorProvider"/> + diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java index eeb54b16361d..5bfa8d865263 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.template.CustomLiveTemplate; import com.intellij.codeInsight.template.CustomTemplateCallback; import com.intellij.codeInsight.template.LiveTemplateBuilder; import com.intellij.codeInsight.template.impl.TemplateImpl; +import com.intellij.codeInsight.template.zencoding.filters.ZenCodingFilter; import com.intellij.codeInsight.template.zencoding.filters.ZenCodingGenerator; import com.intellij.codeInsight.template.zencoding.nodes.*; import com.intellij.codeInsight.template.zencoding.tokens.*; @@ -38,6 +39,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -70,11 +72,11 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { @Nullable private List lex(@NotNull String text, @NotNull CustomTemplateCallback callback) { - String filter = null; + String filterString = null; int filterDelim = text.indexOf('|'); if (filterDelim >= 0 && filterDelim < text.length() - 1) { - filter = text.substring(filterDelim + 1); + filterString = text.substring(filterDelim + 1); text = text.substring(0, filterDelim); } @@ -136,8 +138,11 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { // at least MarkerToken assert result.size() > 0; - if (filter != null) { - result.add(result.size() - 1, new FilterToken(filter)); + if (filterString != null) { + String[] filterSuffixes = filterString.split("\\|"); + for (String filterSuffix : filterSuffixes) { + result.add(result.size() - 1, new FilterToken(filterSuffix)); + } } return result; } @@ -216,6 +221,31 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { return defaultGenerator; } + private static List getFilters(ZenCodingNode node, PsiElement context) { + List result = new ArrayList(); + + while (node instanceof FilterNode) { + FilterNode filterNode = (FilterNode)node; + String filterSuffix = filterNode.getFilter(); + for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { + if (filter.isMyContext(context) && filter.getSuffix().equals(filterSuffix)) { + result.add(filter); + } + } + node = filterNode.getNode(); + } + + for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { + if (filter.isMyContext(context) && filter.isAppliedByDefault(context)) { + result.add(filter); + } + } + + Collections.reverse(result); + return result; + } + + private void expand(String key, @NotNull CustomTemplateCallback callback, String surroundedText) { @@ -231,14 +261,16 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { callback.deleteTemplateKey(key); } - ZenCodingGenerator generator = findApplicableGenerator(node, callback.getContext()); + PsiElement context = callback.getContext(); + ZenCodingGenerator generator = findApplicableGenerator(node, context); + List filters = getFilters(node, context); List genNodes = node.expand(-1); LiveTemplateBuilder builder = new LiveTemplateBuilder(); int end = -1; for (int i = 0, genNodesSize = genNodes.size(); i < genNodesSize; i++) { GenerationNode genNode = genNodes.get(i); - TemplateImpl template = genNode.generate(callback, surroundedText, generator); + TemplateImpl template = genNode.generate(callback, surroundedText, generator, filters); int e = builder.insertTemplate(builder.length(), template, null); if (end == -1 && end < builder.length()) { end = e; @@ -343,11 +375,13 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { return null; } ZenCodingToken filter = nextToken(); - if (filter instanceof FilterToken) { + ZenCodingNode result = add; + while (filter instanceof FilterToken) { + result = new FilterNode(result, ((FilterToken)filter).getSuffix()); myIndex++; - return new FilterNode(add, ((FilterToken)filter).getSuffix()); + filter = nextToken(); } - return add; + return result; } @Nullable diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/CommentZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/CommentZenCodingFilter.java new file mode 100644 index 000000000000..51bf629fada7 --- /dev/null +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/CommentZenCodingFilter.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.template.zencoding.filters; + +import com.intellij.codeInsight.template.zencoding.tokens.TemplateToken; +import com.intellij.codeInsight.template.zencoding.tokens.XmlTemplateToken; +import com.intellij.lang.xml.XMLLanguage; +import com.intellij.psi.PsiElement; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Eugene.Kudelevsky + */ +public class CommentZenCodingFilter extends ZenCodingFilter { + private static String buildCommentString(@Nullable String classAttr, @Nullable String idAttr) { + StringBuilder builder = new StringBuilder(); + if (idAttr != null) { + builder.append('#').append(idAttr); + } + if (classAttr != null) { + builder.append('.').append(classAttr); + } + return builder.toString(); + } + + @NotNull + @Override + public String filterText(@NotNull String text, @NotNull TemplateToken token) { + if (token instanceof XmlTemplateToken) { + XmlDocument document = ((XmlTemplateToken)token).getFile().getDocument(); + if (document != null) { + XmlTag tag = document.getRootTag(); + if (tag != null) { + String classAttr = tag.getAttributeValue("class"); + String idAttr = tag.getAttributeValue("id"); + if (classAttr != null || idAttr != null) { + String commentString = buildCommentString(classAttr, idAttr); + return "\n" + text + "\n"; + } + } + } + } + return text; + } + + @NotNull + @Override + public String getSuffix() { + return "c"; + } + + @Override + public boolean isMyContext(@NotNull PsiElement context) { + return context.getLanguage() instanceof XMLLanguage; + } +} diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/EscapeZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/EscapeZenCodingFilter.java new file mode 100644 index 000000000000..8c3abe8f0aa5 --- /dev/null +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/EscapeZenCodingFilter.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.template.zencoding.filters; + +import com.intellij.codeInsight.template.zencoding.tokens.TemplateToken; +import com.intellij.lang.xml.XMLLanguage; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +/** + * @author Eugene.Kudelevsky + */ +public class EscapeZenCodingFilter extends ZenCodingFilter { + @NotNull + @Override + public String filterText(@NotNull String s, @NotNull TemplateToken token) { + s = s.replace("&", "&"); + s = s.replace("<", "<"); + s = s.replace(">", ">"); + return s; + } + + @NotNull + @Override + public String getSuffix() { + return "e"; + } + + @Override + public boolean isMyContext(@NotNull PsiElement context) { + return context.getLanguage() instanceof XMLLanguage; + } +} diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingGenerator.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingFilter.java similarity index 58% rename from xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingGenerator.java rename to xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingFilter.java index 3e4c6d413e0f..573420c614cd 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingGenerator.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/XslZenCodingFilter.java @@ -15,46 +15,57 @@ */ package com.intellij.codeInsight.template.zencoding.filters; +import com.intellij.codeInsight.template.zencoding.nodes.GenerationNode; +import com.intellij.codeInsight.template.zencoding.tokens.TemplateToken; +import com.intellij.codeInsight.template.zencoding.tokens.XmlTemplateToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlTag; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import java.util.List; - /** * @author Eugene.Kudelevsky */ -public class XslZenCodingGenerator extends XmlZenCodingGenerator { +public class XslZenCodingFilter extends ZenCodingFilter { private final XmlZenCodingGenerator myDelegate = new XmlZenCodingGeneratorImpl(); @NonNls private static final String SELECT_ATTR_NAME = "select"; + @NotNull @Override - public String toString(@NotNull final XmlTag tag, - @NotNull List> attribute2Value, - final boolean hasChildren, - @NotNull PsiElement context) { - for (Pair pair : attribute2Value) { - if (SELECT_ATTR_NAME.equals(pair.first)) { - return myDelegate.toString(tag, attribute2Value, hasChildren, context); - } - } - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - if (isOurTag(tag, hasChildren)) { - XmlAttribute attribute = tag.getAttribute(SELECT_ATTR_NAME); - if (attribute != null) { - attribute.delete(); + public GenerationNode filterNode(@NotNull final GenerationNode node) { + TemplateToken token = node.getTemplateToken(); + if (token instanceof XmlTemplateToken) { + XmlTemplateToken xmlToken = (XmlTemplateToken)token; + XmlDocument document = xmlToken.getFile().getDocument(); + if (document != null) { + final XmlTag tag = document.getRootTag(); + if (tag != null) { + for (Pair pair : xmlToken.getAttribute2Value()) { + if (SELECT_ATTR_NAME.equals(pair.first)) { + return node; + } } + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + if (isOurTag(tag, node.getChildren().size() > 0)) { + XmlAttribute attribute = tag.getAttribute(SELECT_ATTR_NAME); + if (attribute != null) { + attribute.delete(); + } + } + } + }); + return node; } } - }); - return myDelegate.toString(tag, attribute2Value, hasChildren, context); + } + return node; } private static boolean isOurTag(XmlTag tag, boolean hasChildren) { @@ -65,17 +76,12 @@ public class XslZenCodingGenerator extends XmlZenCodingGenerator { return false; } - @NotNull - @Override - public String buildAttributesString(@NotNull List> attribute2value, boolean hasChildren, int numberInIteration) { - return myDelegate.buildAttributesString(attribute2value, hasChildren, numberInIteration); - } - @Override public boolean isMyContext(@NotNull PsiElement context) { return myDelegate.isMyContext(context); } + @NotNull @Override public String getSuffix() { return "xsl"; diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingFilter.java new file mode 100644 index 000000000000..bb4e417dbd67 --- /dev/null +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingFilter.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.template.zencoding.filters; + +import com.intellij.codeInsight.template.zencoding.nodes.GenerationNode; +import com.intellij.codeInsight.template.zencoding.tokens.TemplateToken; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Eugene.Kudelevsky + */ +public abstract class ZenCodingFilter { + public static final ExtensionPointName EP_NAME = + new ExtensionPointName("com.intellij.xml.zenCodingFilter"); + + private static final ZenCodingFilter[] ourStandartFilters = new ZenCodingFilter[]{ + new XslZenCodingFilter(), + new CommentZenCodingFilter(), + new EscapeZenCodingFilter() + }; + + @NotNull + public String filterText(@NotNull String text, @NotNull TemplateToken token) { + return text; + } + + @NotNull + public GenerationNode filterNode(@NotNull GenerationNode node) { + return node; + } + + @NotNull + public abstract String getSuffix(); + + public abstract boolean isMyContext(@NotNull PsiElement context); + + public boolean isAppliedByDefault(@NotNull PsiElement context) { + return false; + } + + public static List getInstances() { + List generators = new ArrayList(); + Collections.addAll(generators, ourStandartFilters); + Collections.addAll(generators, EP_NAME.getExtensions()); + return generators; + } +} diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingGenerator.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingGenerator.java index a6d7cdc881a8..867558b428eb 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingGenerator.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/filters/ZenCodingGenerator.java @@ -43,7 +43,7 @@ public abstract class ZenCodingGenerator { public static List getInstances() { List generators = new ArrayList(); - Collections.addAll(generators, new XslZenCodingGenerator(), XmlZenCodingGeneratorImpl.INSTANCE); + Collections.addAll(generators, XmlZenCodingGeneratorImpl.INSTANCE); Collections.addAll(generators, EP_NAME.getExtensions()); return generators; } diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/nodes/GenerationNode.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/nodes/GenerationNode.java index 875c26337e70..0cca2ddec03e 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/nodes/GenerationNode.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/nodes/GenerationNode.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.template.zencoding.ZenCodingTemplate; import com.intellij.codeInsight.template.zencoding.ZenCodingUtil; import com.intellij.codeInsight.template.zencoding.filters.XmlZenCodingGenerator; import com.intellij.codeInsight.template.zencoding.filters.XmlZenCodingGeneratorImpl; +import com.intellij.codeInsight.template.zencoding.filters.ZenCodingFilter; import com.intellij.codeInsight.template.zencoding.filters.ZenCodingGenerator; import com.intellij.codeInsight.template.zencoding.tokens.TemplateToken; import com.intellij.codeInsight.template.zencoding.tokens.XmlTemplateToken; @@ -34,6 +35,8 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.XmlElementFactory; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.LocalTimeCounter; @@ -103,17 +106,45 @@ public class GenerationNode { @NotNull public TemplateImpl generate(@NotNull CustomTemplateCallback callback, @Nullable String surroundedText, - @Nullable ZenCodingGenerator generator) { + @Nullable ZenCodingGenerator generator, + @NotNull Collection filters) { + GenerationNode generationNode = this; + for (ZenCodingFilter filter : filters) { + generationNode = filter.filterNode(generationNode); + } + + if (generationNode != this) { + return generationNode.generate(callback, surroundedText, generator, Collections.emptyList()); + } + LiveTemplateBuilder builder = new LiveTemplateBuilder(); int end = -1; boolean hasChildren = myChildren.size() > 0; String txt = !hasChildren && myToInsertChildren ? surroundedText : null; - TemplateImpl parentTemplate = myTemplateToken instanceof XmlTemplateToken ? - invokeXmlTemplate((XmlTemplateToken)myTemplateToken, callback, myNumberInIteration, generator, txt, - hasChildren) : - invokeTemplate(myTemplateToken, hasChildren, callback, generator, txt); + TemplateImpl parentTemplate; + Map predefinedValues; + if (myTemplateToken instanceof XmlTemplateToken) { + XmlTemplateToken xmlTemplateToken = (XmlTemplateToken)myTemplateToken; + List> attr2value = new ArrayList>(xmlTemplateToken.getAttribute2Value()); + parentTemplate = invokeXmlTemplate(xmlTemplateToken, callback, myNumberInIteration, generator, + hasChildren, attr2value); + predefinedValues = buildPredefinedValues(attr2value, myNumberInIteration, (XmlZenCodingGenerator)generator, hasChildren); + } + else { + parentTemplate = invokeTemplate(myTemplateToken, hasChildren, callback, generator); + predefinedValues = null; + } + + String s = parentTemplate.getString(); + for (ZenCodingFilter filter : filters) { + s = filter.filterText(s, myTemplateToken); + } + parentTemplate = parentTemplate.copy(); + parentTemplate.setString(s); + + parentTemplate = expandTemplate(parentTemplate, predefinedValues, txt); int offset = builder.insertTemplate(0, parentTemplate, null); int newOffset = gotoChild(callback.getProject(), builder.getText(), offset, 0, builder.length()); @@ -125,21 +156,41 @@ public class GenerationNode { end = offset; } LiveTemplateBuilder.Marker marker = offset < builder.length() ? builder.createMarker(offset) : null; + + CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(callback.getProject()); + String tabStr; + if (callback.isInInjectedFragment()) { + tabStr = ""; + } + else if (settings.useTabCharacter(callback.getFileType())) { + tabStr = "\t"; + } + else { + StringBuilder tab = new StringBuilder(); + int tabSize = settings.getTabSize(callback.getFileType()); + while (tabSize-- > 0) { + tab.append(' '); + } + tabStr = tab.toString(); + } + for (int i = 0, myChildrenSize = myChildren.size(); i < myChildrenSize; i++) { GenerationNode child = myChildren.get(i); - TemplateImpl childTemplate = child.generate(callback, surroundedText, generator); + TemplateImpl childTemplate = child.generate(callback, surroundedText, generator, filters); boolean blockTag = child.isBlockTag(); if (blockTag && !isNewLineBefore(builder.getText(), offset)) { - builder.insertText(offset++, "\n"); + builder.insertText(offset, "\n" + tabStr); + offset += tabStr.length() + 1; } int e = builder.insertTemplate(offset, childTemplate, null); offset = marker != null ? marker.getEndOffset() : builder.length(); if (blockTag && !isNewLineAfter(builder.getText(), offset)) { - builder.insertText(offset++, "\n"); + builder.insertText(offset, "\n" + tabStr); + offset += tabStr.length() + 1; } if (end == -1 && e < offset) { @@ -155,8 +206,7 @@ public class GenerationNode { private static TemplateImpl invokeTemplate(TemplateToken token, boolean hasChildren, final CustomTemplateCallback callback, - @Nullable ZenCodingGenerator generator, - String surroundedText) { + @Nullable ZenCodingGenerator generator) { TemplateImpl template = token.getTemplate(); if (generator != null) { assert template != null; @@ -166,22 +216,21 @@ public class GenerationNode { removeVariablesWhichHasNoSegment(template); } - return expandTemplate(template, null, surroundedText); + return template; } private static TemplateImpl invokeXmlTemplate(XmlTemplateToken token, CustomTemplateCallback callback, final int numberInIteration, @Nullable ZenCodingGenerator generator, - String surroundedText, - final boolean hasChildren) { + final boolean hasChildren, + final List> attr2value) { assert generator == null || generator instanceof XmlZenCodingGenerator : "The generator cannot process XmlTemplateToken because it doesn't inherit XmlZenCodingGenerator"; TemplateImpl template = token.getTemplate(); assert template != null; - final List> attr2value = new ArrayList>(token.getAttribute2Value()); final XmlFile xmlFile = token.getFile(); XmlDocument document = xmlFile.getDocument(); if (document != null) { @@ -199,9 +248,7 @@ public class GenerationNode { template = template.copy(); template.setString(s); removeVariablesWhichHasNoSegment(template); - Map predefinedValues = - buildPredefinedValues(attr2value, numberInIteration, (XmlZenCodingGenerator)generator, hasChildren); - return expandTemplate(template, predefinedValues, surroundedText); + return template; } @NotNull @@ -333,4 +380,8 @@ public class GenerationNode { } return i == text.length(); } + + public TemplateToken getTemplateToken() { + return myTemplateToken; + } }