From e24812f1a39ff2b9ac773b0371e3d56831887547 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:27:05 +0200 Subject: [PATCH 01/25] chore(admonitions): start off with a fresh copy of blockquote plugin --- packages/ckeditor5-admonition/CHANGELOG.md | 4 + packages/ckeditor5-admonition/CONTRIBUTING.md | 4 + packages/ckeditor5-admonition/LICENSE.md | 17 + packages/ckeditor5-admonition/README.md | 26 + .../ckeditor5-metadata.json | 23 + .../features/block-quote-source.html | 1 + .../_snippets/features/block-quote-source.js | 51 ++ .../docs/_snippets/features/block-quote.html | 27 + .../docs/_snippets/features/block-quote.js | 20 + .../features/nested-block-quote.html | 26 + .../_snippets/features/nested-block-quote.js | 15 + .../docs/api/block-quote.md | 36 + .../docs/features/block-quote.md | 119 +++ .../ckeditor5-admonition/lang/contexts.json | 3 + .../lang/translations/af.po | 22 + .../lang/translations/ar.po | 22 + .../lang/translations/az.po | 22 + .../lang/translations/bg.po | 22 + .../lang/translations/bn.po | 22 + .../lang/translations/bs.po | 22 + .../lang/translations/ca.po | 22 + .../lang/translations/cs.po | 22 + .../lang/translations/da.po | 22 + .../lang/translations/de-ch.po | 22 + .../lang/translations/de.po | 22 + .../lang/translations/el.po | 22 + .../lang/translations/en-au.po | 22 + .../lang/translations/en-gb.po | 22 + .../lang/translations/en.po | 22 + .../lang/translations/es-co.po | 22 + .../lang/translations/es.po | 22 + .../lang/translations/et.po | 22 + .../lang/translations/eu.po | 22 + .../lang/translations/fa.po | 22 + .../lang/translations/fi.po | 22 + .../lang/translations/fr.po | 22 + .../lang/translations/gl.po | 22 + .../lang/translations/gu.po | 22 + .../lang/translations/he.po | 22 + .../lang/translations/hi.po | 22 + .../lang/translations/hr.po | 22 + .../lang/translations/hu.po | 22 + .../lang/translations/id.po | 22 + .../lang/translations/it.po | 22 + .../lang/translations/ja.po | 22 + .../lang/translations/km.po | 22 + .../lang/translations/kn.po | 22 + .../lang/translations/ko.po | 22 + .../lang/translations/ku.po | 22 + .../lang/translations/lt.po | 22 + .../lang/translations/lv.po | 22 + .../lang/translations/ms.po | 22 + .../lang/translations/nb.po | 22 + .../lang/translations/ne.po | 22 + .../lang/translations/nl.po | 22 + .../lang/translations/no.po | 22 + .../lang/translations/pl.po | 22 + .../lang/translations/pt-br.po | 22 + .../lang/translations/pt.po | 22 + .../lang/translations/ro.po | 22 + .../lang/translations/ru.po | 22 + .../lang/translations/sk.po | 22 + .../lang/translations/sl.po | 22 + .../lang/translations/sq.po | 22 + .../lang/translations/sr-latn.po | 22 + .../lang/translations/sr.po | 22 + .../lang/translations/sv.po | 22 + .../lang/translations/th.po | 22 + .../lang/translations/tk.po | 22 + .../lang/translations/tr.po | 22 + .../lang/translations/ug.po | 22 + .../lang/translations/uk.po | 22 + .../lang/translations/ur.po | 22 + .../lang/translations/uz.po | 22 + .../lang/translations/vi.po | 22 + .../lang/translations/zh-cn.po | 22 + .../lang/translations/zh.po | 22 + packages/ckeditor5-admonition/package.json | 62 ++ .../ckeditor5-admonition/src/augmentation.ts | 23 + .../ckeditor5-admonition/src/blockquote.ts | 39 + .../src/blockquotecommand.ts | 222 +++++ .../src/blockquoteediting.ts | 146 +++ .../ckeditor5-admonition/src/blockquoteui.ts | 84 ++ packages/ckeditor5-admonition/src/index.ts | 15 + .../ckeditor5-admonition/tests/blockquote.js | 14 + .../tests/blockquotecommand.js | 648 ++++++++++++++ .../tests/blockquoteediting.js | 196 +++++ .../tests/blockquoteui.js | 91 ++ .../ckeditor5-admonition/tests/integration.js | 830 ++++++++++++++++++ .../tests/manual/blockquote.html | 25 + .../tests/manual/blockquote.js | 24 + .../tests/manual/blockquote.md | 12 + .../tests/manual/blockquotenonesting.html | 20 + .../tests/manual/blockquotenonesting.js | 36 + .../tests/manual/blockquotenonesting.md | 2 + .../tests/manual/logo.png | Bin 0 -> 23712 bytes .../ckeditor5-admonition/theme/blockquote.css | 23 + .../ckeditor5-admonition/tsconfig.dist.json | 12 + packages/ckeditor5-admonition/tsconfig.json | 10 + .../ckeditor5-admonition/webpack.config.cjs | 19 + 100 files changed, 4311 insertions(+) create mode 100644 packages/ckeditor5-admonition/CHANGELOG.md create mode 100644 packages/ckeditor5-admonition/CONTRIBUTING.md create mode 100644 packages/ckeditor5-admonition/LICENSE.md create mode 100644 packages/ckeditor5-admonition/README.md create mode 100644 packages/ckeditor5-admonition/ckeditor5-metadata.json create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html create mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js create mode 100644 packages/ckeditor5-admonition/docs/api/block-quote.md create mode 100644 packages/ckeditor5-admonition/docs/features/block-quote.md create mode 100644 packages/ckeditor5-admonition/lang/contexts.json create mode 100644 packages/ckeditor5-admonition/lang/translations/af.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ar.po create mode 100644 packages/ckeditor5-admonition/lang/translations/az.po create mode 100644 packages/ckeditor5-admonition/lang/translations/bg.po create mode 100644 packages/ckeditor5-admonition/lang/translations/bn.po create mode 100644 packages/ckeditor5-admonition/lang/translations/bs.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ca.po create mode 100644 packages/ckeditor5-admonition/lang/translations/cs.po create mode 100644 packages/ckeditor5-admonition/lang/translations/da.po create mode 100644 packages/ckeditor5-admonition/lang/translations/de-ch.po create mode 100644 packages/ckeditor5-admonition/lang/translations/de.po create mode 100644 packages/ckeditor5-admonition/lang/translations/el.po create mode 100644 packages/ckeditor5-admonition/lang/translations/en-au.po create mode 100644 packages/ckeditor5-admonition/lang/translations/en-gb.po create mode 100644 packages/ckeditor5-admonition/lang/translations/en.po create mode 100644 packages/ckeditor5-admonition/lang/translations/es-co.po create mode 100644 packages/ckeditor5-admonition/lang/translations/es.po create mode 100644 packages/ckeditor5-admonition/lang/translations/et.po create mode 100644 packages/ckeditor5-admonition/lang/translations/eu.po create mode 100644 packages/ckeditor5-admonition/lang/translations/fa.po create mode 100644 packages/ckeditor5-admonition/lang/translations/fi.po create mode 100644 packages/ckeditor5-admonition/lang/translations/fr.po create mode 100644 packages/ckeditor5-admonition/lang/translations/gl.po create mode 100644 packages/ckeditor5-admonition/lang/translations/gu.po create mode 100644 packages/ckeditor5-admonition/lang/translations/he.po create mode 100644 packages/ckeditor5-admonition/lang/translations/hi.po create mode 100644 packages/ckeditor5-admonition/lang/translations/hr.po create mode 100644 packages/ckeditor5-admonition/lang/translations/hu.po create mode 100644 packages/ckeditor5-admonition/lang/translations/id.po create mode 100644 packages/ckeditor5-admonition/lang/translations/it.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ja.po create mode 100644 packages/ckeditor5-admonition/lang/translations/km.po create mode 100644 packages/ckeditor5-admonition/lang/translations/kn.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ko.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ku.po create mode 100644 packages/ckeditor5-admonition/lang/translations/lt.po create mode 100644 packages/ckeditor5-admonition/lang/translations/lv.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ms.po create mode 100644 packages/ckeditor5-admonition/lang/translations/nb.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ne.po create mode 100644 packages/ckeditor5-admonition/lang/translations/nl.po create mode 100644 packages/ckeditor5-admonition/lang/translations/no.po create mode 100644 packages/ckeditor5-admonition/lang/translations/pl.po create mode 100644 packages/ckeditor5-admonition/lang/translations/pt-br.po create mode 100644 packages/ckeditor5-admonition/lang/translations/pt.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ro.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ru.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sk.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sl.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sq.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sr-latn.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sr.po create mode 100644 packages/ckeditor5-admonition/lang/translations/sv.po create mode 100644 packages/ckeditor5-admonition/lang/translations/th.po create mode 100644 packages/ckeditor5-admonition/lang/translations/tk.po create mode 100644 packages/ckeditor5-admonition/lang/translations/tr.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ug.po create mode 100644 packages/ckeditor5-admonition/lang/translations/uk.po create mode 100644 packages/ckeditor5-admonition/lang/translations/ur.po create mode 100644 packages/ckeditor5-admonition/lang/translations/uz.po create mode 100644 packages/ckeditor5-admonition/lang/translations/vi.po create mode 100644 packages/ckeditor5-admonition/lang/translations/zh-cn.po create mode 100644 packages/ckeditor5-admonition/lang/translations/zh.po create mode 100644 packages/ckeditor5-admonition/package.json create mode 100644 packages/ckeditor5-admonition/src/augmentation.ts create mode 100644 packages/ckeditor5-admonition/src/blockquote.ts create mode 100644 packages/ckeditor5-admonition/src/blockquotecommand.ts create mode 100644 packages/ckeditor5-admonition/src/blockquoteediting.ts create mode 100644 packages/ckeditor5-admonition/src/blockquoteui.ts create mode 100644 packages/ckeditor5-admonition/src/index.ts create mode 100644 packages/ckeditor5-admonition/tests/blockquote.js create mode 100644 packages/ckeditor5-admonition/tests/blockquotecommand.js create mode 100644 packages/ckeditor5-admonition/tests/blockquoteediting.js create mode 100644 packages/ckeditor5-admonition/tests/blockquoteui.js create mode 100644 packages/ckeditor5-admonition/tests/integration.js create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.html create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.js create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.md create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js create mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md create mode 100644 packages/ckeditor5-admonition/tests/manual/logo.png create mode 100644 packages/ckeditor5-admonition/theme/blockquote.css create mode 100644 packages/ckeditor5-admonition/tsconfig.dist.json create mode 100644 packages/ckeditor5-admonition/tsconfig.json create mode 100644 packages/ckeditor5-admonition/webpack.config.cjs diff --git a/packages/ckeditor5-admonition/CHANGELOG.md b/packages/ckeditor5-admonition/CHANGELOG.md new file mode 100644 index 000000000..01711a3f7 --- /dev/null +++ b/packages/ckeditor5-admonition/CHANGELOG.md @@ -0,0 +1,4 @@ +Changelog +========= + +All changes in the package are documented in https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. diff --git a/packages/ckeditor5-admonition/CONTRIBUTING.md b/packages/ckeditor5-admonition/CONTRIBUTING.md new file mode 100644 index 000000000..ae3ecb8ff --- /dev/null +++ b/packages/ckeditor5-admonition/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Contributing +======================================== + +See the [official contributors' guide to CKEditor 5](https://ckeditor.com/docs/ckeditor5/latest/framework/contributing/contributing.html) to learn more. diff --git a/packages/ckeditor5-admonition/LICENSE.md b/packages/ckeditor5-admonition/LICENSE.md new file mode 100644 index 000000000..106d679d4 --- /dev/null +++ b/packages/ckeditor5-admonition/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 block quote feature** – https://github.com/ckeditor/ckeditor5-block-quote
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/packages/ckeditor5-admonition/README.md b/packages/ckeditor5-admonition/README.md new file mode 100644 index 000000000..71656077a --- /dev/null +++ b/packages/ckeditor5-admonition/README.md @@ -0,0 +1,26 @@ +CKEditor 5 block quote feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-block-quote.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements block quote support for CKEditor 5. + +## Demo + +Check out the [demo in the block quote feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/block-quote.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-block-quote` package](https://ckeditor.com/docs/ckeditor5/latest/api/block-quote.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## Installation + +```bash +npm install ckeditor5 +``` + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/packages/ckeditor5-admonition/ckeditor5-metadata.json b/packages/ckeditor5-admonition/ckeditor5-metadata.json new file mode 100644 index 000000000..6668d4659 --- /dev/null +++ b/packages/ckeditor5-admonition/ckeditor5-metadata.json @@ -0,0 +1,23 @@ +{ + "plugins": [ + { + "name": "Block quote", + "className": "BlockQuote", + "description": "Implements the block quote support to easily include quotations and passages in the rich-text content.", + "docs": "features/block-quote.html", + "path": "src/blockquote.js", + "uiComponents": [ + { + "type": "Button", + "name": "blockQuote", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/quote.svg" + } + ], + "htmlOutput": [ + { + "elements": "blockquote" + } + ] + } + ] +} diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html new file mode 100644 index 000000000..7c726c059 --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html @@ -0,0 +1 @@ + diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js new file mode 100644 index 000000000..eb60d3bbe --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* globals window */ + +import { CKBox, CKBoxImageEdit } from '@ckeditor/ckeditor5-ckbox'; +import { PictureEditing, ImageInsert, ImageResize, AutoImage } from '@ckeditor/ckeditor5-image'; +import { LinkImage } from '@ckeditor/ckeditor5-link'; +import { CS_CONFIG } from '@ckeditor/ckeditor5-cloud-services/tests/_utils/cloud-services-config.js'; +import { TOKEN_URL } from '@ckeditor/ckeditor5-ckbox/tests/_utils/ckbox-config.js'; + +// Umberto combines all `packages/*/docs` into the `docs/` directory. The import path must be valid after merging all directories. +import ClassicEditor from '../build-classic.js'; + +ClassicEditor.defaultConfig = { + plugins: ClassicEditor.builtinPlugins.concat( [ + PictureEditing, + ImageResize, + ImageInsert, + AutoImage, + LinkImage, + CKBox, + CKBoxImageEdit + ] ), + cloudServices: CS_CONFIG, + toolbar: { + items: [ + 'undo', 'redo', '|', 'heading', + '|', 'bold', 'italic', + '|', 'link', 'insertImage', 'insertTable', 'blockQuote', 'mediaEmbed', + '|', 'bulletedList', 'numberedList', 'outdent', 'indent' + ] + }, + ui: { + viewportOffset: { + top: window.getViewportTopOffsetConfig() + } + }, + ckbox: { + tokenUrl: TOKEN_URL, + allowExternalImagesEditing: [ /^data:/, 'origin', /ckbox/ ], + forceDemoLabel: true + }, + image: { + toolbar: [ 'toggleImageCaption', 'imageTextAlternative', 'ckboxImageEdit' ] + } +}; + +window.ClassicEditor = ClassicEditor; diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html new file mode 100644 index 000000000..70663c3e8 --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html @@ -0,0 +1,27 @@ +
+

The Famous Einstein Quote that never was

+ +

You might have come across the following quote in the past few years:

+ +
+

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

+ +

Albert Einstein

+
+ +

It has been most popular on Facebook and other social networks, where people share it aplenty. No wonder: it is neat, it sounds smart, and, let’s be frank, Albert is one hell of a figure!

+ +

The truth is not as neat, though. And mindlessly forwarding the quote isn’t exactly smart. That’s because Einstein never said that. The quote comes from the 2004 book The Rhythm of Life: Living Every Day with Passion and Purpose by Mathew Kelly, published almost 50 years after Albert’s death in 1955.

+ +

Kelly was most likely inspired by an essay by Amos E. Dolbear of Tufts titled “An Educational Allegory,” describing animals educated to work on their weakest features instead of their strongest ones. So an eagle was made to run, a penguin was forced to fly, and so on. There is also the 1903 “Jungle School Boards” fable from an Illinois newspaper. It tells a story of a monkey, a kangaroo, and an elephant who cannot agree on the curriculum for their animal school — should all the little animals be taught tree-climbing, jumping, or looking wise? 

+ +

In the late 1940s, something that appears to be an amalgam of the two was published and later reprinted with various changes in the 1960s. The idea evolved for decades and got mixed up with a few other quotes about being a genius originating back in the 1970s. Finally, Kelly wrote in his 2004 book:

+ +
+

Albert Einstein wrote, “Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.” The question I have for you at this point of our journey together is, “What is your genius?”

+
+ +

Why he attributed this to Albert Einstein remains unclear. The fact is, the quote got popular. But, apparently, not everyone is a genius when it comes to fact-checking and sources.

+ +
+ diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js new file mode 100644 index 000000000..2b81ac2da --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js @@ -0,0 +1,20 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* globals ClassicEditor, window, document, console */ + +ClassicEditor + .create( document.querySelector( '#snippet-block-quote' ) ) + .then( editor => { + window.editor = editor; + window.attachTourBalloon( { + target: window.findToolbarItem( editor.ui.view.toolbar, item => item.label && item.label === 'Block quote' ), + text: 'Click to insert a block quote.', + editor + } ); + } ) + .catch( err => { + console.error( err.stack ); + } ); diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html new file mode 100644 index 000000000..cf0edea58 --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html @@ -0,0 +1,26 @@ +
+

Re: Material usage information

+ +
+
+

Tom,

+ +

This is just a reminder that we need the data for our Friday meeting with the external subcontractors. Can you please let me know if all the reports are ready?

+ +

Zoe

+
+ +

Hi Zoe,

+ +

The reports are coming in, but the Q3 data is still missing. As far as I can tell, Shizuoka is behind the schedule with the final summary, and the Expansion Department has not released its numbers yet. I will reach out to both and will keep you informed on that topic by noon tomorrow.

+ +

Tom

+
+ +

Please do so, this is getting urgent. Contact Haleema from ED directly. Also, check with Shizuoka. This is very much unlike him to leave such an important matter for the last moment.

+ +

Hope to have this ready for review at the 2 p.m. board meeting provided you can manage to prepare a summary and have the full data by Thursday morning at the latest.

+ +

Zoe

+ +
diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js new file mode 100644 index 000000000..892ff9db5 --- /dev/null +++ b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js @@ -0,0 +1,15 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* globals ClassicEditor, window, document, console */ + +ClassicEditor + .create( document.querySelector( '#snippet-nested-block-quote' ) ) + .then( editor => { + window.editor2 = editor; + } ) + .catch( err => { + console.error( err.stack ); + } ); diff --git a/packages/ckeditor5-admonition/docs/api/block-quote.md b/packages/ckeditor5-admonition/docs/api/block-quote.md new file mode 100644 index 000000000..d60ea8e16 --- /dev/null +++ b/packages/ckeditor5-admonition/docs/api/block-quote.md @@ -0,0 +1,36 @@ +--- +category: api-reference +--- + +# CKEditor 5 block quote feature + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-block-quote.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) + +This package implements block quote support for CKEditor 5. + +## Demo + +Check out the {@link features/block-quote#demo demo in the block quote feature guide}. + +## Documentation + +See the {@link features/block-quote block quote feature guide} and the {@link module:block-quote/blockquote~BlockQuote} plugin documentation. + +## Installation + +This package is part of our open-source aggregate package. + +```bash +npm install ckeditor5 +``` + +## Contribute + +The source code of this package is available on GitHub in [https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote). + +## External links + +* [`@ckeditor/ckeditor5-block-quote` on npm](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) +* [`ckeditor/ckeditor5-block-quote` on GitHub](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote) +* [Issue tracker](https://github.com/ckeditor/ckeditor5/issues) +* [Changelog](https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md) diff --git a/packages/ckeditor5-admonition/docs/features/block-quote.md b/packages/ckeditor5-admonition/docs/features/block-quote.md new file mode 100644 index 000000000..3af0af0ca --- /dev/null +++ b/packages/ckeditor5-admonition/docs/features/block-quote.md @@ -0,0 +1,119 @@ +--- +category: features +menu-title: Block quote +meta-title: Block quote | CKEditor 5 Documentation +--- +{@snippet features/block-quote-source} + +# Block quote + +The block quote feature lets you easily include block quotations or pull quotes in your content. It is also an attractive way to draw the readers' attention to selected parts of the text. + +## Demo + +Use the block quote toolbar button {@icon @ckeditor/ckeditor5-core/theme/icons/quote.svg Insert block quote} in the editor below to see the feature in action. You can also type `>` followed by a space before the quotation to format it on the go thanks to the {@link features/autoformat autoformatting} feature. + +{@snippet features/block-quote} + + + This demo presents a limited set of features. Visit the {@link examples/builds/full-featured-editor feature-rich editor example} to see more in action. + + +## Nested block quotes + +Starting from version 27.1.0, CKEditor 5 will properly display a block quote nested in another block quote. This sort of structure is indispensable in email editors or discussion forums. The ability to cite previous messages and preserve a correct quotation structure is often crucial to maintain the flow of communication. Nested block quotes may also prove useful for scientific or academic papers, but articles citing sources and referring to previous writing would often use it, too. + +Support for nested block quotes is provided as backward compatibility for loading pre-existing content, for example created in CKEditor 4. Additionally, pasting content with nested block quotes is supported. You can also nest a block quote in another block quote using the {@link features/drag-drop drag and drop} mechanism – just select an existing block quote and drag it into another. + +{@snippet features/nested-block-quote} + + + If you would want to block the possibility to nest block quotes in your editor, refer to the {@link features/block-quote#disallow-nesting-block-quotes Disallow nesting block quotes} section to learn how to disable this functionality. + + +## Installation + + + ⚠️ **New import paths** + + Starting with {@link updating/update-to-42 version 42.0.0}, we changed the format of import paths. This guide uses the new, shorter format. Refer to the {@link getting-started/legacy-getting-started/legacy-imports Packages in the legacy setup} guide if you use an older version of CKEditor 5. + + +After {@link getting-started/quick-start installing the editor}, add the feature to your plugin list and toolbar configuration: + +```js +import { ClassicEditor, BlockQuote } from 'ckeditor5'; + +ClassicEditor + .create( document.querySelector( '#editor' ), { + plugins: [ BlockQuote, /* ... */ ], + toolbar: [ 'blockQuote', /* ... */ ] + } ) + .then( /* ... */ ) + .catch( /* ... */ ); +``` + +## Configuration + +### Disallow nesting block quotes + +By default, the editor supports inserting a block quote into another block quote. + +To disallow nesting block quotes, you need to register an additional schema rule. It needs to be added before the data is loaded into the editor, hence it is best to implement it as a plugin: + +```js +function DisallowNestingBlockQuotes( editor ) { + editor.model.schema.addChildCheck( ( context, childDefinition ) => { + if ( context.endsWith( 'blockQuote' ) && childDefinition.name == 'blockQuote' ) { + return false; + } + } ); +} + +// Pass it via config.extraPlugins or config.plugins: + +ClassicEditor + .create( document.querySelector( '#editor' ), { + extraPlugins: [ DisallowNestingBlockQuotes ], + + // The rest of the configuration. + // ... + } ) + .then( /* ... */ ) + .catch( /* ... */ ); +``` + + + Check the {@link tutorials/crash-course/editor step-by-step tutorial} if you need more information about the technical side of this solution. + + +## Related features + +Here are some other CKEditor 5 features that you can use similarly to the block quote plugin to structure your text better: + +* {@link features/indent Block indentation} – Set indentation for text blocks such as paragraphs or lists. +* {@link features/code-blocks Code block} – Insert longer, multiline code listings. +* {@link features/text-alignment Text alignment} – Align your content left, right, center it, or justify. +* {@link features/autoformat Autoformatting} – Add formatting elements (such as block quotes) as you type with Markdown code. + +## Common API + +The {@link module:block-quote/blockquote~BlockQuote} plugin registers: + +* the `'blockQuote'` UI button component implemented by the {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}, +* the `'blockQuote'` command implemented by the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature}. + +You can execute the command using the {@link module:core/editor/editor~Editor#execute `editor.execute()`} method: + +```js +// Applies block quote to the selected content. +editor.execute( 'blockQuote' ); +``` + + + We recommend using the official {@link framework/development-tools/inspector CKEditor 5 inspector} for development and debugging. It will give you tons of useful information about the state of the editor such as internal data structures, selection, commands, and many more. + + +## Contribute + +The source code of the feature is available on GitHub at [https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote). diff --git a/packages/ckeditor5-admonition/lang/contexts.json b/packages/ckeditor5-admonition/lang/contexts.json new file mode 100644 index 000000000..163affa15 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/contexts.json @@ -0,0 +1,3 @@ +{ + "Block quote": "Toolbar button tooltip for the Block quote feature." +} diff --git a/packages/ckeditor5-admonition/lang/translations/af.po b/packages/ckeditor5-admonition/lang/translations/af.po new file mode 100644 index 000000000..3103dc671 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/af.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Verwysingsaanhaling" diff --git a/packages/ckeditor5-admonition/lang/translations/ar.po b/packages/ckeditor5-admonition/lang/translations/ar.po new file mode 100644 index 000000000..d4b47f769 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ar.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "اقتباس" diff --git a/packages/ckeditor5-admonition/lang/translations/az.po b/packages/ckeditor5-admonition/lang/translations/az.po new file mode 100644 index 000000000..f7aada9b4 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/az.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitat bloku" diff --git a/packages/ckeditor5-admonition/lang/translations/bg.po b/packages/ckeditor5-admonition/lang/translations/bg.po new file mode 100644 index 000000000..d0fce3706 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/bg.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/packages/ckeditor5-admonition/lang/translations/bn.po b/packages/ckeditor5-admonition/lang/translations/bn.po new file mode 100644 index 000000000..eb6c91a47 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/bn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ব্লক কোট" diff --git a/packages/ckeditor5-admonition/lang/translations/bs.po b/packages/ckeditor5-admonition/lang/translations/bs.po new file mode 100644 index 000000000..434f98d5a --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/bs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/packages/ckeditor5-admonition/lang/translations/ca.po b/packages/ckeditor5-admonition/lang/translations/ca.po new file mode 100644 index 000000000..14f399985 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ca.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloc" diff --git a/packages/ckeditor5-admonition/lang/translations/cs.po b/packages/ckeditor5-admonition/lang/translations/cs.po new file mode 100644 index 000000000..768fc20a6 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/cs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citace" diff --git a/packages/ckeditor5-admonition/lang/translations/da.po b/packages/ckeditor5-admonition/lang/translations/da.po new file mode 100644 index 000000000..9167145f3 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/da.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blot citat" diff --git a/packages/ckeditor5-admonition/lang/translations/de-ch.po b/packages/ckeditor5-admonition/lang/translations/de-ch.po new file mode 100644 index 000000000..438580c74 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/de-ch.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/packages/ckeditor5-admonition/lang/translations/de.po b/packages/ckeditor5-admonition/lang/translations/de.po new file mode 100644 index 000000000..38a92d4c7 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/de.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/packages/ckeditor5-admonition/lang/translations/el.po b/packages/ckeditor5-admonition/lang/translations/el.po new file mode 100644 index 000000000..fd23cff33 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/el.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Περιοχή παράθεσης" diff --git a/packages/ckeditor5-admonition/lang/translations/en-au.po b/packages/ckeditor5-admonition/lang/translations/en-au.po new file mode 100644 index 000000000..2daa3d823 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/en-au.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/en-gb.po b/packages/ckeditor5-admonition/lang/translations/en-gb.po new file mode 100644 index 000000000..8a3acc7a7 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/en-gb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/en.po b/packages/ckeditor5-admonition/lang/translations/en.po new file mode 100644 index 000000000..17bbb2039 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/en.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/es-co.po b/packages/ckeditor5-admonition/lang/translations/es-co.po new file mode 100644 index 000000000..3ec1e1a69 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/es-co.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/packages/ckeditor5-admonition/lang/translations/es.po b/packages/ckeditor5-admonition/lang/translations/es.po new file mode 100644 index 000000000..f8985635b --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/es.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloque de cita" diff --git a/packages/ckeditor5-admonition/lang/translations/et.po b/packages/ckeditor5-admonition/lang/translations/et.po new file mode 100644 index 000000000..763ff9acc --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/et.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Tsitaat" diff --git a/packages/ckeditor5-admonition/lang/translations/eu.po b/packages/ckeditor5-admonition/lang/translations/eu.po new file mode 100644 index 000000000..30d8797cb --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/eu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Aipua" diff --git a/packages/ckeditor5-admonition/lang/translations/fa.po b/packages/ckeditor5-admonition/lang/translations/fa.po new file mode 100644 index 000000000..9919ff2fe --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/fa.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " بلوک نقل قول" diff --git a/packages/ckeditor5-admonition/lang/translations/fi.po b/packages/ckeditor5-admonition/lang/translations/fi.po new file mode 100644 index 000000000..a43e53bc3 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/fi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Lainaus" diff --git a/packages/ckeditor5-admonition/lang/translations/fr.po b/packages/ckeditor5-admonition/lang/translations/fr.po new file mode 100644 index 000000000..9710d7b05 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/fr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citation" diff --git a/packages/ckeditor5-admonition/lang/translations/gl.po b/packages/ckeditor5-admonition/lang/translations/gl.po new file mode 100644 index 000000000..a25dc1866 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/gl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/packages/ckeditor5-admonition/lang/translations/gu.po b/packages/ckeditor5-admonition/lang/translations/gu.po new file mode 100644 index 000000000..1fd205bad --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/gu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Gujarati (https://app.transifex.com/ckeditor/teams/11143/gu/)\n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " વિચાર ટાંકો" diff --git a/packages/ckeditor5-admonition/lang/translations/he.po b/packages/ckeditor5-admonition/lang/translations/he.po new file mode 100644 index 000000000..de0f3e1cf --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/he.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "בלוק ציטוט" diff --git a/packages/ckeditor5-admonition/lang/translations/hi.po b/packages/ckeditor5-admonition/lang/translations/hi.po new file mode 100644 index 000000000..2b5615886 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/hi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/hr.po b/packages/ckeditor5-admonition/lang/translations/hr.po new file mode 100644 index 000000000..01d579a18 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/hr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citat" diff --git a/packages/ckeditor5-admonition/lang/translations/hu.po b/packages/ckeditor5-admonition/lang/translations/hu.po new file mode 100644 index 000000000..40fc0ddf6 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/hu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Idézet" diff --git a/packages/ckeditor5-admonition/lang/translations/id.po b/packages/ckeditor5-admonition/lang/translations/id.po new file mode 100644 index 000000000..27c9bb3ad --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/id.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Kutipan" diff --git a/packages/ckeditor5-admonition/lang/translations/it.po b/packages/ckeditor5-admonition/lang/translations/it.po new file mode 100644 index 000000000..8737841ba --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/it.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blocco citazione" diff --git a/packages/ckeditor5-admonition/lang/translations/ja.po b/packages/ckeditor5-admonition/lang/translations/ja.po new file mode 100644 index 000000000..795865777 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ja.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ブロッククオート(引用)" diff --git a/packages/ckeditor5-admonition/lang/translations/km.po b/packages/ckeditor5-admonition/lang/translations/km.po new file mode 100644 index 000000000..adef2e6e5 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/km.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ប្លុក​ពាក្យ​សម្រង់" diff --git a/packages/ckeditor5-admonition/lang/translations/kn.po b/packages/ckeditor5-admonition/lang/translations/kn.po new file mode 100644 index 000000000..05eddd9e1 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/kn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ" diff --git a/packages/ckeditor5-admonition/lang/translations/ko.po b/packages/ckeditor5-admonition/lang/translations/ko.po new file mode 100644 index 000000000..b7f51b61c --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ko.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "인용 단락" diff --git a/packages/ckeditor5-admonition/lang/translations/ku.po b/packages/ckeditor5-admonition/lang/translations/ku.po new file mode 100644 index 000000000..c0ab93c76 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ku.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "وتەی وەرگیراو" diff --git a/packages/ckeditor5-admonition/lang/translations/lt.po b/packages/ckeditor5-admonition/lang/translations/lt.po new file mode 100644 index 000000000..857f45a18 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/lt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citata" diff --git a/packages/ckeditor5-admonition/lang/translations/lv.po b/packages/ckeditor5-admonition/lang/translations/lv.po new file mode 100644 index 000000000..68b8707e5 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/lv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citāts" diff --git a/packages/ckeditor5-admonition/lang/translations/ms.po b/packages/ckeditor5-admonition/lang/translations/ms.po new file mode 100644 index 000000000..703bf8395 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ms.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok petikan" diff --git a/packages/ckeditor5-admonition/lang/translations/nb.po b/packages/ckeditor5-admonition/lang/translations/nb.po new file mode 100644 index 000000000..be64e8a24 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/nb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/packages/ckeditor5-admonition/lang/translations/ne.po b/packages/ckeditor5-admonition/lang/translations/ne.po new file mode 100644 index 000000000..0681f801b --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ne.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ब्लक उद्धरण" diff --git a/packages/ckeditor5-admonition/lang/translations/nl.po b/packages/ckeditor5-admonition/lang/translations/nl.po new file mode 100644 index 000000000..96d891b6a --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/nl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citaat" diff --git a/packages/ckeditor5-admonition/lang/translations/no.po b/packages/ckeditor5-admonition/lang/translations/no.po new file mode 100644 index 000000000..5eda198a3 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/no.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/packages/ckeditor5-admonition/lang/translations/pl.po b/packages/ckeditor5-admonition/lang/translations/pl.po new file mode 100644 index 000000000..a9a2abfee --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/pl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cytat blokowy" diff --git a/packages/ckeditor5-admonition/lang/translations/pt-br.po b/packages/ckeditor5-admonition/lang/translations/pt-br.po new file mode 100644 index 000000000..92ae869e0 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/pt-br.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/packages/ckeditor5-admonition/lang/translations/pt.po b/packages/ckeditor5-admonition/lang/translations/pt.po new file mode 100644 index 000000000..c4c0db12a --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/pt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/packages/ckeditor5-admonition/lang/translations/ro.po b/packages/ckeditor5-admonition/lang/translations/ro.po new file mode 100644 index 000000000..441fcc2e3 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ro.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloc citat" diff --git a/packages/ckeditor5-admonition/lang/translations/ru.po b/packages/ckeditor5-admonition/lang/translations/ru.po new file mode 100644 index 000000000..4a4025be7 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ru.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/packages/ckeditor5-admonition/lang/translations/sk.po b/packages/ckeditor5-admonition/lang/translations/sk.po new file mode 100644 index 000000000..63239f457 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citát" diff --git a/packages/ckeditor5-admonition/lang/translations/sl.po b/packages/ckeditor5-admonition/lang/translations/sl.po new file mode 100644 index 000000000..a45101568 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://app.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokiraj citat" diff --git a/packages/ckeditor5-admonition/lang/translations/sq.po b/packages/ckeditor5-admonition/lang/translations/sq.po new file mode 100644 index 000000000..a745b3c00 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sq.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Thonjëzat" diff --git a/packages/ckeditor5-admonition/lang/translations/sr-latn.po b/packages/ckeditor5-admonition/lang/translations/sr-latn.po new file mode 100644 index 000000000..6067dba88 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sr-latn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/packages/ckeditor5-admonition/lang/translations/sr.po b/packages/ckeditor5-admonition/lang/translations/sr.po new file mode 100644 index 000000000..d0b5be48e --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/packages/ckeditor5-admonition/lang/translations/sv.po b/packages/ckeditor5-admonition/lang/translations/sv.po new file mode 100644 index 000000000..48ba49cdd --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/sv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockcitat" diff --git a/packages/ckeditor5-admonition/lang/translations/th.po b/packages/ckeditor5-admonition/lang/translations/th.po new file mode 100644 index 000000000..fd3b72129 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/th.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "คำพูดบล็อก" diff --git a/packages/ckeditor5-admonition/lang/translations/tk.po b/packages/ckeditor5-admonition/lang/translations/tk.po new file mode 100644 index 000000000..0fa386ad8 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/tk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitata blokirläň" diff --git a/packages/ckeditor5-admonition/lang/translations/tr.po b/packages/ckeditor5-admonition/lang/translations/tr.po new file mode 100644 index 000000000..caba274db --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/tr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Alıntı" diff --git a/packages/ckeditor5-admonition/lang/translations/ug.po b/packages/ckeditor5-admonition/lang/translations/ug.po new file mode 100644 index 000000000..5816d3fb0 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ug.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "نەقىل" diff --git a/packages/ckeditor5-admonition/lang/translations/uk.po b/packages/ckeditor5-admonition/lang/translations/uk.po new file mode 100644 index 000000000..329193c12 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/uk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/packages/ckeditor5-admonition/lang/translations/ur.po b/packages/ckeditor5-admonition/lang/translations/ur.po new file mode 100644 index 000000000..9e471e028 --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/ur.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "خانہ اقتباس" diff --git a/packages/ckeditor5-admonition/lang/translations/uz.po b/packages/ckeditor5-admonition/lang/translations/uz.po new file mode 100644 index 000000000..f7f4045ae --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/uz.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Iqtibos" diff --git a/packages/ckeditor5-admonition/lang/translations/vi.po b/packages/ckeditor5-admonition/lang/translations/vi.po new file mode 100644 index 000000000..e229468dd --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/vi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Trích dẫn" diff --git a/packages/ckeditor5-admonition/lang/translations/zh-cn.po b/packages/ckeditor5-admonition/lang/translations/zh-cn.po new file mode 100644 index 000000000..461cc956e --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/zh-cn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "块引用" diff --git a/packages/ckeditor5-admonition/lang/translations/zh.po b/packages/ckeditor5-admonition/lang/translations/zh.po new file mode 100644 index 000000000..9b496b39e --- /dev/null +++ b/packages/ckeditor5-admonition/lang/translations/zh.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "段落引用" diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json new file mode 100644 index 000000000..ef9ac3093 --- /dev/null +++ b/packages/ckeditor5-admonition/package.json @@ -0,0 +1,62 @@ +{ + "name": "@ckeditor/ckeditor5-block-quote", + "version": "43.2.0", + "description": "Block quote feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.ts", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.2.0", + "@ckeditor/ckeditor5-enter": "43.2.0", + "@ckeditor/ckeditor5-typing": "43.2.0", + "@ckeditor/ckeditor5-ui": "43.2.0", + "@ckeditor/ckeditor5-utils": "43.2.0", + "ckeditor5": "43.2.0" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "43.2.0", + "@ckeditor/ckeditor5-dev-utils": "^43.0.0", + "@ckeditor/ckeditor5-editor-classic": "43.2.0", + "@ckeditor/ckeditor5-engine": "43.2.0", + "@ckeditor/ckeditor5-heading": "43.2.0", + "@ckeditor/ckeditor5-image": "43.2.0", + "@ckeditor/ckeditor5-list": "43.2.0", + "@ckeditor/ckeditor5-paragraph": "43.2.0", + "@ckeditor/ckeditor5-table": "43.2.0", + "@ckeditor/ckeditor5-theme-lark": "43.2.0", + "typescript": "5.0.4", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-block-quote" + }, + "files": [ + "dist", + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.json", + "build:dist": "node ../../scripts/build-package.mjs" + } +} diff --git a/packages/ckeditor5-admonition/src/augmentation.ts b/packages/ckeditor5-admonition/src/augmentation.ts new file mode 100644 index 000000000..733bc2b28 --- /dev/null +++ b/packages/ckeditor5-admonition/src/augmentation.ts @@ -0,0 +1,23 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +import type { + BlockQuote, + BlockQuoteCommand, + BlockQuoteEditing, + BlockQuoteUI +} from './index.js'; + +declare module '@ckeditor/ckeditor5-core' { + interface PluginsMap { + [ BlockQuote.pluginName ]: BlockQuote; + [ BlockQuoteEditing.pluginName ]: BlockQuoteEditing; + [ BlockQuoteUI.pluginName ]: BlockQuoteUI; + } + + interface CommandsMap { + blockQuote: BlockQuoteCommand; + } +} diff --git a/packages/ckeditor5-admonition/src/blockquote.ts b/packages/ckeditor5-admonition/src/blockquote.ts new file mode 100644 index 000000000..b977c3cec --- /dev/null +++ b/packages/ckeditor5-admonition/src/blockquote.ts @@ -0,0 +1,39 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * @module block-quote/blockquote + */ + +import { Plugin } from 'ckeditor5/src/core.js'; + +import BlockQuoteEditing from './blockquoteediting.js'; +import BlockQuoteUI from './blockquoteui.js'; + +/** + * The block quote plugin. + * + * For more information about this feature check the {@glink api/block-quote package page}. + * + * This is a "glue" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature} + * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuote extends Plugin { + /** + * @inheritDoc + */ + public static get requires() { + return [ BlockQuoteEditing, BlockQuoteUI ] as const; + } + + /** + * @inheritDoc + */ + public static get pluginName() { + return 'BlockQuote' as const; + } +} diff --git a/packages/ckeditor5-admonition/src/blockquotecommand.ts b/packages/ckeditor5-admonition/src/blockquotecommand.ts new file mode 100644 index 000000000..46c2afd53 --- /dev/null +++ b/packages/ckeditor5-admonition/src/blockquotecommand.ts @@ -0,0 +1,222 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * @module block-quote/blockquotecommand + */ + +import { Command } from 'ckeditor5/src/core.js'; +import { first } from 'ckeditor5/src/utils.js'; +import type { DocumentFragment, Element, Position, Range, Schema, Writer } from 'ckeditor5/src/engine.js'; + +/** + * The block quote command plugin. + * + * @extends module:core/command~Command + */ +export default class BlockQuoteCommand extends Command { + /** + * Whether the selection starts in a block quote. + * + * @observable + * @readonly + */ + declare public value: boolean; + + /** + * @inheritDoc + */ + public override refresh(): void { + this.value = this._getValue(); + this.isEnabled = this._checkEnabled(); + } + + /** + * Executes the command. When the command {@link #value is on}, all top-most block quotes within + * the selection will be removed. If it is off, all selected blocks will be wrapped with + * a block quote. + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, + * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. + */ + public override execute( options: { forceValue?: boolean } = {} ): void { + const model = this.editor.model; + const schema = model.schema; + const selection = model.document.selection; + + const blocks = Array.from( selection.getSelectedBlocks() ); + + const value = ( options.forceValue === undefined ) ? !this.value : options.forceValue; + + model.change( writer => { + if ( !value ) { + this._removeQuote( writer, blocks.filter( findQuote ) ); + } else { + const blocksToQuote = blocks.filter( block => { + // Already quoted blocks needs to be considered while quoting too + // in order to reuse their elements. + return findQuote( block ) || checkCanBeQuoted( schema, block ); + } ); + + this._applyQuote( writer, blocksToQuote ); + } + } ); + } + + /** + * Checks the command's {@link #value}. + */ + private _getValue(): boolean { + const selection = this.editor.model.document.selection; + + const firstBlock = first( selection.getSelectedBlocks() ); + + // In the current implementation, the block quote must be an immediate parent of a block element. + return !!( firstBlock && findQuote( firstBlock ) ); + } + + /** + * Checks whether the command can be enabled in the current context. + * + * @returns Whether the command should be enabled. + */ + private _checkEnabled(): boolean { + if ( this.value ) { + return true; + } + + const selection = this.editor.model.document.selection; + const schema = this.editor.model.schema; + + const firstBlock = first( selection.getSelectedBlocks() ); + + if ( !firstBlock ) { + return false; + } + + return checkCanBeQuoted( schema, firstBlock ); + } + + /** + * Removes the quote from given blocks. + * + * If blocks which are supposed to be "unquoted" are in the middle of a quote, + * start it or end it, then the quote will be split (if needed) and the blocks + * will be moved out of it, so other quoted blocks remained quoted. + */ + private _removeQuote( writer: Writer, blocks: Array ): void { + // Unquote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups( writer, blocks ).reverse().forEach( groupRange => { + if ( groupRange.start.isAtStart && groupRange.end.isAtEnd ) { + writer.unwrap( groupRange.start.parent as Element ); + + return; + } + + // The group of blocks are at the beginning of an so let's move them left (out of the ). + if ( groupRange.start.isAtStart ) { + const positionBefore = writer.createPositionBefore( groupRange.start.parent as Element ); + + writer.move( groupRange, positionBefore ); + + return; + } + + // The blocks are in the middle of an so we need to split the after the last block + // so we move the items there. + if ( !groupRange.end.isAtEnd ) { + writer.split( groupRange.end ); + } + + // Now we are sure that groupRange.end.isAtEnd is true, so let's move the blocks right. + + const positionAfter = writer.createPositionAfter( groupRange.end.parent as Element ); + + writer.move( groupRange, positionAfter ); + } ); + } + + /** + * Applies the quote to given blocks. + */ + private _applyQuote( writer: Writer, blocks: Array ): void { + const quotesToMerge: Array = []; + + // Quote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups( writer, blocks ).reverse().forEach( groupRange => { + let quote = findQuote( groupRange.start ); + + if ( !quote ) { + quote = writer.createElement( 'blockQuote' ); + + writer.wrap( groupRange, quote ); + } + + quotesToMerge.push( quote ); + } ); + + // Merge subsequent elements. Reverse the order again because this time we want to go through + // the elements in the source order (due to how merge works – it moves the right element's content + // to the first element and removes the right one. Since we may need to merge a couple of subsequent `` elements + // we want to keep the reference to the first (furthest left) one. + quotesToMerge.reverse().reduce( ( currentQuote, nextQuote ) => { + if ( currentQuote.nextSibling == nextQuote ) { + writer.merge( writer.createPositionAfter( currentQuote ) ); + + return currentQuote; + } + + return nextQuote; + } ); + } +} + +function findQuote( elementOrPosition: Element | Position ): Element | DocumentFragment | null { + return elementOrPosition.parent!.name == 'blockQuote' ? elementOrPosition.parent : null; +} + +/** + * Returns a minimal array of ranges containing groups of subsequent blocks. + * + * content: abcdefgh + * blocks: [ a, b, d, f, g, h ] + * output ranges: [ab]c[d]e[fgh] + */ +function getRangesOfBlockGroups( writer: Writer, blocks: Array ): Array { + let startPosition; + let i = 0; + const ranges = []; + + while ( i < blocks.length ) { + const block = blocks[ i ]; + const nextBlock = blocks[ i + 1 ]; + + if ( !startPosition ) { + startPosition = writer.createPositionBefore( block ); + } + + if ( !nextBlock || block.nextSibling != nextBlock ) { + ranges.push( writer.createRange( startPosition, writer.createPositionAfter( block ) ) ); + startPosition = null; + } + + i++; + } + + return ranges; +} + +/** + * Checks whether can wrap the block. + */ +function checkCanBeQuoted( schema: Schema, block: Element ): boolean { + // TMP will be replaced with schema.checkWrap(). + const isBQAllowed = schema.checkChild( block.parent as Element, 'blockQuote' ); + const isBlockAllowedInBQ = schema.checkChild( [ '$root', 'blockQuote' ], block ); + + return isBQAllowed && isBlockAllowedInBQ; +} diff --git a/packages/ckeditor5-admonition/src/blockquoteediting.ts b/packages/ckeditor5-admonition/src/blockquoteediting.ts new file mode 100644 index 000000000..10d64b4e6 --- /dev/null +++ b/packages/ckeditor5-admonition/src/blockquoteediting.ts @@ -0,0 +1,146 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * @module block-quote/blockquoteediting + */ + +import { Plugin } from 'ckeditor5/src/core.js'; +import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; +import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; + +import BlockQuoteCommand from './blockquotecommand.js'; + +/** + * The block quote editing. + * + * Introduces the `'blockQuote'` command and the `'blockQuote'` model element. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteEditing extends Plugin { + /** + * @inheritDoc + */ + public static get pluginName() { + return 'BlockQuoteEditing' as const; + } + + /** + * @inheritDoc + */ + public static get requires() { + return [ Enter, Delete ] as const; + } + + /** + * @inheritDoc + */ + public init(): void { + const editor = this.editor; + const schema = editor.model.schema; + + editor.commands.add( 'blockQuote', new BlockQuoteCommand( editor ) ); + + schema.register( 'blockQuote', { + inheritAllFrom: '$container' + } ); + + editor.conversion.elementToElement( { model: 'blockQuote', view: 'blockquote' } ); + + // Postfixer which cleans incorrect model states connected with block quotes. + editor.model.document.registerPostFixer( writer => { + const changes = editor.model.document.differ.getChanges(); + + for ( const entry of changes ) { + if ( entry.type == 'insert' ) { + const element = entry.position.nodeAfter; + + if ( !element ) { + // We are inside a text node. + continue; + } + + if ( element.is( 'element', 'blockQuote' ) && element.isEmpty ) { + // Added an empty blockQuote - remove it. + writer.remove( element ); + + return true; + } else if ( element.is( 'element', 'blockQuote' ) && !schema.checkChild( entry.position, element ) ) { + // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost. + writer.unwrap( element ); + + return true; + } else if ( element.is( 'element' ) ) { + // Just added an element. Check that all children meet the scheme rules. + const range = writer.createRangeIn( element ); + + for ( const child of range.getItems() ) { + if ( + child.is( 'element', 'blockQuote' ) && + !schema.checkChild( writer.createPositionBefore( child ), child ) + ) { + writer.unwrap( child ); + + return true; + } + } + } + } else if ( entry.type == 'remove' ) { + const parent = entry.position.parent; + + if ( parent.is( 'element', 'blockQuote' ) && parent.isEmpty ) { + // Something got removed and now blockQuote is empty. Remove the blockQuote as well. + writer.remove( parent ); + + return true; + } + } + } + + return false; + } ); + + const viewDocument = this.editor.editing.view.document; + const selection = editor.model.document.selection; + const blockQuoteCommand: BlockQuoteCommand = editor.commands.get( 'blockQuote' )!; + + // Overwrite default Enter key behavior. + // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote. + this.listenTo( viewDocument, 'enter', ( evt, data ) => { + if ( !selection.isCollapsed || !blockQuoteCommand.value ) { + return; + } + + const positionParent = selection.getLastPosition()!.parent; + + if ( positionParent.isEmpty ) { + editor.execute( 'blockQuote' ); + editor.editing.view.scrollToTheSelection(); + + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' } ); + + // Overwrite default Backspace key behavior. + // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote. + this.listenTo( viewDocument, 'delete', ( evt, data ) => { + if ( data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand!.value ) { + return; + } + + const positionParent = selection.getLastPosition()!.parent; + + if ( positionParent.isEmpty && !positionParent.previousSibling ) { + editor.execute( 'blockQuote' ); + editor.editing.view.scrollToTheSelection(); + + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' } ); + } +} diff --git a/packages/ckeditor5-admonition/src/blockquoteui.ts b/packages/ckeditor5-admonition/src/blockquoteui.ts new file mode 100644 index 000000000..be75840c2 --- /dev/null +++ b/packages/ckeditor5-admonition/src/blockquoteui.ts @@ -0,0 +1,84 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * @module block-quote/blockquoteui + */ + +import { Plugin, icons } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; + +import '../theme/blockquote.css'; + +/** + * The block quote UI plugin. + * + * It introduces the `'blockQuote'` button. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteUI extends Plugin { + /** + * @inheritDoc + */ + public static get pluginName() { + return 'BlockQuoteUI' as const; + } + + /** + * @inheritDoc + */ + public init(): void { + const editor = this.editor; + + editor.ui.componentFactory.add( 'blockQuote', () => { + const buttonView = this._createButton( ButtonView ); + + buttonView.set( { + tooltip: true + } ); + + return buttonView; + } ); + + editor.ui.componentFactory.add( 'menuBar:blockQuote', () => { + const buttonView = this._createButton( MenuBarMenuListItemButtonView ); + + buttonView.set( { + role: 'menuitemcheckbox' + } ); + + return buttonView; + } ); + } + + /** + * Creates a button for block quote command to use either in toolbar or in menu bar. + */ + private _createButton( ButtonClass: T ): InstanceType { + const editor = this.editor; + const locale = editor.locale; + const command = editor.commands.get( 'blockQuote' )!; + const view = new ButtonClass( editor.locale ) as InstanceType; + const t = locale.t; + + view.set( { + label: t( 'Block quote' ), + icon: icons.quote, + isToggleable: true + } ); + + view.bind( 'isEnabled' ).to( command, 'isEnabled' ); + view.bind( 'isOn' ).to( command, 'value' ); + + // Execute the command. + this.listenTo( view, 'execute', () => { + editor.execute( 'blockQuote' ); + editor.editing.view.focus(); + } ); + + return view; + } +} diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts new file mode 100644 index 000000000..21e08e52d --- /dev/null +++ b/packages/ckeditor5-admonition/src/index.ts @@ -0,0 +1,15 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * @module block-quote + */ + +export { default as BlockQuote } from './blockquote.js'; +export { default as BlockQuoteEditing } from './blockquoteediting.js'; +export { default as BlockQuoteUI } from './blockquoteui.js'; +export type { default as BlockQuoteCommand } from './blockquotecommand.js'; + +import './augmentation.js'; diff --git a/packages/ckeditor5-admonition/tests/blockquote.js b/packages/ckeditor5-admonition/tests/blockquote.js new file mode 100644 index 000000000..722525bff --- /dev/null +++ b/packages/ckeditor5-admonition/tests/blockquote.js @@ -0,0 +1,14 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +import BlockQuote from '../src/blockquote.js'; +import BlockQuoteEditing from '../src/blockquoteediting.js'; +import BlockQuoteUI from '../src/blockquoteui.js'; + +describe( 'BlockQuote', () => { + it( 'requires BlockQuoteEditing and BlockQuoteUI', () => { + expect( BlockQuote.requires ).to.deep.equal( [ BlockQuoteEditing, BlockQuoteUI ] ); + } ); +} ); diff --git a/packages/ckeditor5-admonition/tests/blockquotecommand.js b/packages/ckeditor5-admonition/tests/blockquotecommand.js new file mode 100644 index 000000000..08a8197bc --- /dev/null +++ b/packages/ckeditor5-admonition/tests/blockquotecommand.js @@ -0,0 +1,648 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +import BlockQuoteEditing from '../src/blockquoteediting.js'; +import BlockQuoteCommand from '../src/blockquotecommand.js'; + +import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor.js'; +import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; +import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view.js'; + +import Command from '@ckeditor/ckeditor5-core/src/command.js'; + +describe( 'BlockQuoteCommand', () => { + let editor, model, command; + + beforeEach( () => { + return VirtualTestEditor + .create( { + plugins: [ BlockQuoteEditing ] + } ) + .then( newEditor => { + editor = newEditor; + + model = editor.model; + + model.schema.register( 'paragraph', { inheritAllFrom: '$block' } ); + model.schema.register( 'heading', { inheritAllFrom: '$block' } ); + model.schema.register( 'widget' ); + + model.schema.extend( 'widget', { + allowIn: '$root', + allowChildren: '$text', + isLimit: true, + isObject: true + } ); + + editor.conversion.for( 'downcast' ).elementToElement( { model: 'paragraph', view: 'p' } ); + editor.conversion.for( 'downcast' ).elementToElement( { model: 'heading', view: 'h' } ); + editor.conversion.for( 'downcast' ).elementToElement( { model: 'widget', view: 'widget' } ); + + command = editor.commands.get( 'blockQuote' ); + } ); + } ); + + afterEach( async () => { + await editor.destroy(); + } ); + + it( 'is a command', () => { + expect( BlockQuoteCommand.prototype ).to.be.instanceOf( Command ); + expect( command ).to.be.instanceOf( Command ); + } ); + + describe( 'value', () => { + it( 'is false when selection is not in a block quote', () => { + setModelData( model, 'x[]x' ); + + expect( command ).to.have.property( 'value', false ); + } ); + + it( 'is false when start of the selection is not in a block quote', () => { + setModelData( model, 'x[x
y]y
' ); + + expect( command ).to.have.property( 'value', false ); + } ); + + it( 'is false when selection starts in a blockless space', () => { + model.schema.extend( '$text', { allowIn: '$root' } ); + + setModelData( model, 'x[]x' ); + + expect( command ).to.have.property( 'value', false ); + } ); + + it( 'is true when selection is in a block quote', () => { + setModelData( model, '
x[]x
' ); + + expect( command ).to.have.property( 'value', true ); + } ); + + it( 'is true when selection starts in a block quote', () => { + setModelData( model, '
x[x
y]y' ); + + expect( command ).to.have.property( 'value', true ); + } ); + } ); + + describe( 'isEnabled', () => { + it( 'is true when selection is in a block which can be wrapped with blockQuote', () => { + setModelData( model, 'x[]x' ); + + expect( command ).to.have.property( 'isEnabled', true ); + } ); + + it( 'is true when selection is in a block which is already in blockQuote', () => { + setModelData( model, '
x[]x
' ); + + expect( command ).to.have.property( 'isEnabled', true ); + } ); + + it( 'is true when selection starts in a block which can be wrapped with blockQuote', () => { + setModelData( model, 'x[xy]y' ); + + expect( command ).to.have.property( 'isEnabled', true ); + } ); + + it( 'is false when selection is in an element which cannot be wrapped with blockQuote (because it cannot be its child)', () => { + setModelData( model, 'x[]x' ); + + expect( command ).to.have.property( 'isEnabled', false ); + } ); + + it( + 'is false when selection is in an element which cannot be wrapped with blockQuote' + + '(because mQ is not allowed in its parent)', + () => { + model.schema.addChildCheck( ( ctx, childDef ) => { + if ( childDef.name == 'blockQuote' ) { + return false; + } + } ); + + setModelData( model, 'x[]x' ); + + expect( command ).to.have.property( 'isEnabled', false ); + } + ); + + // https://github.com/ckeditor/ckeditor5-engine/issues/826 + // it( 'is false when selection starts in an element which cannot be wrapped with blockQuote', () => { + // setModelData( model, 'x[xy]y' ); + + // expect( command ).to.have.property( 'isEnabled', false ); + // } ); + } ); + + describe( 'execute()', () => { + describe( 'applying quote', () => { + it( 'should wrap a single block', () => { + setModelData( + model, + 'abc' + + 'x[]x' + + 'def' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'abc' + + '
x[]x
' + + 'def' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

