a post-component library for building user-interfaces on the web.
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}