4 * Copyright 2010, Moxiecode Systems AB
5 * Released under LGPL License.
7 * License: http://tinymce.moxiecode.com/license
8 * Contributing: http://tinymce.moxiecode.com/contributing
13 * This class is used to serialize down the DOM tree into a string using a Writer instance.
17 * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('<p>text</p>'));
18 * @class tinymce.html.Serializer
23 * Constructs a new Serializer instance.
27 * @param {Object} settings Name/value settings object.
28 * @param {tinymce.html.Schema} schema Schema instance to use.
30 tinymce.html.Serializer = function(settings, schema) {
31 var self = this, writer = new tinymce.html.Writer(settings);
33 settings = settings || {};
34 settings.validate = "validate" in settings ? settings.validate : true;
36 self.schema = schema = schema || new tinymce.html.Schema();
40 * Serializes the specified node into a string.
43 * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('<p>text</p>'));
45 * @param {tinymce.html.Node} node Node instance to serialize.
46 * @return {String} String with HTML based on DOM tree.
48 self.serialize = function(node) {
49 var handlers, validate;
51 validate = settings.validate;
55 3: function(node, raw) {
56 writer.text(node.value, node.raw);
61 writer.comment(node.value);
64 // Processing instruction
66 writer.pi(node.name, node.value);
71 writer.doctype(node.value);
76 writer.cdata(node.value);
81 if ((node = node.firstChild)) {
84 } while (node = node.next);
92 var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule;
96 isEmpty = node.shortEnded;
97 attrs = node.attributes;
100 if (validate && attrs && attrs.length > 1) {
102 sortedAttrs.map = {};
104 elementRule = schema.getElementRule(node.name);
105 for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) {
106 attrName = elementRule.attributesOrder[i];
108 if (attrName in attrs.map) {
109 attrValue = attrs.map[attrName];
110 sortedAttrs.map[attrName] = attrValue;
111 sortedAttrs.push({name: attrName, value: attrValue});
115 for (i = 0, l = attrs.length; i < l; i++) {
116 attrName = attrs[i].name;
118 if (!(attrName in sortedAttrs.map)) {
119 attrValue = attrs.map[attrName];
120 sortedAttrs.map[attrName] = attrValue;
121 sortedAttrs.push({name: attrName, value: attrValue});
128 writer.start(node.name, attrs, isEmpty);
131 if ((node = node.firstChild)) {
134 } while (node = node.next);
143 // Serialize element and treat all non elements as fragments
144 if (node.type == 1 && !settings.inner)
149 return writer.getContent();