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;
}
Aggregations