mirror of
https://github.com/logseq/logseq.git
synced 2026-05-01 17:36:33 +00:00
76 lines
2.1 KiB
JavaScript
76 lines
2.1 KiB
JavaScript
// Copied from https://stackoverflow.com/a/20336116
|
|
const isDescendant=(parent, child)=> {
|
|
// from http://stackoverflow.com/questions/2234979/how-to-check-in-javascript-if-one-element-is-a-child-of-another
|
|
let node = child;
|
|
while (node != null) {
|
|
if (node == parent) {
|
|
return true;
|
|
}
|
|
node = node.parentNode;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const getNodesBetween=(rootNode, node1, node2)=> {
|
|
const resultNodes = [];
|
|
let isBetweenNodes = false;
|
|
for (let i = 0; i < rootNode.childNodes.length; i+= 1) {
|
|
if (isDescendant(rootNode.childNodes[i], node1) || isDescendant(rootNode.childNodes[i], node2)) {
|
|
if (resultNodes.length == 0) {
|
|
isBetweenNodes = true;
|
|
} else {
|
|
isBetweenNodes = false;
|
|
}
|
|
resultNodes.push(rootNode.childNodes[i]);
|
|
} else if (resultNodes.length == 0) {
|
|
} else if (isBetweenNodes) {
|
|
resultNodes.push(rootNode.childNodes[i]);
|
|
} else {
|
|
return resultNodes;
|
|
}
|
|
};
|
|
if (resultNodes.length == 0) {
|
|
return [rootNode];
|
|
} else if (isDescendant(resultNodes[resultNodes.length - 1], node1) || isDescendant(resultNodes[resultNodes.length - 1], node2)) {
|
|
return resultNodes;
|
|
} else {
|
|
// same child node for both should never happen
|
|
return [resultNodes[0]];
|
|
}
|
|
}
|
|
|
|
export const getSelectedNodes = (selectionAncestor, startNode)=> {
|
|
// from https://developer.mozilla.org/en-US/docs/Web/API/Selection
|
|
let selection = null;
|
|
if(window.getSelection){
|
|
selection = window.getSelection();
|
|
} else if(document.selection){
|
|
selection = document.selection;
|
|
}
|
|
|
|
if(selection) {
|
|
if (selection.isCollapsed) {
|
|
return [];
|
|
};
|
|
const node2 = selection.focusNode;
|
|
return getNodesBetween(selectionAncestor, startNode, node2);
|
|
}
|
|
};
|
|
|
|
export const clearSelection = ()=> {
|
|
let selection = null;
|
|
if(window.getSelection){
|
|
selection = window.getSelection();
|
|
} else if(document.selection){
|
|
selection = document.selection;
|
|
}
|
|
if(selection){
|
|
if(selection.empty){
|
|
selection.empty();
|
|
}
|
|
if(selection.removeAllRanges){
|
|
selection.removeAllRanges();
|
|
}
|
|
}
|
|
}
|