wip: Experimenting with new approach - dividing visualEditor module
[fnpeditor.git] / modules / documentCanvas / transformations.js
diff --git a/modules/documentCanvas/transformations.js b/modules/documentCanvas/transformations.js
new file mode 100644 (file)
index 0000000..cd20d2b
--- /dev/null
@@ -0,0 +1,108 @@
+define(['libs/jquery-1.9.1.min'], function($) {\r
+\r
+    var transformations = {};\r
+\r
+    transformations.fromXML = {\r
+        getHTMLTree: function(xml) {\r
+            var inner = $(xml).clone();\r
+            var toret = $('<div></div>');\r
+            toret.append(inner);\r
+            \r
+            var toBlock = ['div', 'section', 'header'];\r
+            var toInline = ['aside', 'span'];\r
+            \r
+            var transform = function(tags, replacingTagName) {\r
+                tags.forEach(function(tagName) {\r
+                    tagName = tagName.toLowerCase();\r
+                    console.log('running ' + tagName);\r
+                    toret.find(tagName).replaceWith(function() {\r
+                        var currentTag = $(this);\r
+                        if(currentTag.attr('wlxml-tag'))\r
+                            return;\r
+                        var toret = $('<' + replacingTagName + '>').attr('wlxml-tag', tagName);\r
+                        toret.attr('id', 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}));\r
+                        for(var i = 0; i < this.attributes.length; i++) {\r
+                            var attr = this.attributes.item(i);\r
+                            var value = attr.name === 'class' ? attr.value.replace(/\./g, '-') : attr.value;\r
+                            toret.attr('wlxml-' + attr.name, value)\r
+                        }\r
+                        toret.append(currentTag.contents());\r
+                        return toret;\r
+                    });\r
+                });\r
+            }\r
+            \r
+            transform(toBlock, 'div');\r
+            transform(toInline, 'span');\r
+\r
+            return toret.children();\r
+        },\r
+        getMetaData: function(xml) {\r
+            var toret = {};\r
+            $(xml).find('metadata').children().each(function() {\r
+                var node = $(this);\r
+                toret[this.nodeName.split(':')[1].toLowerCase()] = node.text();\r
+            })\r
+            return toret;\r
+        },\r
+        getDocumentDescription: function(xml) {\r
+            return {\r
+                HTMLTree: this.getHTMLTree(xml),\r
+                metadata: this.getMetaData(xml)\r
+            }\r
+        }\r
+    }\r
+\r
+    transformations.toXML = {\r
+        getXML: function(documentDescription) {\r
+            \r
+            var inner = $(documentDescription.HTMLTree);\r
+            var toret = $('<div></div>');\r
+            toret.append(inner);\r
+            \r
+            toret.find('div, span').replaceWith(function() {\r
+                var div = $(this);\r
+                var tagName = div.attr('wlxml-tag');\r
+                var toret = $('<'+tagName+'>');\r
+                                   \r
+                for(var i = 0; i < this.attributes.length; i++) {\r
+                    var attr = this.attributes.item(i);\r
+                    var split = attr.name.split('-')\r
+                    console.log(split);\r
+                    if(split[0] !== 'wlxml' || (split.length > 1 && split[1] === 'tag')) \r
+                        continue;\r
+                    var wlxmlName = split.splice(1).join('-');\r
+                    var value = wlxmlName === 'class' ? attr.value.replace(/-/g, '.') : attr.value;\r
+                    console.log(name + ': ' + value);\r
+                    toret.attr(wlxmlName, value);\r
+                }\r
+                    \r
+                toret.append(div.contents());\r
+                return toret;\r
+            });\r
+            \r
+            var meta = $('<metadata></metadata>\n');\r
+            _.each(_.keys(documentDescription.metadata), function(key) {\r
+                meta.append('\n\t<dc:'+key+'>' + documentDescription.metadata[key] + '</dc:'+key+'>');\r
+            });\r
+            meta.append('\n');\r
+            \r
+            var metadata = toret.find('metadata');\r
+            if(metadata.length === 0) {\r
+                var section = toret.find('section');\r
+                section = section.length ? $(section[0]) : null;\r
+                if(section) {\r
+                    section.prepend(meta)\r
+                }\r
+            } else {\r
+                metadata.replaceWith(meta);\r
+            }\r
+            \r
+            \r
+            return vkbeautify.xml(toret.html());\r
+        }\r
+    }\r
+\r
+    return transformations;\r
+\r
+});
\ No newline at end of file