selection.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copied from https://stackoverflow.com/a/20336116
  2. const isDescendant=(parent, child)=> {
  3. // from http://stackoverflow.com/questions/2234979/how-to-check-in-javascript-if-one-element-is-a-child-of-another
  4. let node = child;
  5. while (node != null) {
  6. if (node == parent) {
  7. return true;
  8. }
  9. node = node.parentNode;
  10. }
  11. return false;
  12. }
  13. const getNodesBetween=(rootNode, node1, node2)=> {
  14. const resultNodes = [];
  15. let isBetweenNodes = false;
  16. for (let i = 0; i < rootNode.childNodes.length; i+= 1) {
  17. if (isDescendant(rootNode.childNodes[i], node1) || isDescendant(rootNode.childNodes[i], node2)) {
  18. if (resultNodes.length == 0) {
  19. isBetweenNodes = true;
  20. } else {
  21. isBetweenNodes = false;
  22. }
  23. resultNodes.push(rootNode.childNodes[i]);
  24. } else if (resultNodes.length == 0) {
  25. } else if (isBetweenNodes) {
  26. resultNodes.push(rootNode.childNodes[i]);
  27. } else {
  28. return resultNodes;
  29. }
  30. };
  31. if (resultNodes.length == 0) {
  32. return [rootNode];
  33. } else if (isDescendant(resultNodes[resultNodes.length - 1], node1) || isDescendant(resultNodes[resultNodes.length - 1], node2)) {
  34. return resultNodes;
  35. } else {
  36. // same child node for both should never happen
  37. return [resultNodes[0]];
  38. }
  39. }
  40. export const getSelectedNodes = (selectionAncestor, startNode)=> {
  41. // from https://developer.mozilla.org/en-US/docs/Web/API/Selection
  42. let selection = null;
  43. if(window.getSelection){
  44. selection = window.getSelection();
  45. } else if(document.selection){
  46. selection = document.selection;
  47. }
  48. if(selection) {
  49. if (selection.isCollapsed) {
  50. return [];
  51. };
  52. const node2 = selection.focusNode;
  53. return getNodesBetween(selectionAncestor, startNode, node2);
  54. }
  55. };
  56. export const clearSelection = ()=> {
  57. let selection = null;
  58. if(window.getSelection){
  59. selection = window.getSelection();
  60. } else if(document.selection){
  61. selection = document.selection;
  62. }
  63. if(selection){
  64. if(selection.empty){
  65. selection.empty();
  66. }
  67. if(selection.removeAllRanges){
  68. selection.removeAllRanges();
  69. }
  70. }
  71. }