/*
- *
+ *
* XSLT STUFF
- *
+ *
*/
function createXSLT(xsl) {
var p = new XSLTProcessor();
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({
xml2htmlStylesheet = createXSLT(data);
$.unblockUI();
code_block();
-
+
},
error: onError
})
function xml2html(options) {
withStylesheets(function() {
- var xml = options.xml.replace(/\/\s+/g, '<br />');
+ var xml = options.xml.replace(/\/\s+/g, '<br />');
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'); });
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
}
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 += "</" + token.tagName + ">";
- for(var padding = getPadding(token.tagName); padding > 0; padding--) {
- self.result += "\n";
+ self.result += "</" + token.tagName + ">";
+ 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:
break;
};
};
-
+
return this.result;
}
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({
"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);
};
};
-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