123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import Delta from 'quill-delta';
- import Parchment from 'parchment';
- import Block from '../blots/block';
- import Inline from '../blots/inline';
- import TextBlot from '../blots/text';
- class Code extends Inline {}
- Code.blotName = 'code';
- Code.tagName = 'CODE';
- class CodeBlock extends Block {
- static create(value) {
- let domNode = super.create(value);
- domNode.setAttribute('spellcheck', false);
- return domNode;
- }
- static formats() {
- return true;
- }
- delta() {
- let text = this.domNode.textContent;
- if (text.endsWith('\n')) { // Should always be true
- text = text.slice(0, -1);
- }
- return text.split('\n').reduce((delta, frag) => {
- return delta.insert(frag).insert('\n', this.formats());
- }, new Delta());
- }
- format(name, value) {
- if (name === this.statics.blotName && value) return;
- let [text, ] = this.descendant(TextBlot, this.length() - 1);
- if (text != null) {
- text.deleteAt(text.length() - 1, 1);
- }
- super.format(name, value);
- }
- formatAt(index, length, name, value) {
- if (length === 0) return;
- if (Parchment.query(name, Parchment.Scope.BLOCK) == null ||
- (name === this.statics.blotName && value === this.statics.formats(this.domNode))) {
- return;
- }
- let nextNewline = this.newlineIndex(index);
- if (nextNewline < 0 || nextNewline >= index + length) return;
- let prevNewline = this.newlineIndex(index, true) + 1;
- let isolateLength = nextNewline - prevNewline + 1;
- let blot = this.isolate(prevNewline, isolateLength);
- let next = blot.next;
- blot.format(name, value);
- if (next instanceof CodeBlock) {
- next.formatAt(0, index - prevNewline + length - isolateLength, name, value);
- }
- }
- insertAt(index, value, def) {
- if (def != null) return;
- let [text, offset] = this.descendant(TextBlot, index);
- text.insertAt(offset, value);
- }
- length() {
- let length = this.domNode.textContent.length;
- if (!this.domNode.textContent.endsWith('\n')) {
- return length + 1;
- }
- return length;
- }
- newlineIndex(searchIndex, reverse = false) {
- if (!reverse) {
- let offset = this.domNode.textContent.slice(searchIndex).indexOf('\n');
- return offset > -1 ? searchIndex + offset : -1;
- } else {
- return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\n');
- }
- }
- optimize(context) {
- if (!this.domNode.textContent.endsWith('\n')) {
- this.appendChild(Parchment.create('text', '\n'));
- }
- super.optimize(context);
- let next = this.next;
- if (next != null && next.prev === this &&
- next.statics.blotName === this.statics.blotName &&
- this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {
- next.optimize(context);
- next.moveChildren(this);
- next.remove();
- }
- }
- replace(target) {
- super.replace(target);
- [].slice.call(this.domNode.querySelectorAll('*')).forEach(function(node) {
- let blot = Parchment.find(node);
- if (blot == null) {
- node.parentNode.removeChild(node);
- } else if (blot instanceof Parchment.Embed) {
- blot.remove();
- } else {
- blot.unwrap();
- }
- });
- }
- }
- CodeBlock.blotName = 'code-block';
- CodeBlock.tagName = 'PRE';
- CodeBlock.TAB = ' ';
- export { Code, CodeBlock as default };
|