| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 | import extend from 'extend';import Delta from 'quill-delta';import Emitter from '../core/emitter';import Keyboard from '../modules/keyboard';import Theme from '../core/theme';import ColorPicker from '../ui/color-picker';import IconPicker from '../ui/icon-picker';import Picker from '../ui/picker';import Tooltip from '../ui/tooltip';const ALIGNS = [ false, 'center', 'right', 'justify' ];const COLORS = [  "#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff",  "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff",  "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff",  "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2",  "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"];const FONTS = [ false, 'serif', 'monospace' ];const HEADERS = [ '1', '2', '3', false ];const SIZES = [ 'small', false, 'large', 'huge' ];class BaseTheme extends Theme {  constructor(quill, options) {    super(quill, options);    let listener = (e) => {      if (!document.body.contains(quill.root)) {        return document.body.removeEventListener('click', listener);      }      if (this.tooltip != null && !this.tooltip.root.contains(e.target) &&          document.activeElement !== this.tooltip.textbox && !this.quill.hasFocus()) {        this.tooltip.hide();      }      if (this.pickers != null) {        this.pickers.forEach(function(picker) {          if (!picker.container.contains(e.target)) {            picker.close();          }        });      }    };    quill.emitter.listenDOM('click', document.body, listener);  }  addModule(name) {    let module = super.addModule(name);    if (name === 'toolbar') {      this.extendToolbar(module);    }    return module;  }  buildButtons(buttons, icons) {    buttons.forEach((button) => {      let className = button.getAttribute('class') || '';      className.split(/\s+/).forEach((name) => {        if (!name.startsWith('ql-')) return;        name = name.slice('ql-'.length);        if (icons[name] == null) return;        if (name === 'direction') {          button.innerHTML = icons[name][''] + icons[name]['rtl'];        } else if (typeof icons[name] === 'string') {          button.innerHTML = icons[name];        } else {          let value = button.value || '';          if (value != null && icons[name][value]) {            button.innerHTML = icons[name][value];          }        }      });    });  }  buildPickers(selects, icons) {    this.pickers = selects.map((select) => {      if (select.classList.contains('ql-align')) {        if (select.querySelector('option') == null) {          fillSelect(select, ALIGNS);        }        return new IconPicker(select, icons.align);      } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {        let format = select.classList.contains('ql-background') ? 'background' : 'color';        if (select.querySelector('option') == null) {          fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000');        }        return new ColorPicker(select, icons[format]);      } else {        if (select.querySelector('option') == null) {          if (select.classList.contains('ql-font')) {            fillSelect(select, FONTS);          } else if (select.classList.contains('ql-header')) {            fillSelect(select, HEADERS);          } else if (select.classList.contains('ql-size')) {            fillSelect(select, SIZES);          }        }        return new Picker(select);      }    });    let update = () => {      this.pickers.forEach(function(picker) {        picker.update();      });    };    this.quill.on(Emitter.events.EDITOR_CHANGE, update);  }}BaseTheme.DEFAULTS = extend(true, {}, Theme.DEFAULTS, {  modules: {    toolbar: {      handlers: {        formula: function() {          this.quill.theme.tooltip.edit('formula');        },        image: function() {          let fileInput = this.container.querySelector('input.ql-image[type=file]');          if (fileInput == null) {            fileInput = document.createElement('input');            fileInput.setAttribute('type', 'file');            fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');            fileInput.classList.add('ql-image');            fileInput.addEventListener('change', () => {              if (fileInput.files != null && fileInput.files[0] != null) {                let reader = new FileReader();                reader.onload = (e) => {                  let range = this.quill.getSelection(true);                  this.quill.updateContents(new Delta()                    .retain(range.index)                    .delete(range.length)                    .insert({ image: e.target.result })                  , Emitter.sources.USER);                  this.quill.setSelection(range.index + 1, Emitter.sources.SILENT);                  fileInput.value = "";                }                reader.readAsDataURL(fileInput.files[0]);              }            });            this.container.appendChild(fileInput);          }          fileInput.click();        },        video: function() {          this.quill.theme.tooltip.edit('video');        }      }    }  }});class BaseTooltip extends Tooltip {  constructor(quill, boundsContainer) {    super(quill, boundsContainer);    this.textbox = this.root.querySelector('input[type="text"]');    this.listen();  }  listen() {    this.textbox.addEventListener('keydown', (event) => {      if (Keyboard.match(event, 'enter')) {        this.save();        event.preventDefault();      } else if (Keyboard.match(event, 'escape')) {        this.cancel();        event.preventDefault();      }    });  }  cancel() {    this.hide();  }  edit(mode = 'link', preview = null) {    this.root.classList.remove('ql-hidden');    this.root.classList.add('ql-editing');    if (preview != null) {      this.textbox.value = preview;    } else if (mode !== this.root.getAttribute('data-mode')) {      this.textbox.value = '';    }    this.position(this.quill.getBounds(this.quill.selection.savedRange));    this.textbox.select();    this.textbox.setAttribute('placeholder', this.textbox.getAttribute(`data-${mode}`) || '');    this.root.setAttribute('data-mode', mode);  }  restoreFocus() {    let scrollTop = this.quill.scrollingContainer.scrollTop;    this.quill.focus();    this.quill.scrollingContainer.scrollTop = scrollTop;  }  save() {    let value = this.textbox.value;    switch(this.root.getAttribute('data-mode')) {      case 'link': {        let scrollTop = this.quill.root.scrollTop;        if (this.linkRange) {          this.quill.formatText(this.linkRange, 'link', value, Emitter.sources.USER);          delete this.linkRange;        } else {          this.restoreFocus();          this.quill.format('link', value, Emitter.sources.USER);        }        this.quill.root.scrollTop = scrollTop;        break;      }      case 'video': {        value = extractVideoUrl(value);      } // eslint-disable-next-line no-fallthrough      case 'formula': {        if (!value) break;        let range = this.quill.getSelection(true);        if (range != null) {          let index = range.index + range.length;          this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, Emitter.sources.USER);          if (this.root.getAttribute('data-mode') === 'formula') {            this.quill.insertText(index + 1, ' ', Emitter.sources.USER);          }          this.quill.setSelection(index + 2, Emitter.sources.USER);        }        break;      }      default:    }    this.textbox.value = '';    this.hide();  }}function extractVideoUrl(url) {  let match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) ||              url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);  if (match) {    return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0';  }  if (match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) {  // eslint-disable-line no-cond-assign    return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/';  }  return url;}function fillSelect(select, values, defaultValue = false) {  values.forEach(function(value) {    let option = document.createElement('option');    if (value === defaultValue) {      option.setAttribute('selected', 'selected');    } else {      option.setAttribute('value', value);    }    select.appendChild(option);  });}export { BaseTooltip, BaseTheme as default };
 |