package.src.util.dom.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of codemirror Show documentation
Show all versions of codemirror Show documentation
Basic configuration for the CodeMirror code editor
The newest version!
import { ie, ios } from "./browser.js"
export function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
export let rmClass = function(node, cls) {
let current = node.className
let match = classTest(cls).exec(current)
if (match) {
let after = current.slice(match.index + match[0].length)
node.className = current.slice(0, match.index) + (after ? match[1] + after : "")
}
}
export function removeChildren(e) {
for (let count = e.childNodes.length; count > 0; --count)
e.removeChild(e.firstChild)
return e
}
export function removeChildrenAndAdd(parent, e) {
return removeChildren(parent).appendChild(e)
}
export function elt(tag, content, className, style) {
let e = document.createElement(tag)
if (className) e.className = className
if (style) e.style.cssText = style
if (typeof content == "string") e.appendChild(document.createTextNode(content))
else if (content) for (let i = 0; i < content.length; ++i) e.appendChild(content[i])
return e
}
// wrapper for elt, which removes the elt from the accessibility tree
export function eltP(tag, content, className, style) {
let e = elt(tag, content, className, style)
e.setAttribute("role", "presentation")
return e
}
export let range
if (document.createRange) range = function(node, start, end, endNode) {
let r = document.createRange()
r.setEnd(endNode || node, end)
r.setStart(node, start)
return r
}
else range = function(node, start, end) {
let r = document.body.createTextRange()
try { r.moveToElementText(node.parentNode) }
catch(e) { return r }
r.collapse(true)
r.moveEnd("character", end)
r.moveStart("character", start)
return r
}
export function contains(parent, child) {
if (child.nodeType == 3) // Android browser always returns false when child is a textnode
child = child.parentNode
if (parent.contains)
return parent.contains(child)
do {
if (child.nodeType == 11) child = child.host
if (child == parent) return true
} while (child = child.parentNode)
}
export function activeElt(doc) {
// IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
// IE < 10 will throw when accessed while the page is loading or in an iframe.
// IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
let activeElement
try {
activeElement = doc.activeElement
} catch(e) {
activeElement = doc.body || null
}
while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
activeElement = activeElement.shadowRoot.activeElement
return activeElement
}
export function addClass(node, cls) {
let current = node.className
if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls
}
export function joinClasses(a, b) {
let as = a.split(" ")
for (let i = 0; i < as.length; i++)
if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i]
return b
}
export let selectInput = function(node) { node.select() }
if (ios) // Mobile Safari apparently has a bug where select() is broken.
selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length }
else if (ie) // Suppress mysterious IE10 errors
selectInput = function(node) { try { node.select() } catch(_e) {} }
export function doc(cm) { return cm.display.wrapper.ownerDocument }
export function win(cm) { return doc(cm).defaultView }
© 2015 - 2025 Weber Informatics LLC | Privacy Policy