// shortcuts (kinda the only reason I use jQuery anyway) function $id(element) { return(document.getElementById(element)); } function $tag(tag) { return(document.getElementsByTagName(tag)); } function $qs(css) { return(document.querySelector(css)) } HTMLWidgets.widget({ name: 'xmlview', type: 'output', initialize: function(el, width, height) { return {} }, renderValue: function(el, param, instance) { var self = this; self.thel = el; self.glob = {} ; function filter_xpath() { self.msg.style.display = "none"; do_filter(self.xpath.value.trim()); } function do_filter(xpath) { self.rcode.style.display = "none"; if (xpath === "") return(reset_form()); var out_xml = "" ; try { var nsResolver = self.glob.parsedOrig.createNSResolver( self.glob.parsedOrig); var results = self.glob.parsedOrig.evaluate(xpath, self.glob.parsedOrig, nsResolver, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); var res = results.iterateNext() ; while(res) { out_xml = out_xml + self.glob.serialize.serializeToString(res); res = results.iterateNext(); } self.xml_div.innerText = vkbeautify.xml(out_xml); self.xml_div.textContent = vkbeautify.xml(out_xml); hljs.highlightBlock(self.xml_div); } catch(err) { self.msg.innerText = "Invalid XPath"; self.msg.textContent = "Invalid XPath"; self.msg.style.display = "inline-block"; } } function reset_form(doc) { self.rcode.style.display = "none"; self.msg.style.display = "none"; self.xpath.value = "" ; self.xml_div.innerText = vkbeautify.xml(self.glob.xmlDoc); self.xml_div.textContent = vkbeautify.xml(self.glob.xmlDoc); hljs.highlightBlock(self.xml_div); return(false); } function generate_rcode() { self.rcode.innerText = "xml2::xml_find_all(" + self.glob.xmlDocName + ", '" + self.xpath.value + "', ns=xml2::xml_ns(" + self.glob.xmlDocName + "))"; self.rcode.textContent = "xml2::xml_find_all(" + self.glob.xmlDocName + ", '" + self.xpath.value + "', ns=xml2::xml_ns(" + self.glob.xmlDocName + "))"; self.rcode.style.display = "inline-block"; return(false); } var serializer = new XMLSerializer(); var domparser = new DOMParser(); self.glob.xmlDocName = param.xmlDocName; self.glob.xmlDoc = param.xmlDoc; self.glob.applyXPath = param.applyXPath; self.glob.orig = param.xmlDoc; self.glob.serialize = serializer; self.glob.parser = domparser; self.glob.parsedOrig = domparser.parseFromString(param.xmlDoc, "text/xml"); var link = document.createElement("link"); link.href = "lib/highlightjs-9.0.0/styles/" + param.styleSheet + ".css"; link.type = "text/css"; link.rel = "stylesheet"; link.media = "screen,print"; $tag("head")[0].appendChild(link); if (param.scroll) { el.style.overflow = "scroll" } var msg = '
'; var rcode = ''; var filter = ""; if (param.addFilter) { filter = '
';
if (param.addFilter) {
$qs("div#" + el.id + " > div.filterdiv > input.filterinput").onchange = filter_xpath;
$qs("div#" + el.id + " > div.filterdiv > button.resetclass").onclick = reset_form;
$qs("div#" + el.id + " > div.filterdiv > button.rcodeclass").onclick = generate_rcode;
}
self.xml_div = $qs("div#" + el.id + " > pre > code.xmldiv");
self.msg = $qs("div#" + el.id + " > div.msgdiv");
self.xpath = $qs("div#" + el.id + " > div.filterdiv > input.filterinput");
self.rcode = $qs("div#" + el.id + " > div.rcodediv");
if (self.glob.applyXPath === null) {
self.xml_div.innerText = vkbeautify.xml(param.xmlDoc);
self.xml_div.textContent = vkbeautify.xml(param.xmlDoc);
hljs.initHighlighting() ;
hljs.highlightBlock(self.xml_div);
} else {
if (param.addFilter) { $qs("div#" + el.id + " > div.filterdiv > input.filterinput").value = param.applyXPath }
do_filter(param.applyXPath);
}
},
resize: function(el, width, height, instance) {},
});