From 998397403a7e6b92535faf7ebd5f45952430b519 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Thu, 4 Sep 2014 12:49:53 +0400 Subject: [PATCH] full SVG support: xlink schema provided --- .../RelaxedHtmlFromRngElementDescriptor.java | 7 +- .../resources/standardSchemas/xlink.dtd | 66 +++++++++++++++++++ .../javaee/InternalResourceProvider.java | 1 + .../com/intellij/xml/HtmlXmlExtension.java | 13 +++- 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 xml/xml-psi-impl/resources/standardSchemas/xlink.dtd diff --git a/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java b/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java index e21db4785f8c..b287e6b50777 100644 --- a/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java +++ b/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java @@ -69,6 +69,9 @@ public class RelaxedHtmlFromRngElementDescriptor implements XmlElementDescriptor @Override public XmlAttributeDescriptor getAttributeDescriptor(XmlAttribute attribute) { + XmlAttributeDescriptor descriptor = myDelegate.getAttributeDescriptor(attribute); + if (descriptor != null) return descriptor; + return getAttributeDescriptor(attribute.getName(), attribute.getParent()); } @@ -94,9 +97,7 @@ public class RelaxedHtmlFromRngElementDescriptor implements XmlElementDescriptor @Override public XmlAttributeDescriptor getAttributeDescriptor(String attributeName, final XmlTag context) { - XmlAttributeDescriptor descriptor = myDelegate.getAttributeDescriptor(attributeName.toLowerCase(), context); - // some elements in HTML5 schema (e.g. SVG) are case sensitive - descriptor = descriptor == null ? myDelegate.getAttributeDescriptor(attributeName, context) : descriptor; + final XmlAttributeDescriptor descriptor = myDelegate.getAttributeDescriptor(attributeName.toLowerCase(), context); if (descriptor != null) return descriptor; return RelaxedHtmlFromSchemaElementDescriptor.getAttributeDescriptorFromFacelets(attributeName, context); diff --git a/xml/xml-psi-impl/resources/standardSchemas/xlink.dtd b/xml/xml-psi-impl/resources/standardSchemas/xlink.dtd new file mode 100644 index 000000000000..1a8f153e55db --- /dev/null +++ b/xml/xml-psi-impl/resources/standardSchemas/xlink.dtd @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xml/xml-psi-impl/src/com/intellij/javaee/InternalResourceProvider.java b/xml/xml-psi-impl/src/com/intellij/javaee/InternalResourceProvider.java index 673540ef38e8..38777922ee35 100644 --- a/xml/xml-psi-impl/src/com/intellij/javaee/InternalResourceProvider.java +++ b/xml/xml-psi-impl/src/com/intellij/javaee/InternalResourceProvider.java @@ -63,5 +63,6 @@ public class InternalResourceProvider implements StandardResourceProvider{ // svg and mathML impl.addIgnoredResource(HtmlUtil.MATH_ML_NAMESPACE); impl.addIgnoredResource(HtmlUtil.SVG_NAMESPACE); + impl.addInternalResource("http://www.w3.org/1999/xlink", "xlink.dtd"); } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/HtmlXmlExtension.java b/xml/xml-psi-impl/src/com/intellij/xml/HtmlXmlExtension.java index 4ece939ffac0..e54a93394242 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/HtmlXmlExtension.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/HtmlXmlExtension.java @@ -3,6 +3,7 @@ package com.intellij.xml; import com.intellij.ide.highlighter.HtmlFileType; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlDocument; +import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.Nullable; /** @@ -19,6 +20,16 @@ public class HtmlXmlExtension extends DefaultXmlExtension { @Nullable @Override public String[][] getNamespacesFromDocument(XmlDocument parent, boolean declarationsExist) { - return super.getNamespacesFromDocument(parent, false); + String[][] namespaces = super.getNamespacesFromDocument(parent, false); + if (namespaces == null || !HtmlUtil.isHtml5Document(parent)) return namespaces; + + for (String[] namespace : namespaces) { + if ("xlink".equals(namespace[0])) return namespaces; + } + + String[][] newNamespaces = new String[namespaces.length + 1][2]; + System.arraycopy(namespaces, 0, newNamespaces, 0, namespaces.length); + newNamespaces[namespaces.length] = new String[] {"xlink", "http://www.w3.org/1999/xlink"}; + return newNamespaces; } }