diff --git a/xo.js b/xo.js
index 076bd25..3441301 100644
--- a/xo.js
+++ b/xo.js
@@ -553,7 +553,7 @@ xover.init = async function () {
await Promise.all(xover.manifest.start.map(async href => await xover.sources[href].ready && xover.sources[href])).catch(e => e && e.render && e.render() || console.error(e));
await xover.stores.restore();
- xover.session.cache_name = typeof (caches) != 'undefined' && (await caches.keys()).find(cache => cache.match(new RegExp(`^${location.hostname}_`))) || "";
+ //xover.session.cache_name = typeof (caches) != 'undefined' && (await caches.keys()).find(cache => cache.match(new RegExp(`^${location.hostname}_`))) || ""; //causes troubles at firefox
xover.dom.updateTitle();
xover.site.sections.forEach(section => section.render());
let active = xover.stores.active;
@@ -2626,21 +2626,33 @@ xover.xml.createDocument = function (xml, options = { autotransform: true }) {
}), "text/xml");
}
if (sXML && result.getElementsByTagName && (result.getElementsByTagName('parsererror').length || 0) > 0) {
- for (let message of [...result.querySelectorAll('parsererror div')]) {
- if (String(message.textContent).match(/prefix|prefijo/)) {
- let prefix = (message.textContent).match(/(?:prefix|prefijo)\s+([^\s]+\b)/).pop();
+ for (let parsererror of [...result.querySelectorAll('parsererror div, parsererror sourcetext')]) {
+ let message = parsererror.nodeName == 'sourcetext' ? parsererror.previousSibling.textContent : parsererror.textContent;
+ if (parsererror.nodeName == 'sourcetext') {
+ let new_node = parsererror.textContent.replace(/(?<=\<|\s)(\w+):([^\s]+)/g, function (match, prefix, name) {
+ let xmlns = xover.spaces[prefix.replace(/:/, '')];
+ if (xmlns) {
+ return `${prefix}:${name} xmlns:${prefix}="${xmlns}"`;
+ } else {
+ return match;
+ }
+ })
+ new_node = new_node.replace(/\^/g, '');
+ result = xover.xml.createDocument(new_node, options);
+ } else if (String(message).match(/prefix|prefijo/)) {
+ let prefix = (parsererror.textContent).match(/(?:prefix|prefijo)\s+([^\s]+\b)/).pop();
if (!xover.spaces[prefix] || sXML.indexOf(` xmlns:${prefix}=`) != -1) {
//xml.documentElement.appendChild(message.documentElement);
- return Promise.reject(message.textContent.match("(error [^:]+):(.+)"));
+ return Promise.reject(message.match("(error [^:]+):(.+)"));
}
//(xml.documentElement || xml).setAttributeNS('http://www.w3.org/2000/xmlns/', "xmlns:" + prefix, xover.spaces[prefix]);
sXML = sXML.replace(new RegExp(`(<[^\\s\/\!\?>]+)`), `$1 xmlns:${prefix}="${xover.spaces[prefix] || ''}"`);
result = xover.xml.createDocument(sXML, options);
return result;
- } else if (message.closest("html") && String(message.textContent).match(/Extra content at the end of the document/)) {
+ } else if (message.closest("html") && String(message).match(/Extra content at the end of the document/)) {
message.closest("html").remove();
//result = document.implementation.createDocument("http://www.w3.org/XML/1998/namespace", "", null);
- } else if (String(message.textContent).match(/Extra content at the end of the document/)) {
+ } else if (String(message).match(/Extra content at the end of the document/)) {
let frag = window.document.createDocumentFragment();
let p = window.document.createElement('p');
p.innerHTML = xml;
@@ -2650,9 +2662,9 @@ xover.xml.createDocument = function (xml, options = { autotransform: true }) {
if (options["silent"] !== true) {
xover.dom.createDialog(message.closest("html"));
}
- throw (new Error(message.textContent));
+ throw (new Error(message));
} else {
- return Promise.reject(message.textContent.match("(error [^:]+):(.+)").pop())
+ return Promise.reject(message.match("(error [^:]+):(.+)").pop())
}
}
}
@@ -3641,7 +3653,7 @@ xover.dom.createDialog = function (message) {
dialog.querySelector("section").append(message);
document.querySelector(`#${dialog_id}`);
- dialog.showModal();
+ typeof (dialog.showModal) == 'function' && dialog.showModal();
xover.messages.set(original_message, dialog);
return dialog;
}
@@ -7872,7 +7884,7 @@ xover.modernize = async function (targetWindow) {
let document = xover.sources[stylesheet];
await document.render({ target: self });
}
- } else if (source_document instanceof xover.Store) {
+ } else if (source_document instanceof xover.Store || source_document instanceof xover.Source) {
await source_document.render(self)
} else {
let body = source_document.cloneNode(true);
@@ -8087,7 +8099,7 @@ xover.modernize = async function (targetWindow) {
let dom;
if (xsl) {
if (!xsl.selectFirst(`/*/comment()[.='ack:optimized']`)) {
- xsl.select(`//xsl:key/@name`).filter(key => !xsl.selectFirst(`//xsl:template//@*[name()='select' or name()='match' or name()='test'][contains(.,"key('${key}'")]`)).forEach(key => key.parentNode.replaceWith(new Comment(`ack:removed: ${key.parentNode.nodeName} '${key}'`)));
+ xsl.select(`//xsl:key/@name`).filter(key => !xsl.selectFirst(`//xsl:template//@*[name()='select' or name()='match' or name()='test'][contains(.,"key('${key.value}'")]`)).forEach(key => key.parentNode.replaceWith(new Comment(`ack:removed: ${key.parentNode.nodeName} '${key}'`)));
xsl.documentElement.prepend(new Comment("ack:optimized"))
}
data.tag = /*'#' + */xsl.href.split(/[\?#]/)[0];
@@ -9242,11 +9254,11 @@ ${el.select(`ancestor::xsl:template[1]/@*`).map(attr => `${attr.name}="${new Tex
}
for (let el of return_value.select(`//xsl:template[not(.//xsl:param/@name="xo:context") and not(.//xsl:variable/@name="xo:context")]`)) {
- el.prepend(xover.xml.createNode(``));
+ el.prepend(xover.xml.createNode(``));
}
for (let el of return_value.select(`//xsl:template[xsl:param/@name="xo:context"]//xsl:apply-templates[not(xsl:with-param/@name="xo:context")]|//xsl:template[xsl:param/@name="xo:context"]//xsl:call-template[not(xsl:with-param/@name="xo:context")]`)) {
- el.prepend(xover.xml.createNode(``));
+ el.prepend(xover.xml.createNode(``));
}
for (let el of return_value.select(`(//xsl:*[not(@match="/")]/html:*[not(self::html:script or self::html:style or self::html:link)]|//xsl:*/svg:*[not(ancestor::svg:*)])[not(@xo-source or @xo-stylesheet or ancestor-or-self::*[@xo-scope])]`)) {
@@ -9254,7 +9266,7 @@ ${el.select(`ancestor::xsl:template[1]/@*`).map(attr => `${attr.name}="${new Tex
}
for (let el of return_value.select(`//xsl:template[not(@match="/")]//xsl:element`)) {
- el.prepend(xover.xml.createNode(``));
+ el.prepend(xover.xml.createNode(``));
//el.prepend(xover.xml.createNode(``));
}
}
@@ -9379,7 +9391,7 @@ xover.xml.createFragment = function (xml_string) {
xover.xml.createNode = function (xml_string, options) {
let result = xover.xml.createDocument(xml_string, options);
- result.disconnect();
+ //result.disconnect();
result = result.firstElementChild || result
if (!result.prefix && result.namespaceURI && !result.attributes.xmlns) {
result.setAttributeNS(xover.spaces["xmlns"], "xmlns", result.namespaceURI)
@@ -9405,6 +9417,13 @@ xover.xml.parseValue = function (value) {
xover.xml.staticMerge = function (node1, node2) {
node1.select(`.//text()[normalize-space(.)='']`).forEach(text => !text.nextElementSibling && text.remove());
node2.select(`.//text()[normalize-space(.)='']`).forEach(text => !text.nextElementSibling && text.remove());
+ for (let text of node2.select(`.//text()[starts-with(., '<') and substring(.,string-length(.),1)='>']`)) {
+ try {
+ text.replaceWith(xover.xml.createNode(text.value))
+ } catch (e) {
+
+ }
+ }
if (node1.classList && node2.classList && node1.classList.contains("xo-working")) node2.classList.add("xo-working");
if (node1.classList && node2.classList && node1.classList.contains("xo-fetching")) node2.classList.add("xo-fetching");
if (!(node1.contains(document.activeElement) || node1.contains("[xo-static],.xo-working,.xo-fetching")) || node1.nodeName.toLowerCase() !== node2.nodeName.toLowerCase() || node1.isEqualNode(node2)) return;