annotate .cms/lib/codemirror/src/util/dom.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { ie, ios } from "./browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 export function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 export let rmClass = function(node, cls) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 let current = node.className
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 let match = classTest(cls).exec(current)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 if (match) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 let after = current.slice(match.index + match[0].length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 node.className = current.slice(0, match.index) + (after ? match[1] + after : "")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 export function removeChildren(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 for (let count = e.childNodes.length; count > 0; --count)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 e.removeChild(e.firstChild)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 return e
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 export function removeChildrenAndAdd(parent, e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 return removeChildren(parent).appendChild(e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 export function elt(tag, content, className, style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 let e = document.createElement(tag)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 if (className) e.className = className
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 if (style) e.style.cssText = style
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 if (typeof content == "string") e.appendChild(document.createTextNode(content))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 else if (content) for (let i = 0; i < content.length; ++i) e.appendChild(content[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 return e
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 // wrapper for elt, which removes the elt from the accessibility tree
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 export function eltP(tag, content, className, style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 let e = elt(tag, content, className, style)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 e.setAttribute("role", "presentation")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 return e
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 export let range
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 if (document.createRange) range = function(node, start, end, endNode) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 let r = document.createRange()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 r.setEnd(endNode || node, end)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 r.setStart(node, start)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 return r
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 else range = function(node, start, end) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 let r = document.body.createTextRange()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 try { r.moveToElementText(node.parentNode) }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 catch(e) { return r }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 r.collapse(true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 r.moveEnd("character", end)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 r.moveStart("character", start)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 return r
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 export function contains(parent, child) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (child.nodeType == 3) // Android browser always returns false when child is a textnode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 child = child.parentNode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 if (parent.contains)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return parent.contains(child)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 do {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if (child.nodeType == 11) child = child.host
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (child == parent) return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 } while (child = child.parentNode)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 export function activeElt(rootNode) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 // IE < 10 will throw when accessed while the page is loading or in an iframe.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 let doc = rootNode.ownerDocument || rootNode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 let activeElement
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 try {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 activeElement = rootNode.activeElement
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 } catch(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 activeElement = doc.body || null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 activeElement = activeElement.shadowRoot.activeElement
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 return activeElement
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 export function addClass(node, cls) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 let current = node.className
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 export function joinClasses(a, b) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 let as = a.split(" ")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 for (let i = 0; i < as.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 return b
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 export let selectInput = function(node) { node.select() }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 if (ios) // Mobile Safari apparently has a bug where select() is broken.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 else if (ie) // Suppress mysterious IE10 errors
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 selectInput = function(node) { try { node.select() } catch(_e) {} }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 export function doc(cm) { return cm.display.wrapper.ownerDocument }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 export function root(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 return rootNode(cm.display.wrapper)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 export function rootNode(element) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 // Detect modern browsers (2017+).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return element.getRootNode ? element.getRootNode() : element.ownerDocument
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 export function win(cm) { return doc(cm).defaultView }