123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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};
|