Pathologic was missing because of a .git folder inside.
[yaffs-website] / node_modules / min-document / serialize.js
1 module.exports = serializeNode
2
3 var voidElements = ["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];
4
5 function serializeNode(node) {
6     switch (node.nodeType) {
7         case 3:
8             return escapeText(node.data)
9         case 8:
10             return "<!--" + node.data + "-->"
11         default:
12             return serializeElement(node)
13     }
14 }
15
16 function serializeElement(elem) {
17     var strings = []
18
19     var tagname = elem.tagName
20
21     if (elem.namespaceURI === "http://www.w3.org/1999/xhtml") {
22         tagname = tagname.toLowerCase()
23     }
24
25     strings.push("<" + tagname + properties(elem) + datasetify(elem))
26
27     if (voidElements.indexOf(tagname) > -1) {
28         strings.push(" />")
29     } else {
30         strings.push(">")
31
32         if (elem.childNodes.length) {
33             strings.push.apply(strings, elem.childNodes.map(serializeNode))
34         } else if (elem.textContent || elem.innerText) {
35             strings.push(escapeText(elem.textContent || elem.innerText))
36         } else if (elem.innerHTML) {
37             strings.push(elem.innerHTML)
38         }
39
40         strings.push("</" + tagname + ">")
41     }
42
43     return strings.join("")
44 }
45
46 function isProperty(elem, key) {
47     var type = typeof elem[key]
48
49     if (key === "style" && Object.keys(elem.style).length > 0) {
50       return true
51     }
52
53     return elem.hasOwnProperty(key) &&
54         (type === "string" || type === "boolean" || type === "number") &&
55         key !== "nodeName" && key !== "className" && key !== "tagName" &&
56         key !== "textContent" && key !== "innerText" && key !== "namespaceURI" &&  key !== "innerHTML"
57 }
58
59 function stylify(styles) {
60     if (typeof styles === 'string') return styles
61     var attr = ""
62     Object.keys(styles).forEach(function (key) {
63         var value = styles[key]
64         key = key.replace(/[A-Z]/g, function(c) {
65             return "-" + c.toLowerCase();
66         })
67         attr += key + ":" + value + ";"
68     })
69     return attr
70 }
71
72 function datasetify(elem) {
73     var ds = elem.dataset
74     var props = []
75
76     for (var key in ds) {
77         props.push({ name: "data-" + key, value: ds[key] })
78     }
79
80     return props.length ? stringify(props) : ""
81 }
82
83 function stringify(list) {
84     var attributes = []
85     list.forEach(function (tuple) {
86         var name = tuple.name
87         var value = tuple.value
88
89         if (name === "style") {
90             value = stylify(value)
91         }
92
93         attributes.push(name + "=" + "\"" + escapeAttributeValue(value) + "\"")
94     })
95
96     return attributes.length ? " " + attributes.join(" ") : ""
97 }
98
99 function properties(elem) {
100     var props = []
101     for (var key in elem) {
102         if (isProperty(elem, key)) {
103             props.push({ name: key, value: elem[key] })
104         }
105     }
106
107     for (var ns in elem._attributes) {
108       for (var attribute in elem._attributes[ns]) {
109         var prop = elem._attributes[ns][attribute]
110         var name = (prop.prefix ? prop.prefix + ":" : "") + attribute
111         props.push({ name: name, value: prop.value })
112       }
113     }
114
115     if (elem.className) {
116         props.push({ name: "class", value: elem.className })
117     }
118
119     return props.length ? stringify(props) : ""
120 }
121
122 function escapeText(s) {
123     var str = '';
124
125     if (typeof(s) === 'string') { 
126         str = s; 
127     } else if (s) {
128         str = s.toString();
129     }
130
131     return str
132         .replace(/&/g, "&amp;")
133         .replace(/</g, "&lt;")
134         .replace(/>/g, "&gt;")
135 }
136
137 function escapeAttributeValue(str) {
138     return escapeText(str).replace(/"/g, "&quot;")
139 }