all files / src/js/base/module/ AutoReplace.js

36% Statements 18/50
8.33% Branches 2/24
27.27% Functions 3/11
36.73% Lines 18/49
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85   97× 96× 96×   96× 96×   96×                       98×                                                                                                          
import lists from '../core/lists';
import dom from '../core/dom';
import key from '../core/key';
 
export default class AutoReplace {
  constructor(context) {
    this.context = context;
    this.options = context.options.replace || {};
 
    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];
    this.previousKeydownCode = null;
 
    this.events = {
      'summernote.keyup': (we, e) => {
        if (!e.isDefaultPrevented()) {
          this.handleKeyup(e);
        }
      },
      'summernote.keydown': (we, e) => {
        this.handleKeydown(e);
      },
    };
  }
 
  shouldInitialize() {
    return !!this.options.match;
  }
 
  initialize() {
    this.lastWord = null;
  }
 
  destroy() {
    this.lastWord = null;
  }
 
  replace() {
    if (!this.lastWord) {
      return;
    }
 
    const self = this;
    const keyword = this.lastWord.toString();
    this.options.match(keyword, function(match) {
      if (match) {
        let node = '';
 
        if (typeof match === 'string') {
          node = dom.createText(match);
        } else if (match instanceof jQuery) {
          node = match[0];
        } else if (match instanceof Node) {
          node = match;
        }
 
        if (!node) return;
        self.lastWord.insertNode(node);
        self.lastWord = null;
        self.context.invoke('editor.focus');
      }
    });
  }
 
  handleKeydown(e) {
    // this forces it to remember the last whole word, even if multiple termination keys are pressed
    // before the previous key is let go.
    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
      this.previousKeydownCode = e.keyCode;
      return;
    }
 
    if (lists.contains(this.keys, e.keyCode)) {
      const wordRange = this.context.invoke('editor.createRange').getWordRange();
      this.lastWord = wordRange;
    }
    this.previousKeydownCode = e.keyCode;
  }
 
  handleKeyup(e) {
    if (lists.contains(this.keys, e.keyCode)) {
      this.replace();
    }
  }
}