x{}x

def

' + ); + } ); + + it( 'should wrap multiple blocks', () => { + setModelData( + model, + 'a[bc' + + 'xx' + + 'de]f' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
' + + 'a[bc' + + 'xx' + + 'de]f' + + '
' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '
a{bc

xx

de}f

' + ); + } ); + + it( 'should merge with an existing quote', () => { + setModelData( + model, + 'a[bc' + + '
x]xyy
' + + 'def' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + '[x]x' + + 'yy' + + '
' + + 'def' + ); + + // Selection incorrectly trimmed. + expect( getViewData( editor.editing.view ) ).to.equal( + '
abc

{x}x

yy

def

' + ); + } ); + + it( 'should not merge with a quote preceding the current block', () => { + setModelData( + model, + '
abc
' + + 'x[]x' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
abc
' + + '
x[]x
' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

' + + '

x{}x

' + ); + } ); + + it( 'should not merge with a quote following the current block', () => { + setModelData( + model, + 'x[]x' + + '
abc
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
x[]x
' + + '
abc
' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

x{}x

' + + '

abc

' + ); + } ); + + it( 'should merge with an existing quote (more blocks)', () => { + setModelData( + model, + 'a[bc' + + 'def' + + '
x]x
' + + 'ghi' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + 'def' + + '[x]x' + + '
' + + 'ghi' + ); + + // Selection incorrectly trimmed. + expect( getViewData( editor.editing.view ) ).to.equal( + '
abc

