text: import cledit from '../../services/cledit';
  import editorSvc from '../../services/editorSvc';
  import utils from '../../services/utils';
  
  const nextTickCbs = [];
  const nextTickExecCbs = cledit.Utils.debounce(() => {
    while (nextTickCbs.length) {
      nextTickCbs.shift()();
    }
  });
  
  const nextTick = (cb) => {
    nextTickCbs.push(cb);
    nextTickExecCbs();
  };
  
  export default class PreviewClassApplier {
    constructor(classGetter, offsetGetter, properties) {
      this.classGetter = typeof classGetter === 'function' ? classGetter : () => classGetter;
      this.offsetGetter = typeof offsetGetter === 'function' ? offsetGetter : () => offsetGetter;
      this.properties = properties || {};
      this.eltCollection = editorSvc.previewElt.getElementsByClassName(this.classGetter()[0]);
      this.lastEltCount = this.eltCollection.length;
  
      this.restoreClass = () => {
        if (!editorSvc.sectionDescWithDiffsList) {
          this.removeClass();
        } else if (!this.eltCollection.length || this.eltCollection.length !== this.lastEltCount) {
          this.removeClass();
          this.applyClass();
        }
      };
  
      editorSvc.$on('sectionDescWithDiffsList', this.restoreClass);
      nextTick(() => this.applyClass());
    }
  
    applyClass() {
      const offset = this.offsetGetter();
      if (offset) {
        const offsetStart = editorSvc.getPreviewOffset(offset.start, editorSvc.sectionDescList);
        const offsetEnd = editorSvc.getPreviewOffset(offset.end, editorSvc.sectionDescList);
        if (offsetStart != null && offsetEnd != null && offsetStart !== offsetEnd) {
          const start = cledit.Utils.findContainer(
            editorSvc.previewElt, Math.min(offsetStart, offsetEnd));
          const end = cledit.Utils.findContainer(
            editorSvc.previewElt, Math.max(offsetStart, offsetEnd));
          const range = document.createRange();
          range.setStart(start.container, start.offsetInContainer);
          range.setEnd(end.container, end.offsetInContainer);
          const properties = {
            ...this.properties,
            className: this.classGetter().join(' '),
          };
          utils.wrapRange(range, properties);
          this.lastEltCount = this.eltCollection.length;
        }
      }
    }
  
    removeClass() {
      utils.unwrapRange(this.eltCollection);
    }
  
    stop() {
      editorSvc.$off('previewHtml', this.restoreClass);
      editorSvc.$off('sectionDescWithDiffsList', this.restoreClass);
      nextTick(() => this.removeClass());
    }
  }
  