diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java index 3dcebcb7127c..d09e0fbeaba3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java @@ -222,6 +222,35 @@ public class CustomTemplateCallback { myBuilder.insertText(offset, text); } + public void insertNewLine() { + myBuilder.insertText(myOffset, "\n"); + myOffset++; + } + + public boolean newLineBefore() { + int i = myOffset - 1; + CharSequence text = myBuilder.getText(); + while (i >= 0 && Character.isWhitespace(text.charAt(i))) { + if (text.charAt(i) == '\n') { + return true; + } + i--; + } + return i < 0; + } + + public boolean newLineAfter() { + int i = myOffset; + CharSequence text = myBuilder.getText(); + while (i < text.length() && Character.isWhitespace(text.charAt(i))) { + if (text.charAt(i) == '\n') { + return true; + } + i++; + } + return i == text.length(); + } + public void deleteTemplateKey(String key) { int caretAt = myEditor.getCaretModel().getOffset(); myEditor.getDocument().deleteString(caretAt - key.length(), caretAt); diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java index 3600106a09cf..21274dd639f9 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java @@ -29,6 +29,7 @@ import com.intellij.psi.xml.XmlTokenType; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import com.intellij.util.containers.IntArrayList; +import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -310,27 +311,38 @@ class XmlZenCodingInterpreter { if (token instanceof XmlTemplateToken && token.getTemplate() != null) { XmlTemplateToken xmlTemplateToken = (XmlTemplateToken)token; List> attr2value = new ArrayList>(xmlTemplateToken.getAttribute2Value()); - if (attr2value.size() > 0 || XmlZenCodingTemplate.isTrueXml(callback)) { - TemplateImpl modifiedTemplate = token.getTemplate().copy(); - XmlTag tag = xmlTemplateToken.getTag(); - if (tag != null) { - for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { - Pair pair = iterator.next(); - if (tag.getAttribute(pair.first) != null) { - tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration)); - iterator.remove(); - } + TemplateImpl modifiedTemplate = token.getTemplate().copy(); + XmlTag tag = xmlTemplateToken.getTag(); + if (tag != null) { + for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { + Pair pair = iterator.next(); + if (tag.getAttribute(pair.first) != null) { + tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration)); + iterator.remove(); } - String s = filterXml(tag, callback, filter); - assert s != null; - modifiedTemplate.setString(s); - removeVariablesWhichHasNoSegment(modifiedTemplate); - Map predefinedValues = buildPredefinedValues(attr2value, numberInIteration, callback); - callback.expandTemplate(modifiedTemplate, predefinedValues); - return; } + String s = filterXml(tag, callback, filter); + assert s != null; + if (HtmlUtil.isHtmlBlockTagL(tag.getName())) { + boolean newLineBefore = callback.newLineBefore(); + boolean newLineAfter = callback.newLineAfter(); + if (!newLineBefore || !newLineAfter) { + StringBuilder builder = new StringBuilder(); + if (!newLineBefore) { + builder.append('\n'); + } + builder.append(s); + if (!newLineAfter) { + builder.append('\n'); + } + s = builder.toString(); + } + } + modifiedTemplate.setString(s); + removeVariablesWhichHasNoSegment(modifiedTemplate); + Map predefinedValues = buildPredefinedValues(attr2value, numberInIteration, callback); + callback.expandTemplate(modifiedTemplate, predefinedValues); } - callback.expandTemplate(token.getTemplate(), null); } else { // for CSS