# 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
    851×
    1×
    1×

    1×
    95×
    94×
    94×

    94×
    94×

    94×

    1×
    96×

    1×

    1×

    1×

    1×

    1×

    1×
     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();
        }
      }
    }