diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 07b15917..9b11b07c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,10 +4,10 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 with: - python-version: '3.6' + python-version: '3.10' - name: Install requirements run: pip install flake8 pycodestyle - name: Check syntax @@ -17,7 +17,7 @@ jobs: needs: lint strategy: matrix: - ckan-version: [2.9, 2.9-py2, 2.8, 2.7] + ckan-version: ["2.10", 2.9] fail-fast: false name: CKAN ${{ matrix.ckan-version }} @@ -26,7 +26,7 @@ jobs: image: openknowledge/ckan-dev:${{ matrix.ckan-version }} services: solr: - image: ckan/ckan-solr-dev:${{ matrix.ckan-version }} + image: ckan/ckan-solr:${{ matrix.ckan-version }} postgres: image: ckan/ckan-postgres-dev:${{ matrix.ckan-version }} env: @@ -44,7 +44,7 @@ jobs: CKAN_REDIS_URL: redis://redis:6379/1 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install requirements run: | pip install -r requirements.txt @@ -53,16 +53,10 @@ jobs: # Replace default path to CKAN core config file with the one on the container sed -i -e 's/use = config:.*/use = config:\/srv\/app\/src\/ckan\/test-core.ini/' test.ini - name: Setup extension (CKAN >= 2.9) - if: ${{ matrix.ckan-version != '2.7' && matrix.ckan-version != '2.8' }} run: | ckan -c test.ini db init - - name: Setup extension (CKAN < 2.9) - if: ${{ matrix.ckan-version == '2.7' || matrix.ckan-version == '2.8' }} - run: | - paster --plugin=ckan db init -c test.ini - name: Run tests run: pytest --ckan-ini=test.ini --cov=ckanext.showcase --cov-report=xml --cov-append --disable-warnings ckanext/showcase/tests - - name: Upload coverage report to codecov uses: codecov/codecov-action@v1 with: diff --git a/.gitignore b/.gitignore index 14608b91..bd799524 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ __pycache__/ # Distribution / packaging .Python env/ -build/ develop-eggs/ sdist/ *.egg-info/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a63ad89..1fe08e09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,43 @@ # Ckanext-showcase CHANGELOG +## v1.6.0 2023-02-14 + +* Dropped support for CKAN 2.7 and 2.8 +* Dropped support for Python 2 +* Add support for CSRF token +* Sanitize blueprint names. All views should be called using `showcase_blueprint.` +* Rename get_showcase_wysiwyg_editor to avoid name clashes with other extensions (like `ckanext-pages`) +* Update CKEditor to it's latest version: 36.0.1 + +## v1.5.1 2022-08-10 + +* Dependency update + +## v1.5.0 2022-04-20 + +* Support for CKAN 2.10 (#143) +* Fix message in Add to showcase button (#139) + +## v1.4.8 2022-01-17 + +* Add Chinese (Traditional, Taiwan) translations (#136) +* Dependency update + +## v1.4.7 2022-01-04 + +* Fix ReST in README (#133) +* Move minimal requirements into setup.py (#134) + +## v1.4.6 2022-01-04 + +* Fix version in setup.py and add to changelog (#130) + +## v1.4.5 2021-11.25 + +* Add German and French translations (#124, #126) +* Fix logic for API routes (#128) +* Dependency updates + ## v1.4.4 2021-08-17 * Fix hardcoded route (#118) diff --git a/README.rst b/README.rst index 7a9d5e13..b54f22e7 100644 --- a/README.rst +++ b/README.rst @@ -30,14 +30,9 @@ ckanext-showcase is intended to be a more powerful replacement for the Requirements ------------ +Tested on CKAN 2.9 and 2.10. -Compatible with CKAN 2.9. - -N.B. The ``migrate`` command, detailed below, requires the Related Item models -and actions, which have been removed in CKAN 2.6. If you wish to migrate your -Related Items, please first upgrade CKAN to 2.5, do the migration, then -continue upgrading to CKAN 2.6+. - +Note: Use `1.5.2` for older CKAN versions (2.7 and 2.8). ------------ Installation @@ -75,7 +70,7 @@ do:: git clone https://github.com/ckan/ckanext-showcase.git cd ckanext-showcase - python setup.py develop + pip install -e . pip install -r dev-requirements.txt @@ -86,11 +81,14 @@ repository contains all the files needed to edit and customize it if needed:: npm install npx webpack --config webpack.config.js -The webpack will use as entrypoint a file located in `ckanext/showcase/fanstatic/src/ckeditor.js`, -create a build and save it to `ckanext/showcase/fanstatic/dist/ckeditor.js` +Build anatomy + * assets/build/ckeditor.js - The ready-to-use editor bundle, containing the editor and all plugins. + * assets/js/showcase-editor - The CKAN module that will load and config the bundle when using it as data-module attribute. + * assets/src/ckeditor.js - The source entry point of the build. Based on it the build/ckeditor.js file is created by webpack. It defines the editor creator, the list of plugins and the default configuration of a build. + * webpack.config.js - The webpack configuration used to build the editor. More info on how to build CKEditor from source: -https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/advanced-setup.html#scenario-2-building-from-source +https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/quick-start-other.html#building-the-editor-from-source --- @@ -157,30 +155,6 @@ The Showcase extension adds the following pages to the user interface: * To add a Showcase Admin : ``http://127.0.0.1:5000/ckan-admin/showcase_admins`` ----------------------------- -Migrating from Related Items ----------------------------- - -If you already have Related Items in your database, you can use the ``showcase -migrate`` command to create Showcases from Related Items. - -From the ``ckanext-showcase`` directory:: - - paster showcase migrate -c {path to production.ini} - -Note that each Related Item must have a unique title before migration can -proceed. If you prefer resolving duplicates as showcases, you can use the --allow-duplicates -option to migrate them anyways. Duplicate Relations will be created as -'duplicate_' + original_related_title + '_' + related_id - - paster showcase migrate -c {path to production.ini} --allow-duplicates - -The Related Item property ``type`` will become a Showcase tag. The Related Item -properties ``created``, ``owner_id``, ``view_count``, and ``featured`` have no -equivalent in Showcases and will not be migrated. - -Related Item data is not removed from the database by this command. - --------------------- Configuration --------------------- @@ -199,7 +173,7 @@ HTML you can use the ```showcase markdown_to_html``` command. From the ``ckanext-showcase`` directory:: - paster showcase markdown-to-html -c {path to production.ini} + ckan -c {path to production.ini} showcase markdown-to-html ----------------- Running the Tests @@ -207,12 +181,7 @@ Running the Tests To run the tests, do:: - nosetests --ckan --nologcapture --with-pylons=test.ini - -To run the tests and produce a coverage report, first make sure you have -coverage installed in your virtualenv (``pip install coverage``) then run:: - - nosetests --ckan --nologcapture --with-pylons=test.ini --with-coverage --cover-package=ckanext.showcase --cover-inclusive --cover-erase --cover-tests + pytest --ckan-ini=test.ini ckanext/showcase/tests ------------------------------------ @@ -288,3 +257,4 @@ See: "Internationalizing strings in extensions" : http://docs.ckan.org/en/latest 3. Compile your language catalog ( You can force pybabel compile to compile messages marked as fuzzy with the -f) python setup.py compile_catalog -f -l es + diff --git a/ckanext/showcase/assets/build/ckeditor.js b/ckanext/showcase/assets/build/ckeditor.js new file mode 100644 index 00000000..a0923184 --- /dev/null +++ b/ckanext/showcase/assets/build/ckeditor.js @@ -0,0 +1,7575 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./ckanext/showcase/assets/src/ckeditor.js": +/*!*************************************************!*\ + !*** ./ckanext/showcase/assets/src/ckeditor.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ClassicEditor)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_editor_classic_src_classiceditor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-editor-classic/src/classiceditor */ \"./node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditor.js\");\n/* harmony import */ var _ckeditor_ckeditor5_essentials_src_essentials__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ckeditor/ckeditor5-essentials/src/essentials */ \"./node_modules/@ckeditor/ckeditor5-essentials/src/essentials.js\");\n/* harmony import */ var _ckeditor_ckeditor5_autoformat_src_autoformat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ckeditor/ckeditor5-autoformat/src/autoformat */ \"./node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js\");\n/* harmony import */ var _ckeditor_ckeditor5_adapter_ckfinder_src_uploadadapter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter */ \"./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_bold__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/bold */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_italic__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/italic */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_underline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/underline */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_strikethrough__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/strikethrough */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_code__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/code */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_subscript__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/subscript */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js\");\n/* harmony import */ var _ckeditor_ckeditor5_basic_styles_src_superscript__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @ckeditor/ckeditor5-basic-styles/src/superscript */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js\");\n/* harmony import */ var _ckeditor_ckeditor5_indent_src_indent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @ckeditor/ckeditor5-indent/src/indent */ \"./node_modules/@ckeditor/ckeditor5-indent/src/indent.js\");\n/* harmony import */ var _ckeditor_ckeditor5_indent_src_indentblock__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @ckeditor/ckeditor5-indent/src/indentblock */ \"./node_modules/@ckeditor/ckeditor5-indent/src/indentblock.js\");\n/* harmony import */ var _ckeditor_ckeditor5_horizontal_line_src_horizontalline__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @ckeditor/ckeditor5-horizontal-line/src/horizontalline */ \"./node_modules/@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js\");\n/* harmony import */ var _ckeditor_ckeditor5_block_quote_src_blockquote__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @ckeditor/ckeditor5-block-quote/src/blockquote */ \"./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js\");\n/* harmony import */ var _ckeditor_ckeditor5_heading_src_heading__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @ckeditor/ckeditor5-heading/src/heading */ \"./node_modules/@ckeditor/ckeditor5-heading/src/heading.js\");\n/* harmony import */ var _ckeditor_ckeditor5_image_src_image__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @ckeditor/ckeditor5-image/src/image */ \"./node_modules/@ckeditor/ckeditor5-image/src/image.js\");\n/* harmony import */ var _ckeditor_ckeditor5_image_src_imagecaption__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @ckeditor/ckeditor5-image/src/imagecaption */ \"./node_modules/@ckeditor/ckeditor5-image/src/imagecaption.js\");\n/* harmony import */ var _ckeditor_ckeditor5_image_src_imagestyle__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @ckeditor/ckeditor5-image/src/imagestyle */ \"./node_modules/@ckeditor/ckeditor5-image/src/imagestyle.js\");\n/* harmony import */ var _ckeditor_ckeditor5_image_src_imagetoolbar__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @ckeditor/ckeditor5-image/src/imagetoolbar */ \"./node_modules/@ckeditor/ckeditor5-image/src/imagetoolbar.js\");\n/* harmony import */ var _ckeditor_ckeditor5_image_src_imageupload__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @ckeditor/ckeditor5-image/src/imageupload */ \"./node_modules/@ckeditor/ckeditor5-image/src/imageupload.js\");\n/* harmony import */ var _ckeditor_ckeditor5_link_src_link__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @ckeditor/ckeditor5-link/src/link */ \"./node_modules/@ckeditor/ckeditor5-link/src/link.js\");\n/* harmony import */ var _ckeditor_ckeditor5_list_src_list__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @ckeditor/ckeditor5-list/src/list */ \"./node_modules/@ckeditor/ckeditor5-list/src/list.js\");\n/* harmony import */ var _ckeditor_ckeditor5_paragraph_src_paragraph__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @ckeditor/ckeditor5-paragraph/src/paragraph */ \"./node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js\");\n/* harmony import */ var _ckeditor_ckeditor5_upload_src_adapters_simpleuploadadapter__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter */ \"./node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js\");\n\n\n\n\n\n// ckeditor5-basic-styles\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ClassicEditor extends _ckeditor_ckeditor5_editor_classic_src_classiceditor__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {}\n\nClassicEditor.builtinPlugins = [\n _ckeditor_ckeditor5_essentials_src_essentials__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _ckeditor_ckeditor5_adapter_ckfinder_src_uploadadapter__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n _ckeditor_ckeditor5_autoformat_src_autoformat__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_bold__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_italic__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_underline__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_strikethrough__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_code__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_subscript__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n _ckeditor_ckeditor5_basic_styles_src_superscript__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n _ckeditor_ckeditor5_indent_src_indent__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n _ckeditor_ckeditor5_indent_src_indentblock__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n _ckeditor_ckeditor5_horizontal_line_src_horizontalline__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n _ckeditor_ckeditor5_block_quote_src_blockquote__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n _ckeditor_ckeditor5_heading_src_heading__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n _ckeditor_ckeditor5_image_src_image__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n _ckeditor_ckeditor5_image_src_imagecaption__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n _ckeditor_ckeditor5_image_src_imagestyle__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n _ckeditor_ckeditor5_image_src_imagetoolbar__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n _ckeditor_ckeditor5_image_src_imageupload__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n _ckeditor_ckeditor5_link_src_link__WEBPACK_IMPORTED_MODULE_21__[\"default\"],\n _ckeditor_ckeditor5_list_src_list__WEBPACK_IMPORTED_MODULE_22__[\"default\"],\n _ckeditor_ckeditor5_paragraph_src_paragraph__WEBPACK_IMPORTED_MODULE_23__[\"default\"],\n _ckeditor_ckeditor5_upload_src_adapters_simpleuploadadapter__WEBPACK_IMPORTED_MODULE_24__[\"default\"]\n];\n\nwindow.ClassicEditor=ClassicEditor;\n\n\n//# sourceURL=webpack:///./ckanext/showcase/assets/src/ckeditor.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CKFinderUploadAdapter)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_upload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/upload */ \"./node_modules/ckeditor5/src/upload.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/* globals XMLHttpRequest, FormData */\n/**\n * @module adapter-ckfinder/uploadadapter\n */\n\n\n\n/**\n * A plugin that enables file uploads in CKEditor 5 using the CKFinder server–side connector.\n *\n * See the {@glink features/images/image-upload/ckfinder \"CKFinder file manager integration\" guide} to learn how to configure\n * and use this feature as well as find out more about the full integration with the file manager\n * provided by the {@link module:ckfinder/ckfinder~CKFinder} plugin.\n *\n * Check out the {@glink features/images/image-upload/image-upload comprehensive \"Image upload overview\"} to learn about\n * other ways to upload images into CKEditor 5.\n */\nclass CKFinderUploadAdapter extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [ckeditor5_src_upload__WEBPACK_IMPORTED_MODULE_1__.FileRepository];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'CKFinderUploadAdapter';\n }\n /**\n * @inheritDoc\n */\n init() {\n const url = this.editor.config.get('ckfinder.uploadUrl');\n if (!url) {\n return;\n }\n // Register CKFinderAdapter\n this.editor.plugins.get(ckeditor5_src_upload__WEBPACK_IMPORTED_MODULE_1__.FileRepository).createUploadAdapter = loader => new UploadAdapter(loader, url, this.editor.t);\n }\n}\n/**\n * Upload adapter for CKFinder.\n */\nclass UploadAdapter {\n /**\n * Creates a new adapter instance.\n */\n constructor(loader, url, t) {\n this.loader = loader;\n this.url = url;\n this.t = t;\n }\n /**\n * Starts the upload process.\n *\n * @see module:upload/filerepository~UploadAdapter#upload\n */\n upload() {\n return this.loader.file.then(file => {\n return new Promise((resolve, reject) => {\n this._initRequest();\n this._initListeners(resolve, reject, file);\n this._sendRequest(file);\n });\n });\n }\n /**\n * Aborts the upload process.\n *\n * @see module:upload/filerepository~UploadAdapter#abort\n */\n abort() {\n if (this.xhr) {\n this.xhr.abort();\n }\n }\n /**\n * Initializes the XMLHttpRequest object.\n */\n _initRequest() {\n const xhr = this.xhr = new XMLHttpRequest();\n xhr.open('POST', this.url, true);\n xhr.responseType = 'json';\n }\n /**\n * Initializes XMLHttpRequest listeners.\n *\n * @param resolve Callback function to be called when the request is successful.\n * @param reject Callback function to be called when the request cannot be completed.\n * @param file File instance to be uploaded.\n */\n _initListeners(resolve, reject, file) {\n const xhr = this.xhr;\n const loader = this.loader;\n const t = this.t;\n const genericError = t('Cannot upload file:') + ` ${file.name}.`;\n xhr.addEventListener('error', () => reject(genericError));\n xhr.addEventListener('abort', () => reject());\n xhr.addEventListener('load', () => {\n const response = xhr.response;\n if (!response || !response.uploaded) {\n return reject(response && response.error && response.error.message ? response.error.message : genericError);\n }\n resolve({\n default: response.url\n });\n });\n // Upload progress when it's supported.\n /* istanbul ignore else */\n if (xhr.upload) {\n xhr.upload.addEventListener('progress', evt => {\n if (evt.lengthComputable) {\n loader.uploadTotal = evt.total;\n loader.uploaded = evt.loaded;\n }\n });\n }\n }\n /**\n * Prepares the data and sends the request.\n *\n * @param file File instance to be uploaded.\n */\n _sendRequest(file) {\n // Prepare form data.\n const data = new FormData();\n data.append('upload', file);\n data.append('ckCsrfToken', (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getCsrfToken)());\n // Send request.\n this.xhr.send(data);\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getCookie\": () => (/* binding */ getCookie),\n/* harmony export */ \"getCsrfToken\": () => (/* binding */ getCsrfToken),\n/* harmony export */ \"setCookie\": () => (/* binding */ setCookie)\n/* harmony export */ });\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/* globals window, document */\n/**\n * @module adapter-ckfinder/utils\n */\nconst TOKEN_COOKIE_NAME = 'ckCsrfToken';\nconst TOKEN_LENGTH = 40;\nconst tokenCharset = 'abcdefghijklmnopqrstuvwxyz0123456789';\n/**\n * Returns the CSRF token value. The value is a hash stored in `document.cookie`\n * under the `ckCsrfToken` key. The CSRF token can be used to secure the communication\n * between the web browser and the CKFinder server.\n */\nfunction getCsrfToken() {\n let token = getCookie(TOKEN_COOKIE_NAME);\n if (!token || token.length != TOKEN_LENGTH) {\n token = generateToken(TOKEN_LENGTH);\n setCookie(TOKEN_COOKIE_NAME, token);\n }\n return token;\n}\n/**\n * Returns the value of the cookie with a given name or `null` if the cookie is not found.\n */\nfunction getCookie(name) {\n name = name.toLowerCase();\n const parts = document.cookie.split(';');\n for (const part of parts) {\n const pair = part.split('=');\n const key = decodeURIComponent(pair[0].trim().toLowerCase());\n if (key === name) {\n return decodeURIComponent(pair[1]);\n }\n }\n return null;\n}\n/**\n * Sets the value of the cookie with a given name.\n */\nfunction setCookie(name, value) {\n document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';path=/';\n}\n/**\n * Generates the CSRF token with the given length.\n */\nfunction generateToken(length) {\n let result = '';\n const randValues = new Uint8Array(length);\n window.crypto.getRandomValues(randValues);\n for (let j = 0; j < randValues.length; j++) {\n const character = tokenCharset.charAt(randValues[j] % tokenCharset.length);\n result += Math.random() > 0.5 ? character.toUpperCase() : character;\n }\n return result;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Autoformat)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/typing */ \"./node_modules/ckeditor5/src/typing.js\");\n/* harmony import */ var _blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./blockautoformatediting */ \"./node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js\");\n/* harmony import */ var _inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./inlineautoformatediting */ \"./node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n\n\n\n/**\n * Enables a set of predefined autoformatting actions.\n *\n * For a detailed overview, check the {@glink features/autoformat Autoformatting feature documentation}\n * and the {@glink api/autoformat package page}.\n */\nclass Autoformat extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritdoc\n */\n static get requires() {\n return [ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__.Delete];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Autoformat';\n }\n /**\n * @inheritDoc\n */\n afterInit() {\n this._addListAutoformats();\n this._addBasicStylesAutoformats();\n this._addHeadingAutoformats();\n this._addBlockQuoteAutoformats();\n this._addCodeBlockAutoformats();\n this._addHorizontalLineAutoformats();\n }\n /**\n * Adds autoformatting related to the {@link module:list/list~List}.\n *\n * When typed:\n * - `* ` or `- ` – A paragraph will be changed to a bulleted list.\n * - `1. ` or `1) ` – A paragraph will be changed to a numbered list (\"1\" can be any digit or a list of digits).\n * - `[] ` or `[ ] ` – A paragraph will be changed to a to-do list.\n * - `[x] ` or `[ x ] ` – A paragraph will be changed to a checked to-do list.\n */\n _addListAutoformats() {\n const commands = this.editor.commands;\n if (commands.get('bulletedList')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^[*-]\\s$/, 'bulletedList');\n }\n if (commands.get('numberedList')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^1[.|)]\\s$/, 'numberedList');\n }\n if (commands.get('todoList')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^\\[\\s?\\]\\s$/, 'todoList');\n }\n if (commands.get('checkTodoList')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^\\[\\s?x\\s?\\]\\s$/, () => {\n this.editor.execute('todoList');\n this.editor.execute('checkTodoList');\n });\n }\n }\n /**\n * Adds autoformatting related to the {@link module:basic-styles/bold~Bold},\n * {@link module:basic-styles/italic~Italic}, {@link module:basic-styles/code~Code}\n * and {@link module:basic-styles/strikethrough~Strikethrough}\n *\n * When typed:\n * - `**foobar**` – `**` characters are removed and `foobar` is set to bold,\n * - `__foobar__` – `__` characters are removed and `foobar` is set to bold,\n * - `*foobar*` – `*` characters are removed and `foobar` is set to italic,\n * - `_foobar_` – `_` characters are removed and `foobar` is set to italic,\n * - ``` `foobar` – ``` ` ``` characters are removed and `foobar` is set to code,\n * - `~~foobar~~` – `~~` characters are removed and `foobar` is set to strikethrough.\n */\n _addBasicStylesAutoformats() {\n const commands = this.editor.commands;\n if (commands.get('bold')) {\n const boldCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'bold');\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(?:^|\\s)(\\*\\*)([^*]+)(\\*\\*)$/g, boldCallback);\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(?:^|\\s)(__)([^_]+)(__)$/g, boldCallback);\n }\n if (commands.get('italic')) {\n const italicCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'italic');\n // The italic autoformatter cannot be triggered by the bold markers, so we need to check the\n // text before the pattern (e.g. `(?:^|[^\\*])`).\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(?:^|\\s)(\\*)([^*_]+)(\\*)$/g, italicCallback);\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(?:^|\\s)(_)([^_]+)(_)$/g, italicCallback);\n }\n if (commands.get('code')) {\n const codeCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'code');\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(`)([^`]+)(`)$/g, codeCallback);\n }\n if (commands.get('strikethrough')) {\n const strikethroughCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'strikethrough');\n (0,_inlineautoformatediting__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this.editor, this, /(~~)([^~]+)(~~)$/g, strikethroughCallback);\n }\n }\n /**\n * Adds autoformatting related to {@link module:heading/heading~Heading}.\n *\n * It is using a number at the end of the command name to associate it with the proper trigger:\n *\n * * `heading` with value `heading1` will be executed when typing `#`,\n * * `heading` with value `heading2` will be executed when typing `##`,\n * * ... up to `heading6` and `######`.\n */\n _addHeadingAutoformats() {\n const command = this.editor.commands.get('heading');\n if (command) {\n command.modelElements\n .filter(name => name.match(/^heading[1-6]$/))\n .forEach(modelName => {\n const level = modelName[7];\n const pattern = new RegExp(`^(#{${level}})\\\\s$`);\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, pattern, () => {\n // Should only be active if command is enabled and heading style associated with pattern is inactive.\n if (!command.isEnabled || command.value === modelName) {\n return false;\n }\n this.editor.execute('heading', { value: modelName });\n });\n });\n }\n }\n /**\n * Adds autoformatting related to {@link module:block-quote/blockquote~BlockQuote}.\n *\n * When typed:\n * * `> ` – A paragraph will be changed to a block quote.\n */\n _addBlockQuoteAutoformats() {\n if (this.editor.commands.get('blockQuote')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^>\\s$/, 'blockQuote');\n }\n }\n /**\n * Adds autoformatting related to {@link module:code-block/codeblock~CodeBlock}.\n *\n * When typed:\n * - `` ``` `` – A paragraph will be changed to a code block.\n */\n _addCodeBlockAutoformats() {\n const editor = this.editor;\n const selection = editor.model.document.selection;\n if (editor.commands.get('codeBlock')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(editor, this, /^```$/, () => {\n if (selection.getFirstPosition().parent.is('element', 'listItem')) {\n return false;\n }\n this.editor.execute('codeBlock', {\n usePreviousLanguageChoice: true\n });\n });\n }\n }\n /**\n * Adds autoformatting related to {@link module:horizontal-line/horizontalline~HorizontalLine}.\n *\n * When typed:\n * - `` --- `` – Will be replaced with a horizontal line.\n */\n _addHorizontalLineAutoformats() {\n if (this.editor.commands.get('horizontalLine')) {\n (0,_blockautoformatediting__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.editor, this, /^---$/, 'horizontalLine');\n }\n }\n}\n/**\n * Helper function for getting `inlineAutoformatEditing` callbacks that checks if command is enabled.\n */\nfunction getCallbackFunctionForInlineAutoformat(editor, attributeKey) {\n return (writer, rangesToFormat) => {\n const command = editor.commands.get(attributeKey);\n if (!command.isEnabled) {\n return false;\n }\n const validRanges = editor.model.schema.getValidRanges(rangesToFormat, attributeKey);\n for (const range of validRanges) {\n writer.setAttribute(attributeKey, true, range);\n }\n // After applying attribute to the text, remove given attribute from the selection.\n // This way user is able to type a text without attribute used by auto formatter.\n writer.removeSelectionAttribute(attributeKey);\n };\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ blockAutoformatEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/engine */ \"./node_modules/ckeditor5/src/engine.js\");\n/* harmony import */ var ckeditor5_src_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/utils */ \"./node_modules/ckeditor5/src/utils.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n\n/**\n * The block autoformatting engine. It allows to format various block patterns. For example,\n * it can be configured to turn a paragraph starting with `*` and followed by a space into a list item.\n *\n * The autoformatting operation is integrated with the undo manager,\n * so the autoformatting step can be undone if the user's intention was not to format the text.\n *\n * See the {@link module:autoformat/blockautoformatediting~blockAutoformatEditing `blockAutoformatEditing`} documentation\n * to learn how to create custom block autoformatters. You can also use\n * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters\n * (lists, headings, bold and italic).\n *\n * @module autoformat/blockautoformatediting\n */\n/**\n * Creates a listener triggered on {@link module:engine/model/document~Document#event:change:data `change:data`} event in the document.\n * Calls the callback when inserted text matches the regular expression or the command name\n * if provided instead of the callback.\n *\n * Examples of usage:\n *\n * To convert a paragraph to heading 1 when `- ` is typed, using just the command name:\n *\n * ```ts\n * blockAutoformatEditing( editor, plugin, /^\\- $/, 'heading1' );\n * ```\n *\n * To convert a paragraph to heading 1 when `- ` is typed, using just the callback:\n *\n * ```ts\n * blockAutoformatEditing( editor, plugin, /^\\- $/, ( context ) => {\n * \tconst { match } = context;\n * \tconst headingLevel = match[ 1 ].length;\n *\n * \teditor.execute( 'heading', {\n * \t\tformatId: `heading${ headingLevel }`\n * \t} );\n * } );\n * ```\n *\n * @param editor The editor instance.\n * @param plugin The autoformat plugin instance.\n * @param pattern The regular expression to execute on just inserted text. The regular expression is tested against the text\n * from the beginning until the caret position.\n * @param callbackOrCommand The callback to execute or the command to run when the text is matched.\n * In case of providing the callback, it receives the following parameter:\n * * {Object} match RegExp.exec() result of matching the pattern to inserted text.\n */\nfunction blockAutoformatEditing(editor, plugin, pattern, callbackOrCommand) {\n let callback;\n let command = null;\n if (typeof callbackOrCommand == 'function') {\n callback = callbackOrCommand;\n }\n else {\n // We assume that the actual command name was provided.\n command = editor.commands.get(callbackOrCommand);\n callback = () => {\n editor.execute(callbackOrCommand);\n };\n }\n editor.model.document.on('change:data', (evt, batch) => {\n if (command && !command.isEnabled || !plugin.isEnabled) {\n return;\n }\n const range = (0,ckeditor5_src_utils__WEBPACK_IMPORTED_MODULE_1__.first)(editor.model.document.selection.getRanges());\n if (!range.isCollapsed) {\n return;\n }\n if (batch.isUndo || !batch.isLocal) {\n return;\n }\n const changes = Array.from(editor.model.document.differ.getChanges());\n const entry = changes[0];\n // Typing is represented by only a single change.\n if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) {\n return;\n }\n const blockToFormat = entry.position.parent;\n // Block formatting should be disabled in codeBlocks (#5800).\n if (blockToFormat.is('element', 'codeBlock')) {\n return;\n }\n // Only list commands and custom callbacks can be applied inside a list.\n if (blockToFormat.is('element', 'listItem') &&\n typeof callbackOrCommand !== 'function' &&\n !['numberedList', 'bulletedList', 'todoList'].includes(callbackOrCommand)) {\n return;\n }\n // In case a command is bound, do not re-execute it over an existing block style which would result with a style removal.\n // Instead just drop processing so that autoformat trigger text is not lost. E.g. writing \"# \" in a level 1 heading.\n if (command && command.value === true) {\n return;\n }\n const firstNode = blockToFormat.getChild(0);\n const firstNodeRange = editor.model.createRangeOn(firstNode);\n // Range is only expected to be within or at the very end of the first text node.\n if (!firstNodeRange.containsRange(range) && !range.end.isEqual(firstNodeRange.end)) {\n return;\n }\n const match = pattern.exec(firstNode.data.substr(0, range.end.offset));\n // ...and this text node's data match the pattern.\n if (!match) {\n return;\n }\n // Use enqueueChange to create new batch to separate typing batch from the auto-format changes.\n editor.model.enqueueChange(writer => {\n // Matched range.\n const start = writer.createPositionAt(blockToFormat, 0);\n const end = writer.createPositionAt(blockToFormat, match[0].length);\n const range = new ckeditor5_src_engine__WEBPACK_IMPORTED_MODULE_0__.LiveRange(start, end);\n const wasChanged = callback({ match });\n // Remove matched text.\n if (wasChanged !== false) {\n writer.remove(range);\n const selectionRange = editor.model.document.selection.getFirstRange();\n const blockRange = writer.createRangeIn(blockToFormat);\n // If the block is empty and the document selection has been moved when\n // applying formatting (e.g. is now in newly created block).\n if (blockToFormat.isEmpty && !blockRange.isEqual(selectionRange) && !blockRange.containsRange(selectionRange, true)) {\n writer.remove(blockToFormat);\n }\n }\n range.detach();\n editor.model.enqueueChange(() => {\n editor.plugins.get('Delete').requestUndoOnBackspace();\n });\n });\n });\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ inlineAutoformatEditing)\n/* harmony export */ });\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * Enables autoformatting mechanism for a given {@link module:core/editor/editor~Editor}.\n *\n * It formats the matched text by applying the given model attribute or by running the provided formatting callback.\n * On every {@link module:engine/model/document~Document#event:change:data data change} in the model document\n * the autoformatting engine checks the text on the left of the selection\n * and executes the provided action if the text matches given criteria (regular expression or callback).\n *\n * @param editor The editor instance.\n * @param plugin The autoformat plugin instance.\n * @param testRegexpOrCallback The regular expression or callback to execute on text.\n * Provided regular expression *must* have three capture groups. The first and the third capture group\n * should match opening and closing delimiters. The second capture group should match the text to format.\n *\n * ```ts\n * // Matches the `**bold text**` pattern.\n * // There are three capturing groups:\n * // - The first to match the starting `**` delimiter.\n * // - The second to match the text to format.\n * // - The third to match the ending `**` delimiter.\n * inlineAutoformatEditing( editor, plugin, /(\\*\\*)([^\\*]+?)(\\*\\*)$/g, formatCallback );\n * ```\n *\n * When a function is provided instead of the regular expression, it will be executed with the text to match as a parameter.\n * The function should return proper \"ranges\" to delete and format.\n *\n * ```ts\n * {\n * \tremove: [\n * \t\t[ 0, 1 ],\t// Remove the first letter from the given text.\n * \t\t[ 5, 6 ]\t// Remove the 6th letter from the given text.\n * \t],\n * \tformat: [\n * \t\t[ 1, 5 ]\t// Format all letters from 2nd to 5th.\n * \t]\n * }\n * ```\n *\n * @param formatCallback A callback to apply actual formatting.\n * It should return `false` if changes should not be applied (e.g. if a command is disabled).\n *\n * ```ts\n * inlineAutoformatEditing( editor, plugin, /(\\*\\*)([^\\*]+?)(\\*\\*)$/g, ( writer, rangesToFormat ) => {\n * \tconst command = editor.commands.get( 'bold' );\n *\n * \tif ( !command.isEnabled ) {\n * \t\treturn false;\n * \t}\n *\n * \tconst validRanges = editor.model.schema.getValidRanges( rangesToFormat, 'bold' );\n *\n * \tfor ( let range of validRanges ) {\n * \t\twriter.setAttribute( 'bold', true, range );\n * \t}\n * } );\n * ```\n */\nfunction inlineAutoformatEditing(editor, plugin, testRegexpOrCallback, formatCallback) {\n let regExp;\n let testCallback;\n if (testRegexpOrCallback instanceof RegExp) {\n regExp = testRegexpOrCallback;\n }\n else {\n testCallback = testRegexpOrCallback;\n }\n // A test callback run on changed text.\n testCallback = testCallback || (text => {\n let result;\n const remove = [];\n const format = [];\n while ((result = regExp.exec(text)) !== null) {\n // There should be full match and 3 capture groups.\n if (result && result.length < 4) {\n break;\n }\n let { index, '1': leftDel, '2': content, '3': rightDel } = result;\n // Real matched string - there might be some non-capturing groups so we need to recalculate starting index.\n const found = leftDel + content + rightDel;\n index += result[0].length - found.length;\n // Start and End offsets of delimiters to remove.\n const delStart = [\n index,\n index + leftDel.length\n ];\n const delEnd = [\n index + leftDel.length + content.length,\n index + leftDel.length + content.length + rightDel.length\n ];\n remove.push(delStart);\n remove.push(delEnd);\n format.push([index + leftDel.length, index + leftDel.length + content.length]);\n }\n return {\n remove,\n format\n };\n });\n editor.model.document.on('change:data', (evt, batch) => {\n if (batch.isUndo || !batch.isLocal || !plugin.isEnabled) {\n return;\n }\n const model = editor.model;\n const selection = model.document.selection;\n // Do nothing if selection is not collapsed.\n if (!selection.isCollapsed) {\n return;\n }\n const changes = Array.from(model.document.differ.getChanges());\n const entry = changes[0];\n // Typing is represented by only a single change.\n if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) {\n return;\n }\n const focus = selection.focus;\n const block = focus.parent;\n const { text, range } = getTextAfterCode(model.createRange(model.createPositionAt(block, 0), focus), model);\n const testOutput = testCallback(text);\n const rangesToFormat = testOutputToRanges(range.start, testOutput.format, model);\n const rangesToRemove = testOutputToRanges(range.start, testOutput.remove, model);\n if (!(rangesToFormat.length && rangesToRemove.length)) {\n return;\n }\n // Use enqueueChange to create new batch to separate typing batch from the auto-format changes.\n model.enqueueChange(writer => {\n // Apply format.\n const hasChanged = formatCallback(writer, rangesToFormat);\n // Strict check on `false` to have backward compatibility (when callbacks were returning `undefined`).\n if (hasChanged === false) {\n return;\n }\n // Remove delimiters - use reversed order to not mix the offsets while removing.\n for (const range of rangesToRemove.reverse()) {\n writer.remove(range);\n }\n model.enqueueChange(() => {\n editor.plugins.get('Delete').requestUndoOnBackspace();\n });\n });\n });\n}\n/**\n * Converts output of the test function provided to the inlineAutoformatEditing and converts it to the model ranges\n * inside provided block.\n */\nfunction testOutputToRanges(start, arrays, model) {\n return arrays\n .filter(array => (array[0] !== undefined && array[1] !== undefined))\n .map(array => {\n return model.createRange(start.getShiftedBy(array[0]), start.getShiftedBy(array[1]));\n });\n}\n/**\n * Returns the last text line after the last code element from the given range.\n * It is similar to {@link module:typing/utils/getlasttextline.getLastTextLine `getLastTextLine()`},\n * but it ignores any text before the last `code`.\n */\nfunction getTextAfterCode(range, model) {\n let start = range.start;\n const text = Array.from(range.getItems()).reduce((rangeText, node) => {\n // Trim text to a last occurrence of an inline element and update range start.\n if (!(node.is('$text') || node.is('$textProxy')) || node.getAttribute('code')) {\n start = model.createPositionAfter(node);\n return '';\n }\n return rangeText + node.data;\n }, '');\n return { text, range: model.createRange(start, range.end) };\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AttributeCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/attributecommand\n */\n\n/**\n * An extension of the base {@link module:core/command~Command} class, which provides utilities for a command\n * that toggles a single attribute on a text or an element.\n *\n * `AttributeCommand` uses {@link module:engine/model/document~Document#selection}\n * to decide which nodes (if any) should be changed, and applies or removes the attribute from them.\n *\n * The command checks the {@link module:engine/model/model~Model#schema} to decide if it can be enabled\n * for the current selection and to which nodes the attribute can be applied.\n */\nclass AttributeCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n /**\n * @param attributeKey Attribute that will be set by the command.\n */\n constructor(editor, attributeKey) {\n super(editor);\n this.attributeKey = attributeKey;\n }\n /**\n * Updates the command's {@link #value} and {@link #isEnabled} based on the current selection.\n */\n refresh() {\n const model = this.editor.model;\n const doc = model.document;\n this.value = this._getValueFromFirstAllowedNode();\n this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, this.attributeKey);\n }\n /**\n * Executes the command — applies the attribute to the selection or removes it from the selection.\n *\n * If the command is active (`value == true`), it will remove attributes. Otherwise, it will set attributes.\n *\n * The execution result differs, depending on the {@link module:engine/model/document~Document#selection}:\n *\n * * If the selection is on a range, the command applies the attribute to all nodes in that range\n * (if they are allowed to have this attribute by the {@link module:engine/model/schema~Schema schema}).\n * * If the selection is collapsed in a non-empty node, the command applies the attribute to the\n * {@link module:engine/model/document~Document#selection} itself (note that typed characters copy attributes from the selection).\n * * If the selection is collapsed in an empty node, the command applies the attribute to the parent node of the selection (note\n * that the selection inherits all attributes from a node if it is in an empty node).\n *\n * @fires execute\n * @param options Command options.\n * @param options.forceValue If set, it will force the command behavior. If `true`,\n * the command will apply the attribute, otherwise the command will remove the attribute.\n * If not set, the command will look for its current value to decide what it should do.\n */\n execute(options = {}) {\n const model = this.editor.model;\n const doc = model.document;\n const selection = doc.selection;\n const value = (options.forceValue === undefined) ? !this.value : options.forceValue;\n model.change(writer => {\n if (selection.isCollapsed) {\n if (value) {\n writer.setSelectionAttribute(this.attributeKey, true);\n }\n else {\n writer.removeSelectionAttribute(this.attributeKey);\n }\n }\n else {\n const ranges = model.schema.getValidRanges(selection.getRanges(), this.attributeKey);\n for (const range of ranges) {\n if (value) {\n writer.setAttribute(this.attributeKey, value, range);\n }\n else {\n writer.removeAttribute(this.attributeKey, range);\n }\n }\n }\n });\n }\n /**\n * Checks the attribute value of the first node in the selection that allows the attribute.\n * For the collapsed selection returns the selection attribute.\n *\n * @returns The attribute value.\n */\n _getValueFromFirstAllowedNode() {\n const model = this.editor.model;\n const schema = model.schema;\n const selection = model.document.selection;\n if (selection.isCollapsed) {\n return selection.hasAttribute(this.attributeKey);\n }\n for (const range of selection.getRanges()) {\n for (const item of range.getItems()) {\n if (schema.checkAttribute(item, this.attributeKey)) {\n return item.hasAttribute(this.attributeKey);\n }\n }\n }\n return false;\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Bold)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _bold_boldediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bold/boldediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js\");\n/* harmony import */ var _bold_boldui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bold/boldui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/bold\n */\n\n\n\n/**\n * The bold feature.\n *\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation}\n * and the {@glink api/basic-styles package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/bold/boldediting~BoldEditing bold editing feature}\n * and {@link module:basic-styles/bold/boldui~BoldUI bold UI feature}.\n */\nclass Bold extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_bold_boldediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _bold_boldui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Bold';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BoldEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/bold/boldediting\n */\n\n\nconst BOLD = 'bold';\n/**\n * The bold editing feature.\n *\n * It registers the `'bold'` command and introduces the `bold` attribute in the model which renders to the view\n * as a `` element.\n */\nclass BoldEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'BoldEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow bold attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: BOLD });\n editor.model.schema.setAttributeProperties(BOLD, {\n isFormatting: true,\n copyOnEnter: true\n });\n // Build converter from model to view for data and editing pipelines.\n editor.conversion.attributeToElement({\n model: BOLD,\n view: 'strong',\n upcastAlso: [\n 'b',\n viewElement => {\n const fontWeight = viewElement.getStyle('font-weight');\n if (!fontWeight) {\n return null;\n }\n // Value of the `font-weight` attribute can be defined as a string or a number.\n if (fontWeight == 'bold' || Number(fontWeight) >= 600) {\n return {\n name: true,\n styles: ['font-weight']\n };\n }\n return null;\n }\n ]\n });\n // Create bold command.\n editor.commands.add(BOLD, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, BOLD));\n // Set the Ctrl+B keystroke.\n editor.keystrokes.set('CTRL+B', BOLD);\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BoldUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/bold/boldui\n */\n\n\nconst BOLD = 'bold';\n/**\n * The bold UI feature. It introduces the Bold button.\n */\nclass BoldUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'BoldUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add bold button to feature components.\n editor.ui.componentFactory.add(BOLD, locale => {\n const command = editor.commands.get(BOLD);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Bold'),\n icon: ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.icons.bold,\n keystroke: 'CTRL+B',\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(BOLD);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Code)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _code_codeediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./code/codeediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js\");\n/* harmony import */ var _code_codeui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./code/codeui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js\");\n/* harmony import */ var _theme_code_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../theme/code.css */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/code\n */\n\n\n\n\n/**\n * The code feature.\n *\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation}\n * and the {@glink api/basic-styles package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/code/codeediting~CodeEditing code editing feature}\n * and {@link module:basic-styles/code/codeui~CodeUI code UI feature}.\n */\nclass Code extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_code_codeediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _code_codeui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Code';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CodeEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/typing */ \"./node_modules/ckeditor5/src/typing.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/code/codeediting\n */\n\n\n\nconst CODE = 'code';\nconst HIGHLIGHT_CLASS = 'ck-code_selected';\n/**\n * The code editing feature.\n *\n * It registers the `'code'` command and introduces the `code` attribute in the model which renders to the view\n * as a `` element.\n */\nclass CodeEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'CodeEditing';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__.TwoStepCaretMovement];\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow code attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: CODE });\n editor.model.schema.setAttributeProperties(CODE, {\n isFormatting: true,\n copyOnEnter: false\n });\n editor.conversion.attributeToElement({\n model: CODE,\n view: 'code',\n upcastAlso: {\n styles: {\n 'word-wrap': 'break-word'\n }\n }\n });\n // Create code command.\n editor.commands.add(CODE, new _attributecommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](editor, CODE));\n // Enable two-step caret movement for `code` attribute.\n editor.plugins.get(ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__.TwoStepCaretMovement).registerAttribute(CODE);\n // Setup highlight over selected element.\n (0,ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_1__.inlineHighlight)(editor, CODE, 'code', HIGHLIGHT_CLASS);\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CodeUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_code_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/code.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg\");\n/* harmony import */ var _theme_code_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../theme/code.css */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/code/codeui\n */\n\n\n\n\nconst CODE = 'code';\n/**\n * The code UI feature. It introduces the Code button.\n */\nclass CodeUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'CodeUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add code button to feature components.\n editor.ui.componentFactory.add(CODE, locale => {\n const command = editor.commands.get(CODE);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Code'),\n icon: _theme_icons_code_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(CODE);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Italic)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _italic_italicediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./italic/italicediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js\");\n/* harmony import */ var _italic_italicui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./italic/italicui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/italic\n */\n\n\n\n/**\n * The italic feature.\n *\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation}\n * and the {@glink api/basic-styles package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/italic/italicediting~ItalicEditing} and\n * {@link module:basic-styles/italic/italicui~ItalicUI} plugins.\n */\nclass Italic extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_italic_italicediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _italic_italicui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Italic';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ItalicEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/italic/italicediting\n */\n\n\nconst ITALIC = 'italic';\n/**\n * The italic editing feature.\n *\n * It registers the `'italic'` command, the Ctrl+I keystroke and introduces the `italic` attribute in the model\n * which renders to the view as an `` element.\n */\nclass ItalicEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'ItalicEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow italic attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: ITALIC });\n editor.model.schema.setAttributeProperties(ITALIC, {\n isFormatting: true,\n copyOnEnter: true\n });\n editor.conversion.attributeToElement({\n model: ITALIC,\n view: 'i',\n upcastAlso: [\n 'em',\n {\n styles: {\n 'font-style': 'italic'\n }\n }\n ]\n });\n // Create italic command.\n editor.commands.add(ITALIC, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, ITALIC));\n // Set the Ctrl+I keystroke.\n editor.keystrokes.set('CTRL+I', ITALIC);\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ItalicUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_italic_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/italic.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/italic/italicui\n */\n\n\n\nconst ITALIC = 'italic';\n/**\n * The italic UI feature. It introduces the Italic button.\n */\nclass ItalicUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'ItalicUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add bold button to feature components.\n editor.ui.componentFactory.add(ITALIC, locale => {\n const command = editor.commands.get(ITALIC);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Italic'),\n icon: _theme_icons_italic_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n keystroke: 'CTRL+I',\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(ITALIC);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Strikethrough)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _strikethrough_strikethroughediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./strikethrough/strikethroughediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js\");\n/* harmony import */ var _strikethrough_strikethroughui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./strikethrough/strikethroughui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/strikethrough\n */\n\n\n\n/**\n * The strikethrough feature.\n *\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation}\n * and the {@glink api/basic-styles package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/strikethrough/strikethroughediting~StrikethroughEditing} and\n * {@link module:basic-styles/strikethrough/strikethroughui~StrikethroughUI} plugins.\n */\nclass Strikethrough extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_strikethrough_strikethroughediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _strikethrough_strikethroughui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Strikethrough';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js ***! + \*************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StrikethroughEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/strikethrough/strikethroughediting\n */\n\n\nconst STRIKETHROUGH = 'strikethrough';\n/**\n * The strikethrough editing feature.\n *\n * It registers the `'strikethrough'` command, the Ctrl+Shift+X keystroke and introduces the\n * `strikethroughsthrough` attribute in the model which renders to the view\n * as a `` element.\n */\nclass StrikethroughEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'StrikethroughEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow strikethrough attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: STRIKETHROUGH });\n editor.model.schema.setAttributeProperties(STRIKETHROUGH, {\n isFormatting: true,\n copyOnEnter: true\n });\n editor.conversion.attributeToElement({\n model: STRIKETHROUGH,\n view: 's',\n upcastAlso: [\n 'del',\n 'strike',\n {\n styles: {\n 'text-decoration': 'line-through'\n }\n }\n ]\n });\n // Create strikethrough command.\n editor.commands.add(STRIKETHROUGH, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, STRIKETHROUGH));\n // Set the Ctrl+Shift+X keystroke.\n editor.keystrokes.set('CTRL+SHIFT+X', 'strikethrough');\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js ***! + \********************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StrikethroughUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_strikethrough_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/strikethrough.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/strikethrough/strikethroughui\n */\n\n\n\nconst STRIKETHROUGH = 'strikethrough';\n/**\n * The strikethrough UI feature. It introduces the Strikethrough button.\n */\nclass StrikethroughUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'StrikethroughUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add strikethrough button to feature components.\n editor.ui.componentFactory.add(STRIKETHROUGH, locale => {\n const command = editor.commands.get(STRIKETHROUGH);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Strikethrough'),\n icon: _theme_icons_strikethrough_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n keystroke: 'CTRL+SHIFT+X',\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(STRIKETHROUGH);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Subscript)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _subscript_subscriptediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./subscript/subscriptediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js\");\n/* harmony import */ var _subscript_subscriptui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./subscript/subscriptui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/subscript\n */\n\n\n\n/**\n * The subscript feature.\n *\n * It loads the {@link module:basic-styles/subscript/subscriptediting~SubscriptEditing} and\n * {@link module:basic-styles/subscript/subscriptui~SubscriptUI} plugins.\n */\nclass Subscript extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_subscript_subscriptediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _subscript_subscriptui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Subscript';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SubscriptEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/subscript/subscriptediting\n */\n\n\nconst SUBSCRIPT = 'subscript';\n/**\n * The subscript editing feature.\n *\n * It registers the `sub` command and introduces the `sub` attribute in the model which renders to the view\n * as a `` element.\n */\nclass SubscriptEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'SubscriptEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow sub attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: SUBSCRIPT });\n editor.model.schema.setAttributeProperties(SUBSCRIPT, {\n isFormatting: true,\n copyOnEnter: true\n });\n // Build converter from model to view for data and editing pipelines.\n editor.conversion.attributeToElement({\n model: SUBSCRIPT,\n view: 'sub',\n upcastAlso: [\n {\n styles: {\n 'vertical-align': 'sub'\n }\n }\n ]\n });\n // Create sub command.\n editor.commands.add(SUBSCRIPT, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, SUBSCRIPT));\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SubscriptUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_subscript_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/subscript.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/subscript/subscriptui\n */\n\n\n\nconst SUBSCRIPT = 'subscript';\n/**\n * The subscript UI feature. It introduces the Subscript button.\n */\nclass SubscriptUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'SubscriptUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add subscript button to feature components.\n editor.ui.componentFactory.add(SUBSCRIPT, locale => {\n const command = editor.commands.get(SUBSCRIPT);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Subscript'),\n icon: _theme_icons_subscript_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(SUBSCRIPT);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Superscript)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _superscript_superscriptediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./superscript/superscriptediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js\");\n/* harmony import */ var _superscript_superscriptui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./superscript/superscriptui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/superscript\n */\n\n\n\n/**\n * The superscript feature.\n *\n * It loads the {@link module:basic-styles/superscript/superscriptediting~SuperscriptEditing} and\n * {@link module:basic-styles/superscript/superscriptui~SuperscriptUI} plugins.\n */\nclass Superscript extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_superscript_superscriptediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _superscript_superscriptui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Superscript';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js ***! + \*********************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SuperscriptEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/superscript/superscriptediting\n */\n\n\nconst SUPERSCRIPT = 'superscript';\n/**\n * The superscript editing feature.\n *\n * It registers the `super` command and introduces the `super` attribute in the model which renders to the view\n * as a `` element.\n */\nclass SuperscriptEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'SuperscriptEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow super attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: SUPERSCRIPT });\n editor.model.schema.setAttributeProperties(SUPERSCRIPT, {\n isFormatting: true,\n copyOnEnter: true\n });\n // Build converter from model to view for data and editing pipelines.\n editor.conversion.attributeToElement({\n model: SUPERSCRIPT,\n view: 'sup',\n upcastAlso: [\n {\n styles: {\n 'vertical-align': 'super'\n }\n }\n ]\n });\n // Create super command.\n editor.commands.add(SUPERSCRIPT, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, SUPERSCRIPT));\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js ***! + \****************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SuperscriptUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_superscript_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/superscript.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/superscript/superscriptui\n */\n\n\n\nconst SUPERSCRIPT = 'superscript';\n/**\n * The superscript UI feature. It introduces the Superscript button.\n */\nclass SuperscriptUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'SuperscriptUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add superscript button to feature components.\n editor.ui.componentFactory.add(SUPERSCRIPT, locale => {\n const command = editor.commands.get(SUPERSCRIPT);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Superscript'),\n icon: _theme_icons_superscript_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(SUPERSCRIPT);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Underline)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _underline_underlineediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./underline/underlineediting */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js\");\n/* harmony import */ var _underline_underlineui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./underline/underlineui */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/underline\n */\n\n\n\n/**\n * The underline feature.\n *\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation}\n * and the {@glink api/basic-styles package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/underline/underlineediting~UnderlineEditing} and\n * {@link module:basic-styles/underline/underlineui~UnderlineUI} plugins.\n */\nclass Underline extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_underline_underlineediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _underline_underlineui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Underline';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ UnderlineEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _attributecommand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../attributecommand */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/underline/underlineediting\n */\n\n\nconst UNDERLINE = 'underline';\n/**\n * The underline editing feature.\n *\n * It registers the `'underline'` command, the Ctrl+U keystroke\n * and introduces the `underline` attribute in the model which renders to the view as an `` element.\n */\nclass UnderlineEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'UnderlineEditing';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n // Allow strikethrough attribute on text nodes.\n editor.model.schema.extend('$text', { allowAttributes: UNDERLINE });\n editor.model.schema.setAttributeProperties(UNDERLINE, {\n isFormatting: true,\n copyOnEnter: true\n });\n editor.conversion.attributeToElement({\n model: UNDERLINE,\n view: 'u',\n upcastAlso: {\n styles: {\n 'text-decoration': 'underline'\n }\n }\n });\n // Create underline command.\n editor.commands.add(UNDERLINE, new _attributecommand__WEBPACK_IMPORTED_MODULE_1__[\"default\"](editor, UNDERLINE));\n // Set the Ctrl+U keystroke.\n editor.keystrokes.set('CTRL+U', 'underline');\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ UnderlineUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_icons_underline_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../theme/icons/underline.svg */ \"./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module basic-styles/underline/underlineui\n */\n\n\n\nconst UNDERLINE = 'underline';\n/**\n * The underline UI feature. It introduces the Underline button.\n */\nclass UnderlineUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'UnderlineUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n // Add bold button to feature components.\n editor.ui.componentFactory.add(UNDERLINE, locale => {\n const command = editor.commands.get(UNDERLINE);\n const view = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n view.set({\n label: t('Underline'),\n icon: _theme_icons_underline_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n keystroke: 'CTRL+U',\n tooltip: true,\n isToggleable: true\n });\n view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(view, 'execute', () => {\n editor.execute(UNDERLINE);\n editor.editing.view.focus();\n });\n return view;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BlockQuote)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var _blockquoteediting__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./blockquoteediting */ \"./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js\");\n/* harmony import */ var _blockquoteui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./blockquoteui */ \"./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module block-quote/blockquote\n */\n\n\n\n/**\n * The block quote plugin.\n *\n * For more information about this feature check the {@glink api/block-quote package page}.\n *\n * This is a \"glue\" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature}\n * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}.\n *\n * @extends module:core/plugin~Plugin\n */\nclass BlockQuote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_blockquoteediting__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _blockquoteui__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'BlockQuote';\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BlockQuoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/utils */ \"./node_modules/ckeditor5/src/utils.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module block-quote/blockquotecommand\n */\n\n\n/**\n * The block quote command plugin.\n *\n * @extends module:core/command~Command\n */\nclass BlockQuoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n /**\n * @inheritDoc\n */\n refresh() {\n this.value = this._getValue();\n this.isEnabled = this._checkEnabled();\n }\n /**\n * Executes the command. When the command {@link #value is on}, all top-most block quotes within\n * the selection will be removed. If it is off, all selected blocks will be wrapped with\n * a block quote.\n *\n * @fires execute\n * @param options Command options.\n * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote,\n * otherwise the command will remove the block quote. If not set, the command will act basing on its current value.\n */\n execute(options = {}) {\n const model = this.editor.model;\n const schema = model.schema;\n const selection = model.document.selection;\n const blocks = Array.from(selection.getSelectedBlocks());\n const value = (options.forceValue === undefined) ? !this.value : options.forceValue;\n model.change(writer => {\n if (!value) {\n this._removeQuote(writer, blocks.filter(findQuote));\n }\n else {\n const blocksToQuote = blocks.filter(block => {\n // Already quoted blocks needs to be considered while quoting too\n // in order to reuse their elements.\n return findQuote(block) || checkCanBeQuoted(schema, block);\n });\n this._applyQuote(writer, blocksToQuote);\n }\n });\n }\n /**\n * Checks the command's {@link #value}.\n */\n _getValue() {\n const selection = this.editor.model.document.selection;\n const firstBlock = (0,ckeditor5_src_utils__WEBPACK_IMPORTED_MODULE_1__.first)(selection.getSelectedBlocks());\n // In the current implementation, the block quote must be an immediate parent of a block element.\n return !!(firstBlock && findQuote(firstBlock));\n }\n /**\n * Checks whether the command can be enabled in the current context.\n *\n * @returns Whether the command should be enabled.\n */\n _checkEnabled() {\n if (this.value) {\n return true;\n }\n const selection = this.editor.model.document.selection;\n const schema = this.editor.model.schema;\n const firstBlock = (0,ckeditor5_src_utils__WEBPACK_IMPORTED_MODULE_1__.first)(selection.getSelectedBlocks());\n if (!firstBlock) {\n return false;\n }\n return checkCanBeQuoted(schema, firstBlock);\n }\n /**\n * Removes the quote from given blocks.\n *\n * If blocks which are supposed to be \"unquoted\" are in the middle of a quote,\n * start it or end it, then the quote will be split (if needed) and the blocks\n * will be moved out of it, so other quoted blocks remained quoted.\n */\n _removeQuote(writer, blocks) {\n // Unquote all groups of block. Iterate in the reverse order to not break following ranges.\n getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => {\n if (groupRange.start.isAtStart && groupRange.end.isAtEnd) {\n writer.unwrap(groupRange.start.parent);\n return;\n }\n // The group of blocks are at the beginning of an so let's move them left (out of the ).\n if (groupRange.start.isAtStart) {\n const positionBefore = writer.createPositionBefore(groupRange.start.parent);\n writer.move(groupRange, positionBefore);\n return;\n }\n // The blocks are in the middle of an so we need to split the after the last block\n // so we move the items there.\n if (!groupRange.end.isAtEnd) {\n writer.split(groupRange.end);\n }\n // Now we are sure that groupRange.end.isAtEnd is true, so let's move the blocks right.\n const positionAfter = writer.createPositionAfter(groupRange.end.parent);\n writer.move(groupRange, positionAfter);\n });\n }\n /**\n * Applies the quote to given blocks.\n */\n _applyQuote(writer, blocks) {\n const quotesToMerge = [];\n // Quote all groups of block. Iterate in the reverse order to not break following ranges.\n getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => {\n let quote = findQuote(groupRange.start);\n if (!quote) {\n quote = writer.createElement('blockQuote');\n writer.wrap(groupRange, quote);\n }\n quotesToMerge.push(quote);\n });\n // Merge subsequent elements. Reverse the order again because this time we want to go through\n // the elements in the source order (due to how merge works – it moves the right element's content\n // to the first element and removes the right one. Since we may need to merge a couple of subsequent `` elements\n // we want to keep the reference to the first (furthest left) one.\n quotesToMerge.reverse().reduce((currentQuote, nextQuote) => {\n if (currentQuote.nextSibling == nextQuote) {\n writer.merge(writer.createPositionAfter(currentQuote));\n return currentQuote;\n }\n return nextQuote;\n });\n }\n}\nfunction findQuote(elementOrPosition) {\n return elementOrPosition.parent.name == 'blockQuote' ? elementOrPosition.parent : null;\n}\n/**\n * Returns a minimal array of ranges containing groups of subsequent blocks.\n *\n * content: abcdefgh\n * blocks: [ a, b, d, f, g, h ]\n * output ranges: [ab]c[d]e[fgh]\n */\nfunction getRangesOfBlockGroups(writer, blocks) {\n let startPosition;\n let i = 0;\n const ranges = [];\n while (i < blocks.length) {\n const block = blocks[i];\n const nextBlock = blocks[i + 1];\n if (!startPosition) {\n startPosition = writer.createPositionBefore(block);\n }\n if (!nextBlock || block.nextSibling != nextBlock) {\n ranges.push(writer.createRange(startPosition, writer.createPositionAfter(block)));\n startPosition = null;\n }\n i++;\n }\n return ranges;\n}\n/**\n * Checks whether can wrap the block.\n */\nfunction checkCanBeQuoted(schema, block) {\n // TMP will be replaced with schema.checkWrap().\n const isBQAllowed = schema.checkChild(block.parent, 'blockQuote');\n const isBlockAllowedInBQ = schema.checkChild(['$root', 'blockQuote'], block);\n return isBQAllowed && isBlockAllowedInBQ;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BlockQuoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_enter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/enter */ \"./node_modules/ckeditor5/src/enter.js\");\n/* harmony import */ var ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/typing */ \"./node_modules/ckeditor5/src/typing.js\");\n/* harmony import */ var _blockquotecommand__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./blockquotecommand */ \"./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module block-quote/blockquoteediting\n */\n\n\n\n\n/**\n * The block quote editing.\n *\n * Introduces the `'blockQuote'` command and the `'blockQuote'` model element.\n *\n * @extends module:core/plugin~Plugin\n */\nclass BlockQuoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'BlockQuoteEditing';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [ckeditor5_src_enter__WEBPACK_IMPORTED_MODULE_1__.Enter, ckeditor5_src_typing__WEBPACK_IMPORTED_MODULE_2__.Delete];\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const schema = editor.model.schema;\n editor.commands.add('blockQuote', new _blockquotecommand__WEBPACK_IMPORTED_MODULE_3__[\"default\"](editor));\n schema.register('blockQuote', {\n inheritAllFrom: '$container'\n });\n editor.conversion.elementToElement({ model: 'blockQuote', view: 'blockquote' });\n // Postfixer which cleans incorrect model states connected with block quotes.\n editor.model.document.registerPostFixer(writer => {\n const changes = editor.model.document.differ.getChanges();\n for (const entry of changes) {\n if (entry.type == 'insert') {\n const element = entry.position.nodeAfter;\n if (!element) {\n // We are inside a text node.\n continue;\n }\n if (element.is('element', 'blockQuote') && element.isEmpty) {\n // Added an empty blockQuote - remove it.\n writer.remove(element);\n return true;\n }\n else if (element.is('element', 'blockQuote') && !schema.checkChild(entry.position, element)) {\n // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost.\n writer.unwrap(element);\n return true;\n }\n else if (element.is('element')) {\n // Just added an element. Check that all children meet the scheme rules.\n const range = writer.createRangeIn(element);\n for (const child of range.getItems()) {\n if (child.is('element', 'blockQuote') &&\n !schema.checkChild(writer.createPositionBefore(child), child)) {\n writer.unwrap(child);\n return true;\n }\n }\n }\n }\n else if (entry.type == 'remove') {\n const parent = entry.position.parent;\n if (parent.is('element', 'blockQuote') && parent.isEmpty) {\n // Something got removed and now blockQuote is empty. Remove the blockQuote as well.\n writer.remove(parent);\n return true;\n }\n }\n }\n return false;\n });\n const viewDocument = this.editor.editing.view.document;\n const selection = editor.model.document.selection;\n const blockQuoteCommand = editor.commands.get('blockQuote');\n // Overwrite default Enter key behavior.\n // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote.\n this.listenTo(viewDocument, 'enter', (evt, data) => {\n if (!selection.isCollapsed || !blockQuoteCommand.value) {\n return;\n }\n const positionParent = selection.getLastPosition().parent;\n if (positionParent.isEmpty) {\n editor.execute('blockQuote');\n editor.editing.view.scrollToTheSelection();\n data.preventDefault();\n evt.stop();\n }\n }, { context: 'blockquote' });\n // Overwrite default Backspace key behavior.\n // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote.\n this.listenTo(viewDocument, 'delete', (evt, data) => {\n if (data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand.value) {\n return;\n }\n const positionParent = selection.getLastPosition().parent;\n if (positionParent.isEmpty && !positionParent.previousSibling) {\n editor.execute('blockQuote');\n editor.editing.view.scrollToTheSelection();\n data.preventDefault();\n evt.stop();\n }\n }, { context: 'blockquote' });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BlockQuoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"./node_modules/ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"./node_modules/ckeditor5/src/ui.js\");\n/* harmony import */ var _theme_blockquote_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../theme/blockquote.css */ \"./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module block-quote/blockquoteui\n */\n\n\n\n/**\n * The block quote UI plugin.\n *\n * It introduces the `'blockQuote'` button.\n *\n * @extends module:core/plugin~Plugin\n */\nclass BlockQuoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'BlockQuoteUI';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const t = editor.t;\n editor.ui.componentFactory.add('blockQuote', locale => {\n const command = editor.commands.get('blockQuote');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n buttonView.set({\n label: t('Block quote'),\n icon: ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.icons.quote,\n tooltip: true,\n isToggleable: true\n });\n // Bind button model to command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n // Execute command.\n this.listenTo(buttonView, 'execute', () => {\n editor.execute('blockQuote');\n editor.editing.view.focus();\n });\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Clipboard)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-core */ \"./node_modules/@ckeditor/ckeditor5-core/src/index.js\");\n/* harmony import */ var _clipboardpipeline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clipboardpipeline */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js\");\n/* harmony import */ var _dragdrop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dragdrop */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js\");\n/* harmony import */ var _pasteplaintext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pasteplaintext */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/clipboard\n */\n\n\n\n\n/**\n * The clipboard feature.\n *\n * Read more about the clipboard integration in the {@glink framework/guides/deep-dive/clipboard clipboard deep-dive guide}.\n *\n * This is a \"glue\" plugin which loads the following plugins:\n * * {@link module:clipboard/clipboardpipeline~ClipboardPipeline}\n * * {@link module:clipboard/dragdrop~DragDrop}\n * * {@link module:clipboard/pasteplaintext~PastePlainText}\n */\nclass Clipboard extends _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Clipboard';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_clipboardpipeline__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _dragdrop__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _pasteplaintext__WEBPACK_IMPORTED_MODULE_3__[\"default\"]];\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ClipboardObserver)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ckeditor/ckeditor5-engine */ \"./node_modules/@ckeditor/ckeditor5-engine/src/index.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/clipboardobserver\n */\n\n\n/**\n * Clipboard events observer.\n *\n * Fires the following events:\n *\n * * {@link module:engine/view/document~Document#event:clipboardInput},\n * * {@link module:engine/view/document~Document#event:paste},\n * * {@link module:engine/view/document~Document#event:copy},\n * * {@link module:engine/view/document~Document#event:cut},\n * * {@link module:engine/view/document~Document#event:drop},\n * * {@link module:engine/view/document~Document#event:dragover},\n * * {@link module:engine/view/document~Document#event:dragging},\n * * {@link module:engine/view/document~Document#event:dragstart},\n * * {@link module:engine/view/document~Document#event:dragend},\n * * {@link module:engine/view/document~Document#event:dragenter},\n * * {@link module:engine/view/document~Document#event:dragleave}.\n *\n * **Note**: This observer is not available by default (ckeditor5-engine does not add it on its own).\n * To make it available, it needs to be added to {@link module:engine/view/document~Document} by using\n * the {@link module:engine/view/view~View#addObserver `View#addObserver()`} method. Alternatively, you can load the\n * {@link module:clipboard/clipboard~Clipboard} plugin which adds this observer automatically (because it uses it).\n */\nclass ClipboardObserver extends _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.DomEventObserver {\n constructor(view) {\n super(view);\n const viewDocument = this.document;\n this.domEventType = ['paste', 'copy', 'cut', 'drop', 'dragover', 'dragstart', 'dragend', 'dragenter', 'dragleave'];\n this.listenTo(viewDocument, 'paste', handleInput('clipboardInput'), { priority: 'low' });\n this.listenTo(viewDocument, 'drop', handleInput('clipboardInput'), { priority: 'low' });\n this.listenTo(viewDocument, 'dragover', handleInput('dragging'), { priority: 'low' });\n function handleInput(type) {\n return (evt, data) => {\n data.preventDefault();\n const targetRanges = data.dropRange ? [data.dropRange] : null;\n const eventInfo = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.EventInfo(viewDocument, type);\n viewDocument.fire(eventInfo, {\n dataTransfer: data.dataTransfer,\n method: evt.name,\n targetRanges,\n target: data.target\n });\n // If CKEditor handled the input, do not bubble the original event any further.\n // This helps external integrations recognize that fact and act accordingly.\n // https://github.com/ckeditor/ckeditor5-upload/issues/92\n if (eventInfo.stop.called) {\n data.stopPropagation();\n }\n };\n }\n }\n onDomEvent(domEvent) {\n const nativeDataTransfer = 'clipboardData' in domEvent ? domEvent.clipboardData : domEvent.dataTransfer;\n const cacheFiles = domEvent.type == 'drop' || domEvent.type == 'paste';\n const evtData = {\n dataTransfer: new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.DataTransfer(nativeDataTransfer, { cacheFiles })\n };\n if (domEvent.type == 'drop' || domEvent.type == 'dragover') {\n evtData.dropRange = getDropViewRange(this.view, domEvent);\n }\n this.fire(domEvent.type, domEvent, evtData);\n }\n}\nfunction getDropViewRange(view, domEvent) {\n const domDoc = domEvent.target.ownerDocument;\n const x = domEvent.clientX;\n const y = domEvent.clientY;\n let domRange;\n // Webkit & Blink.\n if (domDoc.caretRangeFromPoint && domDoc.caretRangeFromPoint(x, y)) {\n domRange = domDoc.caretRangeFromPoint(x, y);\n }\n // FF.\n else if (domEvent.rangeParent) {\n domRange = domDoc.createRange();\n domRange.setStart(domEvent.rangeParent, domEvent.rangeOffset);\n domRange.collapse(true);\n }\n if (domRange) {\n return view.domConverter.domRangeToView(domRange);\n }\n return null;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ClipboardPipeline)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-core */ \"./node_modules/@ckeditor/ckeditor5-core/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/* harmony import */ var _clipboardobserver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clipboardobserver */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js\");\n/* harmony import */ var _utils_plaintexttohtml__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/plaintexttohtml */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js\");\n/* harmony import */ var _utils_normalizeclipboarddata__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/normalizeclipboarddata */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js\");\n/* harmony import */ var _utils_viewtoplaintext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/viewtoplaintext */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/clipboardpipeline\n */\n\n\n\n\n\n\n// Input pipeline events overview:\n//\n// ┌──────────────────────┐ ┌──────────────────────┐\n// │ view.Document │ │ view.Document │\n// │ paste │ │ drop │\n// └───────────┬──────────┘ └───────────┬──────────┘\n// │ │\n// └────────────────┌────────────────┘\n// │\n// ┌─────────V────────┐\n// │ view.Document │ Retrieves text/html or text/plain from data.dataTransfer\n// │ clipboardInput │ and processes it to view.DocumentFragment.\n// └─────────┬────────┘\n// │\n// ┌───────────V───────────┐\n// │ ClipboardPipeline │ Converts view.DocumentFragment to model.DocumentFragment.\n// │ inputTransformation │\n// └───────────┬───────────┘\n// │\n// ┌──────────V──────────┐\n// │ ClipboardPipeline │ Calls model.insertContent().\n// │ contentInsertion │\n// └─────────────────────┘\n//\n//\n// Output pipeline events overview:\n//\n// ┌──────────────────────┐ ┌──────────────────────┐\n// │ view.Document │ │ view.Document │ Retrieves the selected model.DocumentFragment\n// │ copy │ │ cut │ and converts it to view.DocumentFragment.\n// └───────────┬──────────┘ └───────────┬──────────┘\n// │ │\n// └────────────────┌────────────────┘\n// │\n// ┌─────────V────────┐\n// │ view.Document │ Processes view.DocumentFragment to text/html and text/plain\n// │ clipboardOutput │ and stores the results in data.dataTransfer.\n// └──────────────────┘\n//\n/**\n * The clipboard pipeline feature. It is responsible for intercepting the `paste` and `drop` events and\n * passing the pasted content through a series of events in order to insert it into the editor's content.\n * It also handles the `cut` and `copy` events to fill the native clipboard with the serialized editor's data.\n *\n * # Input pipeline\n *\n * The behavior of the default handlers (all at a `low` priority):\n *\n * ## Event: `paste` or `drop`\n *\n * 1. Translates the event data.\n * 2. Fires the {@link module:engine/view/document~Document#event:clipboardInput `view.Document#clipboardInput`} event.\n *\n * ## Event: `view.Document#clipboardInput`\n *\n * 1. If the `data.content` event field is already set (by some listener on a higher priority), it takes this content and fires the event\n * from the last point.\n * 2. Otherwise, it retrieves `text/html` or `text/plain` from `data.dataTransfer`.\n * 3. Normalizes the raw data by applying simple filters on string data.\n * 4. Processes the raw data to {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`} with the\n * {@link module:engine/controller/datacontroller~DataController#htmlProcessor `DataController#htmlProcessor`}.\n * 5. Fires the {@link module:clipboard/clipboardpipeline~ClipboardPipeline#event:inputTransformation\n * `ClipboardPipeline#inputTransformation`} event with the view document fragment in the `data.content` event field.\n *\n * ## Event: `ClipboardPipeline#inputTransformation`\n *\n * 1. Converts {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`} from the `data.content` field to\n * {@link module:engine/model/documentfragment~DocumentFragment `model.DocumentFragment`}.\n * 2. Fires the {@link module:clipboard/clipboardpipeline~ClipboardPipeline#event:contentInsertion `ClipboardPipeline#contentInsertion`}\n * event with the model document fragment in the `data.content` event field.\n * **Note**: The `ClipboardPipeline#contentInsertion` event is fired within a model change block to allow other handlers\n * to run in the same block without post-fixers called in between (i.e., the selection post-fixer).\n *\n * ## Event: `ClipboardPipeline#contentInsertion`\n *\n * 1. Calls {@link module:engine/model/model~Model#insertContent `model.insertContent()`} to insert `data.content`\n * at the current selection position.\n *\n * # Output pipeline\n *\n * The behavior of the default handlers (all at a `low` priority):\n *\n * ## Event: `copy`, `cut` or `dragstart`\n *\n * 1. Retrieves the selected {@link module:engine/model/documentfragment~DocumentFragment `model.DocumentFragment`} by calling\n * {@link module:engine/model/model~Model#getSelectedContent `model#getSelectedContent()`}.\n * 2. Converts the model document fragment to {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`}.\n * 3. Fires the {@link module:engine/view/document~Document#event:clipboardOutput `view.Document#clipboardOutput`} event\n * with the view document fragment in the `data.content` event field.\n *\n * ## Event: `view.Document#clipboardOutput`\n *\n * 1. Processes `data.content` to HTML and plain text with the\n * {@link module:engine/controller/datacontroller~DataController#htmlProcessor `DataController#htmlProcessor`}.\n * 2. Updates the `data.dataTransfer` data for `text/html` and `text/plain` with the processed data.\n * 3. For the `cut` method, calls {@link module:engine/model/model~Model#deleteContent `model.deleteContent()`}\n * on the current selection.\n *\n * Read more about the clipboard integration in the {@glink framework/guides/deep-dive/clipboard clipboard deep-dive guide}.\n */\nclass ClipboardPipeline extends _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'ClipboardPipeline';\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const view = editor.editing.view;\n view.addObserver(_clipboardobserver__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n this._setupPasteDrop();\n this._setupCopyCut();\n }\n /**\n * The clipboard paste pipeline.\n */\n _setupPasteDrop() {\n const editor = this.editor;\n const model = editor.model;\n const view = editor.editing.view;\n const viewDocument = view.document;\n // Pasting and dropping is disabled when editor is in the read-only mode.\n // See: https://github.com/ckeditor/ckeditor5-clipboard/issues/26.\n this.listenTo(viewDocument, 'clipboardInput', evt => {\n if (editor.isReadOnly) {\n evt.stop();\n }\n }, { priority: 'highest' });\n this.listenTo(viewDocument, 'clipboardInput', (evt, data) => {\n const dataTransfer = data.dataTransfer;\n let content;\n // Some feature could already inject content in the higher priority event handler (i.e., codeBlock).\n if (data.content) {\n content = data.content;\n }\n else {\n let contentData = '';\n if (dataTransfer.getData('text/html')) {\n contentData = (0,_utils_normalizeclipboarddata__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(dataTransfer.getData('text/html'));\n }\n else if (dataTransfer.getData('text/plain')) {\n contentData = (0,_utils_plaintexttohtml__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(dataTransfer.getData('text/plain'));\n }\n content = this.editor.data.htmlProcessor.toView(contentData);\n }\n const eventInfo = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_1__.EventInfo(this, 'inputTransformation');\n this.fire(eventInfo, {\n content,\n dataTransfer,\n targetRanges: data.targetRanges,\n method: data.method\n });\n // If CKEditor handled the input, do not bubble the original event any further.\n // This helps external integrations recognize this fact and act accordingly.\n // https://github.com/ckeditor/ckeditor5-upload/issues/92\n if (eventInfo.stop.called) {\n evt.stop();\n }\n view.scrollToTheSelection();\n }, { priority: 'low' });\n this.listenTo(this, 'inputTransformation', (evt, data) => {\n if (data.content.isEmpty) {\n return;\n }\n const dataController = this.editor.data;\n // Convert the pasted content into a model document fragment.\n // The conversion is contextual, but in this case an \"all allowed\" context is needed\n // and for that we use the $clipboardHolder item.\n const modelFragment = dataController.toModel(data.content, '$clipboardHolder');\n if (modelFragment.childCount == 0) {\n return;\n }\n evt.stop();\n // Fire content insertion event in a single change block to allow other handlers to run in the same block\n // without post-fixers called in between (i.e., the selection post-fixer).\n model.change(() => {\n this.fire('contentInsertion', {\n content: modelFragment,\n method: data.method,\n dataTransfer: data.dataTransfer,\n targetRanges: data.targetRanges\n });\n });\n }, { priority: 'low' });\n this.listenTo(this, 'contentInsertion', (evt, data) => {\n data.resultRange = model.insertContent(data.content);\n }, { priority: 'low' });\n }\n /**\n * The clipboard copy/cut pipeline.\n */\n _setupCopyCut() {\n const editor = this.editor;\n const modelDocument = editor.model.document;\n const view = editor.editing.view;\n const viewDocument = view.document;\n const onCopyCut = (evt, data) => {\n const dataTransfer = data.dataTransfer;\n data.preventDefault();\n const content = editor.data.toView(editor.model.getSelectedContent(modelDocument.selection));\n viewDocument.fire('clipboardOutput', {\n dataTransfer,\n content,\n method: evt.name\n });\n };\n this.listenTo(viewDocument, 'copy', onCopyCut, { priority: 'low' });\n this.listenTo(viewDocument, 'cut', (evt, data) => {\n // Cutting is disabled when editor is in the read-only mode.\n // See: https://github.com/ckeditor/ckeditor5-clipboard/issues/26.\n if (editor.isReadOnly) {\n data.preventDefault();\n }\n else {\n onCopyCut(evt, data);\n }\n }, { priority: 'low' });\n this.listenTo(viewDocument, 'clipboardOutput', (evt, data) => {\n if (!data.content.isEmpty) {\n data.dataTransfer.setData('text/html', this.editor.data.htmlProcessor.toData(data.content));\n data.dataTransfer.setData('text/plain', (0,_utils_viewtoplaintext__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(data.content));\n }\n if (data.method == 'cut') {\n editor.model.deleteContent(modelDocument.selection);\n }\n }, { priority: 'low' });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DragDrop)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-core */ \"./node_modules/@ckeditor/ckeditor5-core/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ckeditor/ckeditor5-engine */ \"./node_modules/@ckeditor/ckeditor5-engine/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ckeditor/ckeditor5-widget */ \"./node_modules/@ckeditor/ckeditor5-widget/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/* harmony import */ var _clipboardpipeline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./clipboardpipeline */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js\");\n/* harmony import */ var _clipboardobserver__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./clipboardobserver */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es */ \"./node_modules/lodash-es/throttle.js\");\n/* harmony import */ var _theme_clipboard_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../theme/clipboard.css */ \"./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/dragdrop\n */\n/* globals setTimeout, clearTimeout */\n\n\n\n\n\n\n\n\n// Drag and drop events overview:\n//\n// ┌──────────────────┐\n// │ mousedown │ Sets the draggable attribute.\n// └─────────┬────────┘\n// │\n// └─────────────────────┐\n// │ │\n// │ ┌─────────V────────┐\n// │ │ mouseup │ Dragging did not start, removes the draggable attribute.\n// │ └──────────────────┘\n// │\n// ┌─────────V────────┐ Retrieves the selected model.DocumentFragment\n// │ dragstart │ and converts it to view.DocumentFragment.\n// └─────────┬────────┘\n// │\n// ┌─────────V────────┐ Processes view.DocumentFragment to text/html and text/plain\n// │ clipboardOutput │ and stores the results in data.dataTransfer.\n// └─────────┬────────┘\n// │\n// │ DOM dragover\n// ┌────────────┐\n// │ │\n// ┌─────────V────────┐ │\n// │ dragging │ │ Updates the drop target marker.\n// └─────────┬────────┘ │\n// │ │\n// ┌─────────────└────────────┘\n// │ │ │\n// │ ┌─────────V────────┐ │\n// │ │ dragleave │ │ Removes the drop target marker.\n// │ └─────────┬────────┘ │\n// │ │ │\n// ┌───│─────────────┘ │\n// │ │ │ │\n// │ │ ┌─────────V────────┐ │\n// │ │ │ dragenter │ │ Focuses the editor view.\n// │ │ └─────────┬────────┘ │\n// │ │ │ │\n// │ │ └────────────┘\n// │ │\n// │ └─────────────┐\n// │ │ │\n// │ │ ┌─────────V────────┐\n// └───┐ │ drop │ (The default handler of the clipboard pipeline).\n// │ └─────────┬────────┘\n// │ │\n// │ ┌─────────V────────┐ Resolves the final data.targetRanges.\n// │ │ clipboardInput │ Aborts if dropping on dragged content.\n// │ └─────────┬────────┘\n// │ │\n// │ ┌─────────V────────┐\n// │ │ clipboardInput │ (The default handler of the clipboard pipeline).\n// │ └─────────┬────────┘\n// │ │\n// │ ┌───────────V───────────┐\n// │ │ inputTransformation │ (The default handler of the clipboard pipeline).\n// │ └───────────┬───────────┘\n// │ │\n// │ ┌──────────V──────────┐\n// │ │ contentInsertion │ Updates the document selection to drop range.\n// │ └──────────┬──────────┘\n// │ │\n// │ ┌──────────V──────────┐\n// │ │ contentInsertion │ (The default handler of the clipboard pipeline).\n// │ └──────────┬──────────┘\n// │ │\n// │ ┌──────────V──────────┐\n// │ │ contentInsertion │ Removes the content from the original range if the insertion was successful.\n// │ └──────────┬──────────┘\n// │ │\n// └─────────────┐\n// │\n// ┌─────────V────────┐\n// │ dragend │ Removes the drop marker and cleans the state.\n// └──────────────────┘\n//\n/**\n * The drag and drop feature. It works on top of the {@link module:clipboard/clipboardpipeline~ClipboardPipeline}.\n *\n * Read more about the clipboard integration in the {@glink framework/guides/deep-dive/clipboard clipboard deep-dive guide}.\n */\nclass DragDrop extends _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'DragDrop';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_clipboardpipeline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.Widget];\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const view = editor.editing.view;\n this._draggedRange = null;\n this._draggingUid = '';\n this._draggableElement = null;\n this._updateDropMarkerThrottled = (0,lodash_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(targetRange => this._updateDropMarker(targetRange), 40);\n this._removeDropMarkerDelayed = delay(() => this._removeDropMarker(), 40);\n this._clearDraggableAttributesDelayed = delay(() => this._clearDraggableAttributes(), 40);\n view.addObserver(_clipboardobserver__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n view.addObserver(_ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.MouseObserver);\n this._setupDragging();\n this._setupContentInsertionIntegration();\n this._setupClipboardInputIntegration();\n this._setupDropMarker();\n this._setupDraggableAttributeHandling();\n this.listenTo(editor, 'change:isReadOnly', (evt, name, isReadOnly) => {\n if (isReadOnly) {\n this.forceDisabled('readOnlyMode');\n }\n else {\n this.clearForceDisabled('readOnlyMode');\n }\n });\n this.on('change:isEnabled', (evt, name, isEnabled) => {\n if (!isEnabled) {\n this._finalizeDragging(false);\n }\n });\n if (_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isAndroid) {\n this.forceDisabled('noAndroidSupport');\n }\n }\n /**\n * @inheritDoc\n */\n destroy() {\n if (this._draggedRange) {\n this._draggedRange.detach();\n this._draggedRange = null;\n }\n this._updateDropMarkerThrottled.cancel();\n this._removeDropMarkerDelayed.cancel();\n this._clearDraggableAttributesDelayed.cancel();\n return super.destroy();\n }\n /**\n * Drag and drop events handling.\n */\n _setupDragging() {\n const editor = this.editor;\n const model = editor.model;\n const modelDocument = model.document;\n const view = editor.editing.view;\n const viewDocument = view.document;\n // The handler for the drag start; it is responsible for setting data transfer object.\n this.listenTo(viewDocument, 'dragstart', (evt, data) => {\n const selection = modelDocument.selection;\n // Don't drag the editable element itself.\n if (data.target && data.target.is('editableElement')) {\n data.preventDefault();\n return;\n }\n // TODO we could clone this node somewhere and style it to match editing view but without handles,\n // selection outline, WTA buttons, etc.\n // data.dataTransfer._native.setDragImage( data.domTarget, 0, 0 );\n // Check if this is dragstart over the widget (but not a nested editable).\n const draggableWidget = data.target ? findDraggableWidget(data.target) : null;\n if (draggableWidget) {\n const modelElement = editor.editing.mapper.toModelElement(draggableWidget);\n this._draggedRange = _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.LiveRange.fromRange(model.createRangeOn(modelElement));\n // Disable toolbars so they won't obscure the drop area.\n if (editor.plugins.has('WidgetToolbarRepository')) {\n editor.plugins.get('WidgetToolbarRepository').forceDisabled('dragDrop');\n }\n }\n // If this was not a widget we should check if we need to drag some text content.\n else if (!viewDocument.selection.isCollapsed) {\n const selectedElement = viewDocument.selection.getSelectedElement();\n if (!selectedElement || !(0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(selectedElement)) {\n this._draggedRange = _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.LiveRange.fromRange(selection.getFirstRange());\n }\n }\n if (!this._draggedRange) {\n data.preventDefault();\n return;\n }\n this._draggingUid = (0,_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.uid)();\n data.dataTransfer.effectAllowed = this.isEnabled ? 'copyMove' : 'copy';\n data.dataTransfer.setData('application/ckeditor5-dragging-uid', this._draggingUid);\n const draggedSelection = model.createSelection(this._draggedRange.toRange());\n const content = editor.data.toView(model.getSelectedContent(draggedSelection));\n viewDocument.fire('clipboardOutput', {\n dataTransfer: data.dataTransfer,\n content,\n method: 'dragstart'\n });\n if (!this.isEnabled) {\n this._draggedRange.detach();\n this._draggedRange = null;\n this._draggingUid = '';\n }\n }, { priority: 'low' });\n // The handler for finalizing drag and drop. It should always be triggered after dragging completes\n // even if it was completed in a different application.\n // Note: This is not fired if source text node got removed while downcasting a marker.\n this.listenTo(viewDocument, 'dragend', (evt, data) => {\n this._finalizeDragging(!data.dataTransfer.isCanceled && data.dataTransfer.dropEffect == 'move');\n }, { priority: 'low' });\n // Dragging over the editable.\n this.listenTo(viewDocument, 'dragenter', () => {\n if (!this.isEnabled) {\n return;\n }\n view.focus();\n });\n // Dragging out of the editable.\n this.listenTo(viewDocument, 'dragleave', () => {\n // We do not know if the mouse left the editor or just some element in it, so let us wait a few milliseconds\n // to check if 'dragover' is not fired.\n this._removeDropMarkerDelayed();\n });\n // Handler for moving dragged content over the target area.\n this.listenTo(viewDocument, 'dragging', (evt, data) => {\n if (!this.isEnabled) {\n data.dataTransfer.dropEffect = 'none';\n return;\n }\n this._removeDropMarkerDelayed.cancel();\n const targetRange = findDropTargetRange(editor, data.targetRanges, data.target);\n // If this is content being dragged from another editor, moving out of current editor instance\n // is not possible until 'dragend' event case will be fixed.\n if (!this._draggedRange) {\n data.dataTransfer.dropEffect = 'copy';\n }\n // In Firefox it is already set and effect allowed remains the same as originally set.\n if (!_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isGecko) {\n if (data.dataTransfer.effectAllowed == 'copy') {\n data.dataTransfer.dropEffect = 'copy';\n }\n else if (['all', 'copyMove'].includes(data.dataTransfer.effectAllowed)) {\n data.dataTransfer.dropEffect = 'move';\n }\n }\n /* istanbul ignore else */\n if (targetRange) {\n this._updateDropMarkerThrottled(targetRange);\n }\n }, { priority: 'low' });\n }\n /**\n * Integration with the `clipboardInput` event.\n */\n _setupClipboardInputIntegration() {\n const editor = this.editor;\n const view = editor.editing.view;\n const viewDocument = view.document;\n // Update the event target ranges and abort dropping if dropping over itself.\n this.listenTo(viewDocument, 'clipboardInput', (evt, data) => {\n if (data.method != 'drop') {\n return;\n }\n const targetRange = findDropTargetRange(editor, data.targetRanges, data.target);\n // The dragging markers must be removed after searching for the target range because sometimes\n // the target lands on the marker itself.\n this._removeDropMarker();\n /* istanbul ignore if */\n if (!targetRange) {\n this._finalizeDragging(false);\n evt.stop();\n return;\n }\n // Since we cannot rely on the drag end event, we must check if the local drag range is from the current drag and drop\n // or it is from some previous not cleared one.\n if (this._draggedRange && this._draggingUid != data.dataTransfer.getData('application/ckeditor5-dragging-uid')) {\n this._draggedRange.detach();\n this._draggedRange = null;\n this._draggingUid = '';\n }\n // Do not do anything if some content was dragged within the same document to the same position.\n const isMove = getFinalDropEffect(data.dataTransfer) == 'move';\n if (isMove && this._draggedRange && this._draggedRange.containsRange(targetRange, true)) {\n this._finalizeDragging(false);\n evt.stop();\n return;\n }\n // Override the target ranges with the one adjusted to the best one for a drop.\n data.targetRanges = [editor.editing.mapper.toViewRange(targetRange)];\n }, { priority: 'high' });\n }\n /**\n * Integration with the `contentInsertion` event of the clipboard pipeline.\n */\n _setupContentInsertionIntegration() {\n const clipboardPipeline = this.editor.plugins.get(_clipboardpipeline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n clipboardPipeline.on('contentInsertion', (evt, data) => {\n if (!this.isEnabled || data.method !== 'drop') {\n return;\n }\n // Update the selection to the target range in the same change block to avoid selection post-fixing\n // and to be able to clone text attributes for plain text dropping.\n const ranges = data.targetRanges.map(viewRange => this.editor.editing.mapper.toModelRange(viewRange));\n this.editor.model.change(writer => writer.setSelection(ranges));\n }, { priority: 'high' });\n clipboardPipeline.on('contentInsertion', (evt, data) => {\n if (!this.isEnabled || data.method !== 'drop') {\n return;\n }\n // Remove dragged range content, remove markers, clean after dragging.\n const isMove = getFinalDropEffect(data.dataTransfer) == 'move';\n // Whether any content was inserted (insertion might fail if the schema is disallowing some elements\n // (for example an image caption allows only the content of a block but not blocks themselves.\n // Some integrations might not return valid range (i.e., table pasting).\n const isSuccess = !data.resultRange || !data.resultRange.isCollapsed;\n this._finalizeDragging(isSuccess && isMove);\n }, { priority: 'lowest' });\n }\n /**\n * Adds listeners that add the `draggable` attribute to the elements while the mouse button is down so the dragging could start.\n */\n _setupDraggableAttributeHandling() {\n const editor = this.editor;\n const view = editor.editing.view;\n const viewDocument = view.document;\n // Add the 'draggable' attribute to the widget while pressing the selection handle.\n // This is required for widgets to be draggable. In Chrome it will enable dragging text nodes.\n this.listenTo(viewDocument, 'mousedown', (evt, data) => {\n // The lack of data can be caused by editor tests firing fake mouse events. This should not occur\n // in real-life scenarios but this greatly simplifies editor tests that would otherwise fail a lot.\n if (_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isAndroid || !data) {\n return;\n }\n this._clearDraggableAttributesDelayed.cancel();\n // Check if this is a mousedown over the widget (but not a nested editable).\n let draggableElement = findDraggableWidget(data.target);\n // Note: There is a limitation that if more than a widget is selected (a widget and some text)\n // and dragging starts on the widget, then only the widget is dragged.\n // If this was not a widget then we should check if we need to drag some text content.\n // In Chrome set a 'draggable' attribute on closest editable to allow immediate dragging of the selected text range.\n // In Firefox this is not needed. In Safari it makes the whole editable draggable (not just textual content).\n // Disabled in read-only mode because draggable=\"true\" + contenteditable=\"false\" results\n // in not firing selectionchange event ever, which makes the selection stuck in read-only mode.\n if (_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isBlink && !editor.isReadOnly && !draggableElement && !viewDocument.selection.isCollapsed) {\n const selectedElement = viewDocument.selection.getSelectedElement();\n if (!selectedElement || !(0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(selectedElement)) {\n draggableElement = viewDocument.selection.editableElement;\n }\n }\n if (draggableElement) {\n view.change(writer => {\n writer.setAttribute('draggable', 'true', draggableElement);\n });\n // Keep the reference to the model element in case the view element gets removed while dragging.\n this._draggableElement = editor.editing.mapper.toModelElement(draggableElement);\n }\n });\n // Remove the draggable attribute in case no dragging started (only mousedown + mouseup).\n this.listenTo(viewDocument, 'mouseup', () => {\n if (!_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isAndroid) {\n this._clearDraggableAttributesDelayed();\n }\n });\n }\n /**\n * Removes the `draggable` attribute from the element that was used for dragging.\n */\n _clearDraggableAttributes() {\n const editing = this.editor.editing;\n editing.view.change(writer => {\n // Remove 'draggable' attribute.\n if (this._draggableElement && this._draggableElement.root.rootName != '$graveyard') {\n writer.removeAttribute('draggable', editing.mapper.toViewElement(this._draggableElement));\n }\n this._draggableElement = null;\n });\n }\n /**\n * Creates downcast conversion for the drop target marker.\n */\n _setupDropMarker() {\n const editor = this.editor;\n // Drop marker conversion for hovering over widgets.\n editor.conversion.for('editingDowncast').markerToHighlight({\n model: 'drop-target',\n view: {\n classes: ['ck-clipboard-drop-target-range']\n }\n });\n // Drop marker conversion for in text drop target.\n editor.conversion.for('editingDowncast').markerToElement({\n model: 'drop-target',\n view: (data, { writer }) => {\n const inText = editor.model.schema.checkChild(data.markerRange.start, '$text');\n if (!inText) {\n return;\n }\n return writer.createUIElement('span', { class: 'ck ck-clipboard-drop-target-position' }, function (domDocument) {\n const domElement = this.toDomElement(domDocument);\n // Using word joiner to make this marker as high as text and also making text not break on marker.\n domElement.append('\\u2060', domDocument.createElement('span'), '\\u2060');\n return domElement;\n });\n }\n });\n }\n /**\n * Updates the drop target marker to the provided range.\n *\n * @param targetRange The range to set the marker to.\n */\n _updateDropMarker(targetRange) {\n const editor = this.editor;\n const markers = editor.model.markers;\n editor.model.change(writer => {\n if (markers.has('drop-target')) {\n if (!markers.get('drop-target').getRange().isEqual(targetRange)) {\n writer.updateMarker('drop-target', { range: targetRange });\n }\n }\n else {\n writer.addMarker('drop-target', {\n range: targetRange,\n usingOperation: false,\n affectsData: false\n });\n }\n });\n }\n /**\n * Removes the drop target marker.\n */\n _removeDropMarker() {\n const model = this.editor.model;\n this._removeDropMarkerDelayed.cancel();\n this._updateDropMarkerThrottled.cancel();\n if (model.markers.has('drop-target')) {\n model.change(writer => {\n writer.removeMarker('drop-target');\n });\n }\n }\n /**\n * Deletes the dragged content from its original range and clears the dragging state.\n *\n * @param moved Whether the move succeeded.\n */\n _finalizeDragging(moved) {\n const editor = this.editor;\n const model = editor.model;\n this._removeDropMarker();\n this._clearDraggableAttributes();\n if (editor.plugins.has('WidgetToolbarRepository')) {\n editor.plugins.get('WidgetToolbarRepository').clearForceDisabled('dragDrop');\n }\n this._draggingUid = '';\n if (!this._draggedRange) {\n return;\n }\n // Delete moved content.\n if (moved && this.isEnabled) {\n model.deleteContent(model.createSelection(this._draggedRange), { doNotAutoparagraph: true });\n }\n this._draggedRange.detach();\n this._draggedRange = null;\n }\n}\n/**\n * Returns fixed selection range for given position and target element.\n */\nfunction findDropTargetRange(editor, targetViewRanges, targetViewElement) {\n const model = editor.model;\n const mapper = editor.editing.mapper;\n let range = null;\n const targetViewPosition = targetViewRanges ? targetViewRanges[0].start : null;\n // A UIElement is not a valid drop element, use parent (this could be a drop marker or any other UIElement).\n if (targetViewElement.is('uiElement')) {\n targetViewElement = targetViewElement.parent;\n }\n // Quick win if the target is a widget (but not a nested editable).\n range = findDropTargetRangeOnWidget(editor, targetViewElement);\n if (range) {\n return range;\n }\n // The easiest part is over, now we need to move to the model space.\n // Find target model element and position.\n const targetModelElement = getClosestMappedModelElement(editor, targetViewElement);\n const targetModelPosition = targetViewPosition ? mapper.toModelPosition(targetViewPosition) : null;\n // There is no target position while hovering over an empty table cell.\n // In Safari, target position can be empty while hovering over a widget (e.g., a page-break).\n // Find the drop position inside the element.\n if (!targetModelPosition) {\n return findDropTargetRangeInElement(editor, targetModelElement);\n }\n // Check if target position is between blocks and adjust drop position to the next object.\n // This is because while hovering over a root element next to a widget the target position can jump in crazy places.\n range = findDropTargetRangeBetweenBlocks(editor, targetModelPosition, targetModelElement);\n if (range) {\n return range;\n }\n // Try fixing selection position.\n // In Firefox, the target position lands before widgets but in other browsers it tends to land after a widget.\n range = model.schema.getNearestSelectionRange(targetModelPosition, _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isGecko ? 'forward' : 'backward');\n if (range) {\n return range;\n }\n // There is no valid selection position inside the current limit element so find a closest object ancestor.\n // This happens if the model position lands directly in the element itself (view target element was a `
`\n // so a nested editable, but view target position was directly in the `
` element).\n return findDropTargetRangeOnAncestorObject(editor, targetModelPosition.parent);\n}\n/**\n * Returns fixed selection range for a given position and a target element if it is over the widget but not over its nested editable.\n */\nfunction findDropTargetRangeOnWidget(editor, targetViewElement) {\n const model = editor.model;\n const mapper = editor.editing.mapper;\n // Quick win if the target is a widget.\n if ((0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(targetViewElement)) {\n return model.createRangeOn(mapper.toModelElement(targetViewElement));\n }\n // Check if we are deeper over a widget (but not over a nested editable).\n if (!targetViewElement.is('editableElement')) {\n // Find a closest ancestor that is either a widget or an editable element...\n const ancestor = targetViewElement.findAncestor(node => (0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(node) || node.is('editableElement'));\n // ...and if the widget was closer then it is a drop target.\n if ((0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(ancestor)) {\n return model.createRangeOn(mapper.toModelElement(ancestor));\n }\n }\n return null;\n}\n/**\n * Returns fixed selection range inside a model element.\n */\nfunction findDropTargetRangeInElement(editor, targetModelElement) {\n const model = editor.model;\n const schema = model.schema;\n const positionAtElementStart = model.createPositionAt(targetModelElement, 0);\n return schema.getNearestSelectionRange(positionAtElementStart, 'forward');\n}\n/**\n * Returns fixed selection range for a given position and a target element if the drop is between blocks.\n */\nfunction findDropTargetRangeBetweenBlocks(editor, targetModelPosition, targetModelElement) {\n const model = editor.model;\n // Check if target is between blocks.\n if (!model.schema.checkChild(targetModelElement, '$block')) {\n return null;\n }\n // Find position between blocks.\n const positionAtElementStart = model.createPositionAt(targetModelElement, 0);\n // Get the common part of the path (inside the target element and the target position).\n const commonPath = targetModelPosition.path.slice(0, positionAtElementStart.path.length);\n // Position between the blocks.\n const betweenBlocksPosition = model.createPositionFromPath(targetModelPosition.root, commonPath);\n const nodeAfter = betweenBlocksPosition.nodeAfter;\n // Adjust drop position to the next object.\n // This is because while hovering over a root element next to a widget the target position can jump in crazy places.\n if (nodeAfter && model.schema.isObject(nodeAfter)) {\n return model.createRangeOn(nodeAfter);\n }\n return null;\n}\n/**\n * Returns a selection range on the ancestor object.\n */\nfunction findDropTargetRangeOnAncestorObject(editor, element) {\n const model = editor.model;\n let currentElement = element;\n while (currentElement) {\n if (model.schema.isObject(currentElement)) {\n return model.createRangeOn(currentElement);\n }\n currentElement = currentElement.parent;\n }\n /* istanbul ignore next */\n return null;\n}\n/**\n * Returns the closest model element for the specified view element.\n */\nfunction getClosestMappedModelElement(editor, element) {\n const mapper = editor.editing.mapper;\n const view = editor.editing.view;\n const targetModelElement = mapper.toModelElement(element);\n if (targetModelElement) {\n return targetModelElement;\n }\n // Find mapped ancestor if the target is inside not mapped element (for example inline code element).\n const viewPosition = view.createPositionBefore(element);\n const viewElement = mapper.findMappedViewAncestor(viewPosition);\n return mapper.toModelElement(viewElement);\n}\n/**\n * Returns the drop effect that should be a result of dragging the content.\n * This function is handling a quirk when checking the effect in the 'drop' DOM event.\n */\nfunction getFinalDropEffect(dataTransfer) {\n if (_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_3__.env.isGecko) {\n return dataTransfer.dropEffect;\n }\n return ['all', 'copyMove'].includes(dataTransfer.effectAllowed) ? 'move' : 'copy';\n}\n/**\n * Returns a function wrapper that will trigger a function after a specified wait time.\n * The timeout can be canceled by calling the cancel function on the returned wrapped function.\n * @param func The function to wrap.\n * @param wait The timeout in ms.\n */\nfunction delay(func, wait) {\n let timer;\n function delayed(...args) {\n delayed.cancel();\n timer = setTimeout(() => func(...args), wait);\n }\n delayed.cancel = () => {\n clearTimeout(timer);\n };\n return delayed;\n}\n/**\n * Returns a widget element that should be dragged.\n */\nfunction findDraggableWidget(target) {\n // This is directly an editable so not a widget for sure.\n if (target.is('editableElement')) {\n return null;\n }\n // TODO: Let's have a isWidgetSelectionHandleDomElement() helper in ckeditor5-widget utils.\n if (target.hasClass('ck-widget__selection-handle')) {\n return target.findAncestor(_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget);\n }\n // Direct hit on a widget.\n if ((0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(target)) {\n return target;\n }\n // Find closest ancestor that is either a widget or an editable element...\n const ancestor = target.findAncestor(node => (0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(node) || node.is('editableElement'));\n // ...and if closer was the widget then enable dragging it.\n if ((0,_ckeditor_ckeditor5_widget__WEBPACK_IMPORTED_MODULE_2__.isWidget)(ancestor)) {\n return ancestor;\n }\n return null;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/index.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Clipboard\": () => (/* reexport safe */ _clipboard__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ \"ClipboardPipeline\": () => (/* reexport safe */ _clipboardpipeline__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ \"DragDrop\": () => (/* reexport safe */ _dragdrop__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ \"PastePlainText\": () => (/* reexport safe */ _pasteplaintext__WEBPACK_IMPORTED_MODULE_3__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clipboard */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js\");\n/* harmony import */ var _clipboardpipeline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clipboardpipeline */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js\");\n/* harmony import */ var _dragdrop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dragdrop */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js\");\n/* harmony import */ var _pasteplaintext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pasteplaintext */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard\n */\n\n\n\n\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/index.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PastePlainText)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-core */ \"./node_modules/@ckeditor/ckeditor5-core/src/index.js\");\n/* harmony import */ var _clipboardobserver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clipboardobserver */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js\");\n/* harmony import */ var _clipboardpipeline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clipboardpipeline */ \"./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/pasteplaintext\n */\n\n\n\n/**\n * The plugin detects the user's intention to paste plain text.\n *\n * For example, it detects the Ctrl/Cmd + Shift + V keystroke.\n */\nclass PastePlainText extends _ckeditor_ckeditor5_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'PastePlainText';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [_clipboardpipeline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]];\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const model = editor.model;\n const view = editor.editing.view;\n const viewDocument = view.document;\n const selection = model.document.selection;\n let shiftPressed = false;\n view.addObserver(_clipboardobserver__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.listenTo(viewDocument, 'keydown', (evt, data) => {\n shiftPressed = data.shiftKey;\n });\n editor.plugins.get(_clipboardpipeline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]).on('contentInsertion', (evt, data) => {\n // Plain text can be determined based on the event flag (#7799) or auto-detection (#1006). If detected,\n // preserve selection attributes on pasted items.\n if (!shiftPressed && !isPlainTextFragment(data.content, model.schema)) {\n return;\n }\n model.change(writer => {\n // Formatting attributes should be preserved.\n const textAttributes = Array.from(selection.getAttributes())\n .filter(([key]) => model.schema.getAttributeProperties(key).isFormatting);\n if (!selection.isCollapsed) {\n model.deleteContent(selection, { doNotAutoparagraph: true });\n }\n // Also preserve other attributes if they survived the content deletion (because they were not fully selected).\n // For example linkHref is not a formatting attribute but it should be preserved if pasted text was in the middle\n // of a link.\n textAttributes.push(...selection.getAttributes());\n const range = writer.createRangeIn(data.content);\n for (const item of range.getItems()) {\n if (item.is('$textProxy')) {\n writer.setAttributes(textAttributes, item);\n }\n }\n });\n });\n }\n}\n/**\n * Returns true if specified `documentFragment` represents a plain text.\n */\nfunction isPlainTextFragment(documentFragment, schema) {\n if (documentFragment.childCount > 1) {\n return false;\n }\n const child = documentFragment.getChild(0);\n if (schema.isObject(child)) {\n return false;\n }\n return Array.from(child.getAttributeKeys()).length == 0;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js ***! + \****************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ normalizeClipboardData)\n/* harmony export */ });\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/utils/normalizeclipboarddata\n */\n/**\n * Removes some popular browser quirks out of the clipboard data (HTML).\n * Removes all HTML comments. These are considered an internal thing and it makes little sense if they leak into the editor data.\n *\n * @param data The HTML data to normalize.\n * @returns Normalized HTML.\n */\nfunction normalizeClipboardData(data) {\n return data\n .replace(/(\\s+)<\\/span>/g, (fullMatch, spaces) => {\n // Handle the most popular and problematic case when even a single space becomes an nbsp;.\n // Decode those to normal spaces. Read more in https://github.com/ckeditor/ckeditor5-clipboard/issues/2.\n if (spaces.length == 1) {\n return ' ';\n }\n return spaces;\n })\n // Remove all HTML comments.\n .replace(//g, '');\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ plainTextToHtml)\n/* harmony export */ });\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module clipboard/utils/plaintexttohtml\n */\n/**\n * Converts plain text to its HTML-ized version.\n *\n * @param text The plain text to convert.\n * @returns HTML generated from the plain text.\n */\nfunction plainTextToHtml(text) {\n text = text\n // Encode <>.\n .replace(//g, '>')\n // Creates a paragraph for each double line break.\n .replace(/\\r?\\n\\r?\\n/g, '

')\n // Creates a line break for each single line break.\n .replace(/\\r?\\n/g, '
')\n // Replace tabs with four spaces.\n .replace(/\\t/g, '    ')\n // Preserve trailing spaces (only the first and last one – the rest is handled below).\n .replace(/^\\s/, ' ')\n .replace(/\\s$/, ' ')\n // Preserve other subsequent spaces now.\n .replace(/\\s\\s/g, '  ');\n if (text.includes('

') || text.includes('
')) {\n // If we created paragraphs above, add the trailing ones.\n text = `

