X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/03c5ba6e50339d7bc470eb6d7f051483eff1e96b..c52436a7e25876ee3509df2467c2a9ef33303436:/platforma/static/js/wiki/xslt.js diff --git a/platforma/static/js/wiki/xslt.js b/platforma/static/js/wiki/xslt.js index 566b0a80..dda12a16 100644 --- a/platforma/static/js/wiki/xslt.js +++ b/platforma/static/js/wiki/xslt.js @@ -1,7 +1,7 @@ /* - * + * * XSLT STUFF - * + * */ function createXSLT(xsl) { var p = new XSLTProcessor(); @@ -12,8 +12,8 @@ function createXSLT(xsl) { var xml2htmlStylesheet = null; // Wykonuje block z załadowanymi arkuszami stylów -function withStylesheets(code_block, onError) -{ +function withStylesheets(code_block, onError) +{ if (!xml2htmlStylesheet) { $.blockUI({message: 'Ładowanie arkuszy stylów...'}); $.ajax({ @@ -23,7 +23,7 @@ function withStylesheets(code_block, onError) xml2htmlStylesheet = createXSLT(data); $.unblockUI(); code_block(); - + }, error: onError }) @@ -36,27 +36,27 @@ function withStylesheets(code_block, onError) function xml2html(options) { withStylesheets(function() { - var xml = options.xml.replace(/\/\s+/g, '
'); + var xml = options.xml.replace(/\/\s+/g, '
'); var parser = new DOMParser(); var serializer = new XMLSerializer(); - var doc = parser.parseFromString(xml, 'text/xml'); + var doc = parser.parseFromString(xml, 'text/xml'); var error = $('parsererror', doc); - + if (error.length == 0) { doc = xml2htmlStylesheet.transformToFragment(doc, document); console.log(doc.firstChild); - + if(doc.firstChild === null) { options.error("Błąd w przetwarzaniu XML."); return; } - + error = $('parsererror', doc); } - + if (error.length > 0 && options.error) { options.error(error.text()); - } else { + } else { options.success(doc.firstChild); } }, function() { options.error && options.error('Nie udało się załadować XSLT'); }); @@ -105,46 +105,46 @@ const PADDING = { naglowek_rozdzial: 4, naglowek_osoba: 4, lista_osob: 4, - + akap: 3, akap_cd: 3, akap_dialog: 3, strofa: 3, - motto: 3, + motto: 3, miejsce_czas: 3, - + autor_utworu: 2, nazwa_utworu: 2, dzielo_nadrzedne: 2, - + didaskalia: 2, motto_podpis: 2, naglowek_listy: 2, kwestia: 1, lista_osoba: 1, - - "podpis": 1, + + "podpis": 1, "wers": 0, "wers_cd": 0, "wers_akap": 0, - "wers_wciety": 0, - + "wers_wciety": 0, + "rdf:RDF": 3, - "rdf:Description": 1, + "rdf:Description": 1, }; function getPadding(name) { - + if(name.match(/^dc:.*$/)) return -1; - + if(PADDING[name]) return PADDING[name]; - + return 0; } -function HTMLSerializer() { +function HTMLSerializer() { // empty constructor } @@ -152,99 +152,99 @@ function HTMLSerializer() { HTMLSerializer.prototype._prepare = function() { this.stack = []; - + // XML namespace is implicit this.nsMap = {"http://www.w3.org/XML/1998/namespace": "xml"}; - + this.result = ""; - this.nsCounter = 1; + this.nsCounter = 1; } HTMLSerializer.prototype._pushElement = function(element) { this.stack.push({ "type": ELEM_START, "node": element - }); + }); } HTMLSerializer.prototype._pushChildren = function(element) { for(var i = element.childNodes.length-1; i >= 0; i--) - this._pushElement(element.childNodes.item(i)); + this._pushElement(element.childNodes.item(i)); } HTMLSerializer.prototype._pushTagEnd = function(tagName) { this.stack.push({ "type": ELEM_END, "tagName": tagName - }); + }); } HTMLSerializer.prototype._verseBefore = function(node) { var prev = node.previousSibling; - + while((prev !== null) && (prev.nodeType != ELEMENT_NODE)) { prev = prev.previousSibling; - } - + } + return (prev !== null) && prev.hasAttribute('x-verse'); } -HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) +HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) { var self = this; self._prepare(); - + if(!stripOuter) self._pushElement(rootElement); - else + else self._pushChildren(rootElement); - + while(self.stack.length > 0) { var token = self.stack.pop(); - + if(token.type === ELEM_END) { - self.result += ""; - for(var padding = getPadding(token.tagName); padding > 0; padding--) { - self.result += "\n"; + self.result += ""; + for(var padding = getPadding(token.tagName); padding > 0; padding--) { + self.result += "\n"; } continue; }; - + if(token.type === NS_END) { self._unassignNamespace(token.namespace); continue; - } - - + } + + switch(token.node.nodeType) { case ELEMENT_NODE: if(token.node.hasAttribute('x-pass-thru')) { self._pushChildren(token.node); break; } - + if(!token.node.hasAttribute('x-node')) break; - + var xnode = token.node.getAttribute('x-node'); - + if(xnode === 'wers') { /* push children */ if(self._verseBefore(token.node)) self.result += '/\n'; self._pushChildren(token.node); - break; - }; - + break; + }; + if(xnode === 'out-of-flow-text') { self._pushChildren(token.node); - break; + break; } - + if(token.node.hasAttribute('x-verse') && self._verseBefore(token.node)) { - self.result += '/\n'; + self.result += '/\n'; }; - + self._serializeElement(token.node); break; case TEXT_NODE: @@ -252,7 +252,7 @@ HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) break; }; }; - + return this.result; } @@ -262,84 +262,84 @@ HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) HTMLSerializer.prototype._unassignNamespace = function(nsData) { this.nsMap[nsData.uri] = undefined; }; - + HTMLSerializer.prototype._assignNamespace = function(uri) { if(uri === null) { // default namespace return ({"prefix": "", "uri": "", "fresh": false}); } - + if(this.nsMap[uri] === undefined) { - // this prefix hasn't been defined yet in current context + // this prefix hasn't been defined yet in current context var prefix = NAMESPACES[uri]; - + if (prefix === undefined) { // not predefined prefix = "ns" + this.nsCounter; this.nsCounter += 1; } - - this.nsMap[uri] = prefix; + + this.nsMap[uri] = prefix; return ({ "prefix": prefix, "uri": uri, "fresh": true - }); - } - - return ({"prefix": this.nsMap[uri], "uri": uri, "fresh": false}); + }); + } + + return ({"prefix": this.nsMap[uri], "uri": uri, "fresh": false}); }; HTMLSerializer.prototype._join = function(prefix, name) { - if(!!prefix) + if(!!prefix) return prefix + ":" + name; - return name; + return name; }; HTMLSerializer.prototype._rjoin = function(prefix, name) { - if(!!name) + if(!!name) return prefix + ":" + name; - return prefix; + return prefix; }; - + HTMLSerializer.prototype._serializeElement = function(node) { var self = this; - + var ns = node.getAttribute('x-ns'); var nsPrefix = null; var newNamespaces = []; - + var nsData = self._assignNamespace(node.getAttribute('x-ns')); - + if(nsData.fresh) { newNamespaces.push(nsData); self.stack.push({ "type": NS_END, "namespace": nsData }); - } - + } + var tagName = self._join(nsData.prefix, node.getAttribute('x-node')); - + /* retrieve attributes */ var attributeIDs = []; for (var i = 0; i < node.attributes.length; i++) { var attr = node.attributes.item(i); - + // check if name starts with "x-attr-name" var m = attr.name.match(XATTR_RE); - if (m !== null) - attributeIDs.push(m[1]); + if (m !== null) + attributeIDs.push(m[1]); }; - + /* print out */ if (getPadding(tagName)) self.result += '\n'; - - self.result += '<' + tagName; - + + self.result += '<' + tagName; + $.each(attributeIDs, function() { var nsData = self._assignNamespace(node.getAttribute('x-attr-ns-'+this)); - + if(nsData.fresh) { newNamespaces.push(nsData); self.stack.push({ @@ -347,17 +347,17 @@ HTMLSerializer.prototype._serializeElement = function(node) { "namespace": nsData }); }; - + self.result += ' ' + self._join(nsData.prefix, node.getAttribute('x-attr-name-'+this)); self.result += '="'+node.getAttribute('x-attr-value-'+this) +'"'; }); - + /* print new namespace declarations */ $.each(newNamespaces, function() { self.result += " " + self._rjoin("xmlns", this.prefix); - self.result += '="' + this.uri + '"'; - }); - + self.result += '="' + this.uri + '"'; + }); + if (node.childNodes.length > 0) { self.result += ">"; self._pushTagEnd(tagName); @@ -368,11 +368,11 @@ HTMLSerializer.prototype._serializeElement = function(node) { }; }; -function html2text(params) { +function html2text(params) { try { var s = new HTMLSerializer(); params.success( s.serialize(params.element, params.stripOuter) ); } catch(e) { params.error("Nie udało się zserializować tekstu:" + e) - } + } } \ No newline at end of file