export default function (Quill) {
|
const Parchment = Quill.import('parchment')
|
const Container = Quill.import('blots/container')
|
const ListItem = Quill.import('formats/list/item')
|
|
class List extends Container {
|
static create (value) {
|
const tagName = value === 'ordered' ? 'OL' : 'UL'
|
const 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
|
const format = this.statics.formats(domNode)
|
const blot = Parchment.find(e.target)
|
if (format === 'checked') {
|
blot.format('list', 'unchecked')
|
} else if (format === 'unchecked') {
|
blot.format('list', 'checked')
|
}
|
}
|
|
domNode.addEventListener('click', 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 {
|
const index = ref == null ? this.length() : ref.offset(this)
|
const after = this.split(index)
|
after.parent.insertBefore(blot, after)
|
}
|
}
|
|
optimize (context) {
|
super.optimize(context)
|
const 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) {
|
const 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]
|
|
return {
|
'formats/list': List
|
}
|
}
|