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