def

{x}x

ghi

' + ); + } ); + + it( 'should not wrap non-block content', () => { + setModelData( + model, + 'a[bc' + + 'xx' + + 'de]f' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + '
' + + '[xx' + + '
' + + 'de]f' + + '
' + ); + + // Selection incorrectly trimmed. + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

[xx

de}f

' + ); + } ); + + it( 'should correctly wrap and merge groups of blocks', () => { + setModelData( + model, + 'a[bc' + + 'xx' + + 'def' + + '
ghi
' + + 'yy' + + 'jk]l' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
abc
' + + '[xx' + + '
defghi
' + + 'yy' + + '
jk]l
' + ); + + // Selection incorrectly trimmed. + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

' + + '[xx' + + '

def

ghi

' + + 'yy' + + '

jk}l

' + ); + } ); + + it( 'should correctly merge a couple of subsequent quotes', () => { + setModelData( + model, + 'x' + + 'a[bc' + + '
def
' + + 'ghi' + + '
jkl
' + + 'mn]o' + + 'y' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + 'x' + + '
' + + 'abc' + + 'def' + + 'ghi' + + 'jkl' + + '[mn]o' + + '
' + + 'y' + ); + + // Selection incorrectly trimmed. + expect( getViewData( editor.editing.view ) ).to.equal( + '

x

' + + '
' + + '

abc

' + + '

def

' + + '

ghi

' + + '

jkl

' + + '

{mn}o

' + + '
' + + '

y

' + ); + } ); + + it( 'should not wrap a block which can not be in a quote', () => { + // blockQuote is allowed in root, but fooBlock can not be inside blockQuote. + model.schema.register( 'fooBlock', { inheritAllFrom: '$block' } ); + model.schema.addChildCheck( ( ctx, childDef ) => { + if ( ctx.endsWith( 'blockQuote' ) && childDef.name == 'fooBlock' ) { + return false; + } + } ); + + editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooBlock', view: 'fooblock' } ); + + setModelData( + model, + 'a[bc' + + 'xx' + + 'de]f' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + '
' + + '[xx' + + '
' + + 'de]f' + + '
' + ); + } ); + + it( 'should not wrap a block which parent does not allow quote inside itself', () => { + // blockQuote is not be allowed in fooWrapper, but fooBlock can be inside blockQuote. + model.schema.register( 'fooWrapper' ); + model.schema.register( 'fooBlock', { inheritAllFrom: '$block' } ); + + model.schema.extend( 'fooWrapper', { allowIn: '$root' } ); + model.schema.extend( 'fooBlock', { allowIn: 'fooWrapper' } ); + + editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooWrapper', view: 'foowrapper' } ); + editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooBlock', view: 'fooblock' } ); + + setModelData( + model, + 'a[bc' + + 'xx' + + 'de]f' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + '
' + + '[xx' + + '
' + + 'de]f' + + '
' + ); + } ); + + it( 'should handle forceValue = true param', () => { + setModelData( + model, + '
' + + 'x[x' + + '
' + + 'd]ef' + ); + + editor.execute( 'blockQuote', { forceValue: true } ); + + expect( getModelData( model ) ).to.equal( + '
' + + 'x[x' + + 'd]ef' + + '
' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

x{x

d}ef

' + ); + } ); + } ); + + describe( 'removing quote', () => { + it( 'should unwrap a single block', () => { + setModelData( + model, + 'abc' + + '
x[]x
' + + 'def' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'abc' + + 'x[]x' + + 'def' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

x{}x

def

' + ); + } ); + + it( 'should unwrap multiple blocks', () => { + setModelData( + model, + '
' + + 'a[bc' + + 'xx' + + 'de]f' + + '
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'a[bc' + + 'xx' + + 'de]f' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

a{bc

xx

de}f

' + ); + } ); + + it( 'should unwrap only the selected blocks - at the beginning', () => { + setModelData( + model, + 'xx' + + '
' + + 'a[b]c' + + 'xx' + + '
' + + 'yy' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'xx' + + 'a[b]c' + + '
' + + 'xx' + + '
' + + 'yy' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

xx

a{b}c

xx

yy

' + ); + } ); + + it( 'should unwrap only the selected blocks - at the end', () => { + setModelData( + model, + '
' + + 'abc' + + 'x[x' + + '
' + + 'de]f' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
' + + 'abc' + + '
' + + 'x[x' + + 'de]f' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

abc

x{x

de}f

' + ); + } ); + + it( 'should unwrap only the selected blocks - in the middle', () => { + setModelData( + model, + 'xx' + + '
' + + 'abc' + + 'c[]de' + + 'fgh' + + '
' + + 'xx' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'xx' + + '
abc
' + + 'c[]de' + + '
fgh
' + + 'xx' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

xx

' + + '

abc

' + + '

c{}de

' + + '

fgh

' + + '

xx

' + ); + } ); + + it( 'should remove multiple quotes', () => { + setModelData( + model, + '
a[bc
' + + 'xx' + + '
defghi
' + + 'yy' + + '
de]fghi
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'a[bc' + + 'xx' + + 'defghi' + + 'yy' + + 'de]f' + + '
ghi
' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

a{bc

' + + '

xx

' + + '

def

ghi

' + + '

yy

' + + '

de}f

' + + '

ghi

' + ); + } ); + + it( 'should handle forceValue = false param', () => { + setModelData( + model, + 'a[bc' + + '
' + + 'x]x' + + '
' + ); + + editor.execute( 'blockQuote', { forceValue: false } ); + + // Incorrect selection. + expect( getModelData( model ) ).to.equal( + 'a[bc]' + + 'xx' + ); + + expect( getViewData( editor.editing.view ) ).to.equal( + '

a{bc}

xx

