(element: Element)
| 299 | } |
| 300 | |
| 301 | function getTextContent(element: Element) { |
| 302 | // Manually walk over text nodes inside the element and concatenate them. |
| 303 | // This is like element.textContent except we skip anything inside an element with data-no-copy. |
| 304 | let result = ''; |
| 305 | let walker = document.createTreeWalker( |
| 306 | element, |
| 307 | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, |
| 308 | node => { |
| 309 | if (node.nodeType === Node.ELEMENT_NODE && (node as Element).hasAttribute('data-no-copy')) { |
| 310 | result += '\n'; |
| 311 | return NodeFilter.FILTER_REJECT; |
| 312 | } |
| 313 | return node.nodeType === Node.TEXT_NODE ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; |
| 314 | } |
| 315 | ); |
| 316 | |
| 317 | let node = walker.nextNode(); |
| 318 | while (node) { |
| 319 | result += node.nodeValue || ''; |
| 320 | node = walker.nextNode(); |
| 321 | } |
| 322 | return result; |
| 323 | } |
| 324 | |
| 325 | function getExampleCode(codeRef: RefObject<HTMLDivElement | null>, urls: {[name: string]: string}) { |
| 326 | let code = getTextContent(codeRef.current!.querySelector('pre')!); |
no test coverage detected