@ckeditor/ckeditor5-block-quote 30.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. package/LICENSE.md +17 -0
  2. package/README.md +20 -0
  3. package/build/block-quote.js +5 -0
  4. package/build/translations/af.js +1 -0
  5. package/build/translations/ar.js +1 -0
  6. package/build/translations/az.js +1 -0
  7. package/build/translations/bg.js +1 -0
  8. package/build/translations/ca.js +1 -0
  9. package/build/translations/cs.js +1 -0
  10. package/build/translations/da.js +1 -0
  11. package/build/translations/de-ch.js +1 -0
  12. package/build/translations/de.js +1 -0
  13. package/build/translations/el.js +1 -0
  14. package/build/translations/en-au.js +1 -0
  15. package/build/translations/en-gb.js +1 -0
  16. package/build/translations/es.js +1 -0
  17. package/build/translations/et.js +1 -0
  18. package/build/translations/eu.js +1 -0
  19. package/build/translations/fa.js +1 -0
  20. package/build/translations/fi.js +1 -0
  21. package/build/translations/fr.js +1 -0
  22. package/build/translations/gl.js +1 -0
  23. package/build/translations/gu.js +1 -0
  24. package/build/translations/he.js +1 -0
  25. package/build/translations/hi.js +1 -0
  26. package/build/translations/hr.js +1 -0
  27. package/build/translations/hu.js +1 -0
  28. package/build/translations/id.js +1 -0
  29. package/build/translations/it.js +1 -0
  30. package/build/translations/ja.js +1 -0
  31. package/build/translations/km.js +1 -0
  32. package/build/translations/kn.js +1 -0
  33. package/build/translations/ko.js +1 -0
  34. package/build/translations/ku.js +1 -0
  35. package/build/translations/lt.js +1 -0
  36. package/build/translations/lv.js +1 -0
  37. package/build/translations/nb.js +1 -0
  38. package/build/translations/ne.js +1 -0
  39. package/build/translations/nl.js +1 -0
  40. package/build/translations/no.js +1 -0
  41. package/build/translations/pl.js +1 -0
  42. package/build/translations/pt-br.js +1 -0
  43. package/build/translations/ro.js +1 -0
  44. package/build/translations/ru.js +1 -0
  45. package/build/translations/sk.js +1 -0
  46. package/build/translations/sl.js +1 -0
  47. package/build/translations/sq.js +1 -0
  48. package/build/translations/sr-latn.js +1 -0
  49. package/build/translations/sr.js +1 -0
  50. package/build/translations/sv.js +1 -0
  51. package/build/translations/th.js +1 -0
  52. package/build/translations/tk.js +1 -0
  53. package/build/translations/tr.js +1 -0
  54. package/build/translations/ug.js +1 -0
  55. package/build/translations/uk.js +1 -0
  56. package/build/translations/vi.js +1 -0
  57. package/build/translations/zh-cn.js +1 -0
  58. package/build/translations/zh.js +1 -0
  59. package/ckeditor5-metadata.json +23 -0
  60. package/lang/contexts.json +3 -0
  61. package/lang/translations/af.po +21 -0
  62. package/lang/translations/ar.po +21 -0
  63. package/lang/translations/az.po +21 -0
  64. package/lang/translations/bg.po +21 -0
  65. package/lang/translations/ca.po +21 -0
  66. package/lang/translations/cs.po +21 -0
  67. package/lang/translations/da.po +21 -0
  68. package/lang/translations/de-ch.po +21 -0
  69. package/lang/translations/de.po +21 -0
  70. package/lang/translations/el.po +21 -0
  71. package/lang/translations/en-au.po +21 -0
  72. package/lang/translations/en-gb.po +21 -0
  73. package/lang/translations/en.po +21 -0
  74. package/lang/translations/es.po +21 -0
  75. package/lang/translations/et.po +21 -0
  76. package/lang/translations/eu.po +21 -0
  77. package/lang/translations/fa.po +21 -0
  78. package/lang/translations/fi.po +21 -0
  79. package/lang/translations/fr.po +21 -0
  80. package/lang/translations/gl.po +21 -0
  81. package/lang/translations/gu.po +21 -0
  82. package/lang/translations/he.po +21 -0
  83. package/lang/translations/hi.po +21 -0
  84. package/lang/translations/hr.po +21 -0
  85. package/lang/translations/hu.po +21 -0
  86. package/lang/translations/id.po +21 -0
  87. package/lang/translations/it.po +21 -0
  88. package/lang/translations/ja.po +21 -0
  89. package/lang/translations/km.po +21 -0
  90. package/lang/translations/kn.po +21 -0
  91. package/lang/translations/ko.po +21 -0
  92. package/lang/translations/ku.po +21 -0
  93. package/lang/translations/lt.po +21 -0
  94. package/lang/translations/lv.po +21 -0
  95. package/lang/translations/nb.po +21 -0
  96. package/lang/translations/ne.po +21 -0
  97. package/lang/translations/nl.po +21 -0
  98. package/lang/translations/no.po +21 -0
  99. package/lang/translations/pl.po +21 -0
  100. package/lang/translations/pt-br.po +21 -0
  101. package/lang/translations/ro.po +21 -0
  102. package/lang/translations/ru.po +21 -0
  103. package/lang/translations/sk.po +21 -0
  104. package/lang/translations/sl.po +21 -0
  105. package/lang/translations/sq.po +21 -0
  106. package/lang/translations/sr-latn.po +21 -0
  107. package/lang/translations/sr.po +21 -0
  108. package/lang/translations/sv.po +21 -0
  109. package/lang/translations/th.po +21 -0
  110. package/lang/translations/tk.po +21 -0
  111. package/lang/translations/tr.po +21 -0
  112. package/lang/translations/ug.po +21 -0
  113. package/lang/translations/uk.po +21 -0
  114. package/lang/translations/vi.po +21 -0
  115. package/lang/translations/zh-cn.po +21 -0
  116. package/lang/translations/zh.po +21 -0
  117. package/package.json +57 -0
  118. package/src/blockquote.js +39 -0
  119. package/src/blockquotecommand.js +232 -0
  120. package/src/blockquoteediting.js +147 -0
  121. package/src/blockquoteui.js +60 -0
  122. package/src/index.js +12 -0
  123. package/theme/blockquote.css +23 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module block-quote/blockquoteediting