' + ); + } ); + } ); + } ); +} ); diff --git a/packages/ckeditor5-admonition/tests/blockquoteediting.js b/packages/ckeditor5-admonition/tests/blockquoteediting.js new file mode 100644 index 000000000..54a0ea821 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/blockquoteediting.js @@ -0,0 +1,196 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +import BlockQuoteEditing from '../src/blockquoteediting.js'; +import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; +import ListEditing from '@ckeditor/ckeditor5-list/src/list/listediting.js'; +import BoldEditing from '@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js'; + +import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor.js'; +import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; + +import BlockQuoteCommand from '../src/blockquotecommand.js'; + +describe( 'BlockQuoteEditing', () => { + let editor, model; + + beforeEach( () => { + return VirtualTestEditor + .create( { + plugins: [ BlockQuoteEditing, Paragraph, BoldEditing ] + } ) + .then( newEditor => { + editor = newEditor; + model = editor.model; + } ); + } ); + + afterEach( () => { + return editor.destroy(); + } ); + + it( 'should have pluginName', () => { + expect( BlockQuoteEditing.pluginName ).to.equal( 'BlockQuoteEditing' ); + } ); + + it( 'adds a blockQuote command', () => { + expect( editor.commands.get( 'blockQuote' ) ).to.be.instanceOf( BlockQuoteCommand ); + } ); + + it( 'allows for blockQuote in the $root', () => { + expect( model.schema.checkChild( [ '$root' ], 'blockQuote' ) ).to.be.true; + } ); + + it( 'allows for $block in blockQuote', () => { + expect( model.schema.checkChild( [ '$root', 'blockQuote' ], '$block' ) ).to.be.true; + expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'paragraph' ) ).to.be.true; + } ); + + it( 'allows for blockQuote in blockQuote', () => { + expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'blockQuote' ) ).to.be.true; + } ); + + it( 'does not break when checking an unregisterd item', () => { + expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'foo' ) ).to.be.false; + } ); + + it( 'inherits attributes from $container', () => { + model.schema.extend( '$container', { + allowAttributes: 'foo' + } ); + + expect( model.schema.checkAttribute( 'blockQuote', 'foo' ) ).to.be.true; + } ); + + it( 'adds converters to the data pipeline', () => { + const data = '

x

'; + + editor.setData( data ); + + expect( getModelData( model ) ).to.equal( '
[]x
' ); + expect( editor.getData() ).to.equal( data ); + } ); + + it( 'adds a converter to the view pipeline', () => { + setModelData( model, '
x
' ); + + expect( editor.getData() ).to.equal( '

x

' ); + } ); + + it( 'allows list items inside blockQuote', () => { + return VirtualTestEditor + .create( { + plugins: [ BlockQuoteEditing, Paragraph, ListEditing ] + } ) + .then( editor => { + editor.setData( '
  • xx
' ); + + expect( editor.getData() ).to.equal( '
  • xx
' ); + + return editor.destroy(); + } ); + } ); + + it( 'should remove empty blockQuote elements', () => { + setModelData( model, '
Foo' ); + + expect( editor.getData() ).to.equal( '

Foo

' ); + } ); + + it( 'should remove blockQuotes which became empty', () => { + setModelData( model, '
Foo
' ); + + model.change( writer => { + const root = model.document.getRoot(); + const bq = root.getChild( 0 ); + + writer.remove( writer.createRangeIn( bq ) ); + } ); + + expect( editor.getData( { trim: 'none' } ) ).to.equal( '

 

' ); // Autoparagraphed. + } ); + + it( 'should not unwrap a blockQuote if it was inserted into another blockQuote', () => { + setModelData( model, '
Foo
' ); + + model.change( writer => { + const root = model.document.getRoot(); + const bq = writer.createElement( 'blockQuote' ); + const p = writer.createElement( 'paragraph' ); + + writer.insertText( 'Bar', p, 0 ); //

Bar

. + writer.insert( p, bq, 0 ); //

Bar

. + writer.insert( bq, root.getChild( 0 ), 1 ); // Insert after

Foo

. + } ); + + expect( editor.getData() ).to.equal( '

Foo

Bar

' ); + } ); + + it( 'should not unwrap nested blockQuote if it was wrapped into another blockQuote', () => { + setModelData( model, '
Foo
Bar' ); + + model.change( writer => { + const root = model.document.getRoot(); + + writer.wrap( writer.createRangeIn( root ), 'blockQuote' ); + } ); + + expect( editor.getData() ).to.equal( '

Foo

Bar

' ); + } ); + + it( 'postfixer should do nothing on attribute change', () => { + // This is strictly a 100% CC test. + setModelData( model, '
Foo
' ); + + model.change( writer => { + const root = model.document.getRoot(); + const p = root.getChild( 0 ).getChild( 0 ); + + writer.setAttribute( 'bold', true, writer.createRangeIn( p ) ); + } ); + + expect( editor.getData() ).to.equal( '

Foo

' ); + } ); + + describe( 'nested blockQuote forbidden by custom rule', () => { + // Nested block quotes are supported since https://github.com/ckeditor/ckeditor5/issues/9210, so let's check + // if the editor will not blow up in case nested block quotes are forbidden by custom scheme rule. + beforeEach( () => { + model.schema.addChildCheck( ( ctx, childDef ) => { + if ( ctx.endsWith( 'blockQuote' ) && childDef.name == 'blockQuote' ) { + return false; + } + } ); + } ); + + it( 'should unwrap a blockQuote if it was inserted into another blockQuote', () => { + setModelData( model, '
Foo
' ); + + model.change( writer => { + const root = model.document.getRoot(); + const bq = writer.createElement( 'blockQuote' ); + const p = writer.createElement( 'paragraph' ); + + writer.insertText( 'Bar', p, 0 ); //

Bar

. + writer.insert( p, bq, 0 ); //

Bar

. + writer.insert( bq, root.getChild( 0 ), 1 ); // Insert after

Foo

. + } ); + + expect( editor.getData() ).to.equal( '

Foo

Bar

' ); + } ); + + it( 'should unwrap nested blockQuote if it was wrapped into another blockQuote', () => { + setModelData( model, '
Foo
Bar' ); + + model.change( writer => { + const root = model.document.getRoot(); + + writer.wrap( writer.createRangeIn( root ), 'blockQuote' ); + } ); + + expect( editor.getData() ).to.equal( '

Foo

Bar

' ); + } ); + } ); +} ); diff --git a/packages/ckeditor5-admonition/tests/blockquoteui.js b/packages/ckeditor5-admonition/tests/blockquoteui.js new file mode 100644 index 000000000..e7fe92bb1 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/blockquoteui.js @@ -0,0 +1,91 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* global document */ + +import BlockQuoteEditing from '../src/blockquoteediting.js'; +import BlockQuoteUI from '../src/blockquoteui.js'; + +import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor.js'; + +describe( 'BlockQuoteUI', () => { + let editor, command, element, button; + + beforeEach( () => { + element = document.createElement( 'div' ); + document.body.appendChild( element ); + + return ClassicTestEditor + .create( element, { + plugins: [ BlockQuoteEditing, BlockQuoteUI ] + } ) + .then( newEditor => { + editor = newEditor; + command = editor.commands.get( 'blockQuote' ); + } ); + } ); + + afterEach( () => { + element.remove(); + + return editor.destroy(); + } ); + + describe( 'toolbar block quote button', () => { + beforeEach( () => { + button = editor.ui.componentFactory.create( 'blockQuote' ); + } ); + + it( 'has the base properties', () => { + expect( button ).to.have.property( 'label', 'Block quote' ); + expect( button ).to.have.property( 'icon' ); + expect( button ).to.have.property( 'tooltip', true ); + expect( button ).to.have.property( 'isToggleable', true ); + } ); + + it( 'has isOn bound to command\'s value', () => { + command.value = false; + expect( button ).to.have.property( 'isOn', false ); + + command.value = true; + expect( button ).to.have.property( 'isOn', true ); + } ); + + testButton(); + } ); + + describe( 'menu bar block quote button', () => { + beforeEach( () => { + button = editor.ui.componentFactory.create( 'menuBar:blockQuote' ); + } ); + + it( 'has the base properties', () => { + expect( button ).to.have.property( 'label', 'Block quote' ); + expect( button ).to.have.property( 'icon' ); + expect( button ).to.have.property( 'isToggleable', true ); + } ); + + testButton(); + } ); + + function testButton() { + it( 'has isEnabled bound to command\'s isEnabled', () => { + command.isEnabled = true; + expect( button ).to.have.property( 'isEnabled', true ); + + command.isEnabled = false; + expect( button ).to.have.property( 'isEnabled', false ); + } ); + + it( 'executes command when it\'s executed', () => { + const spy = sinon.stub( editor, 'execute' ); + + button.fire( 'execute' ); + + expect( spy.calledOnce ).to.be.true; + expect( spy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); + } ); + } +} ); diff --git a/packages/ckeditor5-admonition/tests/integration.js b/packages/ckeditor5-admonition/tests/integration.js new file mode 100644 index 000000000..1146dedc3 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/integration.js @@ -0,0 +1,830 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* global document */ + +import BlockQuote from '../src/blockquote.js'; +import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; +import Image from '@ckeditor/ckeditor5-image/src/image.js'; +import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js'; +import LegacyList from '@ckeditor/ckeditor5-list/src/legacylist.js'; +import Enter from '@ckeditor/ckeditor5-enter/src/enter.js'; +import Delete from '@ckeditor/ckeditor5-typing/src/delete.js'; +import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; +import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; +import Table from '@ckeditor/ckeditor5-table/src/table.js'; + +import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor.js'; +import { + parse as parseModel, + getData as getModelData, + setData as setModelData +} from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; + +describe( 'BlockQuote integration', () => { + let editor, model, element, viewDocument; + + beforeEach( () => { + element = document.createElement( 'div' ); + document.body.appendChild( element ); + + return ClassicTestEditor + .create( element, { + plugins: [ BlockQuote, Paragraph, Bold, Image, ImageCaption, LegacyList, Enter, Delete, Heading, Table ] + } ) + .then( newEditor => { + editor = newEditor; + model = editor.model; + viewDocument = editor.editing.view.document; + } ); + } ); + + afterEach( () => { + element.remove(); + + return editor.destroy(); + } ); + + describe( 'enter key support', () => { + function fakeEventData() { + return { + preventDefault: sinon.spy() + }; + } + + it( 'does nothing if selection is in an empty block but not in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, 'x[]x' ); + + viewDocument.fire( 'enter', data ); + + // Only enter command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); + } ); + + it( 'does nothing if selection is in a non-empty block (at the end) in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
xx[]
' ); + + viewDocument.fire( 'enter', data ); + + // Only enter command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); + } ); + + it( 'does nothing if selection is in a non-empty block (at the beginning) in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
[]xx
' ); + + viewDocument.fire( 'enter', data ); + + // Only enter command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); + } ); + + it( 'does nothing if selection is not collapsed', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
[]
' ); + + viewDocument.fire( 'enter', data ); + + // Only enter command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); + } ); + + it( 'does not interfere with a similar handler in the list feature', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
' + + 'a' + + '[]' + + '
' + + 'x' + ); + + viewDocument.fire( 'enter', data ); + + expect( data.preventDefault.called ).to.be.true; + + expect( getModelData( model ) ).to.equal( + 'x' + + '
' + + 'a' + + '[]' + + '
' + + 'x' + ); + } ); + + it( 'escapes block quote if selection is in an empty block in an empty block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, 'x
[]
x' ); + + viewDocument.fire( 'enter', data ); + + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( 'x[]x' ); + } ); + + it( 'escapes block quote if selection is in an empty block in the middle of a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, + 'x' + + '
a[]b
' + + 'x' + ); + + viewDocument.fire( 'enter', data ); + + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '
a
' + + '[]' + + '
b
' + + 'x' + ); + } ); + + it( 'escapes block quote if selection is in an empty block at the end of a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, + 'x' + + '
a[]
' + + 'x' + ); + + viewDocument.fire( 'enter', data ); + + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '
a
' + + '[]' + + 'x' + ); + } ); + + it( 'scrolls the view document to the selection after the command is executed', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + const scrollSpy = sinon.stub( editor.editing.view, 'scrollToTheSelection' ); + + setModelData( model, + 'x' + + '
a[]
' + + 'x' + ); + + viewDocument.fire( 'enter', data ); + + sinon.assert.calledOnce( scrollSpy ); + sinon.assert.callOrder( execSpy, scrollSpy ); + } ); + } ); + + describe( 'backspace key support', () => { + function fakeEventData() { + return { + preventDefault: sinon.spy(), + direction: 'backward', + inputType: 'deleteContentBackward', + unit: 'character' + }; + } + + it( 'merges paragraph into paragraph in the quote', () => { + const data = fakeEventData(); + + setModelData( model, + '
ab
' + + '[]c' + + 'd' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + '
ab[]c
' + + 'd' + ); + } ); + + it( 'merges paragraph from a quote into a paragraph before quote', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
[]ab
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x[]a' + + '
b
' + + 'y' + ); + } ); + + it( 'merges two quotes', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
ab
' + + '
[]cd
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '
ab[]cd
' + + 'y' + ); + } ); + + it( 'unwraps empty quote when the backspace key pressed in the first empty paragraph in a quote', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
a
' + + '
[]
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '
a
' + + '[]' + + 'y' + ); + } ); + + it( 'unwraps empty quote when the backspace key pressed in the empty paragraph that is the only content of quote', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
[]
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '[]' + + 'y' + ); + } ); + + it( 'unwraps quote from the first paragraph when the backspace key pressed', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
[]foo
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '[]' + + '
foo
' + + 'y' + ); + } ); + + it( 'merges paragraphs in a quote when the backspace key pressed not in the first paragraph', () => { + const data = fakeEventData(); + + setModelData( model, + 'x' + + '
[]
' + + 'y' + ); + + viewDocument.fire( 'delete', data ); + + expect( getModelData( model ) ).to.equal( + 'x' + + '
[]
' + + 'y' + ); + } ); + + it( 'does nothing if selection is in an empty block but not in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, 'x[]x' ); + + viewDocument.fire( 'delete', data ); + + // Only delete command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); + } ); + + it( 'does nothing if selection is in a non-empty block (at the end) in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
xx[]
' ); + + viewDocument.fire( 'delete', data ); + + // Only delete command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); + } ); + + it( 'does nothing if selection is in a non-empty block (at the beginning) in a block quote', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
[]xx
' ); + + viewDocument.fire( 'delete', data ); + + // Only delete command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); + } ); + + it( 'does nothing if selection is not collapsed', () => { + const data = fakeEventData(); + const execSpy = sinon.spy( editor, 'execute' ); + + setModelData( model, '
[]
' ); + + viewDocument.fire( 'delete', data ); + + // Only delete command should be executed. + expect( data.preventDefault.called ).to.be.true; + expect( execSpy.calledOnce ).to.be.true; + expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); + } ); + } ); + + // Historically, due to problems with schema, images were not quotable. + // These tests were left here to confirm that after schema was fixed, images are properly quotable. + describe( 'compatibility with images', () => { + it( 'quotes a simple image', () => { + const element = document.createElement( 'div' ); + document.body.appendChild( element ); + + // We can't load ImageCaption in this test because it adds to all images automatically. + return ClassicTestEditor + .create( element, { + plugins: [ BlockQuote, Paragraph, Image ] + } ) + .then( editor => { + setModelData( editor.model, + 'fo[o' + + '' + + 'b]ar' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( editor.model ) ).to.equal( + '
' + + 'fo[o' + + '' + + 'b]ar' + + '
' + ); + + element.remove(); + return editor.destroy(); + } ); + } ); + + it( 'quotes an image with caption', () => { + setModelData( model, + 'fo[o' + + '' + + 'xxx' + + '' + + 'b]ar' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
' + + 'fo[o' + + '' + + 'xxx' + + '' + + 'b]ar' + + '
' + ); + } ); + + it( 'adds an image to an existing quote', () => { + setModelData( model, + 'fo[o' + + '' + + 'xxx' + + '' + + '
b]ar
' + ); + + editor.execute( 'blockQuote' ); + + // Selection incorrectly trimmed. + expect( getModelData( model ) ).to.equal( + '
' + + 'foo' + + '' + + 'xxx' + + '' + + '[b]ar' + + '
' + ); + } ); + + it( 'wraps paragraph+image', () => { + setModelData( model, + '[foofoo]' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
[foofoo]
' + ); + } ); + + it( 'unwraps paragraph+image', () => { + setModelData( model, + '
[foofoo]
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '[foofoo]' + ); + } ); + + it( 'wraps image+paragraph', () => { + setModelData( model, + '[foofoo]' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
[foofoo]
' + ); + } ); + + it( 'unwraps image+paragraph', () => { + setModelData( model, + '[foofoo]' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
[foofoo]
' + ); + } ); + } ); + + // When blockQuote with a paragraph was pasted into a list item, the item contained the paragraph. It was invalid. + // There is a test which checks whether blockQuote will split the list items instead of merging with. + describe( 'compatibility with lists', () => { + it( 'does not merge the paragraph with list item', () => { + setModelData( model, 'fo[]o' ); + + const df = parseModel( + '
xxx
yyy', + model.schema + ); + + model.insertContent( df, model.document.selection ); + + expect( getModelData( model ) ).to.equal( + 'fo' + + '
' + + 'xxx' + + '
' + + 'yyy[]o' + ); + } ); + } ); + + describe( 'compatibility with tables', () => { + it( 'wraps whole table', () => { + setModelData( model, '[foo
]' ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
[foo
]
' + ); + } ); + + it( 'unwraps whole table', () => { + setModelData( + model, + '
[foo
]
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '[foo
]' + ); + } ); + + it( 'wraps paragraph in table cell', () => { + setModelData( model, '[]foo
' ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '
[]foo
' + ); + } ); + + it( 'unwraps paragraph in table cell', () => { + setModelData( + model, + '
[]foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '[]foo
' + ); + } ); + + it( 'wraps image in table cell', () => { + setModelData( model, + '' + + '' + + '[]' + + ' ' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '
[
]' + + '' + + '
foo
' + ); + } ); + + it( 'unwraps image in table cell', () => { + setModelData( model, + '' + + '' + + '
[
]' + + '' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '[]' + + '' + + '
foo
' + ); + } ); + + it( 'wraps paragraph+image in table cell', () => { + setModelData( model, + '' + + '' + + '[foo]' + + '' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '' + + '
[foo
]' + + '' + + '' + + '
foo
' + ); + } ); + + it( 'unwraps paragraph+image in table cell', () => { + setModelData( model, + '' + + '' + + '' + + '
[foo
]' + + '' + + '' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '[foo]' + + '' + + '
foo
' + ); + } ); + + it( 'wraps image+paragraph in table cell', () => { + setModelData( model, + '' + + '' + + '[foo]' + + '' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '' + + '
[
foo]' + + '' + + '' + + '
foo
' + ); + } ); + + it( 'unwraps image+paragraph in table cell', () => { + setModelData( model, + '' + + '' + + '[foo]' + + '' + + '
foo
' + ); + + editor.execute( 'blockQuote' ); + + expect( getModelData( model ) ).to.equal( + '' + + '' + + '' + + '
[
foo]' + + '' + + '' + + '
foo
' + ); + } ); + } ); + + describe( 'autoparagraphing', () => { + it( 'text in block quote in div', () => { + const data = + '
' + + '
foobar
' + + '
' + + 'xyz'; + + editor.setData( data ); + + expect( editor.getData() ).to.equal( + '
' + + '

foobar

' + + '
' + + '

xyz

' + ); + } ); + + it( 'text directly in block quote', () => { + const data = + '
' + + 'foobar' + + '
' + + 'xyz'; + + editor.setData( data ); + + expect( editor.getData() ).to.equal( + '
' + + '

foobar

' + + '
' + + '

xyz

' + ); + } ); + + it( 'text after block quote in div', () => { + const data = + '
' + + 'foobar' + + '
' + + '
xyz
'; + + editor.setData( data ); + + expect( editor.getData() ).to.equal( + '
' + + '

foobar

' + + '
' + + '

xyz

' + ); + } ); + + it( 'text inside block quote in and after div', () => { + const data = + '
' + + '
foo
bar' + + '
' + + 'xyz'; + + editor.setData( data ); + + expect( editor.getData() ).to.equal( + '
' + + '

foo

bar

' + + '
' + + '

xyz

' + ); + } ); + + it( 'text inside block quote in div split by heading', () => { + const data = + '
' + + '
foo

bar

baz
' + + '
' + + 'xyz'; + + editor.setData( data ); + + expect( editor.getData() ).to.equal( + '
' + + '

foo

bar

baz

' + + '
' + + '

xyz

' + ); + } ); + } ); +} ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.html b/packages/ckeditor5-admonition/tests/manual/blockquote.html new file mode 100644 index 000000000..b8ea9f6b2 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquote.html @@ -0,0 +1,25 @@ +
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat.

+
+ CKEditor logo +
+

Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

+
    +
  • Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.
  • +
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

+
+

Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.js b/packages/ckeditor5-admonition/tests/manual/blockquote.js new file mode 100644 index 000000000..f993ca729 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquote.js @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* global document, console, window */ + +import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; +import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset.js'; + +ClassicEditor + .create( document.querySelector( '#editor' ), { + image: { toolbar: [ 'toggleImageCaption', 'imageTextAlternative' ] }, + plugins: [ + ArticlePluginSet + ], + toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ] + } ) + .then( editor => { + window.editor = editor; + } ) + .catch( err => { + console.error( err.stack ); + } ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.md b/packages/ckeditor5-admonition/tests/manual/blockquote.md new file mode 100644 index 000000000..13392bf0a --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquote.md @@ -0,0 +1,12 @@ +## Block quote feature + +Check block quote related behaviors: + +* applying quotes to multiple blocks, +* removing quotes, +* Enter (should leave quote when pressed in an empty block), +* Backspace, +* undo/redo, +* applying headings and lists, +* stability when used with nested lists, +* stability when used with nested block quotes. diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html new file mode 100644 index 000000000..573ba51c4 --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html @@ -0,0 +1,20 @@ + + +
+

Nested block quotes (in the data):

+ +
+

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

+
+

Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+

Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

+
+
+
+
diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js new file mode 100644 index 000000000..7b819167b --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js @@ -0,0 +1,36 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* globals console, window, document */ + +import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; +import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset.js'; + +function DisallowNestingBlockQuotes( editor ) { + editor.model.schema.addChildCheck( ( context, childDefinition ) => { + if ( context.endsWith( 'blockQuote' ) && childDefinition.name == 'blockQuote' ) { + return false; + } + } ); +} + +ClassicEditor + .create( document.querySelector( '#editor' ), { + image: { toolbar: [ 'toggleImageCaption', 'imageTextAlternative' ] }, + plugins: [ ArticlePluginSet, DisallowNestingBlockQuotes ], + toolbar: [ + 'heading', '|', 'insertTable', '|', 'bold', 'italic', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' + ], + table: { + contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells' ], + tableToolbar: [ 'bold', 'italic' ] + } + } ) + .then( editor => { + window.editor = editor; + } ) + .catch( err => { + console.error( err.stack ); + } ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md new file mode 100644 index 000000000..f6113c6bb --- /dev/null +++ b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md @@ -0,0 +1,2 @@ +* The nested block quote present in the data should be "unnested" ("unwrapped") on data load. All block quotes (the top level block quote and all nested ones) should be converted to siblings in editor's root. +* It should not be possible to insert a block quote into another block quote as a direct child in any way (UI, paste, d&d, etc.). It is allowed to have nested block quotes indirectly, i.e. a block quote inside a table, which is inside another block quote. \ No newline at end of file diff --git a/packages/ckeditor5-admonition/tests/manual/logo.png b/packages/ckeditor5-admonition/tests/manual/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a13d628da130fe4bb24eef85fe39551360625b GIT binary patch literal 23712 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 P00000NkvXXu0mjf%p3nA literal 0 HcmV?d00001 diff --git a/packages/ckeditor5-admonition/theme/blockquote.css b/packages/ckeditor5-admonition/theme/blockquote.css new file mode 100644 index 000000000..e456acb12 --- /dev/null +++ b/packages/ckeditor5-admonition/theme/blockquote.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content blockquote { + /* See #12 */ + overflow: hidden; + + /* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */ + padding-right: 1.5em; + padding-left: 1.5em; + + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} + +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} diff --git a/packages/ckeditor5-admonition/tsconfig.dist.json b/packages/ckeditor5-admonition/tsconfig.dist.json new file mode 100644 index 000000000..d8e5823ec --- /dev/null +++ b/packages/ckeditor5-admonition/tsconfig.dist.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.dist.json", + "compilerOptions": { + "rootDir": "src", + "types": [ + "../../typings/types" + ] + }, + "include": [ + "src" + ] +} diff --git a/packages/ckeditor5-admonition/tsconfig.json b/packages/ckeditor5-admonition/tsconfig.json new file mode 100644 index 000000000..06d45c898 --- /dev/null +++ b/packages/ckeditor5-admonition/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.release.json", + "include": [ + "src", + "../../typings" + ], + "exclude": [ + "tests" + ] +} diff --git a/packages/ckeditor5-admonition/webpack.config.cjs b/packages/ckeditor5-admonition/webpack.config.cjs new file mode 100644 index 000000000..04e3af7a4 --- /dev/null +++ b/packages/ckeditor5-admonition/webpack.config.cjs @@ -0,0 +1,19 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +'use strict'; + +/* eslint-env node */ + +const { builds } = require( '@ckeditor/ckeditor5-dev-utils' ); +const webpack = require( 'webpack' ); + +module.exports = builds.getDllPluginWebpackConfig( webpack, { + themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ), + packagePath: __dirname, + manifestPath: require.resolve( 'ckeditor5/build/ckeditor5-dll.manifest.json' ), + isDevelopmentMode: process.argv.includes( '--mode=development' ), + tsconfigPath: require.resolve( 'ckeditor5/tsconfig.dll.json' ) +} ); From 0f9ab0dd891f52d744db11c5e3fc7e330b5d313e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:33:39 +0200 Subject: [PATCH 02/25] refactor(admonitions): rename classes --- packages/ckeditor5-admonition/src/blockquote.ts | 8 ++++---- packages/ckeditor5-admonition/src/blockquotecommand.ts | 2 +- packages/ckeditor5-admonition/src/blockquoteediting.ts | 8 ++++---- packages/ckeditor5-admonition/src/blockquoteui.ts | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/ckeditor5-admonition/src/blockquote.ts b/packages/ckeditor5-admonition/src/blockquote.ts index b977c3cec..1557fd43e 100644 --- a/packages/ckeditor5-admonition/src/blockquote.ts +++ b/packages/ckeditor5-admonition/src/blockquote.ts @@ -9,8 +9,8 @@ import { Plugin } from 'ckeditor5/src/core.js'; -import BlockQuoteEditing from './blockquoteediting.js'; -import BlockQuoteUI from './blockquoteui.js'; +import AdmonitionEditing from './blockquoteediting.js'; +import AdmonitionUI from './blockquoteui.js'; /** * The block quote plugin. @@ -22,12 +22,12 @@ import BlockQuoteUI from './blockquoteui.js'; * * @extends module:core/plugin~Plugin */ -export default class BlockQuote extends Plugin { +export default class Admonition extends Plugin { /** * @inheritDoc */ public static get requires() { - return [ BlockQuoteEditing, BlockQuoteUI ] as const; + return [ AdmonitionEditing, AdmonitionUI ] as const; } /** diff --git a/packages/ckeditor5-admonition/src/blockquotecommand.ts b/packages/ckeditor5-admonition/src/blockquotecommand.ts index 46c2afd53..d2ae120bf 100644 --- a/packages/ckeditor5-admonition/src/blockquotecommand.ts +++ b/packages/ckeditor5-admonition/src/blockquotecommand.ts @@ -16,7 +16,7 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from * * @extends module:core/command~Command */ -export default class BlockQuoteCommand extends Command { +export default class AdmonitionCommand extends Command { /** * Whether the selection starts in a block quote. * diff --git a/packages/ckeditor5-admonition/src/blockquoteediting.ts b/packages/ckeditor5-admonition/src/blockquoteediting.ts index 10d64b4e6..1756ae2fe 100644 --- a/packages/ckeditor5-admonition/src/blockquoteediting.ts +++ b/packages/ckeditor5-admonition/src/blockquoteediting.ts @@ -11,7 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import BlockQuoteCommand from './blockquotecommand.js'; +import AdmonitionCommand from './blockquotecommand.js'; /** * The block quote editing. @@ -20,7 +20,7 @@ import BlockQuoteCommand from './blockquotecommand.js'; * * @extends module:core/plugin~Plugin */ -export default class BlockQuoteEditing extends Plugin { +export default class AdmonitionEditing extends Plugin { /** * @inheritDoc */ @@ -42,7 +42,7 @@ export default class BlockQuoteEditing extends Plugin { const editor = this.editor; const schema = editor.model.schema; - editor.commands.add( 'blockQuote', new BlockQuoteCommand( editor ) ); + editor.commands.add( 'blockQuote', new AdmonitionCommand( editor ) ); schema.register( 'blockQuote', { inheritAllFrom: '$container' @@ -105,7 +105,7 @@ export default class BlockQuoteEditing extends Plugin { const viewDocument = this.editor.editing.view.document; const selection = editor.model.document.selection; - const blockQuoteCommand: BlockQuoteCommand = editor.commands.get( 'blockQuote' )!; + const blockQuoteCommand: AdmonitionCommand = editor.commands.get( 'blockQuote' )!; // Overwrite default Enter key behavior. // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote. diff --git a/packages/ckeditor5-admonition/src/blockquoteui.ts b/packages/ckeditor5-admonition/src/blockquoteui.ts index be75840c2..7f9b9448a 100644 --- a/packages/ckeditor5-admonition/src/blockquoteui.ts +++ b/packages/ckeditor5-admonition/src/blockquoteui.ts @@ -19,7 +19,7 @@ import '../theme/blockquote.css'; * * @extends module:core/plugin~Plugin */ -export default class BlockQuoteUI extends Plugin { +export default class AdmonitionUI extends Plugin { /** * @inheritDoc */ From eaa52b4527aa9243805459576271ff94af666745 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:35:10 +0200 Subject: [PATCH 03/25] refactor(admonition): rename files --- .../src/{blockquote.ts => admonition.ts} | 4 ++-- .../src/{blockquotecommand.ts => admonitioncommand.ts} | 0 .../src/{blockquoteediting.ts => admonitionediting.ts} | 2 +- .../src/{blockquoteui.ts => admonitionui.ts} | 0 packages/ckeditor5-admonition/src/index.ts | 8 ++++---- 5 files changed, 7 insertions(+), 7 deletions(-) rename packages/ckeditor5-admonition/src/{blockquote.ts => admonition.ts} (90%) rename packages/ckeditor5-admonition/src/{blockquotecommand.ts => admonitioncommand.ts} (100%) rename packages/ckeditor5-admonition/src/{blockquoteediting.ts => admonitionediting.ts} (98%) rename packages/ckeditor5-admonition/src/{blockquoteui.ts => admonitionui.ts} (100%) diff --git a/packages/ckeditor5-admonition/src/blockquote.ts b/packages/ckeditor5-admonition/src/admonition.ts similarity index 90% rename from packages/ckeditor5-admonition/src/blockquote.ts rename to packages/ckeditor5-admonition/src/admonition.ts index 1557fd43e..f78fe0a8d 100644 --- a/packages/ckeditor5-admonition/src/blockquote.ts +++ b/packages/ckeditor5-admonition/src/admonition.ts @@ -9,8 +9,8 @@ import { Plugin } from 'ckeditor5/src/core.js'; -import AdmonitionEditing from './blockquoteediting.js'; -import AdmonitionUI from './blockquoteui.js'; +import AdmonitionEditing from './admonitionediting.js'; +import AdmonitionUI from './admonitionui.js'; /** * The block quote plugin. diff --git a/packages/ckeditor5-admonition/src/blockquotecommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts similarity index 100% rename from packages/ckeditor5-admonition/src/blockquotecommand.ts rename to packages/ckeditor5-admonition/src/admonitioncommand.ts diff --git a/packages/ckeditor5-admonition/src/blockquoteediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts similarity index 98% rename from packages/ckeditor5-admonition/src/blockquoteediting.ts rename to packages/ckeditor5-admonition/src/admonitionediting.ts index 1756ae2fe..23d57f5ff 100644 --- a/packages/ckeditor5-admonition/src/blockquoteediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -11,7 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import AdmonitionCommand from './blockquotecommand.js'; +import AdmonitionCommand from './admonitioncommand.js'; /** * The block quote editing. diff --git a/packages/ckeditor5-admonition/src/blockquoteui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts similarity index 100% rename from packages/ckeditor5-admonition/src/blockquoteui.ts rename to packages/ckeditor5-admonition/src/admonitionui.ts diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts index 21e08e52d..7cfc5677c 100644 --- a/packages/ckeditor5-admonition/src/index.ts +++ b/packages/ckeditor5-admonition/src/index.ts @@ -7,9 +7,9 @@ * @module block-quote */ -export { default as BlockQuote } from './blockquote.js'; -export { default as BlockQuoteEditing } from './blockquoteediting.js'; -export { default as BlockQuoteUI } from './blockquoteui.js'; -export type { default as BlockQuoteCommand } from './blockquotecommand.js'; +export { default as BlockQuote } from './admonition.js'; +export { default as BlockQuoteEditing } from './admonitionediting.js'; +export { default as BlockQuoteUI } from './admonitionui.js'; +export type { default as BlockQuoteCommand } from './admonitioncommand.js'; import './augmentation.js'; From a0b60eed8f9001c1b009aa0f4460816c68f1a31a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:36:36 +0200 Subject: [PATCH 04/25] refactor(admonitions): rename exports --- .../ckeditor5-admonition/src/augmentation.ts | 16 ++++++++-------- packages/ckeditor5-admonition/src/index.ts | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/ckeditor5-admonition/src/augmentation.ts b/packages/ckeditor5-admonition/src/augmentation.ts index 733bc2b28..4a094038c 100644 --- a/packages/ckeditor5-admonition/src/augmentation.ts +++ b/packages/ckeditor5-admonition/src/augmentation.ts @@ -4,20 +4,20 @@ */ import type { - BlockQuote, - BlockQuoteCommand, - BlockQuoteEditing, - BlockQuoteUI + Admonition, + AdmonitionCommand, + AdmonitionEditing, + AdmonitionUI } from './index.js'; declare module '@ckeditor/ckeditor5-core' { interface PluginsMap { - [ BlockQuote.pluginName ]: BlockQuote; - [ BlockQuoteEditing.pluginName ]: BlockQuoteEditing; - [ BlockQuoteUI.pluginName ]: BlockQuoteUI; + [ Admonition.pluginName ]: Admonition; + [ AdmonitionEditing.pluginName ]: AdmonitionEditing; + [ AdmonitionUI.pluginName ]: AdmonitionUI; } interface CommandsMap { - blockQuote: BlockQuoteCommand; + blockQuote: AdmonitionCommand; } } diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts index 7cfc5677c..cb11f5db1 100644 --- a/packages/ckeditor5-admonition/src/index.ts +++ b/packages/ckeditor5-admonition/src/index.ts @@ -7,9 +7,9 @@ * @module block-quote */ -export { default as BlockQuote } from './admonition.js'; -export { default as BlockQuoteEditing } from './admonitionediting.js'; -export { default as BlockQuoteUI } from './admonitionui.js'; -export type { default as BlockQuoteCommand } from './admonitioncommand.js'; +export { default as Admonition } from './admonition.js'; +export { default as AdmonitionEditing } from './admonitionediting.js'; +export { default as AdmonitionUI } from './admonitionui.js'; +export type { default as AdmonitionCommand } from './admonitioncommand.js'; import './augmentation.js'; From 303a943b8137e8c3826eed62014a2f7e0d6f4d7f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:37:19 +0200 Subject: [PATCH 05/25] refactor(admonitions): remove unnecessary tests --- .../ckeditor5-admonition/tests/blockquote.js | 14 - .../tests/blockquotecommand.js | 648 -------------- .../tests/blockquoteediting.js | 196 ----- .../tests/blockquoteui.js | 91 -- .../ckeditor5-admonition/tests/integration.js | 830 ------------------ .../tests/manual/blockquote.html | 25 - .../tests/manual/blockquote.js | 24 - .../tests/manual/blockquote.md | 12 - .../tests/manual/blockquotenonesting.html | 20 - .../tests/manual/blockquotenonesting.js | 36 - .../tests/manual/blockquotenonesting.md | 2 - .../tests/manual/logo.png | Bin 23712 -> 0 bytes 12 files changed, 1898 deletions(-) delete mode 100644 packages/ckeditor5-admonition/tests/blockquote.js delete mode 100644 packages/ckeditor5-admonition/tests/blockquotecommand.js delete mode 100644 packages/ckeditor5-admonition/tests/blockquoteediting.js delete mode 100644 packages/ckeditor5-admonition/tests/blockquoteui.js delete mode 100644 packages/ckeditor5-admonition/tests/integration.js delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.html delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.js delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquote.md delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js delete mode 100644 packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md delete mode 100644 packages/ckeditor5-admonition/tests/manual/logo.png diff --git a/packages/ckeditor5-admonition/tests/blockquote.js b/packages/ckeditor5-admonition/tests/blockquote.js deleted file mode 100644 index 722525bff..000000000 --- a/packages/ckeditor5-admonition/tests/blockquote.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -import BlockQuote from '../src/blockquote.js'; -import BlockQuoteEditing from '../src/blockquoteediting.js'; -import BlockQuoteUI from '../src/blockquoteui.js'; - -describe( 'BlockQuote', () => { - it( 'requires BlockQuoteEditing and BlockQuoteUI', () => { - expect( BlockQuote.requires ).to.deep.equal( [ BlockQuoteEditing, BlockQuoteUI ] ); - } ); -} ); diff --git a/packages/ckeditor5-admonition/tests/blockquotecommand.js b/packages/ckeditor5-admonition/tests/blockquotecommand.js deleted file mode 100644 index 08a8197bc..000000000 --- a/packages/ckeditor5-admonition/tests/blockquotecommand.js +++ /dev/null @@ -1,648 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -import BlockQuoteEditing from '../src/blockquoteediting.js'; -import BlockQuoteCommand from '../src/blockquotecommand.js'; - -import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor.js'; -import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; -import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view.js'; - -import Command from '@ckeditor/ckeditor5-core/src/command.js'; - -describe( 'BlockQuoteCommand', () => { - let editor, model, command; - - beforeEach( () => { - return VirtualTestEditor - .create( { - plugins: [ BlockQuoteEditing ] - } ) - .then( newEditor => { - editor = newEditor; - - model = editor.model; - - model.schema.register( 'paragraph', { inheritAllFrom: '$block' } ); - model.schema.register( 'heading', { inheritAllFrom: '$block' } ); - model.schema.register( 'widget' ); - - model.schema.extend( 'widget', { - allowIn: '$root', - allowChildren: '$text', - isLimit: true, - isObject: true - } ); - - editor.conversion.for( 'downcast' ).elementToElement( { model: 'paragraph', view: 'p' } ); - editor.conversion.for( 'downcast' ).elementToElement( { model: 'heading', view: 'h' } ); - editor.conversion.for( 'downcast' ).elementToElement( { model: 'widget', view: 'widget' } ); - - command = editor.commands.get( 'blockQuote' ); - } ); - } ); - - afterEach( async () => { - await editor.destroy(); - } ); - - it( 'is a command', () => { - expect( BlockQuoteCommand.prototype ).to.be.instanceOf( Command ); - expect( command ).to.be.instanceOf( Command ); - } ); - - describe( 'value', () => { - it( 'is false when selection is not in a block quote', () => { - setModelData( model, 'x[]x' ); - - expect( command ).to.have.property( 'value', false ); - } ); - - it( 'is false when start of the selection is not in a block quote', () => { - setModelData( model, 'x[x
y]y
' ); - - expect( command ).to.have.property( 'value', false ); - } ); - - it( 'is false when selection starts in a blockless space', () => { - model.schema.extend( '$text', { allowIn: '$root' } ); - - setModelData( model, 'x[]x' ); - - expect( command ).to.have.property( 'value', false ); - } ); - - it( 'is true when selection is in a block quote', () => { - setModelData( model, '
x[]x
' ); - - expect( command ).to.have.property( 'value', true ); - } ); - - it( 'is true when selection starts in a block quote', () => { - setModelData( model, '
x[x
y]y' ); - - expect( command ).to.have.property( 'value', true ); - } ); - } ); - - describe( 'isEnabled', () => { - it( 'is true when selection is in a block which can be wrapped with blockQuote', () => { - setModelData( model, 'x[]x' ); - - expect( command ).to.have.property( 'isEnabled', true ); - } ); - - it( 'is true when selection is in a block which is already in blockQuote', () => { - setModelData( model, '
x[]x
' ); - - expect( command ).to.have.property( 'isEnabled', true ); - } ); - - it( 'is true when selection starts in a block which can be wrapped with blockQuote', () => { - setModelData( model, 'x[xy]y' ); - - expect( command ).to.have.property( 'isEnabled', true ); - } ); - - it( 'is false when selection is in an element which cannot be wrapped with blockQuote (because it cannot be its child)', () => { - setModelData( model, 'x[]x' ); - - expect( command ).to.have.property( 'isEnabled', false ); - } ); - - it( - 'is false when selection is in an element which cannot be wrapped with blockQuote' + - '(because mQ is not allowed in its parent)', - () => { - model.schema.addChildCheck( ( ctx, childDef ) => { - if ( childDef.name == 'blockQuote' ) { - return false; - } - } ); - - setModelData( model, 'x[]x' ); - - expect( command ).to.have.property( 'isEnabled', false ); - } - ); - - // https://github.com/ckeditor/ckeditor5-engine/issues/826 - // it( 'is false when selection starts in an element which cannot be wrapped with blockQuote', () => { - // setModelData( model, 'x[xy]y' ); - - // expect( command ).to.have.property( 'isEnabled', false ); - // } ); - } ); - - describe( 'execute()', () => { - describe( 'applying quote', () => { - it( 'should wrap a single block', () => { - setModelData( - model, - 'abc' + - 'x[]x' + - 'def' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'abc' + - '
x[]x
' + - 'def' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

x{}x

def

' - ); - } ); - - it( 'should wrap multiple blocks', () => { - setModelData( - model, - 'a[bc' + - 'xx' + - 'de]f' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
' + - 'a[bc' + - 'xx' + - 'de]f' + - '
' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '
a{bc

xx

de}f

' - ); - } ); - - it( 'should merge with an existing quote', () => { - setModelData( - model, - 'a[bc' + - '
x]xyy
' + - 'def' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - '[x]x' + - 'yy' + - '
' + - 'def' - ); - - // Selection incorrectly trimmed. - expect( getViewData( editor.editing.view ) ).to.equal( - '
abc

{x}x

yy

def

' - ); - } ); - - it( 'should not merge with a quote preceding the current block', () => { - setModelData( - model, - '
abc
' + - 'x[]x' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
abc
' + - '
x[]x
' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

' + - '

x{}x

' - ); - } ); - - it( 'should not merge with a quote following the current block', () => { - setModelData( - model, - 'x[]x' + - '
abc
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
x[]x
' + - '
abc
' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

x{}x

' + - '

abc

' - ); - } ); - - it( 'should merge with an existing quote (more blocks)', () => { - setModelData( - model, - 'a[bc' + - 'def' + - '
x]x
' + - 'ghi' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - 'def' + - '[x]x' + - '
' + - 'ghi' - ); - - // Selection incorrectly trimmed. - expect( getViewData( editor.editing.view ) ).to.equal( - '
abc

def

{x}x

ghi

' - ); - } ); - - it( 'should not wrap non-block content', () => { - setModelData( - model, - 'a[bc' + - 'xx' + - 'de]f' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - '
' + - '[xx' + - '
' + - 'de]f' + - '
' - ); - - // Selection incorrectly trimmed. - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

[xx

de}f

' - ); - } ); - - it( 'should correctly wrap and merge groups of blocks', () => { - setModelData( - model, - 'a[bc' + - 'xx' + - 'def' + - '
ghi
' + - 'yy' + - 'jk]l' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
abc
' + - '[xx' + - '
defghi
' + - 'yy' + - '
jk]l
' - ); - - // Selection incorrectly trimmed. - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

' + - '[xx' + - '

def

ghi

' + - 'yy' + - '

jk}l

' - ); - } ); - - it( 'should correctly merge a couple of subsequent quotes', () => { - setModelData( - model, - 'x' + - 'a[bc' + - '
def
' + - 'ghi' + - '
jkl
' + - 'mn]o' + - 'y' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - 'x' + - '
' + - 'abc' + - 'def' + - 'ghi' + - 'jkl' + - '[mn]o' + - '
' + - 'y' - ); - - // Selection incorrectly trimmed. - expect( getViewData( editor.editing.view ) ).to.equal( - '

x

' + - '
' + - '

abc

' + - '

def

' + - '

ghi

' + - '

jkl

' + - '

{mn}o

' + - '
' + - '

y

' - ); - } ); - - it( 'should not wrap a block which can not be in a quote', () => { - // blockQuote is allowed in root, but fooBlock can not be inside blockQuote. - model.schema.register( 'fooBlock', { inheritAllFrom: '$block' } ); - model.schema.addChildCheck( ( ctx, childDef ) => { - if ( ctx.endsWith( 'blockQuote' ) && childDef.name == 'fooBlock' ) { - return false; - } - } ); - - editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooBlock', view: 'fooblock' } ); - - setModelData( - model, - 'a[bc' + - 'xx' + - 'de]f' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - '
' + - '[xx' + - '
' + - 'de]f' + - '
' - ); - } ); - - it( 'should not wrap a block which parent does not allow quote inside itself', () => { - // blockQuote is not be allowed in fooWrapper, but fooBlock can be inside blockQuote. - model.schema.register( 'fooWrapper' ); - model.schema.register( 'fooBlock', { inheritAllFrom: '$block' } ); - - model.schema.extend( 'fooWrapper', { allowIn: '$root' } ); - model.schema.extend( 'fooBlock', { allowIn: 'fooWrapper' } ); - - editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooWrapper', view: 'foowrapper' } ); - editor.conversion.for( 'downcast' ).elementToElement( { model: 'fooBlock', view: 'fooblock' } ); - - setModelData( - model, - 'a[bc' + - 'xx' + - 'de]f' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - '
' + - '[xx' + - '
' + - 'de]f' + - '
' - ); - } ); - - it( 'should handle forceValue = true param', () => { - setModelData( - model, - '
' + - 'x[x' + - '
' + - 'd]ef' - ); - - editor.execute( 'blockQuote', { forceValue: true } ); - - expect( getModelData( model ) ).to.equal( - '
' + - 'x[x' + - 'd]ef' + - '
' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

x{x

d}ef

' - ); - } ); - } ); - - describe( 'removing quote', () => { - it( 'should unwrap a single block', () => { - setModelData( - model, - 'abc' + - '
x[]x
' + - 'def' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'abc' + - 'x[]x' + - 'def' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

x{}x

def

' - ); - } ); - - it( 'should unwrap multiple blocks', () => { - setModelData( - model, - '
' + - 'a[bc' + - 'xx' + - 'de]f' + - '
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'a[bc' + - 'xx' + - 'de]f' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

a{bc

xx

de}f

' - ); - } ); - - it( 'should unwrap only the selected blocks - at the beginning', () => { - setModelData( - model, - 'xx' + - '
' + - 'a[b]c' + - 'xx' + - '
' + - 'yy' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'xx' + - 'a[b]c' + - '
' + - 'xx' + - '
' + - 'yy' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

xx

a{b}c

xx

yy

' - ); - } ); - - it( 'should unwrap only the selected blocks - at the end', () => { - setModelData( - model, - '
' + - 'abc' + - 'x[x' + - '
' + - 'de]f' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
' + - 'abc' + - '
' + - 'x[x' + - 'de]f' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

abc

x{x

de}f

' - ); - } ); - - it( 'should unwrap only the selected blocks - in the middle', () => { - setModelData( - model, - 'xx' + - '
' + - 'abc' + - 'c[]de' + - 'fgh' + - '
' + - 'xx' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'xx' + - '
abc
' + - 'c[]de' + - '
fgh
' + - 'xx' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

xx

' + - '

abc

' + - '

c{}de

' + - '

fgh

' + - '

xx

' - ); - } ); - - it( 'should remove multiple quotes', () => { - setModelData( - model, - '
a[bc
' + - 'xx' + - '
defghi
' + - 'yy' + - '
de]fghi
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'a[bc' + - 'xx' + - 'defghi' + - 'yy' + - 'de]f' + - '
ghi
' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

a{bc

' + - '

xx

' + - '

def

ghi

' + - '

yy

' + - '

de}f

' + - '

ghi

' - ); - } ); - - it( 'should handle forceValue = false param', () => { - setModelData( - model, - 'a[bc' + - '
' + - 'x]x' + - '
' - ); - - editor.execute( 'blockQuote', { forceValue: false } ); - - // Incorrect selection. - expect( getModelData( model ) ).to.equal( - 'a[bc]' + - 'xx' - ); - - expect( getViewData( editor.editing.view ) ).to.equal( - '

a{bc}

xx

' - ); - } ); - } ); - } ); -} ); diff --git a/packages/ckeditor5-admonition/tests/blockquoteediting.js b/packages/ckeditor5-admonition/tests/blockquoteediting.js deleted file mode 100644 index 54a0ea821..000000000 --- a/packages/ckeditor5-admonition/tests/blockquoteediting.js +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -import BlockQuoteEditing from '../src/blockquoteediting.js'; -import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; -import ListEditing from '@ckeditor/ckeditor5-list/src/list/listediting.js'; -import BoldEditing from '@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js'; - -import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor.js'; -import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; - -import BlockQuoteCommand from '../src/blockquotecommand.js'; - -describe( 'BlockQuoteEditing', () => { - let editor, model; - - beforeEach( () => { - return VirtualTestEditor - .create( { - plugins: [ BlockQuoteEditing, Paragraph, BoldEditing ] - } ) - .then( newEditor => { - editor = newEditor; - model = editor.model; - } ); - } ); - - afterEach( () => { - return editor.destroy(); - } ); - - it( 'should have pluginName', () => { - expect( BlockQuoteEditing.pluginName ).to.equal( 'BlockQuoteEditing' ); - } ); - - it( 'adds a blockQuote command', () => { - expect( editor.commands.get( 'blockQuote' ) ).to.be.instanceOf( BlockQuoteCommand ); - } ); - - it( 'allows for blockQuote in the $root', () => { - expect( model.schema.checkChild( [ '$root' ], 'blockQuote' ) ).to.be.true; - } ); - - it( 'allows for $block in blockQuote', () => { - expect( model.schema.checkChild( [ '$root', 'blockQuote' ], '$block' ) ).to.be.true; - expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'paragraph' ) ).to.be.true; - } ); - - it( 'allows for blockQuote in blockQuote', () => { - expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'blockQuote' ) ).to.be.true; - } ); - - it( 'does not break when checking an unregisterd item', () => { - expect( model.schema.checkChild( [ '$root', 'blockQuote' ], 'foo' ) ).to.be.false; - } ); - - it( 'inherits attributes from $container', () => { - model.schema.extend( '$container', { - allowAttributes: 'foo' - } ); - - expect( model.schema.checkAttribute( 'blockQuote', 'foo' ) ).to.be.true; - } ); - - it( 'adds converters to the data pipeline', () => { - const data = '

x

'; - - editor.setData( data ); - - expect( getModelData( model ) ).to.equal( '
[]x
' ); - expect( editor.getData() ).to.equal( data ); - } ); - - it( 'adds a converter to the view pipeline', () => { - setModelData( model, '
x
' ); - - expect( editor.getData() ).to.equal( '

x

' ); - } ); - - it( 'allows list items inside blockQuote', () => { - return VirtualTestEditor - .create( { - plugins: [ BlockQuoteEditing, Paragraph, ListEditing ] - } ) - .then( editor => { - editor.setData( '
  • xx
' ); - - expect( editor.getData() ).to.equal( '
  • xx
' ); - - return editor.destroy(); - } ); - } ); - - it( 'should remove empty blockQuote elements', () => { - setModelData( model, '
Foo' ); - - expect( editor.getData() ).to.equal( '

Foo

' ); - } ); - - it( 'should remove blockQuotes which became empty', () => { - setModelData( model, '
Foo
' ); - - model.change( writer => { - const root = model.document.getRoot(); - const bq = root.getChild( 0 ); - - writer.remove( writer.createRangeIn( bq ) ); - } ); - - expect( editor.getData( { trim: 'none' } ) ).to.equal( '

 

' ); // Autoparagraphed. - } ); - - it( 'should not unwrap a blockQuote if it was inserted into another blockQuote', () => { - setModelData( model, '
Foo
' ); - - model.change( writer => { - const root = model.document.getRoot(); - const bq = writer.createElement( 'blockQuote' ); - const p = writer.createElement( 'paragraph' ); - - writer.insertText( 'Bar', p, 0 ); //

Bar

. - writer.insert( p, bq, 0 ); //

Bar

. - writer.insert( bq, root.getChild( 0 ), 1 ); // Insert after

Foo

. - } ); - - expect( editor.getData() ).to.equal( '

Foo

Bar

' ); - } ); - - it( 'should not unwrap nested blockQuote if it was wrapped into another blockQuote', () => { - setModelData( model, '
Foo
Bar' ); - - model.change( writer => { - const root = model.document.getRoot(); - - writer.wrap( writer.createRangeIn( root ), 'blockQuote' ); - } ); - - expect( editor.getData() ).to.equal( '

Foo

Bar

' ); - } ); - - it( 'postfixer should do nothing on attribute change', () => { - // This is strictly a 100% CC test. - setModelData( model, '
Foo
' ); - - model.change( writer => { - const root = model.document.getRoot(); - const p = root.getChild( 0 ).getChild( 0 ); - - writer.setAttribute( 'bold', true, writer.createRangeIn( p ) ); - } ); - - expect( editor.getData() ).to.equal( '

Foo

' ); - } ); - - describe( 'nested blockQuote forbidden by custom rule', () => { - // Nested block quotes are supported since https://github.com/ckeditor/ckeditor5/issues/9210, so let's check - // if the editor will not blow up in case nested block quotes are forbidden by custom scheme rule. - beforeEach( () => { - model.schema.addChildCheck( ( ctx, childDef ) => { - if ( ctx.endsWith( 'blockQuote' ) && childDef.name == 'blockQuote' ) { - return false; - } - } ); - } ); - - it( 'should unwrap a blockQuote if it was inserted into another blockQuote', () => { - setModelData( model, '
Foo
' ); - - model.change( writer => { - const root = model.document.getRoot(); - const bq = writer.createElement( 'blockQuote' ); - const p = writer.createElement( 'paragraph' ); - - writer.insertText( 'Bar', p, 0 ); //

Bar

. - writer.insert( p, bq, 0 ); //

Bar

. - writer.insert( bq, root.getChild( 0 ), 1 ); // Insert after

Foo

. - } ); - - expect( editor.getData() ).to.equal( '

Foo

Bar

' ); - } ); - - it( 'should unwrap nested blockQuote if it was wrapped into another blockQuote', () => { - setModelData( model, '
Foo
Bar' ); - - model.change( writer => { - const root = model.document.getRoot(); - - writer.wrap( writer.createRangeIn( root ), 'blockQuote' ); - } ); - - expect( editor.getData() ).to.equal( '

Foo

Bar

' ); - } ); - } ); -} ); diff --git a/packages/ckeditor5-admonition/tests/blockquoteui.js b/packages/ckeditor5-admonition/tests/blockquoteui.js deleted file mode 100644 index e7fe92bb1..000000000 --- a/packages/ckeditor5-admonition/tests/blockquoteui.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* global document */ - -import BlockQuoteEditing from '../src/blockquoteediting.js'; -import BlockQuoteUI from '../src/blockquoteui.js'; - -import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor.js'; - -describe( 'BlockQuoteUI', () => { - let editor, command, element, button; - - beforeEach( () => { - element = document.createElement( 'div' ); - document.body.appendChild( element ); - - return ClassicTestEditor - .create( element, { - plugins: [ BlockQuoteEditing, BlockQuoteUI ] - } ) - .then( newEditor => { - editor = newEditor; - command = editor.commands.get( 'blockQuote' ); - } ); - } ); - - afterEach( () => { - element.remove(); - - return editor.destroy(); - } ); - - describe( 'toolbar block quote button', () => { - beforeEach( () => { - button = editor.ui.componentFactory.create( 'blockQuote' ); - } ); - - it( 'has the base properties', () => { - expect( button ).to.have.property( 'label', 'Block quote' ); - expect( button ).to.have.property( 'icon' ); - expect( button ).to.have.property( 'tooltip', true ); - expect( button ).to.have.property( 'isToggleable', true ); - } ); - - it( 'has isOn bound to command\'s value', () => { - command.value = false; - expect( button ).to.have.property( 'isOn', false ); - - command.value = true; - expect( button ).to.have.property( 'isOn', true ); - } ); - - testButton(); - } ); - - describe( 'menu bar block quote button', () => { - beforeEach( () => { - button = editor.ui.componentFactory.create( 'menuBar:blockQuote' ); - } ); - - it( 'has the base properties', () => { - expect( button ).to.have.property( 'label', 'Block quote' ); - expect( button ).to.have.property( 'icon' ); - expect( button ).to.have.property( 'isToggleable', true ); - } ); - - testButton(); - } ); - - function testButton() { - it( 'has isEnabled bound to command\'s isEnabled', () => { - command.isEnabled = true; - expect( button ).to.have.property( 'isEnabled', true ); - - command.isEnabled = false; - expect( button ).to.have.property( 'isEnabled', false ); - } ); - - it( 'executes command when it\'s executed', () => { - const spy = sinon.stub( editor, 'execute' ); - - button.fire( 'execute' ); - - expect( spy.calledOnce ).to.be.true; - expect( spy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); - } ); - } -} ); diff --git a/packages/ckeditor5-admonition/tests/integration.js b/packages/ckeditor5-admonition/tests/integration.js deleted file mode 100644 index 1146dedc3..000000000 --- a/packages/ckeditor5-admonition/tests/integration.js +++ /dev/null @@ -1,830 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* global document */ - -import BlockQuote from '../src/blockquote.js'; -import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; -import Image from '@ckeditor/ckeditor5-image/src/image.js'; -import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js'; -import LegacyList from '@ckeditor/ckeditor5-list/src/legacylist.js'; -import Enter from '@ckeditor/ckeditor5-enter/src/enter.js'; -import Delete from '@ckeditor/ckeditor5-typing/src/delete.js'; -import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; -import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; -import Table from '@ckeditor/ckeditor5-table/src/table.js'; - -import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor.js'; -import { - parse as parseModel, - getData as getModelData, - setData as setModelData -} from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; - -describe( 'BlockQuote integration', () => { - let editor, model, element, viewDocument; - - beforeEach( () => { - element = document.createElement( 'div' ); - document.body.appendChild( element ); - - return ClassicTestEditor - .create( element, { - plugins: [ BlockQuote, Paragraph, Bold, Image, ImageCaption, LegacyList, Enter, Delete, Heading, Table ] - } ) - .then( newEditor => { - editor = newEditor; - model = editor.model; - viewDocument = editor.editing.view.document; - } ); - } ); - - afterEach( () => { - element.remove(); - - return editor.destroy(); - } ); - - describe( 'enter key support', () => { - function fakeEventData() { - return { - preventDefault: sinon.spy() - }; - } - - it( 'does nothing if selection is in an empty block but not in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, 'x[]x' ); - - viewDocument.fire( 'enter', data ); - - // Only enter command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); - } ); - - it( 'does nothing if selection is in a non-empty block (at the end) in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
xx[]
' ); - - viewDocument.fire( 'enter', data ); - - // Only enter command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); - } ); - - it( 'does nothing if selection is in a non-empty block (at the beginning) in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
[]xx
' ); - - viewDocument.fire( 'enter', data ); - - // Only enter command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); - } ); - - it( 'does nothing if selection is not collapsed', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
[]
' ); - - viewDocument.fire( 'enter', data ); - - // Only enter command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'enter' ); - } ); - - it( 'does not interfere with a similar handler in the list feature', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
' + - 'a' + - '[]' + - '
' + - 'x' - ); - - viewDocument.fire( 'enter', data ); - - expect( data.preventDefault.called ).to.be.true; - - expect( getModelData( model ) ).to.equal( - 'x' + - '
' + - 'a' + - '[]' + - '
' + - 'x' - ); - } ); - - it( 'escapes block quote if selection is in an empty block in an empty block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, 'x
[]
x' ); - - viewDocument.fire( 'enter', data ); - - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( 'x[]x' ); - } ); - - it( 'escapes block quote if selection is in an empty block in the middle of a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, - 'x' + - '
a[]b
' + - 'x' - ); - - viewDocument.fire( 'enter', data ); - - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '
a
' + - '[]' + - '
b
' + - 'x' - ); - } ); - - it( 'escapes block quote if selection is in an empty block at the end of a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, - 'x' + - '
a[]
' + - 'x' - ); - - viewDocument.fire( 'enter', data ); - - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '
a
' + - '[]' + - 'x' - ); - } ); - - it( 'scrolls the view document to the selection after the command is executed', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - const scrollSpy = sinon.stub( editor.editing.view, 'scrollToTheSelection' ); - - setModelData( model, - 'x' + - '
a[]
' + - 'x' - ); - - viewDocument.fire( 'enter', data ); - - sinon.assert.calledOnce( scrollSpy ); - sinon.assert.callOrder( execSpy, scrollSpy ); - } ); - } ); - - describe( 'backspace key support', () => { - function fakeEventData() { - return { - preventDefault: sinon.spy(), - direction: 'backward', - inputType: 'deleteContentBackward', - unit: 'character' - }; - } - - it( 'merges paragraph into paragraph in the quote', () => { - const data = fakeEventData(); - - setModelData( model, - '
ab
' + - '[]c' + - 'd' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - '
ab[]c
' + - 'd' - ); - } ); - - it( 'merges paragraph from a quote into a paragraph before quote', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
[]ab
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x[]a' + - '
b
' + - 'y' - ); - } ); - - it( 'merges two quotes', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
ab
' + - '
[]cd
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '
ab[]cd
' + - 'y' - ); - } ); - - it( 'unwraps empty quote when the backspace key pressed in the first empty paragraph in a quote', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
a
' + - '
[]
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '
a
' + - '[]' + - 'y' - ); - } ); - - it( 'unwraps empty quote when the backspace key pressed in the empty paragraph that is the only content of quote', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
[]
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '[]' + - 'y' - ); - } ); - - it( 'unwraps quote from the first paragraph when the backspace key pressed', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
[]foo
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '[]' + - '
foo
' + - 'y' - ); - } ); - - it( 'merges paragraphs in a quote when the backspace key pressed not in the first paragraph', () => { - const data = fakeEventData(); - - setModelData( model, - 'x' + - '
[]
' + - 'y' - ); - - viewDocument.fire( 'delete', data ); - - expect( getModelData( model ) ).to.equal( - 'x' + - '
[]
' + - 'y' - ); - } ); - - it( 'does nothing if selection is in an empty block but not in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, 'x[]x' ); - - viewDocument.fire( 'delete', data ); - - // Only delete command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); - } ); - - it( 'does nothing if selection is in a non-empty block (at the end) in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
xx[]
' ); - - viewDocument.fire( 'delete', data ); - - // Only delete command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); - } ); - - it( 'does nothing if selection is in a non-empty block (at the beginning) in a block quote', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
[]xx
' ); - - viewDocument.fire( 'delete', data ); - - // Only delete command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); - } ); - - it( 'does nothing if selection is not collapsed', () => { - const data = fakeEventData(); - const execSpy = sinon.spy( editor, 'execute' ); - - setModelData( model, '
[]
' ); - - viewDocument.fire( 'delete', data ); - - // Only delete command should be executed. - expect( data.preventDefault.called ).to.be.true; - expect( execSpy.calledOnce ).to.be.true; - expect( execSpy.args[ 0 ][ 0 ] ).to.equal( 'delete' ); - } ); - } ); - - // Historically, due to problems with schema, images were not quotable. - // These tests were left here to confirm that after schema was fixed, images are properly quotable. - describe( 'compatibility with images', () => { - it( 'quotes a simple image', () => { - const element = document.createElement( 'div' ); - document.body.appendChild( element ); - - // We can't load ImageCaption in this test because it adds to all images automatically. - return ClassicTestEditor - .create( element, { - plugins: [ BlockQuote, Paragraph, Image ] - } ) - .then( editor => { - setModelData( editor.model, - 'fo[o' + - '' + - 'b]ar' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( editor.model ) ).to.equal( - '
' + - 'fo[o' + - '' + - 'b]ar' + - '
' - ); - - element.remove(); - return editor.destroy(); - } ); - } ); - - it( 'quotes an image with caption', () => { - setModelData( model, - 'fo[o' + - '' + - 'xxx' + - '' + - 'b]ar' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
' + - 'fo[o' + - '' + - 'xxx' + - '' + - 'b]ar' + - '
' - ); - } ); - - it( 'adds an image to an existing quote', () => { - setModelData( model, - 'fo[o' + - '' + - 'xxx' + - '' + - '
b]ar
' - ); - - editor.execute( 'blockQuote' ); - - // Selection incorrectly trimmed. - expect( getModelData( model ) ).to.equal( - '
' + - 'foo' + - '' + - 'xxx' + - '' + - '[b]ar' + - '
' - ); - } ); - - it( 'wraps paragraph+image', () => { - setModelData( model, - '[foofoo]' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
[foofoo]
' - ); - } ); - - it( 'unwraps paragraph+image', () => { - setModelData( model, - '
[foofoo]
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '[foofoo]' - ); - } ); - - it( 'wraps image+paragraph', () => { - setModelData( model, - '[foofoo]' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
[foofoo]
' - ); - } ); - - it( 'unwraps image+paragraph', () => { - setModelData( model, - '[foofoo]' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
[foofoo]
' - ); - } ); - } ); - - // When blockQuote with a paragraph was pasted into a list item, the item contained the paragraph. It was invalid. - // There is a test which checks whether blockQuote will split the list items instead of merging with. - describe( 'compatibility with lists', () => { - it( 'does not merge the paragraph with list item', () => { - setModelData( model, 'fo[]o' ); - - const df = parseModel( - '
xxx
yyy', - model.schema - ); - - model.insertContent( df, model.document.selection ); - - expect( getModelData( model ) ).to.equal( - 'fo' + - '
' + - 'xxx' + - '
' + - 'yyy[]o' - ); - } ); - } ); - - describe( 'compatibility with tables', () => { - it( 'wraps whole table', () => { - setModelData( model, '[foo
]' ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
[foo
]
' - ); - } ); - - it( 'unwraps whole table', () => { - setModelData( - model, - '
[foo
]
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '[foo
]' - ); - } ); - - it( 'wraps paragraph in table cell', () => { - setModelData( model, '[]foo
' ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '
[]foo
' - ); - } ); - - it( 'unwraps paragraph in table cell', () => { - setModelData( - model, - '
[]foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '[]foo
' - ); - } ); - - it( 'wraps image in table cell', () => { - setModelData( model, - '' + - '' + - '[]' + - ' ' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '
[
]' + - '' + - '
foo
' - ); - } ); - - it( 'unwraps image in table cell', () => { - setModelData( model, - '' + - '' + - '
[
]' + - '' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '[]' + - '' + - '
foo
' - ); - } ); - - it( 'wraps paragraph+image in table cell', () => { - setModelData( model, - '' + - '' + - '[foo]' + - '' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '' + - '
[foo
]' + - '' + - '' + - '
foo
' - ); - } ); - - it( 'unwraps paragraph+image in table cell', () => { - setModelData( model, - '' + - '' + - '' + - '
[foo
]' + - '' + - '' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '[foo]' + - '' + - '
foo
' - ); - } ); - - it( 'wraps image+paragraph in table cell', () => { - setModelData( model, - '' + - '' + - '[foo]' + - '' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '' + - '
[
foo]' + - '' + - '' + - '
foo
' - ); - } ); - - it( 'unwraps image+paragraph in table cell', () => { - setModelData( model, - '' + - '' + - '[foo]' + - '' + - '
foo
' - ); - - editor.execute( 'blockQuote' ); - - expect( getModelData( model ) ).to.equal( - '' + - '' + - '' + - '
[
foo]' + - '' + - '' + - '
foo
' - ); - } ); - } ); - - describe( 'autoparagraphing', () => { - it( 'text in block quote in div', () => { - const data = - '
' + - '
foobar
' + - '
' + - 'xyz'; - - editor.setData( data ); - - expect( editor.getData() ).to.equal( - '
' + - '

foobar

' + - '
' + - '

xyz

' - ); - } ); - - it( 'text directly in block quote', () => { - const data = - '
' + - 'foobar' + - '
' + - 'xyz'; - - editor.setData( data ); - - expect( editor.getData() ).to.equal( - '
' + - '

foobar

' + - '
' + - '

xyz

' - ); - } ); - - it( 'text after block quote in div', () => { - const data = - '
' + - 'foobar' + - '
' + - '
xyz
'; - - editor.setData( data ); - - expect( editor.getData() ).to.equal( - '
' + - '

foobar

' + - '
' + - '

xyz

' - ); - } ); - - it( 'text inside block quote in and after div', () => { - const data = - '
' + - '
foo
bar' + - '
' + - 'xyz'; - - editor.setData( data ); - - expect( editor.getData() ).to.equal( - '
' + - '

foo

bar

' + - '
' + - '

xyz

' - ); - } ); - - it( 'text inside block quote in div split by heading', () => { - const data = - '
' + - '
foo

bar

baz
' + - '
' + - 'xyz'; - - editor.setData( data ); - - expect( editor.getData() ).to.equal( - '
' + - '

foo

bar

baz

' + - '
' + - '

xyz

' - ); - } ); - } ); -} ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.html b/packages/ckeditor5-admonition/tests/manual/blockquote.html deleted file mode 100644 index b8ea9f6b2..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquote.html +++ /dev/null @@ -1,25 +0,0 @@ -
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat.

-
- CKEditor logo -
-

Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

-
    -
  • Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.
  • -
-
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

-
-

Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.js b/packages/ckeditor5-admonition/tests/manual/blockquote.js deleted file mode 100644 index f993ca729..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquote.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* global document, console, window */ - -import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; -import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset.js'; - -ClassicEditor - .create( document.querySelector( '#editor' ), { - image: { toolbar: [ 'toggleImageCaption', 'imageTextAlternative' ] }, - plugins: [ - ArticlePluginSet - ], - toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ] - } ) - .then( editor => { - window.editor = editor; - } ) - .catch( err => { - console.error( err.stack ); - } ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquote.md b/packages/ckeditor5-admonition/tests/manual/blockquote.md deleted file mode 100644 index 13392bf0a..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquote.md +++ /dev/null @@ -1,12 +0,0 @@ -## Block quote feature - -Check block quote related behaviors: - -* applying quotes to multiple blocks, -* removing quotes, -* Enter (should leave quote when pressed in an empty block), -* Backspace, -* undo/redo, -* applying headings and lists, -* stability when used with nested lists, -* stability when used with nested block quotes. diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html deleted file mode 100644 index 573ba51c4..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.html +++ /dev/null @@ -1,20 +0,0 @@ - - -
-

Nested block quotes (in the data):

- -
-

Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris.

-
-

Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-

Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.

-
-
-
-
diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js deleted file mode 100644 index 7b819167b..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* globals console, window, document */ - -import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; -import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset.js'; - -function DisallowNestingBlockQuotes( editor ) { - editor.model.schema.addChildCheck( ( context, childDefinition ) => { - if ( context.endsWith( 'blockQuote' ) && childDefinition.name == 'blockQuote' ) { - return false; - } - } ); -} - -ClassicEditor - .create( document.querySelector( '#editor' ), { - image: { toolbar: [ 'toggleImageCaption', 'imageTextAlternative' ] }, - plugins: [ ArticlePluginSet, DisallowNestingBlockQuotes ], - toolbar: [ - 'heading', '|', 'insertTable', '|', 'bold', 'italic', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' - ], - table: { - contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells' ], - tableToolbar: [ 'bold', 'italic' ] - } - } ) - .then( editor => { - window.editor = editor; - } ) - .catch( err => { - console.error( err.stack ); - } ); diff --git a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md b/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md deleted file mode 100644 index f6113c6bb..000000000 --- a/packages/ckeditor5-admonition/tests/manual/blockquotenonesting.md +++ /dev/null @@ -1,2 +0,0 @@ -* The nested block quote present in the data should be "unnested" ("unwrapped") on data load. All block quotes (the top level block quote and all nested ones) should be converted to siblings in editor's root. -* It should not be possible to insert a block quote into another block quote as a direct child in any way (UI, paste, d&d, etc.). It is allowed to have nested block quotes indirectly, i.e. a block quote inside a table, which is inside another block quote. \ No newline at end of file diff --git a/packages/ckeditor5-admonition/tests/manual/logo.png b/packages/ckeditor5-admonition/tests/manual/logo.png deleted file mode 100644 index c9a13d628da130fe4bb24eef85fe39551360625b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23712 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 P00000NkvXXu0mjf%p3nA From 9ef17919c5dc0b53e13acbe28025db90f69fce9a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:37:43 +0200 Subject: [PATCH 06/25] refactor(admonitions): remove unnecessary docs --- .../features/block-quote-source.html | 1 - .../_snippets/features/block-quote-source.js | 51 -------- .../docs/_snippets/features/block-quote.html | 27 ---- .../docs/_snippets/features/block-quote.js | 20 --- .../features/nested-block-quote.html | 26 ---- .../_snippets/features/nested-block-quote.js | 15 --- .../docs/api/block-quote.md | 36 ------ .../docs/features/block-quote.md | 119 ------------------ 8 files changed, 295 deletions(-) delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html delete mode 100644 packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js delete mode 100644 packages/ckeditor5-admonition/docs/api/block-quote.md delete mode 100644 packages/ckeditor5-admonition/docs/features/block-quote.md diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html deleted file mode 100644 index 7c726c059..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js deleted file mode 100644 index eb60d3bbe..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote-source.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* globals window */ - -import { CKBox, CKBoxImageEdit } from '@ckeditor/ckeditor5-ckbox'; -import { PictureEditing, ImageInsert, ImageResize, AutoImage } from '@ckeditor/ckeditor5-image'; -import { LinkImage } from '@ckeditor/ckeditor5-link'; -import { CS_CONFIG } from '@ckeditor/ckeditor5-cloud-services/tests/_utils/cloud-services-config.js'; -import { TOKEN_URL } from '@ckeditor/ckeditor5-ckbox/tests/_utils/ckbox-config.js'; - -// Umberto combines all `packages/*/docs` into the `docs/` directory. The import path must be valid after merging all directories. -import ClassicEditor from '../build-classic.js'; - -ClassicEditor.defaultConfig = { - plugins: ClassicEditor.builtinPlugins.concat( [ - PictureEditing, - ImageResize, - ImageInsert, - AutoImage, - LinkImage, - CKBox, - CKBoxImageEdit - ] ), - cloudServices: CS_CONFIG, - toolbar: { - items: [ - 'undo', 'redo', '|', 'heading', - '|', 'bold', 'italic', - '|', 'link', 'insertImage', 'insertTable', 'blockQuote', 'mediaEmbed', - '|', 'bulletedList', 'numberedList', 'outdent', 'indent' - ] - }, - ui: { - viewportOffset: { - top: window.getViewportTopOffsetConfig() - } - }, - ckbox: { - tokenUrl: TOKEN_URL, - allowExternalImagesEditing: [ /^data:/, 'origin', /ckbox/ ], - forceDemoLabel: true - }, - image: { - toolbar: [ 'toggleImageCaption', 'imageTextAlternative', 'ckboxImageEdit' ] - } -}; - -window.ClassicEditor = ClassicEditor; diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html deleted file mode 100644 index 70663c3e8..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.html +++ /dev/null @@ -1,27 +0,0 @@ -
-

The Famous Einstein Quote that never was

- -

You might have come across the following quote in the past few years:

- -
-

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

- -

Albert Einstein

-
- -

It has been most popular on Facebook and other social networks, where people share it aplenty. No wonder: it is neat, it sounds smart, and, let’s be frank, Albert is one hell of a figure!

- -

The truth is not as neat, though. And mindlessly forwarding the quote isn’t exactly smart. That’s because Einstein never said that. The quote comes from the 2004 book The Rhythm of Life: Living Every Day with Passion and Purpose by Mathew Kelly, published almost 50 years after Albert’s death in 1955.

- -

Kelly was most likely inspired by an essay by Amos E. Dolbear of Tufts titled “An Educational Allegory,” describing animals educated to work on their weakest features instead of their strongest ones. So an eagle was made to run, a penguin was forced to fly, and so on. There is also the 1903 “Jungle School Boards” fable from an Illinois newspaper. It tells a story of a monkey, a kangaroo, and an elephant who cannot agree on the curriculum for their animal school — should all the little animals be taught tree-climbing, jumping, or looking wise? 

- -

In the late 1940s, something that appears to be an amalgam of the two was published and later reprinted with various changes in the 1960s. The idea evolved for decades and got mixed up with a few other quotes about being a genius originating back in the 1970s. Finally, Kelly wrote in his 2004 book:

- -
-

Albert Einstein wrote, “Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.” The question I have for you at this point of our journey together is, “What is your genius?”

-
- -

Why he attributed this to Albert Einstein remains unclear. The fact is, the quote got popular. But, apparently, not everyone is a genius when it comes to fact-checking and sources.

- -
- diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js b/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js deleted file mode 100644 index 2b81ac2da..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/block-quote.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* globals ClassicEditor, window, document, console */ - -ClassicEditor - .create( document.querySelector( '#snippet-block-quote' ) ) - .then( editor => { - window.editor = editor; - window.attachTourBalloon( { - target: window.findToolbarItem( editor.ui.view.toolbar, item => item.label && item.label === 'Block quote' ), - text: 'Click to insert a block quote.', - editor - } ); - } ) - .catch( err => { - console.error( err.stack ); - } ); diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html deleted file mode 100644 index cf0edea58..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.html +++ /dev/null @@ -1,26 +0,0 @@ -
-

Re: Material usage information

- -
-
-

Tom,

- -

This is just a reminder that we need the data for our Friday meeting with the external subcontractors. Can you please let me know if all the reports are ready?

- -

Zoe

-
- -

Hi Zoe,

- -

The reports are coming in, but the Q3 data is still missing. As far as I can tell, Shizuoka is behind the schedule with the final summary, and the Expansion Department has not released its numbers yet. I will reach out to both and will keep you informed on that topic by noon tomorrow.

- -

Tom

-
- -

Please do so, this is getting urgent. Contact Haleema from ED directly. Also, check with Shizuoka. This is very much unlike him to leave such an important matter for the last moment.

- -

Hope to have this ready for review at the 2 p.m. board meeting provided you can manage to prepare a summary and have the full data by Thursday morning at the latest.

- -

Zoe

- -
diff --git a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js b/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js deleted file mode 100644 index 892ff9db5..000000000 --- a/packages/ckeditor5-admonition/docs/_snippets/features/nested-block-quote.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/* globals ClassicEditor, window, document, console */ - -ClassicEditor - .create( document.querySelector( '#snippet-nested-block-quote' ) ) - .then( editor => { - window.editor2 = editor; - } ) - .catch( err => { - console.error( err.stack ); - } ); diff --git a/packages/ckeditor5-admonition/docs/api/block-quote.md b/packages/ckeditor5-admonition/docs/api/block-quote.md deleted file mode 100644 index d60ea8e16..000000000 --- a/packages/ckeditor5-admonition/docs/api/block-quote.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -category: api-reference ---- - -# CKEditor 5 block quote feature - -[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-block-quote.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) - -This package implements block quote support for CKEditor 5. - -## Demo - -Check out the {@link features/block-quote#demo demo in the block quote feature guide}. - -## Documentation - -See the {@link features/block-quote block quote feature guide} and the {@link module:block-quote/blockquote~BlockQuote} plugin documentation. - -## Installation - -This package is part of our open-source aggregate package. - -```bash -npm install ckeditor5 -``` - -## Contribute - -The source code of this package is available on GitHub in [https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote). - -## External links - -* [`@ckeditor/ckeditor5-block-quote` on npm](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) -* [`ckeditor/ckeditor5-block-quote` on GitHub](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote) -* [Issue tracker](https://github.com/ckeditor/ckeditor5/issues) -* [Changelog](https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md) diff --git a/packages/ckeditor5-admonition/docs/features/block-quote.md b/packages/ckeditor5-admonition/docs/features/block-quote.md deleted file mode 100644 index 3af0af0ca..000000000 --- a/packages/ckeditor5-admonition/docs/features/block-quote.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -category: features -menu-title: Block quote -meta-title: Block quote | CKEditor 5 Documentation ---- -{@snippet features/block-quote-source} - -# Block quote - -The block quote feature lets you easily include block quotations or pull quotes in your content. It is also an attractive way to draw the readers' attention to selected parts of the text. - -## Demo - -Use the block quote toolbar button {@icon @ckeditor/ckeditor5-core/theme/icons/quote.svg Insert block quote} in the editor below to see the feature in action. You can also type `>` followed by a space before the quotation to format it on the go thanks to the {@link features/autoformat autoformatting} feature. - -{@snippet features/block-quote} - - - This demo presents a limited set of features. Visit the {@link examples/builds/full-featured-editor feature-rich editor example} to see more in action. - - -## Nested block quotes - -Starting from version 27.1.0, CKEditor 5 will properly display a block quote nested in another block quote. This sort of structure is indispensable in email editors or discussion forums. The ability to cite previous messages and preserve a correct quotation structure is often crucial to maintain the flow of communication. Nested block quotes may also prove useful for scientific or academic papers, but articles citing sources and referring to previous writing would often use it, too. - -Support for nested block quotes is provided as backward compatibility for loading pre-existing content, for example created in CKEditor 4. Additionally, pasting content with nested block quotes is supported. You can also nest a block quote in another block quote using the {@link features/drag-drop drag and drop} mechanism – just select an existing block quote and drag it into another. - -{@snippet features/nested-block-quote} - - - If you would want to block the possibility to nest block quotes in your editor, refer to the {@link features/block-quote#disallow-nesting-block-quotes Disallow nesting block quotes} section to learn how to disable this functionality. - - -## Installation - - - ⚠️ **New import paths** - - Starting with {@link updating/update-to-42 version 42.0.0}, we changed the format of import paths. This guide uses the new, shorter format. Refer to the {@link getting-started/legacy-getting-started/legacy-imports Packages in the legacy setup} guide if you use an older version of CKEditor 5. - - -After {@link getting-started/quick-start installing the editor}, add the feature to your plugin list and toolbar configuration: - -```js -import { ClassicEditor, BlockQuote } from 'ckeditor5'; - -ClassicEditor - .create( document.querySelector( '#editor' ), { - plugins: [ BlockQuote, /* ... */ ], - toolbar: [ 'blockQuote', /* ... */ ] - } ) - .then( /* ... */ ) - .catch( /* ... */ ); -``` - -## Configuration - -### Disallow nesting block quotes - -By default, the editor supports inserting a block quote into another block quote. - -To disallow nesting block quotes, you need to register an additional schema rule. It needs to be added before the data is loaded into the editor, hence it is best to implement it as a plugin: - -```js -function DisallowNestingBlockQuotes( editor ) { - editor.model.schema.addChildCheck( ( context, childDefinition ) => { - if ( context.endsWith( 'blockQuote' ) && childDefinition.name == 'blockQuote' ) { - return false; - } - } ); -} - -// Pass it via config.extraPlugins or config.plugins: - -ClassicEditor - .create( document.querySelector( '#editor' ), { - extraPlugins: [ DisallowNestingBlockQuotes ], - - // The rest of the configuration. - // ... - } ) - .then( /* ... */ ) - .catch( /* ... */ ); -``` - - - Check the {@link tutorials/crash-course/editor step-by-step tutorial} if you need more information about the technical side of this solution. - - -## Related features - -Here are some other CKEditor 5 features that you can use similarly to the block quote plugin to structure your text better: - -* {@link features/indent Block indentation} – Set indentation for text blocks such as paragraphs or lists. -* {@link features/code-blocks Code block} – Insert longer, multiline code listings. -* {@link features/text-alignment Text alignment} – Align your content left, right, center it, or justify. -* {@link features/autoformat Autoformatting} – Add formatting elements (such as block quotes) as you type with Markdown code. - -## Common API - -The {@link module:block-quote/blockquote~BlockQuote} plugin registers: - -* the `'blockQuote'` UI button component implemented by the {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}, -* the `'blockQuote'` command implemented by the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature}. - -You can execute the command using the {@link module:core/editor/editor~Editor#execute `editor.execute()`} method: - -```js -// Applies block quote to the selected content. -editor.execute( 'blockQuote' ); -``` - - - We recommend using the official {@link framework/development-tools/inspector CKEditor 5 inspector} for development and debugging. It will give you tons of useful information about the state of the editor such as internal data structures, selection, commands, and many more. - - -## Contribute - -The source code of the feature is available on GitHub at [https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote](https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-block-quote). From e028f88821b14d70d7e66de1317e71f4d6701bda Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 18:41:37 +0200 Subject: [PATCH 07/25] chore(admonitions): rename plugin names and more references --- packages/ckeditor5-admonition/ckeditor5-metadata.json | 10 +++++----- packages/ckeditor5-admonition/src/admonition.ts | 2 +- packages/ckeditor5-admonition/src/admonitionediting.ts | 2 +- packages/ckeditor5-admonition/src/admonitionui.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ckeditor5-admonition/ckeditor5-metadata.json b/packages/ckeditor5-admonition/ckeditor5-metadata.json index 6668d4659..2cf1d7a37 100644 --- a/packages/ckeditor5-admonition/ckeditor5-metadata.json +++ b/packages/ckeditor5-admonition/ckeditor5-metadata.json @@ -1,15 +1,15 @@ { "plugins": [ { - "name": "Block quote", - "className": "BlockQuote", - "description": "Implements the block quote support to easily include quotations and passages in the rich-text content.", + "name": "Admonitions", + "className": "Admonition", + "description": "Implements admonitions (warning, info boxes) in a similar fashion to blockquotes", "docs": "features/block-quote.html", - "path": "src/blockquote.js", + "path": "src/admonition.js", "uiComponents": [ { "type": "Button", - "name": "blockQuote", + "name": "admonition", "iconPath": "@ckeditor/ckeditor5-core/theme/icons/quote.svg" } ], diff --git a/packages/ckeditor5-admonition/src/admonition.ts b/packages/ckeditor5-admonition/src/admonition.ts index f78fe0a8d..c19919ad6 100644 --- a/packages/ckeditor5-admonition/src/admonition.ts +++ b/packages/ckeditor5-admonition/src/admonition.ts @@ -34,6 +34,6 @@ export default class Admonition extends Plugin { * @inheritDoc */ public static get pluginName() { - return 'BlockQuote' as const; + return 'Admonition' as const; } } diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 23d57f5ff..dda985dfc 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -25,7 +25,7 @@ export default class AdmonitionEditing extends Plugin { * @inheritDoc */ public static get pluginName() { - return 'BlockQuoteEditing' as const; + return 'AdmonitionEditing' as const; } /** diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 7f9b9448a..88133369e 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -24,7 +24,7 @@ export default class AdmonitionUI extends Plugin { * @inheritDoc */ public static get pluginName() { - return 'BlockQuoteUI' as const; + return 'AdmonitionUI' as const; } /** From 137c5c27cd8f575b085ccbaa5dc174e9d72e6e34 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:02:10 +0200 Subject: [PATCH 08/25] refactor(admonitions): more references to blockquote --- packages/ckeditor5-admonition/package.json | 4 ++-- .../ckeditor5-admonition/src/admonition.ts | 2 +- .../src/admonitioncommand.ts | 2 +- .../src/admonitionediting.ts | 18 +++++++++--------- .../ckeditor5-admonition/src/admonitionui.ts | 12 ++++++------ .../ckeditor5-admonition/src/augmentation.ts | 2 +- packages/ckeditor5-admonition/src/index.ts | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index ef9ac3093..7b40a6921 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -1,5 +1,5 @@ { - "name": "@ckeditor/ckeditor5-block-quote", + "name": "@ckeditor/ckeditor5-admonition", "version": "43.2.0", "description": "Block quote feature for CKEditor 5.", "keywords": [ @@ -42,7 +42,7 @@ "repository": { "type": "git", "url": "https://github.com/ckeditor/ckeditor5.git", - "directory": "packages/ckeditor5-block-quote" + "directory": "packages/ckeditor5-admonition" }, "files": [ "dist", diff --git a/packages/ckeditor5-admonition/src/admonition.ts b/packages/ckeditor5-admonition/src/admonition.ts index c19919ad6..7c5fcc123 100644 --- a/packages/ckeditor5-admonition/src/admonition.ts +++ b/packages/ckeditor5-admonition/src/admonition.ts @@ -4,7 +4,7 @@ */ /** - * @module block-quote/blockquote + * @module admonition/admonition */ import { Plugin } from 'ckeditor5/src/core.js'; diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index d2ae120bf..543161730 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -4,7 +4,7 @@ */ /** - * @module block-quote/blockquotecommand + * @module admonition/admonitioncommand */ import { Command } from 'ckeditor5/src/core.js'; diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index dda985dfc..7f8c16077 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -4,7 +4,7 @@ */ /** - * @module block-quote/blockquoteediting + * @module admonition/admonitionediting */ import { Plugin } from 'ckeditor5/src/core.js'; @@ -42,13 +42,13 @@ export default class AdmonitionEditing extends Plugin { const editor = this.editor; const schema = editor.model.schema; - editor.commands.add( 'blockQuote', new AdmonitionCommand( editor ) ); + editor.commands.add( 'admonition', new AdmonitionCommand( editor ) ); - schema.register( 'blockQuote', { + schema.register( 'admonition', { inheritAllFrom: '$container' } ); - editor.conversion.elementToElement( { model: 'blockQuote', view: 'blockquote' } ); + editor.conversion.elementToElement( { model: 'blockQuote', view: 'admonition' } ); // Postfixer which cleans incorrect model states connected with block quotes. editor.model.document.registerPostFixer( writer => { @@ -105,19 +105,19 @@ export default class AdmonitionEditing extends Plugin { const viewDocument = this.editor.editing.view.document; const selection = editor.model.document.selection; - const blockQuoteCommand: AdmonitionCommand = editor.commands.get( 'blockQuote' )!; + const admonitionCommand: AdmonitionCommand = editor.commands.get( 'admonition' )!; // Overwrite default Enter key behavior. // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote. this.listenTo( viewDocument, 'enter', ( evt, data ) => { - if ( !selection.isCollapsed || !blockQuoteCommand.value ) { + if ( !selection.isCollapsed || !admonitionCommand.value ) { return; } const positionParent = selection.getLastPosition()!.parent; if ( positionParent.isEmpty ) { - editor.execute( 'blockQuote' ); + editor.execute( 'admonition' ); editor.editing.view.scrollToTheSelection(); data.preventDefault(); @@ -128,14 +128,14 @@ export default class AdmonitionEditing extends Plugin { // Overwrite default Backspace key behavior. // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote. this.listenTo( viewDocument, 'delete', ( evt, data ) => { - if ( data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand!.value ) { + if ( data.direction != 'backward' || !selection.isCollapsed || !admonitionCommand!.value ) { return; } const positionParent = selection.getLastPosition()!.parent; if ( positionParent.isEmpty && !positionParent.previousSibling ) { - editor.execute( 'blockQuote' ); + editor.execute( 'admonition' ); editor.editing.view.scrollToTheSelection(); data.preventDefault(); diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 88133369e..7c5a89641 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -4,7 +4,7 @@ */ /** - * @module block-quote/blockquoteui + * @module admonition/admonitionui */ import { Plugin, icons } from 'ckeditor5/src/core.js'; @@ -15,7 +15,7 @@ import '../theme/blockquote.css'; /** * The block quote UI plugin. * - * It introduces the `'blockQuote'` button. + * It introduces the `'admonition'` button. * * @extends module:core/plugin~Plugin */ @@ -33,7 +33,7 @@ export default class AdmonitionUI extends Plugin { public init(): void { const editor = this.editor; - editor.ui.componentFactory.add( 'blockQuote', () => { + editor.ui.componentFactory.add( 'admonition', () => { const buttonView = this._createButton( ButtonView ); buttonView.set( { @@ -43,7 +43,7 @@ export default class AdmonitionUI extends Plugin { return buttonView; } ); - editor.ui.componentFactory.add( 'menuBar:blockQuote', () => { + editor.ui.componentFactory.add( 'menuBar:admonition', () => { const buttonView = this._createButton( MenuBarMenuListItemButtonView ); buttonView.set( { @@ -60,7 +60,7 @@ export default class AdmonitionUI extends Plugin { private _createButton( ButtonClass: T ): InstanceType { const editor = this.editor; const locale = editor.locale; - const command = editor.commands.get( 'blockQuote' )!; + const command = editor.commands.get( 'admonition' )!; const view = new ButtonClass( editor.locale ) as InstanceType; const t = locale.t; @@ -75,7 +75,7 @@ export default class AdmonitionUI extends Plugin { // Execute the command. this.listenTo( view, 'execute', () => { - editor.execute( 'blockQuote' ); + editor.execute( 'admonition' ); editor.editing.view.focus(); } ); diff --git a/packages/ckeditor5-admonition/src/augmentation.ts b/packages/ckeditor5-admonition/src/augmentation.ts index 4a094038c..5bf87e70e 100644 --- a/packages/ckeditor5-admonition/src/augmentation.ts +++ b/packages/ckeditor5-admonition/src/augmentation.ts @@ -18,6 +18,6 @@ declare module '@ckeditor/ckeditor5-core' { } interface CommandsMap { - blockQuote: AdmonitionCommand; + admonition: AdmonitionCommand; } } diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts index cb11f5db1..56b7ade58 100644 --- a/packages/ckeditor5-admonition/src/index.ts +++ b/packages/ckeditor5-admonition/src/index.ts @@ -4,7 +4,7 @@ */ /** - * @module block-quote + * @module admonition */ export { default as Admonition } from './admonition.js'; From d79110b75c443f95e72dfff0d65815727c2e17bd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:05:20 +0200 Subject: [PATCH 09/25] feat(admonitions): rename toolbar button --- .../ckeditor5-admonition/lang/contexts.json | 2 +- .../lang/translations/af.po | 22 ------------------- .../lang/translations/ar.po | 22 ------------------- .../lang/translations/az.po | 22 ------------------- .../lang/translations/bg.po | 22 ------------------- .../lang/translations/bn.po | 22 ------------------- .../lang/translations/bs.po | 22 ------------------- .../lang/translations/ca.po | 22 ------------------- .../lang/translations/cs.po | 22 ------------------- .../lang/translations/da.po | 22 ------------------- .../lang/translations/de-ch.po | 22 ------------------- .../lang/translations/de.po | 22 ------------------- .../lang/translations/el.po | 22 ------------------- .../lang/translations/en-au.po | 22 ------------------- .../lang/translations/en-gb.po | 22 ------------------- .../lang/translations/en.po | 6 ++--- .../lang/translations/es-co.po | 22 ------------------- .../lang/translations/es.po | 22 ------------------- .../lang/translations/et.po | 22 ------------------- .../lang/translations/eu.po | 22 ------------------- .../lang/translations/fa.po | 22 ------------------- .../lang/translations/fi.po | 22 ------------------- .../lang/translations/fr.po | 22 ------------------- .../lang/translations/gl.po | 22 ------------------- .../lang/translations/gu.po | 22 ------------------- .../lang/translations/he.po | 22 ------------------- .../lang/translations/hi.po | 22 ------------------- .../lang/translations/hr.po | 22 ------------------- .../lang/translations/hu.po | 22 ------------------- .../lang/translations/id.po | 22 ------------------- .../lang/translations/it.po | 22 ------------------- .../lang/translations/ja.po | 22 ------------------- .../lang/translations/km.po | 22 ------------------- .../lang/translations/kn.po | 22 ------------------- .../lang/translations/ko.po | 22 ------------------- .../lang/translations/ku.po | 22 ------------------- .../lang/translations/lt.po | 22 ------------------- .../lang/translations/lv.po | 22 ------------------- .../lang/translations/ms.po | 22 ------------------- .../lang/translations/nb.po | 22 ------------------- .../lang/translations/ne.po | 22 ------------------- .../lang/translations/nl.po | 22 ------------------- .../lang/translations/no.po | 22 ------------------- .../lang/translations/pl.po | 22 ------------------- .../lang/translations/pt-br.po | 22 ------------------- .../lang/translations/pt.po | 22 ------------------- .../lang/translations/ro.po | 22 ------------------- .../lang/translations/ru.po | 22 ------------------- .../lang/translations/sk.po | 22 ------------------- .../lang/translations/sl.po | 22 ------------------- .../lang/translations/sq.po | 22 ------------------- .../lang/translations/sr-latn.po | 22 ------------------- .../lang/translations/sr.po | 22 ------------------- .../lang/translations/sv.po | 22 ------------------- .../lang/translations/th.po | 22 ------------------- .../lang/translations/tk.po | 22 ------------------- .../lang/translations/tr.po | 22 ------------------- .../lang/translations/ug.po | 22 ------------------- .../lang/translations/uk.po | 22 ------------------- .../lang/translations/ur.po | 22 ------------------- .../lang/translations/uz.po | 22 ------------------- .../lang/translations/vi.po | 22 ------------------- .../lang/translations/zh-cn.po | 22 ------------------- .../lang/translations/zh.po | 22 ------------------- packages/ckeditor5-admonition/package.json | 2 +- .../ckeditor5-admonition/src/admonitionui.ts | 4 ++-- 66 files changed, 7 insertions(+), 1371 deletions(-) delete mode 100644 packages/ckeditor5-admonition/lang/translations/af.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ar.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/az.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/bg.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/bn.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/bs.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ca.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/cs.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/da.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/de-ch.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/de.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/el.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/en-au.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/en-gb.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/es-co.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/es.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/et.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/eu.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/fa.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/fi.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/fr.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/gl.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/gu.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/he.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/hi.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/hr.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/hu.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/id.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/it.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ja.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/km.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/kn.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ko.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ku.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/lt.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/lv.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ms.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/nb.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ne.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/nl.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/no.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/pl.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/pt-br.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/pt.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ro.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ru.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sk.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sl.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sq.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sr-latn.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sr.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/sv.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/th.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/tk.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/tr.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ug.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/uk.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/ur.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/uz.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/vi.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/zh-cn.po delete mode 100644 packages/ckeditor5-admonition/lang/translations/zh.po diff --git a/packages/ckeditor5-admonition/lang/contexts.json b/packages/ckeditor5-admonition/lang/contexts.json index 163affa15..421249ff6 100644 --- a/packages/ckeditor5-admonition/lang/contexts.json +++ b/packages/ckeditor5-admonition/lang/contexts.json @@ -1,3 +1,3 @@ { - "Block quote": "Toolbar button tooltip for the Block quote feature." + "Admonition": "Toolbar button tooltip for the Admonition feature." } diff --git a/packages/ckeditor5-admonition/lang/translations/af.po b/packages/ckeditor5-admonition/lang/translations/af.po deleted file mode 100644 index 3103dc671..000000000 --- a/packages/ckeditor5-admonition/lang/translations/af.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Verwysingsaanhaling" diff --git a/packages/ckeditor5-admonition/lang/translations/ar.po b/packages/ckeditor5-admonition/lang/translations/ar.po deleted file mode 100644 index d4b47f769..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ar.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "اقتباس" diff --git a/packages/ckeditor5-admonition/lang/translations/az.po b/packages/ckeditor5-admonition/lang/translations/az.po deleted file mode 100644 index f7aada9b4..000000000 --- a/packages/ckeditor5-admonition/lang/translations/az.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Sitat bloku" diff --git a/packages/ckeditor5-admonition/lang/translations/bg.po b/packages/ckeditor5-admonition/lang/translations/bg.po deleted file mode 100644 index d0fce3706..000000000 --- a/packages/ckeditor5-admonition/lang/translations/bg.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Цитат" diff --git a/packages/ckeditor5-admonition/lang/translations/bn.po b/packages/ckeditor5-admonition/lang/translations/bn.po deleted file mode 100644 index eb6c91a47..000000000 --- a/packages/ckeditor5-admonition/lang/translations/bn.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "ব্লক কোট" diff --git a/packages/ckeditor5-admonition/lang/translations/bs.po b/packages/ckeditor5-admonition/lang/translations/bs.po deleted file mode 100644 index 434f98d5a..000000000 --- a/packages/ckeditor5-admonition/lang/translations/bs.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citat" diff --git a/packages/ckeditor5-admonition/lang/translations/ca.po b/packages/ckeditor5-admonition/lang/translations/ca.po deleted file mode 100644 index 14f399985..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ca.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Cita de bloc" diff --git a/packages/ckeditor5-admonition/lang/translations/cs.po b/packages/ckeditor5-admonition/lang/translations/cs.po deleted file mode 100644 index 768fc20a6..000000000 --- a/packages/ckeditor5-admonition/lang/translations/cs.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citace" diff --git a/packages/ckeditor5-admonition/lang/translations/da.po b/packages/ckeditor5-admonition/lang/translations/da.po deleted file mode 100644 index 9167145f3..000000000 --- a/packages/ckeditor5-admonition/lang/translations/da.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blot citat" diff --git a/packages/ckeditor5-admonition/lang/translations/de-ch.po b/packages/ckeditor5-admonition/lang/translations/de-ch.po deleted file mode 100644 index 438580c74..000000000 --- a/packages/ckeditor5-admonition/lang/translations/de-ch.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" -"Language: de_CH\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blockzitat" diff --git a/packages/ckeditor5-admonition/lang/translations/de.po b/packages/ckeditor5-admonition/lang/translations/de.po deleted file mode 100644 index 38a92d4c7..000000000 --- a/packages/ckeditor5-admonition/lang/translations/de.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blockzitat" diff --git a/packages/ckeditor5-admonition/lang/translations/el.po b/packages/ckeditor5-admonition/lang/translations/el.po deleted file mode 100644 index fd23cff33..000000000 --- a/packages/ckeditor5-admonition/lang/translations/el.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Περιοχή παράθεσης" diff --git a/packages/ckeditor5-admonition/lang/translations/en-au.po b/packages/ckeditor5-admonition/lang/translations/en-au.po deleted file mode 100644 index 2daa3d823..000000000 --- a/packages/ckeditor5-admonition/lang/translations/en-au.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/en-gb.po b/packages/ckeditor5-admonition/lang/translations/en-gb.po deleted file mode 100644 index 8a3acc7a7..000000000 --- a/packages/ckeditor5-admonition/lang/translations/en-gb.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/en.po b/packages/ckeditor5-admonition/lang/translations/en.po index 17bbb2039..b5032283a 100644 --- a/packages/ckeditor5-admonition/lang/translations/en.po +++ b/packages/ckeditor5-admonition/lang/translations/en.po @@ -17,6 +17,6 @@ msgstr "" "Plural-Forms: \n" "Content-Type: text/plain; charset=UTF-8\n" -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Block quote" +msgctxt "Toolbar button tooltip for the Admoniton feature." +msgid "Admonition" +msgstr "Admonition" diff --git a/packages/ckeditor5-admonition/lang/translations/es-co.po b/packages/ckeditor5-admonition/lang/translations/es-co.po deleted file mode 100644 index 3ec1e1a69..000000000 --- a/packages/ckeditor5-admonition/lang/translations/es-co.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Cita de bloque" diff --git a/packages/ckeditor5-admonition/lang/translations/es.po b/packages/ckeditor5-admonition/lang/translations/es.po deleted file mode 100644 index f8985635b..000000000 --- a/packages/ckeditor5-admonition/lang/translations/es.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" -"Language: es\n" -"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Bloque de cita" diff --git a/packages/ckeditor5-admonition/lang/translations/et.po b/packages/ckeditor5-admonition/lang/translations/et.po deleted file mode 100644 index 763ff9acc..000000000 --- a/packages/ckeditor5-admonition/lang/translations/et.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Tsitaat" diff --git a/packages/ckeditor5-admonition/lang/translations/eu.po b/packages/ckeditor5-admonition/lang/translations/eu.po deleted file mode 100644 index 30d8797cb..000000000 --- a/packages/ckeditor5-admonition/lang/translations/eu.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Aipua" diff --git a/packages/ckeditor5-admonition/lang/translations/fa.po b/packages/ckeditor5-admonition/lang/translations/fa.po deleted file mode 100644 index 9919ff2fe..000000000 --- a/packages/ckeditor5-admonition/lang/translations/fa.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr " بلوک نقل قول" diff --git a/packages/ckeditor5-admonition/lang/translations/fi.po b/packages/ckeditor5-admonition/lang/translations/fi.po deleted file mode 100644 index a43e53bc3..000000000 --- a/packages/ckeditor5-admonition/lang/translations/fi.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Lainaus" diff --git a/packages/ckeditor5-admonition/lang/translations/fr.po b/packages/ckeditor5-admonition/lang/translations/fr.po deleted file mode 100644 index 9710d7b05..000000000 --- a/packages/ckeditor5-admonition/lang/translations/fr.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" -"Language: fr\n" -"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citation" diff --git a/packages/ckeditor5-admonition/lang/translations/gl.po b/packages/ckeditor5-admonition/lang/translations/gl.po deleted file mode 100644 index a25dc1866..000000000 --- a/packages/ckeditor5-admonition/lang/translations/gl.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Cita de bloque" diff --git a/packages/ckeditor5-admonition/lang/translations/gu.po b/packages/ckeditor5-admonition/lang/translations/gu.po deleted file mode 100644 index 1fd205bad..000000000 --- a/packages/ckeditor5-admonition/lang/translations/gu.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Gujarati (https://app.transifex.com/ckeditor/teams/11143/gu/)\n" -"Language: gu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr " વિચાર ટાંકો" diff --git a/packages/ckeditor5-admonition/lang/translations/he.po b/packages/ckeditor5-admonition/lang/translations/he.po deleted file mode 100644 index de0f3e1cf..000000000 --- a/packages/ckeditor5-admonition/lang/translations/he.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" -"Language: he\n" -"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "בלוק ציטוט" diff --git a/packages/ckeditor5-admonition/lang/translations/hi.po b/packages/ckeditor5-admonition/lang/translations/hi.po deleted file mode 100644 index 2b5615886..000000000 --- a/packages/ckeditor5-admonition/lang/translations/hi.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Block quote" diff --git a/packages/ckeditor5-admonition/lang/translations/hr.po b/packages/ckeditor5-admonition/lang/translations/hr.po deleted file mode 100644 index 01d579a18..000000000 --- a/packages/ckeditor5-admonition/lang/translations/hr.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blok citat" diff --git a/packages/ckeditor5-admonition/lang/translations/hu.po b/packages/ckeditor5-admonition/lang/translations/hu.po deleted file mode 100644 index 40fc0ddf6..000000000 --- a/packages/ckeditor5-admonition/lang/translations/hu.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Idézet" diff --git a/packages/ckeditor5-admonition/lang/translations/id.po b/packages/ckeditor5-admonition/lang/translations/id.po deleted file mode 100644 index 27c9bb3ad..000000000 --- a/packages/ckeditor5-admonition/lang/translations/id.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Kutipan" diff --git a/packages/ckeditor5-admonition/lang/translations/it.po b/packages/ckeditor5-admonition/lang/translations/it.po deleted file mode 100644 index 8737841ba..000000000 --- a/packages/ckeditor5-admonition/lang/translations/it.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" -"Language: it\n" -"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blocco citazione" diff --git a/packages/ckeditor5-admonition/lang/translations/ja.po b/packages/ckeditor5-admonition/lang/translations/ja.po deleted file mode 100644 index 795865777..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ja.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "ブロッククオート(引用)" diff --git a/packages/ckeditor5-admonition/lang/translations/km.po b/packages/ckeditor5-admonition/lang/translations/km.po deleted file mode 100644 index adef2e6e5..000000000 --- a/packages/ckeditor5-admonition/lang/translations/km.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "ប្លុក​ពាក្យ​សម្រង់" diff --git a/packages/ckeditor5-admonition/lang/translations/kn.po b/packages/ckeditor5-admonition/lang/translations/kn.po deleted file mode 100644 index 05eddd9e1..000000000 --- a/packages/ckeditor5-admonition/lang/translations/kn.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ" diff --git a/packages/ckeditor5-admonition/lang/translations/ko.po b/packages/ckeditor5-admonition/lang/translations/ko.po deleted file mode 100644 index b7f51b61c..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ko.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "인용 단락" diff --git a/packages/ckeditor5-admonition/lang/translations/ku.po b/packages/ckeditor5-admonition/lang/translations/ku.po deleted file mode 100644 index c0ab93c76..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ku.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" -"Language: ku\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "وتەی وەرگیراو" diff --git a/packages/ckeditor5-admonition/lang/translations/lt.po b/packages/ckeditor5-admonition/lang/translations/lt.po deleted file mode 100644 index 857f45a18..000000000 --- a/packages/ckeditor5-admonition/lang/translations/lt.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citata" diff --git a/packages/ckeditor5-admonition/lang/translations/lv.po b/packages/ckeditor5-admonition/lang/translations/lv.po deleted file mode 100644 index 68b8707e5..000000000 --- a/packages/ckeditor5-admonition/lang/translations/lv.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citāts" diff --git a/packages/ckeditor5-admonition/lang/translations/ms.po b/packages/ckeditor5-admonition/lang/translations/ms.po deleted file mode 100644 index 703bf8395..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ms.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blok petikan" diff --git a/packages/ckeditor5-admonition/lang/translations/nb.po b/packages/ckeditor5-admonition/lang/translations/nb.po deleted file mode 100644 index be64e8a24..000000000 --- a/packages/ckeditor5-admonition/lang/translations/nb.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blokksitat" diff --git a/packages/ckeditor5-admonition/lang/translations/ne.po b/packages/ckeditor5-admonition/lang/translations/ne.po deleted file mode 100644 index 0681f801b..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ne.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" -"Language: ne_NP\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "ब्लक उद्धरण" diff --git a/packages/ckeditor5-admonition/lang/translations/nl.po b/packages/ckeditor5-admonition/lang/translations/nl.po deleted file mode 100644 index 96d891b6a..000000000 --- a/packages/ckeditor5-admonition/lang/translations/nl.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blok citaat" diff --git a/packages/ckeditor5-admonition/lang/translations/no.po b/packages/ckeditor5-admonition/lang/translations/no.po deleted file mode 100644 index 5eda198a3..000000000 --- a/packages/ckeditor5-admonition/lang/translations/no.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" -"Language: no\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blokksitat" diff --git a/packages/ckeditor5-admonition/lang/translations/pl.po b/packages/ckeditor5-admonition/lang/translations/pl.po deleted file mode 100644 index a9a2abfee..000000000 --- a/packages/ckeditor5-admonition/lang/translations/pl.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Cytat blokowy" diff --git a/packages/ckeditor5-admonition/lang/translations/pt-br.po b/packages/ckeditor5-admonition/lang/translations/pt-br.po deleted file mode 100644 index 92ae869e0..000000000 --- a/packages/ckeditor5-admonition/lang/translations/pt-br.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Bloco de citação" diff --git a/packages/ckeditor5-admonition/lang/translations/pt.po b/packages/ckeditor5-admonition/lang/translations/pt.po deleted file mode 100644 index c4c0db12a..000000000 --- a/packages/ckeditor5-admonition/lang/translations/pt.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" -"Language: pt\n" -"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Bloco de citação" diff --git a/packages/ckeditor5-admonition/lang/translations/ro.po b/packages/ckeditor5-admonition/lang/translations/ro.po deleted file mode 100644 index 441fcc2e3..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ro.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Bloc citat" diff --git a/packages/ckeditor5-admonition/lang/translations/ru.po b/packages/ckeditor5-admonition/lang/translations/ru.po deleted file mode 100644 index 4a4025be7..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ru.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Цитата" diff --git a/packages/ckeditor5-admonition/lang/translations/sk.po b/packages/ckeditor5-admonition/lang/translations/sk.po deleted file mode 100644 index 63239f457..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sk.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citát" diff --git a/packages/ckeditor5-admonition/lang/translations/sl.po b/packages/ckeditor5-admonition/lang/translations/sl.po deleted file mode 100644 index a45101568..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sl.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Slovenian (https://app.transifex.com/ckeditor/teams/11143/sl/)\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blokiraj citat" diff --git a/packages/ckeditor5-admonition/lang/translations/sq.po b/packages/ckeditor5-admonition/lang/translations/sq.po deleted file mode 100644 index a745b3c00..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sq.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Thonjëzat" diff --git a/packages/ckeditor5-admonition/lang/translations/sr-latn.po b/packages/ckeditor5-admonition/lang/translations/sr-latn.po deleted file mode 100644 index 6067dba88..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sr-latn.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Citat" diff --git a/packages/ckeditor5-admonition/lang/translations/sr.po b/packages/ckeditor5-admonition/lang/translations/sr.po deleted file mode 100644 index d0b5be48e..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sr.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Цитат" diff --git a/packages/ckeditor5-admonition/lang/translations/sv.po b/packages/ckeditor5-admonition/lang/translations/sv.po deleted file mode 100644 index 48ba49cdd..000000000 --- a/packages/ckeditor5-admonition/lang/translations/sv.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Blockcitat" diff --git a/packages/ckeditor5-admonition/lang/translations/th.po b/packages/ckeditor5-admonition/lang/translations/th.po deleted file mode 100644 index fd3b72129..000000000 --- a/packages/ckeditor5-admonition/lang/translations/th.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "คำพูดบล็อก" diff --git a/packages/ckeditor5-admonition/lang/translations/tk.po b/packages/ckeditor5-admonition/lang/translations/tk.po deleted file mode 100644 index 0fa386ad8..000000000 --- a/packages/ckeditor5-admonition/lang/translations/tk.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Sitata blokirläň" diff --git a/packages/ckeditor5-admonition/lang/translations/tr.po b/packages/ckeditor5-admonition/lang/translations/tr.po deleted file mode 100644 index caba274db..000000000 --- a/packages/ckeditor5-admonition/lang/translations/tr.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Alıntı" diff --git a/packages/ckeditor5-admonition/lang/translations/ug.po b/packages/ckeditor5-admonition/lang/translations/ug.po deleted file mode 100644 index 5816d3fb0..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ug.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "نەقىل" diff --git a/packages/ckeditor5-admonition/lang/translations/uk.po b/packages/ckeditor5-admonition/lang/translations/uk.po deleted file mode 100644 index 329193c12..000000000 --- a/packages/ckeditor5-admonition/lang/translations/uk.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Цитата" diff --git a/packages/ckeditor5-admonition/lang/translations/ur.po b/packages/ckeditor5-admonition/lang/translations/ur.po deleted file mode 100644 index 9e471e028..000000000 --- a/packages/ckeditor5-admonition/lang/translations/ur.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "خانہ اقتباس" diff --git a/packages/ckeditor5-admonition/lang/translations/uz.po b/packages/ckeditor5-admonition/lang/translations/uz.po deleted file mode 100644 index f7f4045ae..000000000 --- a/packages/ckeditor5-admonition/lang/translations/uz.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Iqtibos" diff --git a/packages/ckeditor5-admonition/lang/translations/vi.po b/packages/ckeditor5-admonition/lang/translations/vi.po deleted file mode 100644 index e229468dd..000000000 --- a/packages/ckeditor5-admonition/lang/translations/vi.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "Trích dẫn" diff --git a/packages/ckeditor5-admonition/lang/translations/zh-cn.po b/packages/ckeditor5-admonition/lang/translations/zh-cn.po deleted file mode 100644 index 461cc956e..000000000 --- a/packages/ckeditor5-admonition/lang/translations/zh-cn.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "块引用" diff --git a/packages/ckeditor5-admonition/lang/translations/zh.po b/packages/ckeditor5-admonition/lang/translations/zh.po deleted file mode 100644 index 9b496b39e..000000000 --- a/packages/ckeditor5-admonition/lang/translations/zh.po +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. -# -# !!! IMPORTANT !!! -# -# Before you edit this file, please keep in mind that contributing to the project -# translations is possible ONLY via the Transifex online service. -# -# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. -# -# To learn more, check out the official contributor's guide: -# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html -# -msgid "" -msgstr "" -"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "Toolbar button tooltip for the Block quote feature." -msgid "Block quote" -msgstr "段落引用" diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 7b40a6921..e93c8fdfc 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -1,7 +1,7 @@ { "name": "@ckeditor/ckeditor5-admonition", "version": "43.2.0", - "description": "Block quote feature for CKEditor 5.", + "description": "Admonition (info box, warning box) feature for CKEditor 5.", "keywords": [ "ckeditor", "ckeditor5", diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 7c5a89641..bdd44a26d 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -55,7 +55,7 @@ export default class AdmonitionUI extends Plugin { } /** - * Creates a button for block quote command to use either in toolbar or in menu bar. + * Creates a button for admonition command to use either in toolbar or in menu bar. */ private _createButton( ButtonClass: T ): InstanceType { const editor = this.editor; @@ -65,7 +65,7 @@ export default class AdmonitionUI extends Plugin { const t = locale.t; view.set( { - label: t( 'Block quote' ), + label: t( 'Admonition' ), icon: icons.quote, isToggleable: true } ); From d11254e0449ba639e3708a3937b44ec3cb11a2e2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:10:07 +0200 Subject: [PATCH 10/25] feat(admonitions): add custom icon --- .../ckeditor5-metadata.json | 2 +- .../ckeditor5-admonition/src/admonitionui.ts | 3 +- .../theme/icons/admonition.svg | 52 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 packages/ckeditor5-admonition/theme/icons/admonition.svg diff --git a/packages/ckeditor5-admonition/ckeditor5-metadata.json b/packages/ckeditor5-admonition/ckeditor5-metadata.json index 2cf1d7a37..1061d38e2 100644 --- a/packages/ckeditor5-admonition/ckeditor5-metadata.json +++ b/packages/ckeditor5-admonition/ckeditor5-metadata.json @@ -10,7 +10,7 @@ { "type": "Button", "name": "admonition", - "iconPath": "@ckeditor/ckeditor5-core/theme/icons/quote.svg" + "iconPath": "theme/icons/admonition.svg" } ], "htmlOutput": [ diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index bdd44a26d..4f88c2cc1 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -11,6 +11,7 @@ import { Plugin, icons } from 'ckeditor5/src/core.js'; import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; import '../theme/blockquote.css'; +import admonitionIcon from '../theme/icons/admonition.svg'; /** * The block quote UI plugin. @@ -66,7 +67,7 @@ export default class AdmonitionUI extends Plugin { view.set( { label: t( 'Admonition' ), - icon: icons.quote, + icon: admonitionIcon, isToggleable: true } ); diff --git a/packages/ckeditor5-admonition/theme/icons/admonition.svg b/packages/ckeditor5-admonition/theme/icons/admonition.svg new file mode 100644 index 000000000..0f497f8c6 --- /dev/null +++ b/packages/ckeditor5-admonition/theme/icons/admonition.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c49b30cf53aad7d9f93c1f3005f4c05dc8cfbea1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:28:57 +0200 Subject: [PATCH 11/25] feat(admonitions): use aside instead of blockquote --- .../ckeditor5-metadata.json | 2 +- .../src/admonitioncommand.ts | 8 ++++---- .../src/admonitionediting.ts | 20 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/ckeditor5-admonition/ckeditor5-metadata.json b/packages/ckeditor5-admonition/ckeditor5-metadata.json index 1061d38e2..3218dff50 100644 --- a/packages/ckeditor5-admonition/ckeditor5-metadata.json +++ b/packages/ckeditor5-admonition/ckeditor5-metadata.json @@ -15,7 +15,7 @@ ], "htmlOutput": [ { - "elements": "blockquote" + "elements": "aside" } ] } diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 543161730..cf91e49f3 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -151,7 +151,7 @@ export default class AdmonitionCommand extends Command { let quote = findQuote( groupRange.start ); if ( !quote ) { - quote = writer.createElement( 'blockQuote' ); + quote = writer.createElement( 'aside' ); writer.wrap( groupRange, quote ); } @@ -176,7 +176,7 @@ export default class AdmonitionCommand extends Command { } function findQuote( elementOrPosition: Element | Position ): Element | DocumentFragment | null { - return elementOrPosition.parent!.name == 'blockQuote' ? elementOrPosition.parent : null; + return elementOrPosition.parent!.name == 'aside' ? elementOrPosition.parent : null; } /** @@ -215,8 +215,8 @@ function getRangesOfBlockGroups( writer: Writer, blocks: Array ): Array */ function checkCanBeQuoted( schema: Schema, block: Element ): boolean { // TMP will be replaced with schema.checkWrap(). - const isBQAllowed = schema.checkChild( block.parent as Element, 'blockQuote' ); - const isBlockAllowedInBQ = schema.checkChild( [ '$root', 'blockQuote' ], block ); + const isBQAllowed = schema.checkChild( block.parent as Element, 'aside' ); + const isBlockAllowedInBQ = schema.checkChild( [ '$root', 'aside' ], block ); return isBQAllowed && isBlockAllowedInBQ; } diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 7f8c16077..29e2352ab 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -16,7 +16,7 @@ import AdmonitionCommand from './admonitioncommand.js'; /** * The block quote editing. * - * Introduces the `'blockQuote'` command and the `'blockQuote'` model element. + * Introduces the `'admonition'` command and the `'aside'` model element. * * @extends module:core/plugin~Plugin */ @@ -44,11 +44,11 @@ export default class AdmonitionEditing extends Plugin { editor.commands.add( 'admonition', new AdmonitionCommand( editor ) ); - schema.register( 'admonition', { + schema.register( 'aside', { inheritAllFrom: '$container' } ); - editor.conversion.elementToElement( { model: 'blockQuote', view: 'admonition' } ); + editor.conversion.elementToElement( { model: 'aside', view: 'aside' } ); // Postfixer which cleans incorrect model states connected with block quotes. editor.model.document.registerPostFixer( writer => { @@ -63,13 +63,13 @@ export default class AdmonitionEditing extends Plugin { continue; } - if ( element.is( 'element', 'blockQuote' ) && element.isEmpty ) { - // Added an empty blockQuote - remove it. + if ( element.is( 'element', 'aside' ) && element.isEmpty ) { + // Added an empty aside - remove it. writer.remove( element ); return true; - } else if ( element.is( 'element', 'blockQuote' ) && !schema.checkChild( entry.position, element ) ) { - // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost. + } else if ( element.is( 'element', 'aside' ) && !schema.checkChild( entry.position, element ) ) { + // Added a aside in incorrect place. Unwrap it so the content inside is not lost. writer.unwrap( element ); return true; @@ -79,7 +79,7 @@ export default class AdmonitionEditing extends Plugin { for ( const child of range.getItems() ) { if ( - child.is( 'element', 'blockQuote' ) && + child.is( 'element', 'aside' ) && !schema.checkChild( writer.createPositionBefore( child ), child ) ) { writer.unwrap( child ); @@ -91,8 +91,8 @@ export default class AdmonitionEditing extends Plugin { } else if ( entry.type == 'remove' ) { const parent = entry.position.parent; - if ( parent.is( 'element', 'blockQuote' ) && parent.isEmpty ) { - // Something got removed and now blockQuote is empty. Remove the blockQuote as well. + if ( parent.is( 'element', 'aside' ) && parent.isEmpty ) { + // Something got removed and now aside is empty. Remove the aside as well. writer.remove( parent ); return true; From 8c6c15a8d1cc2d3e92333f588d5fe43298313034 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:38:52 +0200 Subject: [PATCH 12/25] feat(admonitions): apply dedicated admonition class --- packages/ckeditor5-admonition/src/admonitionediting.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 29e2352ab..c69cbb71b 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -48,7 +48,13 @@ export default class AdmonitionEditing extends Plugin { inheritAllFrom: '$container' } ); - editor.conversion.elementToElement( { model: 'aside', view: 'aside' } ); + editor.conversion.elementToElement( { + model: 'aside', + view: { + name: "aside", + classes: "admonition" + } + }); // Postfixer which cleans incorrect model states connected with block quotes. editor.model.document.registerPostFixer( writer => { From 283dbb2b75cfba7d76951f7f27bdc961275dabec Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 19:41:46 +0200 Subject: [PATCH 13/25] fix(admonitions): double enter to exit block --- packages/ckeditor5-admonition/src/admonitionediting.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index c69cbb71b..9f16e4ae4 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -129,7 +129,7 @@ export default class AdmonitionEditing extends Plugin { data.preventDefault(); evt.stop(); } - }, { context: 'blockquote' } ); + }, { context: 'aside' } ); // Overwrite default Backspace key behavior. // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote. @@ -147,6 +147,6 @@ export default class AdmonitionEditing extends Plugin { data.preventDefault(); evt.stop(); } - }, { context: 'blockquote' } ); + }, { context: 'aside' } ); } } From d29edbe325d259ec7c80d08a29af0b9348cc222c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 20:07:55 +0200 Subject: [PATCH 14/25] fix(admonitions): create dropdown list --- .../ckeditor5-admonition/src/admonitionui.ts | 75 +++++++++++++------ 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 4f88c2cc1..62a79c8e5 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -7,11 +7,34 @@ * @module admonition/admonitionui */ -import { Plugin, icons } from 'ckeditor5/src/core.js'; -import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { Plugin, } from 'ckeditor5/src/core.js'; +import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, ViewModel } from 'ckeditor5/src/ui.js'; import '../theme/blockquote.css'; import admonitionIcon from '../theme/icons/admonition.svg'; +import { Collection } from '@ckeditor/ckeditor5-utils'; + +interface AdmonitionDefinition { + title: string; +} + +const ADMONITION_TYPES: Record = { + "note": { + title: "Note" + }, + "tip": { + title: "Tip" + }, + "important": { + title: "Important" + }, + "caution": { + title: "Caution" + }, + "warning": { + title: "Warning" + } +}; /** * The block quote UI plugin. @@ -35,21 +58,7 @@ export default class AdmonitionUI extends Plugin { const editor = this.editor; editor.ui.componentFactory.add( 'admonition', () => { - const buttonView = this._createButton( ButtonView ); - - buttonView.set( { - tooltip: true - } ); - - return buttonView; - } ); - - editor.ui.componentFactory.add( 'menuBar:admonition', () => { - const buttonView = this._createButton( MenuBarMenuListItemButtonView ); - - buttonView.set( { - role: 'menuitemcheckbox' - } ); + const buttonView = this._createButton(); return buttonView; } ); @@ -58,21 +67,24 @@ export default class AdmonitionUI extends Plugin { /** * Creates a button for admonition command to use either in toolbar or in menu bar. */ - private _createButton( ButtonClass: T ): InstanceType { + private _createButton() { const editor = this.editor; const locale = editor.locale; const command = editor.commands.get( 'admonition' )!; - const view = new ButtonClass( editor.locale ) as InstanceType; + const view = createDropdown(locale); const t = locale.t; - view.set( { + addListToDropdown(view, this._getDropdownItems()) + + view.buttonView.set( { label: t( 'Admonition' ), icon: admonitionIcon, - isToggleable: true + isToggleable: true, + tooltip: true } ); view.bind( 'isEnabled' ).to( command, 'isEnabled' ); - view.bind( 'isOn' ).to( command, 'value' ); + // view.buttonView.bind( 'isOn' ).to( command, 'value' ); // Execute the command. this.listenTo( view, 'execute', () => { @@ -82,4 +94,23 @@ export default class AdmonitionUI extends Plugin { return view; } + + private _getDropdownItems() { + const itemDefinitions = new Collection(); + + for (const [ type, admonition ] of Object.entries(ADMONITION_TYPES)) { + const definition: ListDropdownButtonDefinition = { + type: "button", + model: new ViewModel({ + commandParam: type, + label: admonition.title, + withText: true + }) + } + + itemDefinitions.add(definition); + } + + return itemDefinitions; + } } From fb7e3102243697e266ea829063d179351cabe61c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 21:27:29 +0200 Subject: [PATCH 15/25] feat(admonitions): allow selecting admonition type --- .../src/admonitioncommand.ts | 22 +++++++++---- .../src/admonitionediting.ts | 33 ++++++++++++++++--- .../ckeditor5-admonition/src/admonitionui.ts | 18 +++++----- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index cf91e49f3..3ff85e0dc 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -16,6 +16,10 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from * * @extends module:core/command~Command */ + +// TODO: Change me. +type AdmonitionType = string; + export default class AdmonitionCommand extends Command { /** * Whether the selection starts in a block quote. @@ -23,7 +27,7 @@ export default class AdmonitionCommand extends Command { * @observable * @readonly */ - declare public value: boolean; + declare public value: AdmonitionType | false; /** * @inheritDoc @@ -43,7 +47,7 @@ export default class AdmonitionCommand extends Command { * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. */ - public override execute( options: { forceValue?: boolean } = {} ): void { + public override execute( options: { forceValue?: AdmonitionType } = {} ): void { const model = this.editor.model; const schema = model.schema; const selection = model.document.selection; @@ -51,6 +55,8 @@ export default class AdmonitionCommand extends Command { const blocks = Array.from( selection.getSelectedBlocks() ); const value = ( options.forceValue === undefined ) ? !this.value : options.forceValue; + // TODO: Fix me. + const valueString = (typeof value === "string" ? value : "note"); model.change( writer => { if ( !value ) { @@ -62,7 +68,7 @@ export default class AdmonitionCommand extends Command { return findQuote( block ) || checkCanBeQuoted( schema, block ); } ); - this._applyQuote( writer, blocksToQuote ); + this._applyQuote( writer, blocksToQuote, valueString); } } ); } @@ -70,13 +76,15 @@ export default class AdmonitionCommand extends Command { /** * Checks the command's {@link #value}. */ - private _getValue(): boolean { + private _getValue(): AdmonitionType | false { const selection = this.editor.model.document.selection; const firstBlock = first( selection.getSelectedBlocks() ); // In the current implementation, the block quote must be an immediate parent of a block element. - return !!( firstBlock && findQuote( firstBlock ) ); + // TODO: Read correct quote. + const result = !!( firstBlock && findQuote( firstBlock ) ); + return result ? "note" : false; } /** @@ -143,7 +151,7 @@ export default class AdmonitionCommand extends Command { /** * Applies the quote to given blocks. */ - private _applyQuote( writer: Writer, blocks: Array ): void { + private _applyQuote( writer: Writer, blocks: Array, type?: AdmonitionType | false): void { const quotesToMerge: Array = []; // Quote all groups of block. Iterate in the reverse order to not break following ranges. @@ -151,7 +159,7 @@ export default class AdmonitionCommand extends Command { let quote = findQuote( groupRange.start ); if ( !quote ) { - quote = writer.createElement( 'aside' ); + quote = writer.createElement( 'aside', { type }); writer.wrap( groupRange, quote ); } diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 9f16e4ae4..ce6ac6d8b 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -12,6 +12,7 @@ import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; import AdmonitionCommand from './admonitioncommand.js'; +import { ADMONITION_TYPES } from './admonitionui.js'; /** * The block quote editing. @@ -45,14 +46,38 @@ export default class AdmonitionEditing extends Plugin { editor.commands.add( 'admonition', new AdmonitionCommand( editor ) ); schema.register( 'aside', { - inheritAllFrom: '$container' + inheritAllFrom: '$container', + allowAttributes: "type" } ); - editor.conversion.elementToElement( { - model: 'aside', + editor.conversion.for("upcast").elementToElement({ view: { name: "aside", - classes: "admonition" + classes: "admonition", + }, + model: (viewElement, { writer }) => { + let type = "note"; + const allowedTypes = Object.keys(ADMONITION_TYPES); + for (const className of viewElement.getClassNames()) { + if (className !== "admonition" && allowedTypes.includes(className)) { + type = className; + } + } + + return writer.createElement("aside", { + type + }); + } + }); + + editor.conversion.for("downcast").elementToElement( { + model: 'aside', + view: (modelElement, { writer }) => { + return writer.createContainerElement( + "aside", { + class: [ "admonition", modelElement.getAttribute("type") ].join(" ") + } + ) } }); diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 62a79c8e5..859ef44c3 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -18,7 +18,7 @@ interface AdmonitionDefinition { title: string; } -const ADMONITION_TYPES: Record = { +export const ADMONITION_TYPES: Record = { "note": { title: "Note" }, @@ -71,28 +71,28 @@ export default class AdmonitionUI extends Plugin { const editor = this.editor; const locale = editor.locale; const command = editor.commands.get( 'admonition' )!; - const view = createDropdown(locale); + const dropdownView = createDropdown(locale); const t = locale.t; - addListToDropdown(view, this._getDropdownItems()) + addListToDropdown(dropdownView, this._getDropdownItems()) - view.buttonView.set( { + dropdownView.buttonView.set( { label: t( 'Admonition' ), icon: admonitionIcon, isToggleable: true, tooltip: true } ); - view.bind( 'isEnabled' ).to( command, 'isEnabled' ); + dropdownView.bind( 'isEnabled' ).to( command, 'isEnabled' ); // view.buttonView.bind( 'isOn' ).to( command, 'value' ); // Execute the command. - this.listenTo( view, 'execute', () => { - editor.execute( 'admonition' ); + this.listenTo(dropdownView, 'execute', evt => { + editor.execute("admonition", { forceValue: ( evt.source as any ).commandParam } ); editor.editing.view.focus(); - } ); + }); - return view; + return dropdownView; } private _getDropdownItems() { From 504879b11c8f984cd6f8c67eace6a616564b1d9f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 22:20:12 +0200 Subject: [PATCH 16/25] feat(admonitions): allow changing admonition type --- .../src/admonitioncommand.ts | 4 +++ .../src/admonitionediting.ts | 28 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 3ff85e0dc..ad6f262bc 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -162,6 +162,10 @@ export default class AdmonitionCommand extends Command { quote = writer.createElement( 'aside', { type }); writer.wrap( groupRange, quote ); + } else if (quote.is("element")) { + this.editor.model.change((writer) => { + writer.setAttribute("type", type, quote as Element); + }); } quotesToMerge.push( quote ); diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index ce6ac6d8b..d57d05bfc 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -70,16 +70,24 @@ export default class AdmonitionEditing extends Plugin { } }); - editor.conversion.for("downcast").elementToElement( { - model: 'aside', - view: (modelElement, { writer }) => { - return writer.createContainerElement( - "aside", { - class: [ "admonition", modelElement.getAttribute("type") ].join(" ") - } - ) - } - }); + editor.conversion.for("downcast") + .elementToElement( { + model: 'aside', + view: (modelElement, { writer }) => { + return writer.createContainerElement( + "aside", { + class: [ "admonition", modelElement.getAttribute("type") ].join(" ") + } + ) + } + }) + .attributeToAttribute({ + model: "type", + view: (value) => ({ + key: "class", + value: [ "admonition", value as string ] + }) + }); // Postfixer which cleans incorrect model states connected with block quotes. editor.model.document.registerPostFixer( writer => { From a3354d4d108b156e5ecc73d0e832f285e15f826f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 22:21:43 +0200 Subject: [PATCH 17/25] refactor(admonitions): remove no longer needed custom conversion --- packages/ckeditor5-admonition/src/admonitionediting.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index d57d05bfc..4c1b7fba0 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -73,13 +73,7 @@ export default class AdmonitionEditing extends Plugin { editor.conversion.for("downcast") .elementToElement( { model: 'aside', - view: (modelElement, { writer }) => { - return writer.createContainerElement( - "aside", { - class: [ "admonition", modelElement.getAttribute("type") ].join(" ") - } - ) - } + view: "aside" }) .attributeToAttribute({ model: "type", From 5c9fe3adcda96c62ea45b9b2cec0eadb76e91de3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 22:47:21 +0200 Subject: [PATCH 18/25] feat(admonitions): indicate with a checkmark the active type --- .../ckeditor5-admonition/src/admonitioncommand.ts | 15 ++++++++++----- packages/ckeditor5-admonition/src/admonitionui.ts | 4 ++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index ad6f262bc..42e713d27 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -78,13 +78,18 @@ export default class AdmonitionCommand extends Command { */ private _getValue(): AdmonitionType | false { const selection = this.editor.model.document.selection; - const firstBlock = first( selection.getSelectedBlocks() ); + if (!firstBlock) { + return false; + } - // In the current implementation, the block quote must be an immediate parent of a block element. - // TODO: Read correct quote. - const result = !!( firstBlock && findQuote( firstBlock ) ); - return result ? "note" : false; + // In the current implementation, the admonition must be an immediate parent of a block element. + const firstQuote = findQuote( firstBlock ); + if (firstQuote?.is("element")) { + return firstQuote.getAttribute("type") as string; + } + + return false; } /** diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 859ef44c3..397912320 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -13,6 +13,7 @@ import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, ViewMo import '../theme/blockquote.css'; import admonitionIcon from '../theme/icons/admonition.svg'; import { Collection } from '@ckeditor/ckeditor5-utils'; +import AdmonitionCommand from './admonitioncommand'; interface AdmonitionDefinition { title: string; @@ -97,6 +98,7 @@ export default class AdmonitionUI extends Plugin { private _getDropdownItems() { const itemDefinitions = new Collection(); + const command = this.editor.commands.get("admonition") as AdmonitionCommand for (const [ type, admonition ] of Object.entries(ADMONITION_TYPES)) { const definition: ListDropdownButtonDefinition = { @@ -104,10 +106,12 @@ export default class AdmonitionUI extends Plugin { model: new ViewModel({ commandParam: type, label: admonition.title, + role: 'menuitemradio', withText: true }) } + definition.model.bind("isOn").to(command, "value", currentType => currentType === type); itemDefinitions.add(definition); } From 878743500f6c8a855781b950469677694df936a8 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 13 Mar 2025 23:20:58 +0200 Subject: [PATCH 19/25] feat(admonitions): convert to split and get last type --- .../src/admonitioncommand.ts | 49 ++++++++++++++++--- .../ckeditor5-admonition/src/admonitionui.ts | 19 ++++--- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 42e713d27..798aef5ba 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -20,6 +20,18 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from // TODO: Change me. type AdmonitionType = string; +interface ExecuteOpts { + /** + * If set, it will force the command behavior. If `true`, the command will apply a block quote, + * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. + */ + forceValue?: AdmonitionType; + /** + * If set to true and `forceValue` is not specified, the command will apply the previous admonition type (if the command was already executed). + */ + usePreviousChoice?: boolean +} + export default class AdmonitionCommand extends Command { /** * Whether the selection starts in a block quote. @@ -29,6 +41,8 @@ export default class AdmonitionCommand extends Command { */ declare public value: AdmonitionType | false; + private _lastType?: AdmonitionType; + /** * @inheritDoc */ @@ -44,19 +58,15 @@ export default class AdmonitionCommand extends Command { * * @fires execute * @param options Command options. - * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, - * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. */ - public override execute( options: { forceValue?: AdmonitionType } = {} ): void { + public override execute( options: ExecuteOpts = {} ): void { const model = this.editor.model; const schema = model.schema; const selection = model.document.selection; const blocks = Array.from( selection.getSelectedBlocks() ); - const value = ( options.forceValue === undefined ) ? !this.value : options.forceValue; - // TODO: Fix me. - const valueString = (typeof value === "string" ? value : "note"); + const value = this._getType(options); model.change( writer => { if ( !value ) { @@ -68,11 +78,33 @@ export default class AdmonitionCommand extends Command { return findQuote( block ) || checkCanBeQuoted( schema, block ); } ); - this._applyQuote( writer, blocksToQuote, valueString); + this._applyQuote( writer, blocksToQuote, value); } } ); } + private _getType(options: ExecuteOpts): AdmonitionType | false { + const value = (options.forceValue === undefined) ? !this.value : options.forceValue; + + // Allow removing the admonition. + if (!value) { + return false; + } + + // Prefer the type from the command, if any. + if (typeof value === "string") { + return value; + } + + // See if we can restore the previous language. + if (options.usePreviousChoice && this._lastType) { + return this._lastType; + } + + // Otherwise return a default. + return "note"; + } + /** * Checks the command's {@link #value}. */ @@ -156,7 +188,8 @@ export default class AdmonitionCommand extends Command { /** * Applies the quote to given blocks. */ - private _applyQuote( writer: Writer, blocks: Array, type?: AdmonitionType | false): void { + private _applyQuote( writer: Writer, blocks: Array, type?: AdmonitionType): void { + this._lastType = type; const quotesToMerge: Array = []; // Quote all groups of block. Iterate in the reverse order to not break following ranges. diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 397912320..c81a37a28 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -8,7 +8,7 @@ */ import { Plugin, } from 'ckeditor5/src/core.js'; -import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, ViewModel } from 'ckeditor5/src/ui.js'; +import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, SplitButtonView, ViewModel } from 'ckeditor5/src/ui.js'; import '../theme/blockquote.css'; import admonitionIcon from '../theme/icons/admonition.svg'; @@ -72,23 +72,28 @@ export default class AdmonitionUI extends Plugin { const editor = this.editor; const locale = editor.locale; const command = editor.commands.get( 'admonition' )!; - const dropdownView = createDropdown(locale); + const dropdownView = createDropdown(locale, SplitButtonView); + const splitButtonView = dropdownView.buttonView; const t = locale.t; addListToDropdown(dropdownView, this._getDropdownItems()) - dropdownView.buttonView.set( { + // Button configuration. + splitButtonView.set( { label: t( 'Admonition' ), icon: admonitionIcon, isToggleable: true, tooltip: true } ); + splitButtonView.on("execute", () => { + editor.execute("admonition", { usePreviousChoice: true }); + editor.editing.view.focus(); + }); + splitButtonView.bind( 'isOn' ).to( command, 'value', value => (!!value) as boolean); + // Dropdown configuration dropdownView.bind( 'isEnabled' ).to( command, 'isEnabled' ); - // view.buttonView.bind( 'isOn' ).to( command, 'value' ); - - // Execute the command. - this.listenTo(dropdownView, 'execute', evt => { + dropdownView.on("execute", evt => { editor.execute("admonition", { forceValue: ( evt.source as any ).commandParam } ); editor.editing.view.focus(); }); From 83a4804c2c638f6175647b73ca9f38a1bf9dfa42 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 11:25:38 +0200 Subject: [PATCH 20/25] feat(admonitions): start implementing autoformat --- .../ckeditor5-admonition/src/admonition.ts | 3 ++- .../src/admonitionautoformat.ts | 20 +++++++++++++++++++ packages/ckeditor5-admonition/src/index.ts | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 packages/ckeditor5-admonition/src/admonitionautoformat.ts diff --git a/packages/ckeditor5-admonition/src/admonition.ts b/packages/ckeditor5-admonition/src/admonition.ts index 7c5fcc123..b09dfb78d 100644 --- a/packages/ckeditor5-admonition/src/admonition.ts +++ b/packages/ckeditor5-admonition/src/admonition.ts @@ -11,6 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import AdmonitionEditing from './admonitionediting.js'; import AdmonitionUI from './admonitionui.js'; +import AdmonitionAutoformat from './admonitionautoformat.js'; /** * The block quote plugin. @@ -27,7 +28,7 @@ export default class Admonition extends Plugin { * @inheritDoc */ public static get requires() { - return [ AdmonitionEditing, AdmonitionUI ] as const; + return [ AdmonitionEditing, AdmonitionUI, AdmonitionAutoformat ] as const; } /** diff --git a/packages/ckeditor5-admonition/src/admonitionautoformat.ts b/packages/ckeditor5-admonition/src/admonitionautoformat.ts new file mode 100644 index 000000000..28172f5a1 --- /dev/null +++ b/packages/ckeditor5-admonition/src/admonitionautoformat.ts @@ -0,0 +1,20 @@ +import Plugin from "@ckeditor/ckeditor5-core/src/plugin"; +import Autoformat from "@ckeditor/ckeditor5-autoformat/src/autoformat"; +import blockAutoformatEditing from "@ckeditor/ckeditor5-autoformat/src/blockautoformatediting"; + +export default class AdmonitionAutoformat extends Plugin { + static get requires() { + return [ Autoformat ]; + } + + afterInit() { + if (!this.editor.commands.get("admonition")) { + return; + } + + const instance = (this as any); + blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, (match) => { + console.log("Got match ", match); + }); + } +} diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts index 56b7ade58..073365f5d 100644 --- a/packages/ckeditor5-admonition/src/index.ts +++ b/packages/ckeditor5-admonition/src/index.ts @@ -10,6 +10,7 @@ export { default as Admonition } from './admonition.js'; export { default as AdmonitionEditing } from './admonitionediting.js'; export { default as AdmonitionUI } from './admonitionui.js'; +export { default as AdmonitionAutoformat } from './admonitionautoformat.js'; export type { default as AdmonitionCommand } from './admonitioncommand.js'; import './augmentation.js'; From 4967883f1d7f095c295ffecf9f709faba430c4f1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 22:47:42 +0200 Subject: [PATCH 21/25] feat(editor): functional autoformat when type is specified --- .../src/admonitionautoformat.ts | 20 +++++++++++++++++-- .../src/admonitioncommand.ts | 6 +++--- .../ckeditor5-admonition/src/admonitionui.ts | 14 ++++++------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionautoformat.ts b/packages/ckeditor5-admonition/src/admonitionautoformat.ts index 28172f5a1..ab0191e8c 100644 --- a/packages/ckeditor5-admonition/src/admonitionautoformat.ts +++ b/packages/ckeditor5-admonition/src/admonitionautoformat.ts @@ -1,6 +1,17 @@ import Plugin from "@ckeditor/ckeditor5-core/src/plugin"; import Autoformat from "@ckeditor/ckeditor5-autoformat/src/autoformat"; import blockAutoformatEditing from "@ckeditor/ckeditor5-autoformat/src/blockautoformatediting"; +import { AdmonitionType, admonitionTypes } from "./admonitioncommand"; + +function tryParseAdmonitionType(match: RegExpMatchArray) { + if (match.length !== 2) { + return; + } + + if ((admonitionTypes as readonly string[]).includes(match[1])) { + return match[1] as AdmonitionType; + } +} export default class AdmonitionAutoformat extends Plugin { static get requires() { @@ -13,8 +24,13 @@ export default class AdmonitionAutoformat extends Plugin { } const instance = (this as any); - blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, (match) => { - console.log("Got match ", match); + blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, ({ match }) => { + const type = tryParseAdmonitionType(match); + if (!type) { + return; + } + + this.editor.execute("admonition", { forceValue: type }); }); } } diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 798aef5ba..dd78bdb6e 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -17,8 +17,8 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from * @extends module:core/command~Command */ -// TODO: Change me. -type AdmonitionType = string; +export const admonitionTypes = [ "note", "tip", "important", "caution", "warning" ] as const; +export type AdmonitionType = typeof admonitionTypes[number]; interface ExecuteOpts { /** @@ -118,7 +118,7 @@ export default class AdmonitionCommand extends Command { // In the current implementation, the admonition must be an immediate parent of a block element. const firstQuote = findQuote( firstBlock ); if (firstQuote?.is("element")) { - return firstQuote.getAttribute("type") as string; + return firstQuote.getAttribute("type") as AdmonitionType; } return false; diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index c81a37a28..6e5b779fe 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -13,26 +13,26 @@ import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, SplitB import '../theme/blockquote.css'; import admonitionIcon from '../theme/icons/admonition.svg'; import { Collection } from '@ckeditor/ckeditor5-utils'; -import AdmonitionCommand from './admonitioncommand'; +import AdmonitionCommand, { AdmonitionType } from './admonitioncommand'; interface AdmonitionDefinition { title: string; } -export const ADMONITION_TYPES: Record = { - "note": { +export const ADMONITION_TYPES: Record = { + note: { title: "Note" }, - "tip": { + tip: { title: "Tip" }, - "important": { + important: { title: "Important" }, - "caution": { + caution: { title: "Caution" }, - "warning": { + warning: { title: "Warning" } }; From 2f3106d8cda553eae06641f1a1266f513aabd2ca Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 22:54:46 +0200 Subject: [PATCH 22/25] feat(editor): functional autoformat when type is not specified --- .../src/admonitionautoformat.ts | 14 ++++++++++---- .../ckeditor5-admonition/src/admonitioncommand.ts | 1 + .../ckeditor5-admonition/src/admonitionediting.ts | 9 ++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionautoformat.ts b/packages/ckeditor5-admonition/src/admonitionautoformat.ts index ab0191e8c..64699cdaa 100644 --- a/packages/ckeditor5-admonition/src/admonitionautoformat.ts +++ b/packages/ckeditor5-admonition/src/admonitionautoformat.ts @@ -26,11 +26,17 @@ export default class AdmonitionAutoformat extends Plugin { const instance = (this as any); blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, ({ match }) => { const type = tryParseAdmonitionType(match); - if (!type) { - return; - } - this.editor.execute("admonition", { forceValue: type }); + if (type) { + // User has entered the admonition type, so we insert as-is. + this.editor.execute("admonition", { forceValue: type }); + } else { + // User has not entered a valid type, assume it's part of the text of the admonition. + this.editor.execute("admonition"); + if (match.length > 1) { + this.editor.execute("insertText", { text: (match[1] ?? "") + " " }); + } + } }); } } diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index dd78bdb6e..27d7a471e 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -18,6 +18,7 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from */ export const admonitionTypes = [ "note", "tip", "important", "caution", "warning" ] as const; +export const defaultAdmonitionType = admonitionTypes[0]; export type AdmonitionType = typeof admonitionTypes[number]; interface ExecuteOpts { diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 4c1b7fba0..e28e0d086 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -11,7 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import AdmonitionCommand from './admonitioncommand.js'; +import AdmonitionCommand, { AdmonitionType, admonitionTypes, defaultAdmonitionType } from './admonitioncommand.js'; import { ADMONITION_TYPES } from './admonitionui.js'; /** @@ -56,11 +56,10 @@ export default class AdmonitionEditing extends Plugin { classes: "admonition", }, model: (viewElement, { writer }) => { - let type = "note"; - const allowedTypes = Object.keys(ADMONITION_TYPES); + let type: AdmonitionType = defaultAdmonitionType; for (const className of viewElement.getClassNames()) { - if (className !== "admonition" && allowedTypes.includes(className)) { - type = className; + if (className !== "admonition" && (admonitionTypes as readonly string[]).includes(className)) { + type = className as AdmonitionType; } } From 2c6df42d51b34cc601d1b8e9bcd9f118c2637cc7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 22:55:32 +0200 Subject: [PATCH 23/25] refactor(admonitions): convention for constants --- packages/ckeditor5-admonition/src/admonitionautoformat.ts | 4 ++-- packages/ckeditor5-admonition/src/admonitioncommand.ts | 6 +++--- packages/ckeditor5-admonition/src/admonitionediting.ts | 7 +++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionautoformat.ts b/packages/ckeditor5-admonition/src/admonitionautoformat.ts index 64699cdaa..ac104a845 100644 --- a/packages/ckeditor5-admonition/src/admonitionautoformat.ts +++ b/packages/ckeditor5-admonition/src/admonitionautoformat.ts @@ -1,14 +1,14 @@ import Plugin from "@ckeditor/ckeditor5-core/src/plugin"; import Autoformat from "@ckeditor/ckeditor5-autoformat/src/autoformat"; import blockAutoformatEditing from "@ckeditor/ckeditor5-autoformat/src/blockautoformatediting"; -import { AdmonitionType, admonitionTypes } from "./admonitioncommand"; +import { AdmonitionType, ADMONITION_TYPES } from "./admonitioncommand"; function tryParseAdmonitionType(match: RegExpMatchArray) { if (match.length !== 2) { return; } - if ((admonitionTypes as readonly string[]).includes(match[1])) { + if ((ADMONITION_TYPES as readonly string[]).includes(match[1])) { return match[1] as AdmonitionType; } } diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 27d7a471e..2b97af491 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -17,9 +17,9 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from * @extends module:core/command~Command */ -export const admonitionTypes = [ "note", "tip", "important", "caution", "warning" ] as const; -export const defaultAdmonitionType = admonitionTypes[0]; -export type AdmonitionType = typeof admonitionTypes[number]; +export const ADMONITION_TYPES = [ "note", "tip", "important", "caution", "warning" ] as const; +export const DEFAULT_ADMONITION_TYPE = ADMONITION_TYPES[0]; +export type AdmonitionType = typeof ADMONITION_TYPES[number]; interface ExecuteOpts { /** diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index e28e0d086..3f644b56a 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -11,8 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import AdmonitionCommand, { AdmonitionType, admonitionTypes, defaultAdmonitionType } from './admonitioncommand.js'; -import { ADMONITION_TYPES } from './admonitionui.js'; +import AdmonitionCommand, { AdmonitionType, ADMONITION_TYPES, DEFAULT_ADMONITION_TYPE } from './admonitioncommand.js'; /** * The block quote editing. @@ -56,9 +55,9 @@ export default class AdmonitionEditing extends Plugin { classes: "admonition", }, model: (viewElement, { writer }) => { - let type: AdmonitionType = defaultAdmonitionType; + let type: AdmonitionType = DEFAULT_ADMONITION_TYPE; for (const className of viewElement.getClassNames()) { - if (className !== "admonition" && (admonitionTypes as readonly string[]).includes(className)) { + if (className !== "admonition" && (ADMONITION_TYPES as readonly string[]).includes(className)) { type = className as AdmonitionType; } } From 80de28c617deb35d1a6f905310af1583190d3db1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 23:29:41 +0200 Subject: [PATCH 24/25] fix(admonitions): breaking math plugin --- .../ckeditor5-admonition/src/admonitioncommand.ts | 5 +++-- .../ckeditor5-admonition/src/admonitionediting.ts | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 2b97af491..234e41a93 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -18,6 +18,7 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from */ export const ADMONITION_TYPES = [ "note", "tip", "important", "caution", "warning" ] as const; +export const ADMONITION_TYPE_ATTRIBUTE = "admonitionType"; export const DEFAULT_ADMONITION_TYPE = ADMONITION_TYPES[0]; export type AdmonitionType = typeof ADMONITION_TYPES[number]; @@ -119,7 +120,7 @@ export default class AdmonitionCommand extends Command { // In the current implementation, the admonition must be an immediate parent of a block element. const firstQuote = findQuote( firstBlock ); if (firstQuote?.is("element")) { - return firstQuote.getAttribute("type") as AdmonitionType; + return firstQuote.getAttribute(ADMONITION_TYPE_ATTRIBUTE) as AdmonitionType; } return false; @@ -203,7 +204,7 @@ export default class AdmonitionCommand extends Command { writer.wrap( groupRange, quote ); } else if (quote.is("element")) { this.editor.model.change((writer) => { - writer.setAttribute("type", type, quote as Element); + writer.setAttribute(ADMONITION_TYPE_ATTRIBUTE, type, quote as Element); }); } diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 3f644b56a..6af25b965 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -11,7 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import AdmonitionCommand, { AdmonitionType, ADMONITION_TYPES, DEFAULT_ADMONITION_TYPE } from './admonitioncommand.js'; +import AdmonitionCommand, { AdmonitionType, ADMONITION_TYPES, DEFAULT_ADMONITION_TYPE, ADMONITION_TYPE_ATTRIBUTE } from './admonitioncommand.js'; /** * The block quote editing. @@ -46,7 +46,7 @@ export default class AdmonitionEditing extends Plugin { schema.register( 'aside', { inheritAllFrom: '$container', - allowAttributes: "type" + allowAttributes: ADMONITION_TYPE_ATTRIBUTE } ); editor.conversion.for("upcast").elementToElement({ @@ -62,9 +62,9 @@ export default class AdmonitionEditing extends Plugin { } } - return writer.createElement("aside", { - type - }); + const attributes: Record = {}; + attributes[ADMONITION_TYPE_ATTRIBUTE] = type; + return writer.createElement("aside", attributes); } }); @@ -74,7 +74,7 @@ export default class AdmonitionEditing extends Plugin { view: "aside" }) .attributeToAttribute({ - model: "type", + model: ADMONITION_TYPE_ATTRIBUTE, view: (value) => ({ key: "class", value: [ "admonition", value as string ] From c3a95822085abd4c38c46c4999342ecfebd5ac7b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 15 Mar 2025 10:49:27 +0200 Subject: [PATCH 25/25] fix(admonition): inserting new admonitions of given type not working --- packages/ckeditor5-admonition/src/admonitioncommand.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index 234e41a93..c9a6cae49 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -199,7 +199,9 @@ export default class AdmonitionCommand extends Command { let quote = findQuote( groupRange.start ); if ( !quote ) { - quote = writer.createElement( 'aside', { type }); + const attributes: Record = {}; + attributes[ADMONITION_TYPE_ATTRIBUTE] = type; + quote = writer.createElement( 'aside', attributes); writer.wrap( groupRange, quote ); } else if (quote.is("element")) {