diff --git a/xml/impl/resources/liveTemplates/zen_html.xml b/xml/impl/resources/liveTemplates/zen_html.xml
index ebdbac5c70d5..1c9356ab4c37 100644
--- a/xml/impl/resources/liveTemplates/zen_html.xml
+++ b/xml/impl/resources/liveTemplates/zen_html.xml
@@ -149,7 +149,7 @@
-
+
@@ -163,7 +163,7 @@
-
+
@@ -226,7 +226,7 @@
-
+
@@ -236,7 +236,7 @@
-
+
@@ -253,9 +253,9 @@
-
+ value="<link rel="shortcut icon" href="$FAVICON$" type="image/x-icon">">
@@ -272,9 +272,9 @@
-
+ value="<link rel="alternate" href="$RSS$" type="application/rss+xml" title="RSS">">
@@ -282,9 +282,9 @@
-
+ value="<link rel="alternate" href="$ATOM$" type="application/atom+xml" title="Atom">">
@@ -327,14 +327,11 @@
-
+ toShortenFQNames="true" value="<meta name="viewport" content="width=$WIDTH$, initial-scale=$INITIAL_SCALE$">">
-
-
-
@@ -390,8 +387,8 @@
-
+
@@ -401,8 +398,8 @@
-
+
@@ -412,8 +409,8 @@
-
+
@@ -424,8 +421,8 @@
-
+
@@ -571,8 +568,8 @@
-
+
@@ -582,8 +579,8 @@
-
+
@@ -676,8 +673,9 @@
-
+
+
@@ -1086,7 +1084,7 @@
-
+
@@ -1649,8 +1647,8 @@
-
+
@@ -1660,8 +1658,8 @@
-
+
@@ -1671,8 +1669,8 @@
-
+
@@ -1683,8 +1681,8 @@
-
+
diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/XmlEmmetParser.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/XmlEmmetParser.java
index 78b06c0cab24..edc906e7740a 100644
--- a/xml/impl/src/com/intellij/codeInsight/template/emmet/XmlEmmetParser.java
+++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/XmlEmmetParser.java
@@ -98,15 +98,15 @@ public class XmlEmmetParser extends EmmetParser {
@Nullable
private String parseAttributeName() {
- String name = "";
+ StringBuilder name = new StringBuilder();
ZenCodingToken token = getToken();
while (token != null) {
if ((token instanceof IdentifierToken)) {
- name += ((IdentifierToken)token).getText();
+ name.append(((IdentifierToken)token).getText());
}
else if (token instanceof OperationToken &&
(((OperationToken)token).getSign() == '+' || ((OperationToken)token).getSign() == '-')) {
- name += ((OperationToken)token).getSign();
+ name.append(((OperationToken)token).getSign());
}
else {
break;
@@ -115,7 +115,7 @@ public class XmlEmmetParser extends EmmetParser {
token = getToken();
}
- if (name.isEmpty()) {
+ if (name.length() == 0) {
return null;
}
@@ -130,7 +130,7 @@ public class XmlEmmetParser extends EmmetParser {
}
@NotNull
- private static String getAttributeValueByToken(@Nullable ZenCodingToken token) {
+ private static String getAttributeValueByToken(@Nullable ZenCodingToken token, boolean allowOperations) {
if (token == null) {
return "";
}
@@ -147,6 +147,9 @@ public class XmlEmmetParser extends EmmetParser {
else if (token instanceof NumberToken) {
return Integer.toString(((NumberToken)token).getNumber());
}
+ else if (allowOperations && token instanceof OperationToken) {
+ return String.valueOf(((OperationToken)token).getSign());
+ }
else if (token == ZenCodingTokens.DOT || token == ZenCodingTokens.SHARP) {
return token.toString();
}
@@ -188,6 +191,12 @@ public class XmlEmmetParser extends EmmetParser {
return null;
}
+ ZenCodingToken currentToken = getToken();
+ if (currentToken instanceof IdentifierToken && "/".equals(((IdentifierToken)currentToken).getText())) {
+ advance();
+ forceSingleTag = true;
+ }
+
TemplateToken templateToken = new TemplateToken(templateKey, attributes, forceSingleTag);
if (!setTemplate(templateToken, template)) {
return null;
@@ -329,7 +338,7 @@ public class XmlEmmetParser extends EmmetParser {
final String name = token == ZenCodingTokens.DOT ? getClassAttributeName() : HtmlUtil.ID_ATTRIBUTE_NAME;
advance();
token = getToken();
- final String value = getAttributeValueByToken(token);
+ final String value = getAttributeValueByToken(token, false);
if (!value.isEmpty()) {
advance();
}
@@ -402,7 +411,7 @@ public class XmlEmmetParser extends EmmetParser {
String value;
do {
token = getToken();
- value = getAttributeValueByToken(token);
+ value = getAttributeValueByToken(token, true);
attrValueBuilder.append(value);
if (!isEndOfAttribute(token)) {
advance();