| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | import extend from 'extend';import Emitter from '../core/emitter';import BaseTheme, { BaseTooltip } from './base';import LinkBlot from '../formats/link';import { Range } from '../core/selection';import icons from '../ui/icons';const TOOLBAR_CONFIG = [  [{ header: ['1', '2', '3', false] }],  ['bold', 'italic', 'underline', 'link'],  [{ list: 'ordered' }, { list: 'bullet' }],  ['clean']];class SnowTheme extends BaseTheme {  constructor(quill, options) {    if (options.modules.toolbar != null && options.modules.toolbar.container == null) {      options.modules.toolbar.container = TOOLBAR_CONFIG;    }    super(quill, options);    this.quill.container.classList.add('ql-snow');  }  extendToolbar(toolbar) {    toolbar.container.classList.add('ql-snow');    this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), icons);    this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), icons);    this.tooltip = new SnowTooltip(this.quill, this.options.bounds);    if (toolbar.container.querySelector('.ql-link')) {      this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function(range, context) {        toolbar.handlers['link'].call(toolbar, !context.format.link);      });    }  }}SnowTheme.DEFAULTS = extend(true, {}, BaseTheme.DEFAULTS, {  modules: {    toolbar: {      handlers: {        link: function(value) {          if (value) {            let range = this.quill.getSelection();            if (range == null || range.length == 0) return;            let preview = this.quill.getText(range);            if (/^\S+@\S+\.\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) {              preview = 'mailto:' + preview;            }            let tooltip = this.quill.theme.tooltip;            tooltip.edit('link', preview);          } else {            this.quill.format('link', false);          }        }      }    }  }});class SnowTooltip extends BaseTooltip {  constructor(quill, bounds) {    super(quill, bounds);    this.preview = this.root.querySelector('a.ql-preview');  }  listen() {    super.listen();    this.root.querySelector('a.ql-action').addEventListener('click', (event) => {      if (this.root.classList.contains('ql-editing')) {        this.save();      } else {        this.edit('link', this.preview.textContent);      }      event.preventDefault();    });    this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {      if (this.linkRange != null) {        let range = this.linkRange;        this.restoreFocus();        this.quill.formatText(range, 'link', false, Emitter.sources.USER);        delete this.linkRange;      }      event.preventDefault();      this.hide();    });    this.quill.on(Emitter.events.SELECTION_CHANGE, (range, oldRange, source) => {      if (range == null) return;      if (range.length === 0 && source === Emitter.sources.USER) {        let [link, offset] = this.quill.scroll.descendant(LinkBlot, range.index);        if (link != null) {          this.linkRange = new Range(range.index - offset, link.length());          let preview = LinkBlot.formats(link.domNode);          this.preview.textContent = preview;          this.preview.setAttribute('href', preview);          this.show();          this.position(this.quill.getBounds(this.linkRange));          return;        }      } else {        delete this.linkRange;      }      this.hide();    });  }  show() {    super.show();    this.root.removeAttribute('data-mode');  }}SnowTooltip.TEMPLATE = [  '<a class="ql-preview" rel="noopener noreferrer" target="_blank" href="about:blank"></a>',  '<input type="text" data-formula="e=mc^2" data-link="https://quilljs.com" data-video="Embed URL">',  '<a class="ql-action"></a>',  '<a class="ql-remove"></a>'].join('');export default SnowTheme;
 |