${text}

`;\n }\n // TODO:\n // * What about '\\nfoo' vs ' foo'?\n return text;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ viewToPlainText)\n/* harmony export */ });\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n// Elements which should not have empty-line padding.\n// Most `view.ContainerElement` want to be separate by new-line, but some are creating one structure\n// together (like `
  • `) so it is better to separate them by only one \"\\n\".\nconst smallPaddingElements = ['figcaption', 'li'];\n/**\n * Converts {@link module:engine/view/item~Item view item} and all of its children to plain text.\n *\n * @param viewItem View item to convert.\n * @returns Plain text representation of `viewItem`.\n */\nfunction viewToPlainText(viewItem) {\n let text = '';\n if (viewItem.is('$text') || viewItem.is('$textProxy')) {\n // If item is `Text` or `TextProxy` simple take its text data.\n text = viewItem.data;\n }\n else if (viewItem.is('element', 'img') && viewItem.hasAttribute('alt')) {\n // Special case for images - use alt attribute if it is provided.\n text = viewItem.getAttribute('alt');\n }\n else if (viewItem.is('element', 'br')) {\n // A soft break should be converted into a single line break (#8045).\n text = '\\n';\n }\n else {\n // Other elements are document fragments, attribute elements or container elements.\n // They don't have their own text value, so convert their children.\n let prev = null;\n for (const child of viewItem.getChildren()) {\n const childText = viewToPlainText(child);\n // Separate container element children with one or more new-line characters.\n if (prev && (prev.is('containerElement') || child.is('containerElement'))) {\n if (smallPaddingElements.includes(prev.name) ||\n smallPaddingElements.includes(child.name)) {\n text += '\\n';\n }\n else {\n text += '\\n\\n';\n }\n }\n text += childText;\n prev = child;\n }\n }\n return text;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/command.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/command.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Command)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/command\n */\n\n/**\n * Base class for the CKEditor commands.\n *\n * Commands are the main way to manipulate the editor contents and state. They are mostly used by UI elements (or by other\n * commands) to make changes in the model. Commands are available in every part of the code that has access to\n * the {@link module:core/editor/editor~Editor editor} instance.\n *\n * Instances of registered commands can be retrieved from {@link module:core/editor/editor~Editor#commands `editor.commands`}.\n * The easiest way to execute a command is through {@link module:core/editor/editor~Editor#execute `editor.execute()`}.\n *\n * By default, commands are disabled when the editor is in the {@link module:core/editor/editor~Editor#isReadOnly read-only} mode\n * but commands with the {@link module:core/command~Command#affectsData `affectsData`} flag set to `false` will not be disabled.\n *\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nclass Command extends (0,_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.ObservableMixin)() {\n /**\n * Creates a new `Command` instance.\n *\n * @param {module:core/editor/editor~Editor} editor The editor on which this command will be used.\n */\n constructor(editor) {\n super();\n /**\n * The editor on which this command will be used.\n *\n * @readonly\n * @member {module:core/editor/editor~Editor}\n */\n this.editor = editor;\n /**\n * The value of the command. A given command class should define what it represents for it.\n *\n * For example, the `'bold'` command's value indicates whether the selection starts in a bolded text.\n * And the value of the `'link'` command may be an object with link details.\n *\n * It is possible for a command to have no value (e.g. for stateless actions such as `'uploadImage'`).\n *\n * A given command class should control this value by overriding the {@link #refresh `refresh()`} method.\n *\n * @observable\n * @readonly\n * @member #value\n */\n this.set('value', undefined);\n /**\n * Flag indicating whether a command is enabled or disabled.\n * A disabled command will do nothing when executed.\n *\n * A given command class should control this value by overriding the {@link #refresh `refresh()`} method.\n *\n * It is possible to disable a command \"from outside\". For instance, in your integration you may want to disable\n * a certain set of commands for the time being. To do that, you can use the fact that `isEnabled` is observable\n * and it fires the `set:isEnabled` event every time anyone tries to modify its value:\n *\n *\t\tfunction disableCommand( cmd ) {\n *\t\t\tcmd.on( 'set:isEnabled', forceDisable, { priority: 'highest' } );\n *\n *\t\t\tcmd.isEnabled = false;\n *\n *\t\t\t// Make it possible to enable the command again.\n *\t\t\treturn () => {\n *\t\t\t\tcmd.off( 'set:isEnabled', forceDisable );\n *\t\t\t\tcmd.refresh();\n *\t\t\t};\n *\n *\t\t\tfunction forceDisable( evt ) {\n *\t\t\t\tevt.return = false;\n *\t\t\t\tevt.stop();\n *\t\t\t}\n *\t\t}\n *\n *\t\t// Usage:\n *\n *\t\t// Disabling the command.\n *\t\tconst enableBold = disableCommand( editor.commands.get( 'bold' ) );\n *\n *\t\t// Enabling the command again.\n *\t\tenableBold();\n *\n * @observable\n * @readonly\n * @member {Boolean} #isEnabled\n */\n this.set('isEnabled', false);\n /**\n * A flag indicating whether a command execution changes the editor data or not.\n *\n * Commands with `affectsData` set to `false` will not be automatically disabled in\n * the {@link module:core/editor/editor~Editor#isReadOnly read-only mode} and\n * {@glink features/read-only#related-features other editor modes} with restricted user write permissions.\n *\n * **Note:** You do not have to set it for your every command. It is `true` by default.\n *\n * @readonly\n * @default true\n * @member {Boolean} #affectsData\n */\n this._affectsData = true;\n /**\n * Holds identifiers for {@link #forceDisabled} mechanism.\n *\n * @type {Set.}\n * @private\n */\n this._disableStack = new Set();\n this.decorate('execute');\n // By default every command is refreshed when changes are applied to the model.\n this.listenTo(this.editor.model.document, 'change', () => {\n this.refresh();\n });\n this.on('execute', evt => {\n if (!this.isEnabled) {\n evt.stop();\n }\n }, { priority: 'high' });\n // By default commands are disabled when the editor is in read-only mode.\n this.listenTo(editor, 'change:isReadOnly', (evt, name, value) => {\n if (value && this.affectsData) {\n this.forceDisabled('readOnlyMode');\n }\n else {\n this.clearForceDisabled('readOnlyMode');\n }\n });\n }\n get affectsData() {\n return this._affectsData;\n }\n set affectsData(affectsData) {\n this._affectsData = affectsData;\n }\n /**\n * Refreshes the command. The command should update its {@link #isEnabled} and {@link #value} properties\n * in this method.\n *\n * This method is automatically called when\n * {@link module:engine/model/document~Document#event:change any changes are applied to the document}.\n */\n refresh() {\n this.isEnabled = true;\n }\n /**\n * Disables the command.\n *\n * Command may be disabled by multiple features or algorithms (at once). When disabling a command, unique id should be passed\n * (e.g. the feature name). The same identifier should be used when {@link #clearForceDisabled enabling back} the command.\n * The command becomes enabled only after all features {@link #clearForceDisabled enabled it back}.\n *\n * Disabling and enabling a command:\n *\n *\t\tcommand.isEnabled; // -> true\n *\t\tcommand.forceDisabled( 'MyFeature' );\n *\t\tcommand.isEnabled; // -> false\n *\t\tcommand.clearForceDisabled( 'MyFeature' );\n *\t\tcommand.isEnabled; // -> true\n *\n * Command disabled by multiple features:\n *\n *\t\tcommand.forceDisabled( 'MyFeature' );\n *\t\tcommand.forceDisabled( 'OtherFeature' );\n *\t\tcommand.clearForceDisabled( 'MyFeature' );\n *\t\tcommand.isEnabled; // -> false\n *\t\tcommand.clearForceDisabled( 'OtherFeature' );\n *\t\tcommand.isEnabled; // -> true\n *\n * Multiple disabling with the same identifier is redundant:\n *\n *\t\tcommand.forceDisabled( 'MyFeature' );\n *\t\tcommand.forceDisabled( 'MyFeature' );\n *\t\tcommand.clearForceDisabled( 'MyFeature' );\n *\t\tcommand.isEnabled; // -> true\n *\n * **Note:** some commands or algorithms may have more complex logic when it comes to enabling or disabling certain commands,\n * so the command might be still disabled after {@link #clearForceDisabled} was used.\n *\n * @param {String} id Unique identifier for disabling. Use the same id when {@link #clearForceDisabled enabling back} the command.\n */\n forceDisabled(id) {\n this._disableStack.add(id);\n if (this._disableStack.size == 1) {\n this.on('set:isEnabled', forceDisable, { priority: 'highest' });\n this.isEnabled = false;\n }\n }\n /**\n * Clears forced disable previously set through {@link #forceDisabled}. See {@link #forceDisabled}.\n *\n * @param {String} id Unique identifier, equal to the one passed in {@link #forceDisabled} call.\n */\n clearForceDisabled(id) {\n this._disableStack.delete(id);\n if (this._disableStack.size == 0) {\n this.off('set:isEnabled', forceDisable);\n this.refresh();\n }\n }\n /**\n * Executes the command.\n *\n * A command may accept parameters. They will be passed from {@link module:core/editor/editor~Editor#execute `editor.execute()`}\n * to the command.\n *\n * The `execute()` method will automatically abort when the command is disabled ({@link #isEnabled} is `false`).\n * This behavior is implemented by a high priority listener to the {@link #event:execute} event.\n *\n * In order to see how to disable a command from \"outside\" see the {@link #isEnabled} documentation.\n *\n * This method may return a value, which would be forwarded all the way down to the\n * {@link module:core/editor/editor~Editor#execute `editor.execute()`}.\n *\n * @fires execute\n */\n execute(...args) { return undefined; }\n /**\n * Destroys the command.\n */\n destroy() {\n this.stopListening();\n }\n}\n// Helper function that forces command to be disabled.\nfunction forceDisable(evt) {\n evt.return = false;\n evt.stop();\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-core/src/command.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CommandCollection)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/commandcollection\n */\n\n/**\n * Collection of commands. Its instance is available in {@link module:core/editor/editor~Editor#commands `editor.commands`}.\n */\nclass CommandCollection {\n /**\n * Creates collection instance.\n */\n constructor() {\n /**\n * Command map.\n *\n * @private\n * @member {Map}\n */\n this._commands = new Map();\n }\n /**\n * Registers a new command.\n *\n * @param {String} commandName The name of the command.\n * @param {module:core/command~Command} command\n */\n add(commandName, command) {\n this._commands.set(commandName, command);\n }\n /**\n * Retrieves a command from the collection.\n *\n * @param {String} commandName The name of the command.\n * @returns {module:core/command~Command}\n */\n get(commandName) {\n return this._commands.get(commandName);\n }\n /**\n * Executes a command.\n *\n * @param {String} commandName The name of the command.\n * @param {*} [...commandParams] Command parameters.\n * @returns {*} The value returned by the {@link module:core/command~Command#execute `command.execute()`}.\n */\n execute(commandName, ...args) {\n const command = this.get(commandName);\n if (!command) {\n /**\n * Command does not exist.\n *\n * @error commandcollection-command-not-found\n * @param {String} commandName Name of the command.\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('commandcollection-command-not-found', this, { commandName });\n }\n return command.execute(...args);\n }\n /**\n * Returns iterator of command names.\n *\n * @returns {Iterable.}\n */\n *names() {\n yield* this._commands.keys();\n }\n /**\n * Returns iterator of command instances.\n *\n * @returns {Iterable.}\n */\n *commands() {\n yield* this._commands.values();\n }\n /**\n * Iterable interface.\n *\n * Returns `[ commandName, commandInstance ]` pairs.\n *\n * @returns {Iterator.}\n */\n [Symbol.iterator]() {\n return this._commands[Symbol.iterator]();\n }\n /**\n * Destroys all collection commands.\n */\n destroy() {\n for (const command of this.commands()) {\n command.destroy();\n }\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/context.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/context.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Context)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/* harmony import */ var _plugincollection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./plugincollection */ \"./node_modules/@ckeditor/ckeditor5-core/src/plugincollection.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/context\n */\n\n\n/**\n * Provides a common, higher-level environment for solutions that use multiple {@link module:core/editor/editor~Editor editors}\n * or plugins that work outside the editor. Use it instead of {@link module:core/editor/editor~Editor.create `Editor.create()`}\n * in advanced application integrations.\n *\n * All configuration options passed to a context will be used as default options for the editor instances initialized in that context.\n *\n * {@link module:core/contextplugin~ContextPlugin Context plugins} passed to a context instance will be shared among all\n * editor instances initialized in this context. These will be the same plugin instances for all the editors.\n *\n * **Note:** The context can only be initialized with {@link module:core/contextplugin~ContextPlugin context plugins}\n * (e.g. [comments](https://ckeditor.com/collaboration/comments/)). Regular {@link module:core/plugin~Plugin plugins} require an\n * editor instance to work and cannot be added to a context.\n *\n * **Note:** You can add a context plugin to an editor instance, though.\n *\n * If you are using multiple editor instances on one page and use any context plugins, create a context to share the configuration and\n * plugins among these editors. Some plugins will use the information about all existing editors to better integrate between them.\n *\n * If you are using plugins that do not require an editor to work (e.g. [comments](https://ckeditor.com/collaboration/comments/)),\n * enable and configure them using the context.\n *\n * If you are using only a single editor on each page, use {@link module:core/editor/editor~Editor.create `Editor.create()`} instead.\n * In such a case, a context instance will be created by the editor instance in a transparent way.\n *\n * See {@link module:core/context~Context.create `Context.create()`} for usage examples.\n */\nclass Context {\n /**\n * Creates a context instance with a given configuration.\n *\n * Usually not to be used directly. See the static {@link module:core/context~Context.create `create()`} method.\n *\n * @param {Object} [config={}] The context configuration.\n */\n constructor(config) {\n /**\n * Stores all the configurations specific to this context instance.\n *\n * @readonly\n * @type {module:utils/config~Config}\n */\n this.config = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.Config(config, this.constructor.defaultConfig);\n const availablePlugins = this.constructor.builtinPlugins;\n this.config.define('plugins', availablePlugins);\n /**\n * The plugins loaded and in use by this context instance.\n *\n * @readonly\n * @type {module:core/plugincollection~PluginCollection}\n */\n this.plugins = new _plugincollection__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, availablePlugins);\n const languageConfig = this.config.get('language') || {};\n /**\n * @readonly\n * @type {module:utils/locale~Locale}\n */\n this.locale = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.Locale({\n uiLanguage: typeof languageConfig === 'string' ? languageConfig : languageConfig.ui,\n contentLanguage: this.config.get('language.content')\n });\n /**\n * Shorthand for {@link module:utils/locale~Locale#t}.\n *\n * @see module:utils/locale~Locale#t\n * @method #t\n */\n this.t = this.locale.t;\n /**\n * A list of editors that this context instance is injected to.\n *\n * @readonly\n * @type {module:utils/collection~Collection}\n */\n this.editors = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.Collection();\n /**\n * Reference to the editor which created the context.\n * Null when the context was created outside of the editor.\n *\n * It is used to destroy the context when removing the editor that has created the context.\n *\n * @private\n * @type {module:core/editor/editor~Editor|null}\n */\n this._contextOwner = null;\n }\n /**\n * Loads and initializes plugins specified in the configuration.\n *\n * @returns {Promise.} A promise which resolves\n * once the initialization is completed, providing an array of loaded plugins.\n */\n initPlugins() {\n const plugins = this.config.get('plugins') || [];\n const substitutePlugins = this.config.get('substitutePlugins') || [];\n // Plugins for substitution should be checked as well.\n for (const Plugin of plugins.concat(substitutePlugins)) {\n if (typeof Plugin != 'function') {\n /**\n * Only a constructor function is allowed as a {@link module:core/contextplugin~ContextPlugin context plugin}.\n *\n * @error context-initplugins-constructor-only\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('context-initplugins-constructor-only', null, { Plugin });\n }\n if (Plugin.isContextPlugin !== true) {\n /**\n * Only a plugin marked as a {@link module:core/contextplugin~ContextPlugin.isContextPlugin context plugin}\n * is allowed to be used with a context.\n *\n * @error context-initplugins-invalid-plugin\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('context-initplugins-invalid-plugin', null, { Plugin });\n }\n }\n return this.plugins.init(plugins, [], substitutePlugins);\n }\n /**\n * Destroys the context instance and all editors used with the context,\n * releasing all resources used by the context.\n *\n * @returns {Promise} A promise that resolves once the context instance is fully destroyed.\n */\n destroy() {\n return Promise.all(Array.from(this.editors, editor => editor.destroy()))\n .then(() => this.plugins.destroy());\n }\n /**\n * Adds a reference to the editor which is used with this context.\n *\n * When the given editor has created the context, the reference to this editor will be stored\n * as a {@link ~Context#_contextOwner}.\n *\n * This method should only be used by the editor.\n *\n * @protected\n * @param {module:core/editor/editor~Editor} editor\n * @param {Boolean} isContextOwner Stores the given editor as a context owner.\n */\n _addEditor(editor, isContextOwner) {\n if (this._contextOwner) {\n /**\n * Cannot add multiple editors to the context which is created by the editor.\n *\n * @error context-addeditor-private-context\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('context-addeditor-private-context');\n }\n this.editors.add(editor);\n if (isContextOwner) {\n this._contextOwner = editor;\n }\n }\n /**\n * Removes a reference to the editor which was used with this context.\n * When the context was created by the given editor, the context will be destroyed.\n *\n * This method should only be used by the editor.\n *\n * @protected\n * @param {module:core/editor/editor~Editor} editor\n * @return {Promise} A promise that resolves once the editor is removed from the context or when the context was destroyed.\n */\n _removeEditor(editor) {\n if (this.editors.has(editor)) {\n this.editors.remove(editor);\n }\n if (this._contextOwner === editor) {\n return this.destroy();\n }\n return Promise.resolve();\n }\n /**\n * Returns the context configuration which will be copied to the editors created using this context.\n *\n * The configuration returned by this method has the plugins configuration removed — plugins are shared with all editors\n * through another mechanism.\n *\n * This method should only be used by the editor.\n *\n * @protected\n * @returns {Object} Configuration as a plain object.\n */\n _getEditorConfig() {\n const result = {};\n for (const name of this.config.names()) {\n if (!['plugins', 'removePlugins', 'extraPlugins'].includes(name)) {\n result[name] = this.config.get(name);\n }\n }\n return result;\n }\n /**\n * Creates and initializes a new context instance.\n *\n *\t\tconst commonConfig = { ... }; // Configuration for all the plugins and editors.\n *\t\tconst editorPlugins = [ ... ]; // Regular plugins here.\n *\n *\t\tContext\n *\t\t\t.create( {\n *\t\t\t\t// Only context plugins here.\n *\t\t\t\tplugins: [ ... ],\n *\n *\t\t\t\t// Configure the language for all the editors (it cannot be overwritten).\n *\t\t\t\tlanguage: { ... },\n *\n *\t\t\t\t// Configuration for context plugins.\n *\t\t\t\tcomments: { ... },\n *\t\t\t\t...\n *\n *\t\t\t\t// Default configuration for editor plugins.\n *\t\t\t\ttoolbar: { ... },\n *\t\t\t\timage: { ... },\n *\t\t\t\t...\n *\t\t\t} )\n *\t\t\t.then( context => {\n *\t\t\t\tconst promises = [];\n *\n *\t\t\t\tpromises.push( ClassicEditor.create(\n *\t\t\t\t\tdocument.getElementById( 'editor1' ),\n *\t\t\t\t\t{\n *\t\t\t\t\t\teditorPlugins,\n *\t\t\t\t\t\tcontext\n *\t\t\t\t\t}\n *\t\t\t\t) );\n *\n *\t\t\t\tpromises.push( ClassicEditor.create(\n *\t\t\t\t\tdocument.getElementById( 'editor2' ),\n *\t\t\t\t\t{\n *\t\t\t\t\t\teditorPlugins,\n *\t\t\t\t\t\tcontext,\n *\t\t\t\t\t\ttoolbar: { ... } // You can overwrite the configuration of the context.\n *\t\t\t\t\t}\n *\t\t\t\t) );\n *\n *\t\t\t\treturn Promise.all( promises );\n *\t\t\t} );\n *\n * @param {Object} [config] The context configuration.\n * @returns {Promise} A promise resolved once the context is ready. The promise resolves with the created context instance.\n */\n static create(config) {\n return new Promise(resolve => {\n const context = new this(config);\n resolve(context.initPlugins().then(() => context));\n });\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-core/src/context.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/contextplugin.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/contextplugin.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ContextPlugin)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/contextplugin\n */\n\n/**\n * The base class for {@link module:core/context~Context} plugin classes.\n *\n * A context plugin can either be initialized for an {@link module:core/editor/editor~Editor editor} or for\n * a {@link module:core/context~Context context}. In other words, it can either\n * work within one editor instance or with one or more editor instances that use a single context.\n * It is the context plugin's role to implement handling for both modes.\n *\n * There are a few rules for interaction between the editor plugins and context plugins:\n *\n * * A context plugin can require another context plugin.\n * * An {@link module:core/plugin~Plugin editor plugin} can require a context plugin.\n * * A context plugin MUST NOT require an {@link module:core/plugin~Plugin editor plugin}.\n *\n * @implements module:core/plugin~PluginInterface\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nclass ContextPlugin extends (0,_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.ObservableMixin)() {\n /**\n * Creates a new plugin instance.\n *\n * @param {module:core/context~Context|module:core/editor/editor~Editor} context\n */\n constructor(context) {\n super();\n /**\n * The context instance.\n *\n * @readonly\n * @type {module:core/context~Context|module:core/editor/editor~Editor}\n */\n this.context = context;\n }\n /**\n * @inheritDoc\n */\n destroy() {\n this.stopListening();\n }\n /**\n * @inheritDoc\n */\n static get isContextPlugin() {\n return true;\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-core/src/contextplugin.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ EditingKeystrokeHandler)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/editingkeystrokehandler\n */\n\n/**\n * A keystroke handler for editor editing. Its instance is available\n * in {@link module:core/editor/editor~Editor#keystrokes} so plugins\n * can register their keystrokes.\n *\n * E.g. an undo plugin would do this:\n *\n *\t\teditor.keystrokes.set( 'Ctrl+Z', 'undo' );\n *\t\teditor.keystrokes.set( 'Ctrl+Shift+Z', 'redo' );\n *\t\teditor.keystrokes.set( 'Ctrl+Y', 'redo' );\n *\n * @extends module:utils/keystrokehandler~KeystrokeHandler\n */\nclass EditingKeystrokeHandler extends _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.KeystrokeHandler {\n /**\n * Creates an instance of the keystroke handler.\n *\n * @param {module:core/editor/editor~Editor} editor\n */\n constructor(editor) {\n super();\n /**\n * The editor instance.\n *\n * @readonly\n * @member {module:core/editor/editor~Editor}\n */\n this.editor = editor;\n }\n /**\n * Registers a handler for the specified keystroke.\n *\n * The handler can be specified as a command name or a callback.\n *\n * @param {String|Array.} keystroke Keystroke defined in a format accepted by\n * the {@link module:utils/keyboard~parseKeystroke} function.\n * @param {Function|String} callback If a string is passed, then the keystroke will\n * {@link module:core/editor/editor~Editor#execute execute a command}.\n * If a function, then it will be called with the\n * {@link module:engine/view/observer/keyobserver~KeyEventData key event data} object and\n * a `cancel()` helper to both `preventDefault()` and `stopPropagation()` of the event.\n * @param {Object} [options={}] Additional options.\n * @param {module:utils/priorities~PriorityString|Number} [options.priority='normal'] The priority of the keystroke\n * callback. The higher the priority value the sooner the callback will be executed. Keystrokes having the same priority\n * are called in the order they were added.\n */\n set(keystroke, callback, options = {}) {\n if (typeof callback == 'string') {\n const commandName = callback;\n callback = (evtData, cancel) => {\n this.editor.execute(commandName);\n cancel();\n };\n }\n super.set(keystroke, callback, options);\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js?"); + +/***/ }), + +/***/ "./node_modules/@ckeditor/ckeditor5-core/src/editor/editor.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ckeditor/ckeditor5-core/src/editor/editor.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Editor)\n/* harmony export */ });\n/* harmony import */ var _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-utils */ \"./node_modules/@ckeditor/ckeditor5-utils/src/index.js\");\n/* harmony import */ var _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ckeditor/ckeditor5-engine */ \"./node_modules/@ckeditor/ckeditor5-engine/src/index.js\");\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../context */ \"./node_modules/@ckeditor/ckeditor5-core/src/context.js\");\n/* harmony import */ var _plugincollection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../plugincollection */ \"./node_modules/@ckeditor/ckeditor5-core/src/plugincollection.js\");\n/* harmony import */ var _commandcollection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../commandcollection */ \"./node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js\");\n/* harmony import */ var _editingkeystrokehandler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../editingkeystrokehandler */ \"./node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js\");\n/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module core/editor/editor\n */\n\n\n\n\n\n\n/**\n * The class representing a basic, generic editor.\n *\n * Check out the list of its subclasses to learn about specific editor implementations.\n *\n * All editor implementations (like {@link module:editor-classic/classiceditor~ClassicEditor} or\n * {@link module:editor-inline/inlineeditor~InlineEditor}) should extend this class. They can add their\n * own methods and properties.\n *\n * When you are implementing a plugin, this editor represents the API\n * which your plugin can expect to get when using its {@link module:core/plugin~Plugin#editor} property.\n *\n * This API should be sufficient in order to implement the \"editing\" part of your feature\n * (schema definition, conversion, commands, keystrokes, etc.).\n * It does not define the editor UI, which is available only if\n * the specific editor implements also the {@link module:core/editor/editorwithui~EditorWithUI} interface\n * (as most editor implementations do).\n *\n * @abstract\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nclass Editor extends (0,_ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.ObservableMixin)() {\n /**\n * Creates a new instance of the editor class.\n *\n * Usually, not to be used directly. See the static {@link module:core/editor/editor~Editor.create `create()`} method.\n *\n * @param {Object} [config={}] The editor configuration.\n */\n constructor(config = {}) {\n super();\n const constructor = this.constructor;\n // Prefer the language passed as the argument to the constructor instead of the constructor's `defaultConfig`, if both are set.\n const language = config.language || (constructor.defaultConfig && constructor.defaultConfig.language);\n /**\n * The editor context.\n * When it is not provided through the configuration, the editor creates it.\n *\n * @protected\n * @type {module:core/context~Context}\n */\n this._context = config.context || new _context__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({ language });\n this._context._addEditor(this, !config.context);\n // Clone the plugins to make sure that the plugin array will not be shared\n // between editors and make the watchdog feature work correctly.\n const availablePlugins = Array.from(constructor.builtinPlugins || []);\n /**\n * Stores all configurations specific to this editor instance.\n *\n *\t\teditor.config.get( 'image.toolbar' );\n *\t\t// -> [ 'imageStyle:block', 'imageStyle:side', '|', 'toggleImageCaption', 'imageTextAlternative' ]\n *\n * @readonly\n * @member {module:utils/config~Config}\n */\n this.config = new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.Config(config, constructor.defaultConfig);\n this.config.define('plugins', availablePlugins);\n this.config.define(this._context._getEditorConfig());\n /**\n * The plugins loaded and in use by this editor instance.\n *\n *\t\teditor.plugins.get( 'ClipboardPipeline' ); // -> An instance of the clipboard pipeline plugin.\n *\n * @readonly\n * @member {module:core/plugincollection~PluginCollection}\n */\n this.plugins = new _plugincollection__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this, availablePlugins, this._context.plugins);\n /**\n * The locale instance.\n *\n * @readonly\n * @type {module:utils/locale~Locale}\n */\n this.locale = this._context.locale;\n /**\n * Shorthand for {@link module:utils/locale~Locale#t}.\n *\n * @see module:utils/locale~Locale#t\n * @method #t\n */\n this.t = this.locale.t;\n /**\n * A set of lock IDs for the {@link #isReadOnly} getter.\n *\n * @private\n * @type {Set.}\n */\n this._readOnlyLocks = new Set();\n /**\n * Commands registered to the editor.\n *\n * Use the shorthand {@link #execute `editor.execute()`} method to execute commands:\n *\n *\t\t// Execute the bold command:\n *\t\teditor.execute( 'bold' );\n *\n *\t\t// Check the state of the bold command:\n *\t\teditor.commands.get( 'bold' ).value;\n *\n * @readonly\n * @member {module:core/commandcollection~CommandCollection}\n */\n this.commands = new _commandcollection__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n /**\n * Indicates the editor life-cycle state.\n *\n * The editor is in one of the following states:\n *\n * * `initializing` – During the editor initialization (before\n * {@link module:core/editor/editor~Editor.create `Editor.create()`}) finished its job.\n * * `ready` – After the promise returned by the {@link module:core/editor/editor~Editor.create `Editor.create()`}\n * method is resolved.\n * * `destroyed` – Once the {@link #destroy `editor.destroy()`} method was called.\n *\n * @observable\n * @member {'initializing'|'ready'|'destroyed'} #state\n */\n this.set('state', 'initializing');\n this.once('ready', () => (this.state = 'ready'), { priority: 'high' });\n this.once('destroy', () => (this.state = 'destroyed'), { priority: 'high' });\n /**\n * The editor's model.\n *\n * The central point of the editor's abstract data model.\n *\n * @readonly\n * @member {module:engine/model/model~Model}\n */\n this.model = new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.Model();\n const stylesProcessor = new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.StylesProcessor();\n /**\n * The {@link module:engine/controller/datacontroller~DataController data controller}.\n * Used e.g. for setting and retrieving the editor data.\n *\n * @readonly\n * @member {module:engine/controller/datacontroller~DataController}\n */\n this.data = new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.DataController(this.model, stylesProcessor);\n /**\n * The {@link module:engine/controller/editingcontroller~EditingController editing controller}.\n * Controls user input and rendering the content for editing.\n *\n * @readonly\n * @member {module:engine/controller/editingcontroller~EditingController}\n */\n this.editing = new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.EditingController(this.model, stylesProcessor);\n this.editing.view.document.bind('isReadOnly').to(this);\n /**\n * Conversion manager through which you can register model-to-view and view-to-model converters.\n *\n * See the {@link module:engine/conversion/conversion~Conversion} documentation to learn how to add converters.\n *\n * @readonly\n * @member {module:engine/conversion/conversion~Conversion}\n */\n this.conversion = new _ckeditor_ckeditor5_engine__WEBPACK_IMPORTED_MODULE_1__.Conversion([this.editing.downcastDispatcher, this.data.downcastDispatcher], this.data.upcastDispatcher);\n this.conversion.addAlias('dataDowncast', this.data.downcastDispatcher);\n this.conversion.addAlias('editingDowncast', this.editing.downcastDispatcher);\n /**\n * An instance of the {@link module:core/editingkeystrokehandler~EditingKeystrokeHandler}.\n *\n * It allows setting simple keystrokes:\n *\n *\t\t// Execute the bold command on Ctrl+E:\n *\t\teditor.keystrokes.set( 'Ctrl+E', 'bold' );\n *\n *\t\t// Execute your own callback:\n *\t\teditor.keystrokes.set( 'Ctrl+E', ( data, cancel ) => {\n *\t\t\tconsole.log( data.keyCode );\n *\n *\t\t\t// Prevent the default (native) action and stop the underlying keydown event\n *\t\t\t// so no other editor feature will interfere.\n *\t\t\tcancel();\n *\t\t} );\n *\n * Note: Certain typing-oriented keystrokes (like Backspace or Enter) are handled\n * by a low-level mechanism and trying to listen to them via the keystroke handler will not work reliably.\n * To handle these specific keystrokes, see the events fired by the\n * {@link module:engine/view/document~Document editing view document} (`editor.editing.view.document`).\n *\n * @readonly\n * @member {module:core/editingkeystrokehandler~EditingKeystrokeHandler}\n */\n this.keystrokes = new _editingkeystrokehandler__WEBPACK_IMPORTED_MODULE_5__[\"default\"](this);\n this.keystrokes.listenTo(this.editing.view.document);\n }\n /**\n * Defines whether the editor is in the read-only mode.\n *\n * In read-only mode the editor {@link #commands commands} are disabled so it is not possible\n * to modify the document by using them. Also, the editable element(s) become non-editable.\n *\n * In order to make the editor read-only, you need to call the {@link #enableReadOnlyMode} method:\n *\n *\t\teditor.enableReadOnlyMode( 'feature-id' );\n *\n * Later, to turn off the read-only mode, call {@link #disableReadOnlyMode}:\n *\n * \t\teditor.disableReadOnlyMode( 'feature-id' );\n *\n * @readonly\n * @observable\n * @member {Boolean} #isReadOnly\n */\n get isReadOnly() {\n return this._readOnlyLocks.size > 0;\n }\n set isReadOnly(value) {\n /**\n * The {@link #isReadOnly Editor#isReadOnly} property is read-only since version `34.0.0` and can be set only using\n * {@link #enableReadOnlyMode `Editor#enableReadOnlyMode( lockId )`} and\n * {@link #disableReadOnlyMode `Editor#disableReadOnlyMode( lockId )`}.\n *\n * Usage before version `34.0.0`:\n *\n *\t\teditor.isReadOnly = true;\n * \t\teditor.isReadOnly = false;\n *\n * Usage since version `34.0.0`:\n *\n *\t\teditor.enableReadOnlyMode( 'my-feature-id' );\n * \t\teditor.disableReadOnlyMode( 'my-feature-id' );\n *\n * @error editor-isreadonly-has-no-setter\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('editor-isreadonly-has-no-setter');\n }\n /**\n * Turns on the read-only mode in the editor.\n *\n * Editor can be switched to or out of the read-only mode by many features, under various circumstances. The editor supports locking\n * mechanism for the read-only mode. It enables easy control over the read-only mode when many features wants to turn it on or off at\n * the same time, without conflicting with each other. It guarantees that you will not make the editor editable accidentally (which\n * could lead to errors).\n *\n * Each read-only mode request is identified by a unique id (also called \"lock\"). If multiple plugins requested to turn on the\n * read-only mode, then, the editor will become editable only after all these plugins turn the read-only mode off (using the same ids).\n *\n * Note, that you cannot force the editor to disable the read-only mode if other plugins set it.\n *\n * After the first `enableReadOnlyMode()` call, the {@link #isReadOnly `isReadOnly` property} will be set to `true`:\n *\n *\t\teditor.isReadOnly; // `false`.\n * \t\teditor.enableReadOnlyMode( 'my-feature-id' );\n * \t\teditor.isReadOnly; // `true`.\n *\n * You can turn off the read-only mode (\"clear the lock\") using the {@link #disableReadOnlyMode `disableReadOnlyMode()`} method:\n *\n * \t\teditor.enableReadOnlyMode( 'my-feature-id' );\n * \t\t// ...\n * \t\teditor.disableReadOnlyMode( 'my-feature-id' );\n * \t\teditor.isReadOnly; // `false`.\n *\n * All \"locks\" need to be removed to enable editing:\n *\n * \t\teditor.enableReadOnlyMode( 'my-feature-id' );\n * \t\teditor.enableReadOnlyMode( 'my-other-feature-id' );\n * \t\t// ...\n * \t\teditor.disableReadOnlyMode( 'my-feature-id' );\n * \t\teditor.isReadOnly; // `true`.\n * \t\teditor.disableReadOnlyMode( 'my-other-feature-id' );\n * \t\teditor.isReadOnly; // `false`.\n *\n * @param {String|Symbol} lockId A unique ID for setting the editor to the read-only state.\n */\n enableReadOnlyMode(lockId) {\n if (typeof lockId !== 'string' && typeof lockId !== 'symbol') {\n /**\n * The lock ID is missing or it is not a string or symbol.\n *\n * @error editor-read-only-lock-id-invalid\n */\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('editor-read-only-lock-id-invalid', null, { lockId });\n }\n if (this._readOnlyLocks.has(lockId)) {\n return;\n }\n this._readOnlyLocks.add(lockId);\n if (this._readOnlyLocks.size === 1) {\n // Manually fire the `change:isReadOnly` event as only getter is provided.\n this.fire('change:isReadOnly', 'isReadOnly', true, false);\n }\n }\n /**\n * Removes the read-only lock from the editor with given lock ID.\n *\n * When no lock is present on the editor anymore, then the {@link #isReadOnly `isReadOnly` property} will be set to `false`.\n *\n * @param {String|Symbol} lockId The lock ID for setting the editor to the read-only state.\n */\n disableReadOnlyMode(lockId) {\n if (typeof lockId !== 'string' && typeof lockId !== 'symbol') {\n throw new _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError('editor-read-only-lock-id-invalid', null, { lockId });\n }\n if (!this._readOnlyLocks.has(lockId)) {\n return;\n }\n this._readOnlyLocks.delete(lockId);\n if (this._readOnlyLocks.size === 0) {\n // Manually fire the `change:isReadOnly` event as only getter is provided.\n this.fire('change:isReadOnly', 'isReadOnly', false, true);\n }\n }\n /**\n * Loads and initializes plugins specified in the configuration.\n *\n * @returns {Promise.} A promise which resolves\n * once the initialization is completed, providing an array of loaded plugins.\n */\n initPlugins() {\n const config = this.config;\n const plugins = config.get('plugins');\n const removePlugins = config.get('removePlugins') || [];\n const extraPlugins = config.get('extraPlugins') || [];\n const substitutePlugins = config.get('substitutePlugins') || [];\n return this.plugins.init(plugins.concat(extraPlugins), removePlugins, substitutePlugins);\n }\n /**\n * Destroys the editor instance, releasing all resources used by it.\n *\n * **Note** The editor cannot be destroyed during the initialization phase so if it is called\n * while the editor {@link #state is being initialized}, it will wait for the editor initialization before destroying it.\n *\n * @fires destroy\n * @returns {Promise} A promise that resolves once the editor instance is fully destroyed.\n */\n destroy() {\n let readyPromise = Promise.resolve();\n if (this.state == 'initializing') {\n readyPromise = new Promise(resolve => this.once('ready', resolve));\n }\n return readyPromise\n .then(() => {\n this.fire('destroy');\n this.stopListening();\n this.commands.destroy();\n })\n .then(() => this.plugins.destroy())\n .then(() => {\n this.model.destroy();\n this.data.destroy();\n this.editing.destroy();\n this.keystrokes.destroy();\n })\n // Remove the editor from the context.\n // When the context was created by this editor, the context will be destroyed.\n .then(() => this._context._removeEditor(this));\n }\n /**\n * Executes the specified command with given parameters.\n *\n * Shorthand for:\n *\n *\t\teditor.commands.get( commandName ).execute( ... );\n *\n * @param {String} commandName The name of the command to execute.\n * @param {*} [...commandParams] Command parameters.\n * @returns {*} The value returned by the {@link module:core/commandcollection~CommandCollection#execute `commands.execute()`}.\n */\n execute(commandName, ...args) {\n try {\n return this.commands.execute(commandName, ...args);\n }\n catch (err) {\n // @if CK_DEBUG // throw err;\n /* istanbul ignore next */\n _ckeditor_ckeditor5_utils__WEBPACK_IMPORTED_MODULE_0__.CKEditorError.rethrowUnexpectedError(err, this);\n }\n }\n /**\n * Focuses the editor.\n *\n * **Note** To explicitly focus the editing area of the editor, use the\n * {@link module:engine/view/view~View#focus `editor.editing.view.focus()`} method of the editing view.\n *\n * Check out the {@glink framework/guides/deep-dive/ui/focus-tracking#focus-in-the-editor-ui Focus in the editor UI} section\n * of the {@glink framework/guides/deep-dive/ui/focus-tracking Deep dive into focus tracking} guide to learn more.\n */\n focus() {\n this.editing.view.focus();\n }\n}\n/**\n * This error is thrown when trying to pass a `