You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					82 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					82 lines
				
				2.1 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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};
							 |