# all files / src/js/base/editing/ Typing.js

72.5% Statements 29/40
63.16% Branches 12/19
80% Functions 4/5
72.5% Lines 29/40

    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
    86
    87
    88
    89
    90
    911×
    1×
    1×
    1×

    1×
    1×

    91×

    1×
    1×
    1×
    1×

    1×
    1×

    1×
    2×

    2×

    2×

    2×

    2×

    2×

    2×

    2×

    2×

    2×
    2×

    2×

    2×

    2×

    1×
     import $ from 'jquery';
    import dom from '../core/dom';
    import range from '../core/range';
    import Bullet from '../editing/Bullet';

    /**
     * @class editing.Typing
     *
     * Typing
     *
     */
    export default class Typing {
      constructor() {
        // a Bullet instance to toggle lists off
        this.bullet = new Bullet();
      }

      /**
       * insert tab
       *
       * @param {WrappedRange} rng
       * @param {Number} tabsize
       */
      insertTab(rng, tabsize) {
        const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
        rng = rng.deleteContents();
        rng.insertNode(tab, true);

        rng = range.create(tab, tabsize);
        rng.select();
      }

      /**
       * insert paragraph
       */
      insertParagraph(editable) {
        let rng = range.create(editable);

        // deleteContents on range.
        rng = rng.deleteContents();

        // Wrap range if it needs to be wrapped by paragraph
        rng = rng.wrapBodyInlineWithPara();

        // finding paragraph
        const splitRoot = dom.ancestor(rng.sc, dom.isPara);

        let nextPara;
        // on paragraph: split paragraph
        Eif (splitRoot) {
          // if it is an empty line with li
          Iif (dom.isEmpty(splitRoot) && dom.isLi(splitRoot)) {
            // toogle UL/OL and escape
            this.bullet.toggleList(splitRoot.parentNode.nodeName);
            return;
          // if it is an empty line with para on blockquote
          } else Iif (dom.isEmpty(splitRoot) && dom.isPara(splitRoot) && dom.isBlockquote(splitRoot.parentNode)) {
            // escape blockquote
            dom.insertAfter(splitRoot, splitRoot.parentNode);
            nextPara = splitRoot;
          // if new line has content (not a line break)
          } else {
            nextPara = dom.splitTree(splitRoot, rng.getStartPoint());

            let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));

            $.each(emptyAnchors, (idx, anchor) => {
              dom.remove(anchor);
            });

            // replace empty heading, pre or custom-made styleTag with P tag
            Iif ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
              nextPara = dom.replace(nextPara, 'p');
            }
          }
        // no paragraph: insert empty paragraph
        } else {
          const next = rng.sc.childNodes[rng.so];
          nextPara = $(dom.emptyPara)[0];
          if (next) {
            rng.sc.insertBefore(nextPara, next);
          } else {
            rng.sc.appendChild(nextPara);
          }
        }

        range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
      }
    }