From 706554677cf46d2beda56487511859a0366022f5 Mon Sep 17 00:00:00 2001 From: Alan Date: Thu, 6 Jan 2022 17:11:20 +0800 Subject: [PATCH] Roo/htmleditor/TidySerializer.js --- Roo/htmleditor/TidySerializer.js | 234 ++++++++++++++++--------------- 1 file changed, 122 insertions(+), 112 deletions(-) diff --git a/Roo/htmleditor/TidySerializer.js b/Roo/htmleditor/TidySerializer.js index 5b708515cc..0f40fe7af8 100644 --- a/Roo/htmleditor/TidySerializer.js +++ b/Roo/htmleditor/TidySerializer.js @@ -1,117 +1,127 @@ - define('tinymce/html/Serializer', ['tinymce/html/Writer', 'tinymce/html/Schema'], function(Writer, Schema) { - /** - * Constructs a new Serializer instance. - * - * @constructor - * @method Serializer - * @param {Object} settings Name/value settings object. - * @param {tinymce.html.Schema} schema Schema instance to use. - */ - return function(settings, schema) { - var self = this, - writer = new Writer(settings); - settings = settings || {}; - settings.validate = !('validate' in settings) || settings.validate; - self.schema = schema = schema || new Schema(); - self.writer = writer; - /** - * Serializes the specified node into a string. - * - * @example - * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('

text

')); - * @method serialize - * @param {tinymce.html.Node} node Node instance to serialize. - * @return {String} String with HTML based on DOM tree. - */ - self.serialize = function(node) { - var handlers, validate; - validate = settings.validate; - handlers = { - // #text - 3: function(node) { - writer.text(node.value, node.raw); - }, - // #comment - 8: function(node) { - writer.comment(node.value); - }, - // Processing instruction - 7: function(node) { - writer.pi(node.name, node.value); - }, - // Doctype - 10: function(node) { - writer.doctype(node.value); - }, - // CDATA - 4: function(node) { - writer.cdata(node.value); - }, - // Document fragment - 11: function(node) { - if (node = node.firstChild) { - do { - walk(node); - } while (node = node.next); - } - } - }; - writer.reset(); - function walk(node) { - var name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule, handler = handlers[node.type]; - if (handler) { - handler(node); - } else { - name = node.name; - isEmpty = node.shortEnded; - attrs = node.attributes; - // Sort attributes - if (validate && attrs && attrs.length > 1) { - sortedAttrs = []; - sortedAttrs.map = {}; - elementRule = schema.getElementRule(node.name); - if (elementRule) { - for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { - attrName = elementRule.attributesOrder[i]; - if (attrName in attrs.map) { - attrValue = attrs.map[attrName]; - sortedAttrs.map[attrName] = attrValue; - sortedAttrs.push({ - name: attrName, - value: attrValue - }); - } - } - for (i = 0, l = attrs.length; i < l; i++) { - attrName = attrs[i].name; - if (!(attrName in sortedAttrs.map)) { - attrValue = attrs.map[attrName]; - sortedAttrs.map[attrName] = attrValue; - sortedAttrs.push({ - name: attrName, - value: attrValue - }); - } - } - attrs = sortedAttrs; - } +/*** + * This is based loosely on tinymce + * @class Roo.htmleditor.TidySerializer + * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js + * @constructor + * @method Serializer + * @param {Object} settings Name/value settings object. + * @param {tinymce.html.Schema} schema Schema instance to use. + */ + + +Roo.htmleditor.TidySerializer = function(settings) +{ + Roo.apply(this.settings); + + this.writer = new Roo.htmleditor.TidyWriter(settings); + + //settings.validate = !('validate' in settings) || settings.validate; + // self.schema = schema = schema || new Schema(); + +}; +Roo.apply(Roo.htmleditor.TidySerializer.prototype, { + /** + * Serializes the specified node into a string. + * + * @example + * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('

text

')); + * @method serialize + * @param {DomElement} node Node instance to serialize. + * @return {String} String with HTML based on DOM tree. + */ + serialize : function(node) { + + // = settings.validate; + var writer = this.writer; + this.handlers = { + // #text + 3: function(node) { + writer.text(node.value, node.raw); + }, + // #comment + 8: function(node) { + writer.comment(node.value); + }, + // Processing instruction + 7: function(node) { + writer.pi(node.name, node.value); + }, + // Doctype + 10: function(node) { + writer.doctype(node.value); + }, + // CDATA + 4: function(node) { + writer.cdata(node.value); + }, + // Document fragment + 11: function(node) { + node = node.firstChild; + if (!node) { + return; + } + while(node) { + walk(node); + node = node.nextSibling + } + } + }; + writer.reset(); + + function walk(node) { + var name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule, handler = handlers[node.type]; + if (handler) { + handler(node); + } else { + name = node.name; + isEmpty = node.shortEnded; + attrs = node.attributes; + // Sort attributes + if (validate && attrs && attrs.length > 1) { + sortedAttrs = []; + sortedAttrs.map = {}; + elementRule = schema.getElementRule(node.name); + if (elementRule) { + for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { + attrName = elementRule.attributesOrder[i]; + if (attrName in attrs.map) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({ + name: attrName, + value: attrValue + }); } - writer.start(node.name, attrs, isEmpty); - if (!isEmpty) { - if (node = node.firstChild) { - do { - walk(node); - } while (node = node.next); - } - writer.end(name); + } + for (i = 0, l = attrs.length; i < l; i++) { + attrName = attrs[i].name; + if (!(attrName in sortedAttrs.map)) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({ + name: attrName, + value: attrValue + }); } } + attrs = sortedAttrs; } - // Serialize element and treat all non elements as fragments - 1 != node.type || settings.inner ? handlers[11](node) : walk(node); - return writer.getContent(); - }; - }; - - \ No newline at end of file + } + writer.start(node.name, attrs, isEmpty); + if (!isEmpty) { + if (node = node.firstChild) { + do { + walk(node); + } while (node = node.next); + } + writer.end(name); + } + } + } + // Serialize element and treat all non elements as fragments + 1 != node.type || settings.inner ? handlers[11](node) : walk(node); + return writer.getContent(); +}; +}; + -- 2.39.2