X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/94e3767f1597835ac82361d7d04be1347fe40942..f320855811739cc82a58c74224c3771bc471e4d8:/src/wlxml/wlxml.js?ds=sidebyside diff --git a/src/wlxml/wlxml.js b/src/wlxml/wlxml.js index 820b95f..4f6e356 100644 --- a/src/wlxml/wlxml.js +++ b/src/wlxml/wlxml.js @@ -2,8 +2,9 @@ define([ 'libs/jquery', 'libs/underscore', 'smartxml/smartxml', - 'smartxml/transformations' -], function($, _, smartxml, transformations) { + 'smartxml/transformations', + 'wlxml/extensions/metadata/metadata' +], function($, _, smartxml, transformations, metadataExtension) { 'use strict'; @@ -16,10 +17,26 @@ AttributesList.prototype.keys = function() { return _.keys(this); }; +var getClassLists = function(klassName) { + var toret = [], + classParts = [''].concat(klassName.split('.')), + classCurrent; + + classParts.forEach(function(part) { + classCurrent = classCurrent ? classCurrent + '.' + part : part; + toret.push(classCurrent); + }); + return toret; +}; + var installObject = function(instance, klass) { - var methods = instance.document.classMethods[klass] || {}, - transformations = instance.document.classTransformations[klass] || {}; + var methods = {}, + transformations = {}; + getClassLists(klass).forEach(function(klassName) { + _.extend(methods, instance.document.classMethods[klassName] || {}); + _.extend(methods, instance.document.classTransformations[klassName] || {}); + }); instance.object = Object.create(_.extend({}, methods, transformations)); _.keys(methods).concat(_.keys(transformations)).forEach(function(key) { instance.object[key] = _.bind(instance.object[key], instance); @@ -79,7 +96,8 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, { }, _getXMLDOMToDump: function() { - var DOM = this._$.clone(true, true); + var DOM = this._$.clone(true, true), + doc = this.document; DOM.find('*').addBack().each(function() { var el = $(this), @@ -89,7 +107,7 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, { data = el.data(); - var txt; + var txt, documentNode, metaNode; if(data[formatter_prefix+ 'orig_before']) { txt = idx > 0 && contents[idx-1].nodeType === Node.TEXT_NODE ? contents[idx-1] : null; @@ -119,8 +137,23 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, { el.append(data[formatter_prefix+ 'orig_end']); } } + + + if(this.nodeType === Node.ELEMENT_NODE) { + documentNode = doc.createDocumentNode(this); + metaNode = $(''); + documentNode.getMetadata().forEach(function(row) { + metaNode.append('' + row.value + ''); + }); + if(metaNode.children().length) { + $(this).prepend(metaNode); + } + } + }); + + return DOM; } }); @@ -143,11 +176,10 @@ var WLXMLDocumentNode = function() { WLXMLDocumentNode.prototype = Object.create(smartxml.DocumentNode.prototype); var WLXMLDocument = function(xml, options) { - smartxml.Document.call(this, xml); - this.options = options; - this.classMethods = {}; this.classTransformations = {}; + smartxml.Document.call(this, xml, [metadataExtension]); + this.options = options; }; var formatter_prefix = '_wlxml_formatter_'; @@ -162,6 +194,21 @@ $.extend(WLXMLDocument.prototype, { }, normalizeXML: function(nativeNode) { + var doc = this, + prefixLength = 'dc:'.length; + + $(nativeNode).find('metadata').each(function() { + var metadataNode = $(this), + owner = doc.createDocumentNode(metadataNode.parent()[0]), + metadata = owner.getMetadata(); + + metadataNode.children().each(function() { + metadata.add({key: (this.tagName).toLowerCase().substr(prefixLength), value: $(this).text()}, {undoable: false}); + }); + metadataNode.remove(); + }); + nativeNode.normalize(); + $(nativeNode).find(':not(iframe)').addBack().contents() .filter(function() {return this.nodeType === Node.TEXT_NODE;}) .each(function() { @@ -244,12 +291,15 @@ $.extend(WLXMLDocument.prototype, { /* globals document */ el.replaceWith(document.createTextNode(text.transformed)); }); + + }, registerClassTransformation: function(Transformation, className) { var thisClassTransformations = (this.classTransformations[className] = this.classTransformations[className] || {}); - thisClassTransformations[Transformation.prototype.name] = function(args) { + thisClassTransformations[Transformation.prototype.name] = function() { var nodeInstance = this; + var args = Array.prototype.slice.call(arguments, 0); return nodeInstance.transform(Transformation, args); }; },