OLD | NEW |
1 <script> | 1 <script> |
2 const kEntityMap = new Map([ | 2 const kEntityMap = new Map([ |
3 ['\u00a0', ' '], | 3 ['\u00a0', ' '], |
4 ['&', '&'], | 4 ['&', '&'], |
5 ['<', '<'], | 5 ['<', '<'], |
6 ['>', '>'], | 6 ['>', '>'], |
7 ['"', '"'], | 7 ['"', '"'], |
8 ]); | 8 ]); |
9 | 9 |
10 const kTextEscapePattern = /&|<|>|"|\u00a0/g; | 10 const kTextEscapePattern = /&|<|>|"|\u00a0/g; |
11 const kAttributeEscapePattern = /&|>|"|\u00a0/g; | 11 const kAttributeEscapePattern = /&|>|"|\u00a0/g; |
| 12 const kIndent = ' '; |
12 | 13 |
13 function escapeText(value, pattern) { | 14 function escapeText(value, pattern) { |
14 return (value || '').replace(pattern, function(match) { | 15 return (value || '').replace(pattern, function(match) { |
15 return kEntityMap.get(match); | 16 return kEntityMap.get(match); |
16 }); | 17 }); |
17 } | 18 } |
18 | 19 |
19 function serializeAttributes(element) { | 20 function serializeAttributes(element) { |
20 var buffer = ""; | 21 var buffer = ''; |
21 var attributes = element.getAttributes(); | 22 var attributes = element.getAttributes(); |
22 | 23 |
23 for (var i = 0; i < attributes.length; ++i) { | 24 for (var i = 0; i < attributes.length; ++i) { |
24 var attribute = attributes[i]; | 25 var attribute = attributes[i]; |
25 buffer += ' '; | 26 buffer += ' '; |
26 buffer += attribute.name; | 27 buffer += attribute.name; |
27 buffer += '="'; | 28 buffer += '="'; |
28 buffer += escapeText(attribute.value, kAttributeEscapePattern); | 29 buffer += escapeText(attribute.value, kAttributeEscapePattern); |
29 buffer += '"'; | 30 buffer += '"'; |
30 } | 31 } |
31 | 32 |
32 return buffer; | 33 return buffer; |
33 } | 34 } |
34 | 35 |
35 function getFirstChild(element) { | 36 function getFirstChild(node) { |
36 if (element.tagName === 'template') | 37 if (node.localName === 'template') |
37 return element.content.firstChild; | 38 return node.content.firstChild; |
38 return element.firstChild; | 39 return node.firstChild; |
39 } | 40 } |
40 | 41 |
41 function serializeElementChildren(element) { | 42 function getLastChild(node) { |
42 if (element.tagName == "script" || element.tagName == "style") | 43 if (node.localName === 'template') |
43 return element.textContent; | 44 return node.content.lastChild; |
44 return serializeChildren(getFirstChild(element)); | 45 return node.lastChild; |
45 } | 46 } |
46 | 47 |
47 function serializeChildren(firstChild) { | 48 function serializeChildren(node, depth) { |
48 var buffer = ""; | 49 var buffer = ''; |
49 for (var child = firstChild; child; child = child.nextSibling) | 50 var firstChild = getFirstChild(node); |
50 buffer += serializeNode(child); | 51 var lastChild = getLastChild(node); |
| 52 if (firstChild instanceof Element && depth) |
| 53 buffer += '\n' + kIndent.repeat(depth); |
| 54 for (var child = firstChild; child; child = child.nextSibling) { |
| 55 buffer += serializeNode(child, depth); |
| 56 if (child instanceof Element && child.nextSibling instanceof Element) |
| 57 buffer += '\n' + kIndent.repeat(depth); |
| 58 } |
| 59 if (lastChild instanceof Element) { |
| 60 buffer += '\n'; |
| 61 if (depth) |
| 62 buffer += kIndent.repeat(depth - 1); |
| 63 } |
51 return buffer; | 64 return buffer; |
52 } | 65 } |
53 | 66 |
54 function serializeElement(element) { | 67 function serializeElement(element, depth) { |
55 var buffer = '<' + element.tagName + serializeAttributes(element) + '>'; | 68 var buffer = '<' + element.tagName + serializeAttributes(element) + '>'; |
56 buffer += serializeElementChildren(element); | 69 buffer += serializeChildren(element, depth + 1); |
57 buffer += '</' + element.tagName + '>'; | 70 buffer += '</' + element.tagName + '>'; |
58 return buffer; | 71 return buffer; |
59 } | 72 } |
60 | 73 |
61 function serializeNode(node) { | 74 function serializeText(node) { |
| 75 var parent = node.parentNode; |
| 76 if (parent && (parent.tagName == 'script' || parent.tagName == 'style')) |
| 77 return node.data; |
| 78 return escapeText(node.data, kTextEscapePattern); |
| 79 } |
| 80 |
| 81 function serializeNode(node, depth) { |
62 if (node instanceof Text) | 82 if (node instanceof Text) |
63 return escapeText(node.data, kTextEscapePattern); | 83 return serializeText(node); |
64 if (node instanceof Element) | 84 if (node instanceof Element) |
65 return serializeElement(node); | 85 return serializeElement(node, depth || 0); |
66 if (node instanceof Document || node instanceof ShadowRoot) | 86 if (node instanceof Document || node instanceof ShadowRoot) |
67 return serializeChildren(node.firstChild); | 87 return serializeChildren(node, depth || 0); |
68 throw new Error("Cannot serialize node"); | 88 throw new Error('Cannot serialize node'); |
69 } | 89 } |
70 | 90 |
71 module.exports = { | 91 module.exports = { |
72 serializeNode: serializeNode, | 92 serializeNode: serializeNode, |
73 }; | 93 }; |
74 </script> | 94 </script> |
OLD | NEW |