X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/1a0d01d9cdbffcf9667562502c3d2e36e5a9fa5b..0be3fc3037cea44c23261215f92d6c24dbf81060:/redakcja/static/js/wiki/xslt.js diff --git a/redakcja/static/js/wiki/xslt.js b/redakcja/static/js/wiki/xslt.js index 532b452b..a0d0d4bc 100644 --- a/redakcja/static/js/wiki/xslt.js +++ b/redakcja/static/js/wiki/xslt.js @@ -19,6 +19,7 @@ function withStylesheets(code_block, onError) $.ajax({ url: STATIC_URL + 'xsl/wl2html_client.xsl', dataType: 'xml', + timeout: 10000, success: function(data) { xml2htmlStylesheet = createXSLT(data); $.unblockUI(); @@ -34,9 +35,32 @@ function withStylesheets(code_block, onError) } +// Wykonuje block z załadowanymi kanonicznymi motywami +function withThemes(code_block, onError) +{ + if (typeof withThemes.canon == 'undefined') { + $.ajax({ + url: '/themes', + dataType: 'text', + success: function(data) { + withThemes.canon = data.split('\n'); + code_block(withThemes.canon); + }, + error: function() { + withThemes.canon = null; + code_block(withThemes.canon); + } + }) + } + else { + code_block(withThemes.canon); + } +} + + function xml2html(options) { withStylesheets(function() { - var xml = options.xml.replace(/\/\s+/g, '
'); + var xml = options.xml.replace(/\/(\s+)/g, '
$1'); var parser = new DOMParser(); var serializer = new XMLSerializer(); var doc = parser.parseFromString(xml, 'text/xml'); @@ -44,20 +68,37 @@ function xml2html(options) { if (error.length == 0) { doc = xml2htmlStylesheet.transformToFragment(doc, document); - console.log(doc.firstChild); + console.log(doc.firstChild); - if(doc.firstChild === null) { - options.error("Błąd w przetwarzaniu XML."); - return; - } + 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()); + source = $('sourcetext', doc); + source_text = source.text(); + source.text(''); + options.error(error.text(), source_text); } else { options.success(doc.firstChild); + + withThemes(function(canonThemes) { + if (canonThemes != null) { + $('.theme-text-list').addClass('canon').each(function(){ + var themes = $(this).html().split(','); + for (i in themes) { + themes[i] = $.trim(themes[i]); + if (canonThemes.indexOf(themes[i]) == -1) + themes[i] = '' + themes[i] + "" + } + $(this).html(themes.join(', ')); + }); + } + }); } }, function() { options.error && options.error('Nie udało się załadować XSLT'); }); } @@ -232,7 +273,7 @@ HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) if(xnode === 'wers') { /* push children */ if(self._verseBefore(token.node)) - self.result += '/\n'; + self.result += '/'; self._pushChildren(token.node); break; }; @@ -249,7 +290,11 @@ HTMLSerializer.prototype.serialize = function(rootElement, stripOuter) self._serializeElement(token.node); break; case TEXT_NODE: - self.result += token.node.nodeValue; + // collapse previous element's padding + var i = 0; + while (token.node.nodeValue[i] == '\n' && self.result[self.result.length - 1] == '\n') + i ++; + self.result += token.node.nodeValue.substr(i); break; }; }; @@ -333,7 +378,9 @@ HTMLSerializer.prototype._serializeElement = function(node) { }; /* print out */ - if (getPadding(tagName)) + + // at least one newline before padded elements + if (getPadding(tagName) && self.result[self.result.length - 1] != '\n') self.result += '\n'; self.result += '<' + tagName;