123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import Parchment from 'parchment';
- import Block from '../blots/block';
- import Container from '../blots/container';
- class ListItem extends Block {
- static formats(domNode) {
- return domNode.tagName === this.tagName ? undefined : super.formats(domNode);
- }
- format(name, value) {
- if (name === List.blotName && !value) {
- this.replaceWith(Parchment.create(this.statics.scope));
- } else {
- super.format(name, value);
- }
- }
- remove() {
- if (this.prev == null && this.next == null) {
- this.parent.remove();
- } else {
- super.remove();
- }
- }
- replaceWith(name, value) {
- this.parent.isolate(this.offset(this.parent), this.length());
- if (name === this.parent.statics.blotName) {
- this.parent.replaceWith(name, value);
- return this;
- } else {
- this.parent.unwrap();
- return super.replaceWith(name, value);
- }
- }
- }
- ListItem.blotName = 'list-item';
- ListItem.tagName = 'LI';
- class List extends Container {
- static create(value) {
- let tagName = value === 'ordered' ? 'OL' : 'UL';
- let node = super.create(tagName);
- if (value === 'checked' || value === 'unchecked') {
- node.setAttribute('data-checked', value === 'checked');
- }
- return node;
- }
- static formats(domNode) {
- if (domNode.tagName === 'OL') return 'ordered';
- if (domNode.tagName === 'UL') {
- if (domNode.hasAttribute('data-checked')) {
- return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked';
- } else {
- return 'bullet';
- }
- }
- return undefined;
- }
- constructor(domNode) {
- super(domNode);
- const listEventHandler = (e) => {
- if (e.target.parentNode !== domNode) return;
- let format = this.statics.formats(domNode);
- let blot = Parchment.find(e.target);
- if (format === 'checked') {
- blot.format('list', 'unchecked');
- } else if(format === 'unchecked') {
- blot.format('list', 'checked');
- }
- }
- domNode.addEventListener('touchstart', listEventHandler);
- domNode.addEventListener('mousedown', listEventHandler);
- }
- format(name, value) {
- if (this.children.length > 0) {
- this.children.tail.format(name, value);
- }
- }
- formats() {
- // We don't inherit from FormatBlot
- return { [this.statics.blotName]: this.statics.formats(this.domNode) };
- }
- insertBefore(blot, ref) {
- if (blot instanceof ListItem) {
- super.insertBefore(blot, ref);
- } else {
- let index = ref == null ? this.length() : ref.offset(this);
- let after = this.split(index);
- after.parent.insertBefore(blot, after);
- }
- }
- optimize(context) {
- super.optimize(context);
- let next = this.next;
- if (next != null && next.prev === this &&
- next.statics.blotName === this.statics.blotName &&
- next.domNode.tagName === this.domNode.tagName &&
- next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) {
- next.moveChildren(this);
- next.remove();
- }
- }
- replace(target) {
- if (target.statics.blotName !== this.statics.blotName) {
- let item = Parchment.create(this.statics.defaultChild);
- target.moveChildren(item);
- this.appendChild(item);
- }
- super.replace(target);
- }
- }
- List.blotName = 'list';
- List.scope = Parchment.Scope.BLOCK_BLOT;
- List.tagName = ['OL', 'UL'];
- List.defaultChild = 'list-item';
- List.allowedChildren = [ListItem];
- export { ListItem, List as default };
|