| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | import extend from 'extend';import Delta from 'quill-delta';import Parchment from 'parchment';import Break from './break';import Inline from './inline';import TextBlot from './text';const NEWLINE_LENGTH = 1;class BlockEmbed extends Parchment.Embed {  attach() {    super.attach();    this.attributes = new Parchment.Attributor.Store(this.domNode);  }  delta() {    return new Delta().insert(this.value(), extend(this.formats(), this.attributes.values()));  }  format(name, value) {    let attribute = Parchment.query(name, Parchment.Scope.BLOCK_ATTRIBUTE);    if (attribute != null) {      this.attributes.attribute(attribute, value);    }  }  formatAt(index, length, name, value) {    this.format(name, value);  }  insertAt(index, value, def) {    if (typeof value === 'string' && value.endsWith('\n')) {      let block = Parchment.create(Block.blotName);      this.parent.insertBefore(block, index === 0 ? this : this.next);      block.insertAt(0, value.slice(0, -1));    } else {      super.insertAt(index, value, def);    }  }}BlockEmbed.scope = Parchment.Scope.BLOCK_BLOT;// It is important for cursor behavior BlockEmbeds use tags that are block level elementsclass Block extends Parchment.Block {  constructor(domNode) {    super(domNode);    this.cache = {};  }  delta() {    if (this.cache.delta == null) {      this.cache.delta = this.descendants(Parchment.Leaf).reduce((delta, leaf) => {        if (leaf.length() === 0) {          return delta;        } else {          return delta.insert(leaf.value(), bubbleFormats(leaf));        }      }, new Delta()).insert('\n', bubbleFormats(this));    }    return this.cache.delta;  }  deleteAt(index, length) {    super.deleteAt(index, length);    this.cache = {};  }  formatAt(index, length, name, value) {    if (length <= 0) return;    if (Parchment.query(name, Parchment.Scope.BLOCK)) {      if (index + length === this.length()) {        this.format(name, value);      }    } else {      super.formatAt(index, Math.min(length, this.length() - index - 1), name, value);    }    this.cache = {};  }  insertAt(index, value, def) {    if (def != null) return super.insertAt(index, value, def);    if (value.length === 0) return;    let lines = value.split('\n');    let text = lines.shift();    if (text.length > 0) {      if (index < this.length() - 1 || this.children.tail == null) {        super.insertAt(Math.min(index, this.length() - 1), text);      } else {        this.children.tail.insertAt(this.children.tail.length(), text);      }      this.cache = {};    }    let block = this;    lines.reduce(function(index, line) {      block = block.split(index, true);      block.insertAt(0, line);      return line.length;    }, index + text.length);  }  insertBefore(blot, ref) {    let head = this.children.head;    super.insertBefore(blot, ref);    if (head instanceof Break) {      head.remove();    }    this.cache = {};  }  length() {    if (this.cache.length == null) {      this.cache.length = super.length() + NEWLINE_LENGTH;    }    return this.cache.length;  }  moveChildren(target, ref) {    super.moveChildren(target, ref);    this.cache = {};  }  optimize(context) {    super.optimize(context);    this.cache = {};  }  path(index) {    return super.path(index, true);  }  removeChild(child) {    super.removeChild(child);    this.cache = {};  }  split(index, force = false) {    if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {      let clone = this.clone();      if (index === 0) {        this.parent.insertBefore(clone, this);        return this;      } else {        this.parent.insertBefore(clone, this.next);        return clone;      }    } else {      let next = super.split(index, force);      this.cache = {};      return next;    }  }}Block.blotName = 'block';Block.tagName = 'P';Block.defaultChild = 'break';Block.allowedChildren = [Inline, Parchment.Embed, TextBlot];function bubbleFormats(blot, formats = {}) {  if (blot == null) return formats;  if (typeof blot.formats === 'function') {    formats = extend(formats, blot.formats());  }  if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {    return formats;  }  return bubbleFormats(blot.parent, formats);}export { bubbleFormats, BlockEmbed, Block as default };
 |