{"ScriptPreparationCode":"const NEWLINE = \u0027\\n\u0027;\r\n\r\nfunction isBlockElement(node) {\r\n return (node.nodeType === Node.ELEMENT_NODE \u0026\u0026\r\n getComputedStyle(node).display === \u0027block\u0027);\r\n}\r\nconst walkers = new WeakMap();\r\n\r\nfunction getOrCreateWalker(node) {\r\n let walker = walkers.get(node);\r\n if (!walker) {\r\n walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT);\r\n walkers.set(node, walker);\r\n }\r\n walker.currentNode = node;\r\n return walker;\r\n}\r\n\r\nfunction getContent1(rootNode) {\r\n let content = \u0022\u0022;\r\n const walker = getOrCreateWalker(rootNode);\r\n const seen = new Set([rootNode]);\r\n for (let currentNode = walker.firstChild(); currentNode !== null;) {\r\n while (!seen.has(currentNode) \u0026\u0026 walker.firstChild() !== null) {\r\n seen.add(currentNode);\r\n currentNode = walker.currentNode;\r\n if (content \u0026\u0026\r\n !content.endsWith(NEWLINE) \u0026\u0026\r\n isBlockElement(currentNode)) {\r\n content \u002B= NEWLINE;\r\n }\r\n }\r\n if (currentNode.nodeType === Node.TEXT_NODE) {\r\n const data = currentNode.data;\r\n content \u002B= data;\r\n } else {\r\n if (currentNode.tagName === \u0022BR\u0022) {\r\n content \u002B= NEWLINE;\r\n }\r\n }\r\n if (walker.nextSibling() === null) {\r\n if (!content.endsWith(NEWLINE) \u0026\u0026 isBlockElement(currentNode)) {\r\n content \u002B= NEWLINE;\r\n }\r\n currentNode = walker.parentNode();\r\n } else {\r\n currentNode = walker.currentNode;\r\n }\r\n }\r\n return content;\r\n}\r\n\r\nfunction getContent2(node) {\r\n switch (node.nodeType) {\r\n case Node.TEXT_NODE:\r\n return node.data;\r\n case Node.ELEMENT_NODE: {\r\n if (node.nodeName === \u0027BR\u0027) {\r\n return NEWLINE;\r\n }\r\n let result = \u0027\u0027;\r\n for (let child = node.firstChild; child !== null; child = child.nextSibling) {\r\n if (result \u0026\u0026 !result.endsWith(NEWLINE) \u0026\u0026 isBlockElement(child)) {\r\n result \u002B= NEWLINE;\r\n }\r\n const content = getContent2(child);\r\n result \u002B= content;\r\n }\r\n if (!result.endsWith(NEWLINE) \u0026\u0026 isBlockElement(node)) {\r\n result \u002B= NEWLINE;\r\n }\r\n return result;\r\n }\r\n default:\r\n return \u0027\u0027;\r\n }\r\n}\r\n\r\nvar div = document.createElement(\u0022div\u0022);\r\ndiv.innerHTML = \u0022\u003Cdiv\u003E\u003Cspan\u003EHello\u003C/span\u003E\u003Cbr\u003E\u003C/div\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cdiv\u003E\u003Cbr\u003E\u003Cspan\u003EW\u003C/span\u003Eo\u003Cspan\u003Er\u003C/span\u003El\u003Cspan\u003Ed\u003C/span\u003E\u003C/div\u003E\u0022;","TestCases":[{"Name":"Treewalker","Code":"getContent1(div);","IsDeferred":false},{"Name":"Recursion","Code":"getContent2(div);","IsDeferred":false}]}