Search in sources :

Example 1 with HtmlNSDescriptorImpl

use of com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl in project intellij-community by JetBrains.

the class XmlDocumentImpl method getDefaultNSDescriptorInner.

private XmlNSDescriptor getDefaultNSDescriptorInner(final String namespace, final boolean strict) {
    final XmlFile containingFile = XmlUtil.getContainingFile(this);
    if (containingFile == null)
        return null;
    final XmlProlog prolog = getProlog();
    final XmlDoctype doctype = prolog != null ? prolog.getDoctype() : null;
    boolean dtdUriFromDocTypeIsNamespace = false;
    if (XmlUtil.HTML_URI.equals(namespace)) {
        XmlNSDescriptor nsDescriptor = doctype != null ? getNsDescriptorFormDocType(doctype, containingFile, true) : null;
        if (doctype != null) {
            LOG.debug("Descriptor from doctype " + doctype + " is " + (nsDescriptor != null ? nsDescriptor.getClass().getCanonicalName() : "NULL"));
        }
        if (nsDescriptor == null) {
            String htmlns = ExternalResourceManagerEx.getInstanceEx().getDefaultHtmlDoctype(getProject());
            if (htmlns.isEmpty()) {
                htmlns = Html5SchemaProvider.getHtml5SchemaLocation();
            }
            nsDescriptor = getDefaultNSDescriptor(htmlns, false);
        }
        final XmlFile descriptorFile = nsDescriptor.getDescriptorFile();
        if (descriptorFile != null) {
            return getCachedHtmlNsDescriptor(descriptorFile);
        }
        return new HtmlNSDescriptorImpl(nsDescriptor);
    } else if (XmlUtil.XHTML_URI.equals(namespace)) {
        String xhtmlNamespace = XmlUtil.getDefaultXhtmlNamespace(getProject());
        if (xhtmlNamespace == null || xhtmlNamespace.isEmpty()) {
            xhtmlNamespace = Html5SchemaProvider.getXhtml5SchemaLocation();
        }
        return getDefaultNSDescriptor(xhtmlNamespace, false);
    } else if (namespace != null && namespace != XmlUtil.EMPTY_URI) {
        if (doctype == null || !namespace.equals(XmlUtil.getDtdUri(doctype))) {
            boolean documentIsSchemaThatDefinesNs = namespace.equals(XmlUtil.getTargetSchemaNsFromTag(getRootTag()));
            final XmlFile xmlFile = documentIsSchemaThatDefinesNs ? containingFile : XmlUtil.findNamespace(containingFile, namespace);
            if (xmlFile != null) {
                final XmlDocument document = xmlFile.getDocument();
                if (document != null) {
                    return (XmlNSDescriptor) document.getMetaData();
                }
            }
        } else {
            dtdUriFromDocTypeIsNamespace = true;
        }
    }
    if (strict && !dtdUriFromDocTypeIsNamespace)
        return null;
    if (doctype != null) {
        XmlNSDescriptor descr = getNsDescriptorFormDocType(doctype, containingFile, false);
        if (descr != null) {
            return XmlExtension.getExtension(containingFile).getDescriptorFromDoctype(containingFile, descr);
        }
    }
    if (strict)
        return null;
    if (namespace == XmlUtil.EMPTY_URI) {
        final XmlFile xmlFile = XmlUtil.findNamespace(containingFile, namespace);
        if (xmlFile != null) {
            return (XmlNSDescriptor) xmlFile.getDocument().getMetaData();
        }
    }
    try {
        final PsiFile fileFromText = PsiFileFactory.getInstance(getProject()).createFileFromText(containingFile.getName() + ".dtd", DTDLanguage.INSTANCE, XmlUtil.generateDocumentDTD(this, false), false, false);
        if (fileFromText instanceof XmlFile) {
            fileFromText.putUserData(AUTO_GENERATED, Boolean.TRUE);
            return (XmlNSDescriptor) ((XmlFile) fileFromText).getDocument().getMetaData();
        }
    } catch (ProcessCanceledException ex) {
        throw ex;
    } catch (RuntimeException ignored) {
    }
    return null;
}
Also used : HtmlNSDescriptorImpl(com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl) XmlNSDescriptor(com.intellij.xml.XmlNSDescriptor) ProcessCanceledException(com.intellij.openapi.progress.ProcessCanceledException)

Aggregations

ProcessCanceledException (com.intellij.openapi.progress.ProcessCanceledException)1 HtmlNSDescriptorImpl (com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl)1 XmlNSDescriptor (com.intellij.xml.XmlNSDescriptor)1