a post-component library for building user-interfaces on the web.
at main 49 lines 1.2 kB view raw
1import { assert } from '../shared.ts' 2 3export interface Span { 4 readonly _start: Node 5 readonly _end: Node 6} 7 8export function create_span_into(parent: Node): Span { 9 return { _start: parent.appendChild(new Text()), _end: parent.appendChild(new Text()) } 10} 11 12export function create_span_after(node: Node): Span { 13 assert(node.parentNode !== null) 14 15 return { 16 _start: node.parentNode.insertBefore(new Text(), node.nextSibling), 17 _end: node.parentNode.insertBefore(new Text(), node.nextSibling!.nextSibling), 18 } 19} 20 21export function insert_node(span: Span, node: Node): void { 22 span._end.parentNode!.insertBefore(node, span._end) 23} 24 25export function extract_contents(span: Span): DocumentFragment { 26 const fragment = document.createDocumentFragment() 27 28 let node = span._start.nextSibling 29 for (;;) { 30 assert(node) 31 if (node === span._end) break 32 const next = node.nextSibling 33 fragment.appendChild(node) 34 node = next 35 } 36 37 return fragment 38} 39 40export function delete_contents(span: Span): void { 41 let node = span._start.nextSibling 42 for (;;) { 43 assert(node) 44 if (node === span._end) break 45 const next = node.nextSibling 46 node.remove() 47 node = next 48 } 49}