do not accept incorrect XML names; accept template names containing operation charact...
[idea/community.git] / xml / impl / src / com / intellij / codeInsight / template / XmlZenCodingTemplate.java
index 4734d0c1ccdaade00c13ee513c8b70c61a131377..82d12a2c48ebf46e1cf0b952594f7d8eb897dc48 100644 (file)
@@ -29,6 +29,7 @@ import com.intellij.psi.xml.XmlToken;
 import com.intellij.psi.xml.XmlTokenType;
 import com.intellij.util.containers.HashMap;
 import com.intellij.util.containers.HashSet;
+import com.sun.org.apache.xml.internal.utils.XML11Char;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -85,10 +86,6 @@ public class XmlZenCodingTemplate implements CustomLiveTemplate {
     }
   }
 
-  private static boolean isTemplateKeyPart(char c) {
-    return !Character.isWhitespace(c) && OPERATIONS.indexOf(c) < 0;
-  }
-
   private static int parseNonNegativeInt(@NotNull String s) {
     try {
       return Integer.parseInt(s);
@@ -200,7 +197,7 @@ public class XmlZenCodingTemplate implements CustomLiveTemplate {
     List<MyToken> result = new ArrayList<MyToken>();
     for (int i = 0, n = text.length(); i < n; i++) {
       char c = text.charAt(i);
-      if (i == n - 1 || OPERATIONS.indexOf(c) >= 0) {
+      if (i == n - 1 || (i < n - 2 && OPERATIONS.indexOf(c) >= 0)) {
         String key = templateKeyBuilder.toString();
         templateKeyBuilder = new StringBuilder();
         int num = parseNonNegativeInt(key);
@@ -212,7 +209,7 @@ public class XmlZenCodingTemplate implements CustomLiveTemplate {
             return null;
           }
           String prefix = getPrefix(key);
-          if (!callback.isLiveTemplateApplicable(prefix) && prefix.indexOf('<') >= 0) {
+          if (!callback.isLiveTemplateApplicable(prefix) && !XML11Char.isXML11ValidQName(prefix)) {
             return null;
           }
           MyTemplateToken token = parseSelectors(key);
@@ -223,7 +220,7 @@ public class XmlZenCodingTemplate implements CustomLiveTemplate {
         }
         result.add(i < n - 1 ? new MyOperationToken(c) : new MyMarkerToken());
       }
-      else if (isTemplateKeyPart(c)) {
+      else if (!Character.isWhitespace(c)) {
         templateKeyBuilder.append(c);
       }
       else {