MCPcopy Create free account
hub / github.com/editablejs/editable / toEditorRange

Function toEditorRange

packages/editor/src/plugin/editable.ts:1008–1087  ·  view source on GitHub ↗

* Find a Editor range from a DOM range or selection.

(
    editor: Editor,
    domRange: DOMRange | DOMStaticRange | DOMSelection,
    options: {
      exactMatch: T
      suppressThrow: T
    },
  )

Source from the content-addressed store, hash-verified

1006 * Find a Editor range from a DOM range or selection.
1007 */
1008 toEditorRange<T extends boolean>(
1009 editor: Editor,
1010 domRange: DOMRange | DOMStaticRange | DOMSelection,
1011 options: {
1012 exactMatch: T
1013 suppressThrow: T
1014 },
1015 ): T extends true ? Range | null : Range {
1016 const { exactMatch, suppressThrow } = options
1017 const el = isDOMSelection(domRange) ? domRange.anchorNode : domRange.startContainer
1018 let anchorNode
1019 let anchorOffset
1020 let focusNode
1021 let focusOffset
1022 let isCollapsed
1023
1024 if (el) {
1025 if (isDOMSelection(domRange)) {
1026 anchorNode = domRange.anchorNode
1027 anchorOffset = domRange.anchorOffset
1028 focusNode = domRange.focusNode
1029 focusOffset = domRange.focusOffset
1030 // COMPAT: There's a bug in chrome that always returns `true` for
1031 // `isCollapsed` for a Selection that comes from a ShadowRoot.
1032 // (2020/08/08)
1033 // https://bugs.chromium.org/p/chromium/issues/detail?id=447523
1034 if (IS_CHROME && hasShadowRoot()) {
1035 isCollapsed =
1036 domRange.anchorNode === domRange.focusNode &&
1037 domRange.anchorOffset === domRange.focusOffset
1038 } else {
1039 isCollapsed = domRange.isCollapsed
1040 }
1041 } else {
1042 anchorNode = domRange.startContainer
1043 anchorOffset = domRange.startOffset
1044 focusNode = domRange.endContainer
1045 focusOffset = domRange.endOffset
1046 isCollapsed = domRange.collapsed
1047 }
1048 }
1049
1050 if (anchorNode == null || focusNode == null || anchorOffset == null || focusOffset == null) {
1051 throw new Error(`Cannot resolve a Editor range from DOM range: ${domRange}`)
1052 }
1053
1054 const anchor = Editable.toEditorPoint(editor, [anchorNode, anchorOffset], {
1055 exactMatch,
1056 suppressThrow,
1057 })
1058 if (!anchor) {
1059 return null as T extends true ? Range | null : Range
1060 }
1061
1062 const focus = isCollapsed
1063 ? anchor
1064 : Editable.toEditorPoint(editor, [focusNode, focusOffset], {
1065 exactMatch,

Callers

nothing calls this directly

Calls 3

isDOMSelectionFunction · 0.90
hasShadowRootFunction · 0.90
isDOMElementFunction · 0.90

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…