import Parchment from 'parchment'; import Quill from '../core/quill'; import Module from '../core/module'; import CodeBlock from '../formats/code'; class SyntaxCodeBlock extends CodeBlock { replaceWith(block) { this.domNode.textContent = this.domNode.textContent; this.attach(); super.replaceWith(block); } highlight(highlight) { let text = this.domNode.textContent; if (this.cachedText !== text) { if (text.trim().length > 0 || this.cachedText == null) { this.domNode.innerHTML = highlight(text); this.domNode.normalize(); this.attach(); } this.cachedText = text; } } } SyntaxCodeBlock.className = 'ql-syntax'; let CodeToken = new Parchment.Attributor.Class('token', 'hljs', { scope: Parchment.Scope.INLINE }); class Syntax extends Module { static register() { Quill.register(CodeToken, true); Quill.register(SyntaxCodeBlock, true); } constructor(quill, options) { super(quill, options); if (typeof this.options.highlight !== 'function') { throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.'); } let timer = null; this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => { clearTimeout(timer); timer = setTimeout(() => { this.highlight(); timer = null; }, this.options.interval); }); this.highlight(); } highlight() { if (this.quill.selection.composing) return; this.quill.update(Quill.sources.USER); let range = this.quill.getSelection(); this.quill.scroll.descendants(SyntaxCodeBlock).forEach((code) => { code.highlight(this.options.highlight); }); this.quill.update(Quill.sources.SILENT); if (range != null) { this.quill.setSelection(range, Quill.sources.SILENT); } } } Syntax.DEFAULTS = { highlight: (function() { if (window.hljs == null) return null; return function(text) { let result = window.hljs.highlightAuto(text); return result.value; }; })(), interval: 1000 }; export { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default};