8
+ */
9
+
10
+ import { Plugin } from 'ckeditor5/src/core';
11
+ import { Enter } from 'ckeditor5/src/enter';
12
+ import { Delete } from 'ckeditor5/src/typing';
13
+
14
+ import BlockQuoteCommand from './blockquotecommand';
15
+
16
+ /**
17
+ * The block quote editing.
18
+ *
19
+ * Introduces the `'blockQuote'` command and the `'blockQuote'` model element.
20
+ *
21
+ * @extends module:core/plugin~Plugin
22
+ */
23
+ export default class BlockQuoteEditing extends Plugin {
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ static get pluginName() {
28
+ return 'BlockQuoteEditing';
29
+ }
30
+
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ static get requires() {
35
+ return [ Enter, Delete ];
36
+ }
37
+
38
+ /**
39
+ * @inheritDoc
40
+ */
41
+ init() {
42
+ const editor = this.editor;
43
+ const schema = editor.model.schema;
44
+
45
+ editor.commands.add( 'blockQuote', new BlockQuoteCommand( editor ) );
46
+
47
+ schema.register( 'blockQuote', {
48
+ allowWhere: '$block',
49
+ allowContentOf: '$root'
50
+ } );
51
+
52
+ editor.conversion.elementToElement( { model: 'blockQuote', view: 'blockquote' } );
53
+
54
+ // Postfixer which cleans incorrect model states connected with block quotes.
55
+ editor.model.document.registerPostFixer( writer => {
56
+ const changes = editor.model.document.differ.getChanges();
57
+
58
+ for ( const entry of changes ) {
59
+ if ( entry.type == 'insert' ) {
60
+ const element = entry.position.nodeAfter;
61
+
62
+ if ( !element ) {
63
+ // We are inside a text node.
64
+ continue;
65
+ }
66
+
67
+ if ( element.is( 'element', 'blockQuote' ) && element.isEmpty ) {
68
+ // Added an empty blockQuote - remove it.
69
+ writer.remove( element );
70
+
71
+ return true;
72
+ } else if ( element.is( 'element', 'blockQuote' ) && !schema.checkChild( entry.position, element ) ) {
73
+ // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost.
74
+ writer.unwrap( element );
75
+
76
+ return true;
77
+ } else if ( element.is( 'element' ) ) {
78
+ // Just added an element. Check that all children meet the scheme rules.
79
+ const range = writer.createRangeIn( element );
80
+
81
+ for ( const child of range.getItems() ) {
82
+ if (
83
+ child.is( 'element', 'blockQuote' ) &&
84
+ !schema.checkChild( writer.createPositionBefore( child ), child )
85
+ ) {
86
+ writer.unwrap( child );
87
+
88
+ return true;
89
+ }
90
+ }
91
+ }
92
+ } else if ( entry.type == 'remove' ) {
93
+ const parent = entry.position.parent;
94
+
95
+ if ( parent.is( 'element', 'blockQuote' ) && parent.isEmpty ) {
96
+ // Something got removed and now blockQuote is empty. Remove the blockQuote as well.
97
+ writer.remove( parent );
98
+
99
+ return true;
100
+ }
101
+ }
102
+ }
103
+
104
+ return false;
105
+ } );
106
+
107
+ const viewDocument = this.editor.editing.view.document;
108
+ const selection = editor.model.document.selection;
109
+ const blockQuoteCommand = editor.commands.get( 'blockQuote' );
110
+
111
+ // Overwrite default Enter key behavior.
112
+ // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote.
113
+ this.listenTo( viewDocument, 'enter', ( evt, data ) => {
114
+ if ( !selection.isCollapsed || !blockQuoteCommand.value ) {
115
+ return;
116
+ }
117
+
118
+ const positionParent = selection.getLastPosition().parent;
119
+
120
+ if ( positionParent.isEmpty ) {
121
+ editor.execute( 'blockQuote' );
122
+ editor.editing.view.scrollToTheSelection();
123
+
124
+ data.preventDefault();
125
+ evt.stop();
126
+ }
127
+ }, { context: 'blockquote' } );
128
+
129
+ // Overwrite default Backspace key behavior.
130
+ // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote.
131
+ this.listenTo( viewDocument, 'delete', ( evt, data ) => {
132
+ if ( data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand.value ) {
133
+ return;
134
+ }
135
+
136
+ const positionParent = selection.getLastPosition().parent;
137
+
138
+ if ( positionParent.isEmpty && !positionParent.previousSibling ) {
139
+ editor.execute( 'blockQuote' );
140
+ editor.editing.view.scrollToTheSelection();
141
+
142
+ data.preventDefault();
143
+ evt.stop();
144
+ }
145
+ }, { context: 'blockquote' } );
146
+ }
147
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module block-quote/blockquoteui
8
+ */
9
+
10
+ import { Plugin, icons } from 'ckeditor5/src/core';
11
+ import { ButtonView } from 'ckeditor5/src/ui';
12
+
13
+ import '../theme/blockquote.css';
14
+
15
+ /**
16
+ * The block quote UI plugin.
17
+ *
18
+ * It introduces the `'blockQuote'` button.
19
+ *
20
+ * @extends module:core/plugin~Plugin
21
+ */
22
+ export default class BlockQuoteUI extends Plugin {
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ static get pluginName() {
27
+ return 'BlockQuoteUI';
28
+ }
29
+
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ init() {
34
+ const editor = this.editor;
35
+ const t = editor.t;
36
+
37
+ editor.ui.componentFactory.add( 'blockQuote', locale => {
38
+ const command = editor.commands.get( 'blockQuote' );
39
+ const buttonView = new ButtonView( locale );
40
+
41
+ buttonView.set( {
42
+ label: t( 'Block quote' ),
43
+ icon: icons.quote,
44
+ tooltip: true,
45
+ isToggleable: true
46
+ } );
47
+
48
+ // Bind button model to command.
49
+ buttonView.bind( 'isOn', 'isEnabled' ).to( command, 'value', 'isEnabled' );
50
+
51
+ // Execute command.
52
+ this.listenTo( buttonView, 'execute', () => {
53
+ editor.execute( 'blockQuote' );
54
+ editor.editing.view.focus();
55
+ } );
56
+
57
+ return buttonView;
58
+ } );
59
+ }
60
+ }
package/src/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module block-quote
8
+ */
9
+
10
+ export { default as BlockQuote } from './blockquote';
11
+ export { default as BlockQuoteEditing } from './blockquoteediting';
12
+ export { default as BlockQuoteUI } from './blockquoteui';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ .ck-content blockquote {
7
+ /* See #12 */
8
+ overflow: hidden;
9
+
10
+ /* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */
11
+ padding-right: 1.5em;
12
+ padding-left: 1.5em;
13
+
14
+ margin-left: 0;
15
+ margin-right: 0;
16
+ font-style: italic;
17
+ border-left: solid 5px hsl(0, 0%, 80%);
18
+ }
19
+
20
+ .ck-content[dir="rtl"] blockquote {
21
+ border-left: 0;
22
+ border-right: solid 5px hsl(0, 0%, 80%);
23
+ }