From a7ce9ad0aefdc76ba7199b1bd1952ec04cafc2df Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Aug 2012 16:10:29 +0400 Subject: [PATCH] IDEA-89266 fix storing of default html doctype --- .../src/META-INF/XmlPlugin.xml | 1 + .../javaee/DefaultHtmlDoctypeConverter.java | 92 +++++++++++++++++++ .../javaee/ExternalResourceManagerImpl.java | 22 ++++- .../com/intellij/xml/Html5SchemaProvider.java | 11 ++- 4 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 xml/impl/src/com/intellij/javaee/DefaultHtmlDoctypeConverter.java diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index 6340ee08e1d9..a8236a81ab31 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -106,6 +106,7 @@ + diff --git a/xml/impl/src/com/intellij/javaee/DefaultHtmlDoctypeConverter.java b/xml/impl/src/com/intellij/javaee/DefaultHtmlDoctypeConverter.java new file mode 100644 index 000000000000..7a5c0244b5c6 --- /dev/null +++ b/xml/impl/src/com/intellij/javaee/DefaultHtmlDoctypeConverter.java @@ -0,0 +1,92 @@ +package com.intellij.javaee; + +import com.intellij.conversion.*; +import com.intellij.openapi.util.io.FileUtil; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.Collection; +import java.util.Collections; + +/** + * @author Eugene.Kudelevsky + */ +public class DefaultHtmlDoctypeConverter extends ConverterProvider { + protected DefaultHtmlDoctypeConverter() { + super("default-html-language-level"); + } + + @NotNull + @Override + public String getConversionDescription() { + return "Default HTML language level setting will be updated"; + } + + @NotNull + @Override + public ProjectConverter createConverter(@NotNull ConversionContext context) { + return new MyConverter(context); + } + + private static class MyConverter extends ProjectConverter { + private final ConversionContext myContext; + + private MyConverter(@NotNull ConversionContext context) { + myContext = context; + } + + @Override + public boolean isConversionNeeded() { + return getElementToUpdate() != null; + } + + @Override + public void preProcessingFinished() throws CannotConvertException { + final Element defaultHtmlDoctype = getElementToUpdate(); + + if (defaultHtmlDoctype != null) { + defaultHtmlDoctype.setText(ExternalResourceManagerImpl.HTML5_DOCTYPE_ELEMENT); + } + } + + @Nullable + private Element getElementToUpdate() { + final ComponentManagerSettings settings = myContext.getProjectRootManagerSettings(); + if (settings == null) { + return null; + } + + final Element root = settings.getComponentElement("ProjectResources"); + if (root == null) { + return null; + } + + Element defaultHtmlDoctype = root.getChild("default-html-language-level"); + if (defaultHtmlDoctype == null) { + return null; + } + + String value = defaultHtmlDoctype.getTextTrim(); + value = value != null ? myContext.expandPath(value) : null; + if (value == null) { + return null; + } + + if (!FileUtil.toSystemIndependentName(value).endsWith("idea.jar!/resources/html5-schema/html5.rnc")) { + return null; + } + return defaultHtmlDoctype; + } + + @Override + public Collection getAdditionalAffectedFiles() { + final ComponentManagerSettings settings = myContext.getProjectRootManagerSettings(); + final File file = settings != null ? settings.getFile() : null; + return file != null + ? Collections.singletonList(file) + : Collections.emptyList(); + } + } +} diff --git a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java index be0783628e78..32d1a1be74ec 100644 --- a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java +++ b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java @@ -101,10 +101,12 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple @NonNls private static final String URL_ATTR = "url"; @NonNls private static final String LOCATION_ATTR = "location"; @NonNls private static final String IGNORED_RESOURCE_ELEMENT = "ignored-resource"; - @NonNls private static final String HTML_DEFAULT_DOCTYPE_ELEMENT = "default-html-doctype"; + @NonNls private static final String HTML_DEFAULT_DOCTYPE_ELEMENT = "default-html-language-level"; private static final String DEFAULT_VERSION = null; @NonNls public static final String STANDARD_SCHEMAS = "/standardSchemas/"; + public static String HTML5_DOCTYPE_ELEMENT = "HTML5"; + public ExternalResourceManagerImpl(PathMacrosImpl pathMacros) { myPathMacros = pathMacros; } @@ -361,7 +363,14 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple Element child = element.getChild(HTML_DEFAULT_DOCTYPE_ELEMENT); if (child != null) { - myDefaultHtmlDoctype = child.getText(); + final String text = child.getText(); + + if (HTML5_DOCTYPE_ELEMENT.equals(text)) { + myDefaultHtmlDoctype = Html5SchemaProvider.HTML5_SCHEMA_LOCATION; + } + else { + myDefaultHtmlDoctype = text; + } } Element catalogElement = element.getChild(CATALOG_PROPERTIES_ELEMENT); if (catalogElement != null) { @@ -392,7 +401,14 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple if (myDefaultHtmlDoctype != null) { final Element e = new Element(HTML_DEFAULT_DOCTYPE_ELEMENT); - e.setText(myDefaultHtmlDoctype); + + if (Html5SchemaProvider.HTML5_SCHEMA_LOCATION.equals(myDefaultHtmlDoctype)) { + // do not store the path to html5 schema in project settings + e.setText(HTML5_DOCTYPE_ELEMENT); + } + else { + e.setText(myDefaultHtmlDoctype); + } element.addContent(e); } if (myCatalogPropertiesFile != null) { diff --git a/xml/impl/src/com/intellij/xml/Html5SchemaProvider.java b/xml/impl/src/com/intellij/xml/Html5SchemaProvider.java index 729c9395a61f..218498bfc497 100644 --- a/xml/impl/src/com/intellij/xml/Html5SchemaProvider.java +++ b/xml/impl/src/com/intellij/xml/Html5SchemaProvider.java @@ -3,8 +3,9 @@ package com.intellij.xml; import com.intellij.javaee.ExternalResourceManagerImpl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; +import com.intellij.util.io.URLUtil; import org.jetbrains.annotations.NotNull; import java.net.URL; @@ -46,12 +47,12 @@ public abstract class Html5SchemaProvider { xhtmlSchemaLocationURL = htmlSchemaLocationURL; } - HTML5_SCHEMA_LOCATION = - VfsUtil.urlToPath(VfsUtil.fixURLforIDEA(FileUtil.unquote(htmlSchemaLocationURL.toExternalForm()))); + HTML5_SCHEMA_LOCATION = VfsUtilCore.urlToPath(VfsUtil.fixURLforIDEA( + URLUtil.unescapePercentSequences(htmlSchemaLocationURL.toExternalForm()))); LOG.info("HTML5_SCHEMA_LOCATION = " + HTML5_SCHEMA_LOCATION); - XHTML5_SCHEMA_LOCATION = - VfsUtil.urlToPath(VfsUtil.fixURLforIDEA(FileUtil.unquote(xhtmlSchemaLocationURL.toExternalForm()))); + XHTML5_SCHEMA_LOCATION = VfsUtilCore.urlToPath(VfsUtil.fixURLforIDEA( + URLUtil.unescapePercentSequences(xhtmlSchemaLocationURL.toExternalForm()))); LOG.info("XHTML5_SCHEMA_LOCATION = " + XHTML5_SCHEMA_LOCATION); }