Search code examples
reactjswysiwygslate.js

Expanding selection to the current word with SlateJS


With Slatejs (v0.47) how do I expand the current selection (starting off collapsed) to encompass the current word?

So (assuming [] indicates the current section)

If I start of with

this is some te[]xt

How do I programmatically expand the selection to

this is some [text]

?


Solution

  • Eventually got this working.

    export const word_selection = (editor) => {
      const {value} = editor
      const {selection, startText} = value
      const {start, isExpanded} = selection
    
      if (isExpanded) {
        return value.fragment.text
      }
      const {text} = startText
      const {offset} = start
      let left = text.slice(0, offset).search(/\S+$/)
      if (left === -1) {
        // character before the cursor is a space, selection starts at the cursor
        left = offset
      }
      let right = text.slice(offset).search(/\s/)
      if (right < 0) {
        // character after teh cursor is a space, selection ends at the cursor
        right = text.length
      } else {
        right = right + offset
      }
      if (left === right) {
        // nothing to select
        return ''
      }
      editor.moveAnchorBackward(offset - left).moveFocusForward(right - offset)
      return value.fragment.text
    }