@ckeditor/ckeditor5-page-break 35.4.0 → 36.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/build/page-break.js +2 -2
- package/package.json +19 -15
- package/src/index.js +1 -3
- package/src/pagebreak.js +13 -19
- package/src/pagebreakcommand.js +40 -59
- package/src/pagebreakediting.js +86 -118
- package/src/pagebreakui.js +31 -43
- package/theme/pagebreak.css +1 -1
package/LICENSE.md
CHANGED
|
@@ -2,7 +2,7 @@ Software License Agreement
|
|
|
2
2
|
==========================
|
|
3
3
|
|
|
4
4
|
**CKEditor 5 page break feature** – https://github.com/ckeditor/ckeditor5-page-break <br>
|
|
5
|
-
Copyright (c) 2003-
|
|
5
|
+
Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved.
|
|
6
6
|
|
|
7
7
|
Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html).
|
|
8
8
|
|
package/build/page-break.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Page break":"Page break"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),
|
|
2
2
|
/*!
|
|
3
|
-
* @license Copyright (c) 2003-
|
|
3
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
4
4
|
* For licensing, see LICENSE.md.
|
|
5
|
-
*/(()=>{var e={587:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(609),a=n.n(r)()((function(e){return e[1]}));a.push([e.id,'.ck-content .page-break{align-items:center;clear:both;display:flex;justify-content:center;padding:5px 0;position:relative}.ck-content .page-break:after{border-bottom:2px dashed #c4c4c4;content:"";position:absolute;width:100%}.ck-content .page-break__label{background:#fff;border:1px solid #c4c4c4;border-radius:2px;box-shadow:2px 2px 1px rgba(0,0,0,.15);color:#333;display:block;font-family:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;font-size:.75em;font-weight:700;padding:.3em .6em;position:relative;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}@media print{.ck-content .page-break{padding:0}.ck-content .page-break:after{display:none}}',""]);const i=a},609:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(r)for(var i=0;i<this.length;i++){var o=this[i][0];null!=o&&(a[o]=!0)}for(var s=0;s<e.length;s++){var c=[].concat(e[s]);r&&a[c[0]]||(n&&(c[2]?c[2]="".concat(n," and ").concat(c[2]):c[2]=n),t.push(c))}},t}},62:(e,t,n)=>{"use strict";var r,a=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),o=[];function s(e){for(var t=-1,n=0;n<o.length;n++)if(o[n].identifier===e){t=n;break}return t}function c(e,t){for(var n={},r=[],a=0;a<e.length;a++){var i=e[a],c=t.base?i[0]+t.base:i[0],l=n[c]||0,d="".concat(c," ").concat(l);n[c]=l+1;var u=s(d),p={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(o[u].references++,o[u].updater(p)):o.push({identifier:d,updater:h(p,t),references:1}),r.push(d)}return r}function l(e){var t=document.createElement("style"),r=e.attributes||{};if(void 0===r.nonce){var a=n.nc;a&&(r.nonce=a)}if(Object.keys(r).forEach((function(e){t.setAttribute(e,r[e])})),"function"==typeof e.insert)e.insert(t);else{var o=i(e.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function p(e,t,n,r){var a=n?"":r.media?"@media ".concat(r.media," {").concat(r.css,"}"):r.css;if(e.styleSheet)e.styleSheet.cssText=u(t,a);else{var i=document.createTextNode(a),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(i,o[t]):e.appendChild(i)}}function f(e,t,n){var r=n.css,a=n.media,i=n.sourceMap;if(a?e.setAttribute("media",a):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=r;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(r))}}var g=null,m=0;function h(e,t){var n,r,a;if(t.singleton){var i=m++;n=g||(g=l(t)),r=p.bind(null,n,i,!1),a=p.bind(null,n,i,!0)}else n=l(t),r=f.bind(null,n,t),a=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else a()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=a());var n=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var r=0;r<n.length;r++){var a=s(n[r]);o[a].references--}for(var i=c(e,t),l=0;l<n.length;l++){var d=s(n[l]);0===o[d].references&&(o[d].updater(),o.splice(d,1))}n=i}}}},704:(e,t,n)=>{e.exports=n(79)("./src/core.js")},273:(e,t,n)=>{e.exports=n(79)("./src/ui.js")},995:(e,t,n)=>{e.exports=n(79)("./src/widget.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var i=t[r]={id:r,exports:{}};return e[r](i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var r={};(()=>{"use strict";n.r(r),n.d(r,{PageBreak:()=>p,PageBreakEditing:()=>l,PageBreakUI:()=>u});var e=n(704),t=n(995);class a extends e.Command{refresh(){const e=this.editor.model,n=e.schema,r=e.document.selection;this.isEnabled=function(e,n,r){const a=function(e,n){const r=(0,t.findOptimalInsertionRange)(e,n),a=r.start.parent;if(a.isEmpty&&!a.is("element","$root"))return a.parent;return a}(e,r);return n.checkChild(a,"pageBreak")}(r,n,e)}execute(){const e=this.editor.model;e.change((t=>{const n=t.createElement("pageBreak");e.insertObject(n,null,null,{setSelection:"after"})}))}}var i=n(62),o=n.n(i),s=n(587),c={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o()(s.Z,c);s.Z.locals;class l extends e.Plugin{static get pluginName(){return"PageBreakEditing"}init(){const e=this.editor,n=e.model.schema,r=e.t,i=e.conversion;n.register("pageBreak",{inheritAllFrom:"$blockObject"}),i.for("dataDowncast").elementToStructure({model:"pageBreak",view:(e,{writer:t})=>t.createContainerElement("div",{class:"page-break",style:"page-break-after: always"},t.createContainerElement("span",{style:"display: none"}))}),i.for("editingDowncast").elementToStructure({model:"pageBreak",view:(e,{writer:n})=>{const a=r("Page break"),i=n.createContainerElement("div"),o=n.createRawElement("span",{class:"page-break__label"},(function(e){e.innerText=r("Page break")}));return n.addClass("page-break",i),n.insert(n.createPositionAt(i,0),o),function(e,n,r){return n.setCustomProperty("pageBreak",!0,e),(0,t.toWidget)(e,n,{label:r})}(i,n,a)}}),i.for("upcast").elementToElement({view:e=>{const t="always"==e.getStyle("page-break-before"),n="always"==e.getStyle("page-break-after");if(t
|
|
5
|
+
*/(()=>{var e={587:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(609),a=n.n(r)()((function(e){return e[1]}));a.push([e.id,'.ck-content .page-break{align-items:center;clear:both;display:flex;justify-content:center;padding:5px 0;position:relative}.ck-content .page-break:after{border-bottom:2px dashed #c4c4c4;content:"";position:absolute;width:100%}.ck-content .page-break__label{background:#fff;border:1px solid #c4c4c4;border-radius:2px;box-shadow:2px 2px 1px rgba(0,0,0,.15);color:#333;display:block;font-family:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;font-size:.75em;font-weight:700;padding:.3em .6em;position:relative;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}@media print{.ck-content .page-break{padding:0}.ck-content .page-break:after{display:none}}',""]);const i=a},609:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(r)for(var i=0;i<this.length;i++){var o=this[i][0];null!=o&&(a[o]=!0)}for(var s=0;s<e.length;s++){var c=[].concat(e[s]);r&&a[c[0]]||(n&&(c[2]?c[2]="".concat(n," and ").concat(c[2]):c[2]=n),t.push(c))}},t}},62:(e,t,n)=>{"use strict";var r,a=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),o=[];function s(e){for(var t=-1,n=0;n<o.length;n++)if(o[n].identifier===e){t=n;break}return t}function c(e,t){for(var n={},r=[],a=0;a<e.length;a++){var i=e[a],c=t.base?i[0]+t.base:i[0],l=n[c]||0,d="".concat(c," ").concat(l);n[c]=l+1;var u=s(d),p={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(o[u].references++,o[u].updater(p)):o.push({identifier:d,updater:h(p,t),references:1}),r.push(d)}return r}function l(e){var t=document.createElement("style"),r=e.attributes||{};if(void 0===r.nonce){var a=n.nc;a&&(r.nonce=a)}if(Object.keys(r).forEach((function(e){t.setAttribute(e,r[e])})),"function"==typeof e.insert)e.insert(t);else{var o=i(e.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function p(e,t,n,r){var a=n?"":r.media?"@media ".concat(r.media," {").concat(r.css,"}"):r.css;if(e.styleSheet)e.styleSheet.cssText=u(t,a);else{var i=document.createTextNode(a),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(i,o[t]):e.appendChild(i)}}function f(e,t,n){var r=n.css,a=n.media,i=n.sourceMap;if(a?e.setAttribute("media",a):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=r;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(r))}}var g=null,m=0;function h(e,t){var n,r,a;if(t.singleton){var i=m++;n=g||(g=l(t)),r=p.bind(null,n,i,!1),a=p.bind(null,n,i,!0)}else n=l(t),r=f.bind(null,n,t),a=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else a()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=a());var n=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var r=0;r<n.length;r++){var a=s(n[r]);o[a].references--}for(var i=c(e,t),l=0;l<n.length;l++){var d=s(n[l]);0===o[d].references&&(o[d].updater(),o.splice(d,1))}n=i}}}},704:(e,t,n)=>{e.exports=n(79)("./src/core.js")},273:(e,t,n)=>{e.exports=n(79)("./src/ui.js")},995:(e,t,n)=>{e.exports=n(79)("./src/widget.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var i=t[r]={id:r,exports:{}};return e[r](i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var r={};(()=>{"use strict";n.r(r),n.d(r,{PageBreak:()=>p,PageBreakEditing:()=>l,PageBreakUI:()=>u});var e=n(704),t=n(995);class a extends e.Command{refresh(){const e=this.editor.model,n=e.schema,r=e.document.selection;this.isEnabled=function(e,n,r){const a=function(e,n){const r=(0,t.findOptimalInsertionRange)(e,n),a=r.start.parent;if(a.isEmpty&&!a.is("element","$root"))return a.parent;return a}(e,r);return n.checkChild(a,"pageBreak")}(r,n,e)}execute(){const e=this.editor.model;e.change((t=>{const n=t.createElement("pageBreak");e.insertObject(n,null,null,{setSelection:"after"})}))}}var i=n(62),o=n.n(i),s=n(587),c={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o()(s.Z,c);s.Z.locals;class l extends e.Plugin{static get pluginName(){return"PageBreakEditing"}init(){const e=this.editor,n=e.model.schema,r=e.t,i=e.conversion;n.register("pageBreak",{inheritAllFrom:"$blockObject"}),i.for("dataDowncast").elementToStructure({model:"pageBreak",view:(e,{writer:t})=>t.createContainerElement("div",{class:"page-break",style:"page-break-after: always"},t.createContainerElement("span",{style:"display: none"}))}),i.for("editingDowncast").elementToStructure({model:"pageBreak",view:(e,{writer:n})=>{const a=r("Page break"),i=n.createContainerElement("div"),o=n.createRawElement("span",{class:"page-break__label"},(function(e){e.innerText=r("Page break")}));return n.addClass("page-break",i),n.insert(n.createPositionAt(i,0),o),function(e,n,r){return n.setCustomProperty("pageBreak",!0,e),(0,t.toWidget)(e,n,{label:r})}(i,n,a)}}),i.for("upcast").elementToElement({view:e=>{const t="always"==e.getStyle("page-break-before"),n="always"==e.getStyle("page-break-after");if(!t&&!n)return null;if(1==e.childCount){const t=e.getChild(0);if(!t.is("element","span")||"none"!=t.getStyle("display"))return null}else if(e.childCount>1)return null;return{name:!0}},model:"pageBreak",converterPriority:"high"}),e.commands.add("pageBreak",new a(e))}}var d=n(273);class u extends e.Plugin{static get pluginName(){return"PageBreakUI"}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("pageBreak",(n=>{const r=e.commands.get("pageBreak"),a=new d.ButtonView(n);return a.set({label:t("Page break"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.598.687h1.5v5h-1.5zm14.5 0h1.5v5h-1.5z"/><path d="M19.598 4.187v1.5h-16v-1.5zm-16 14.569h1.5v-5h-1.5zm14.5 0h1.5v-5h-1.5z"/><path d="M19.598 15.256v-1.5h-16v1.5zM5.081 9h6v2h-6zm8 0h6v2h-6zm-9.483 1L0 12.5v-5z"/></svg>',tooltip:!0}),a.bind("isEnabled").to(r,"isEnabled"),this.listenTo(a,"execute",(()=>{e.execute("pageBreak"),e.editing.view.focus()})),a}))}}class p extends e.Plugin{static get requires(){return[l,u,t.Widget]}static get pluginName(){return"PageBreak"}}})(),(window.CKEditor5=window.CKEditor5||{}).pageBreak=r})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ckeditor/ckeditor5-page-break",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "36.0.1",
|
|
4
4
|
"description": "Page break feature for CKEditor 5.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ckeditor",
|
|
@@ -12,20 +12,21 @@
|
|
|
12
12
|
],
|
|
13
13
|
"main": "src/index.js",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"ckeditor5": "^
|
|
15
|
+
"ckeditor5": "^36.0.1"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@ckeditor/ckeditor5-cloud-services": "^
|
|
19
|
-
"@ckeditor/ckeditor5-core": "^
|
|
20
|
-
"@ckeditor/ckeditor5-dev-utils": "^
|
|
21
|
-
"@ckeditor/ckeditor5-easy-image": "^
|
|
22
|
-
"@ckeditor/ckeditor5-editor-classic": "^
|
|
23
|
-
"@ckeditor/ckeditor5-engine": "^
|
|
24
|
-
"@ckeditor/ckeditor5-image": "^
|
|
25
|
-
"@ckeditor/ckeditor5-paragraph": "^
|
|
26
|
-
"@ckeditor/ckeditor5-theme-lark": "^
|
|
27
|
-
"@ckeditor/ckeditor5-ui": "^
|
|
28
|
-
"@ckeditor/ckeditor5-widget": "^
|
|
18
|
+
"@ckeditor/ckeditor5-cloud-services": "^36.0.1",
|
|
19
|
+
"@ckeditor/ckeditor5-core": "^36.0.1",
|
|
20
|
+
"@ckeditor/ckeditor5-dev-utils": "^32.0.0",
|
|
21
|
+
"@ckeditor/ckeditor5-easy-image": "^36.0.1",
|
|
22
|
+
"@ckeditor/ckeditor5-editor-classic": "^36.0.1",
|
|
23
|
+
"@ckeditor/ckeditor5-engine": "^36.0.1",
|
|
24
|
+
"@ckeditor/ckeditor5-image": "^36.0.1",
|
|
25
|
+
"@ckeditor/ckeditor5-paragraph": "^36.0.1",
|
|
26
|
+
"@ckeditor/ckeditor5-theme-lark": "^36.0.1",
|
|
27
|
+
"@ckeditor/ckeditor5-ui": "^36.0.1",
|
|
28
|
+
"@ckeditor/ckeditor5-widget": "^36.0.1",
|
|
29
|
+
"typescript": "^4.8.4",
|
|
29
30
|
"webpack": "^5.58.1",
|
|
30
31
|
"webpack-cli": "^4.9.0"
|
|
31
32
|
},
|
|
@@ -44,13 +45,16 @@
|
|
|
44
45
|
},
|
|
45
46
|
"files": [
|
|
46
47
|
"lang",
|
|
47
|
-
"src",
|
|
48
|
+
"src/**/*.js",
|
|
49
|
+
"src/**/*.d.ts",
|
|
48
50
|
"theme",
|
|
49
51
|
"build",
|
|
50
52
|
"ckeditor5-metadata.json",
|
|
51
53
|
"CHANGELOG.md"
|
|
52
54
|
],
|
|
53
55
|
"scripts": {
|
|
54
|
-
"dll:build": "webpack"
|
|
56
|
+
"dll:build": "webpack",
|
|
57
|
+
"build": "tsc -p ./tsconfig.release.json",
|
|
58
|
+
"postversion": "npm run build"
|
|
55
59
|
}
|
|
56
60
|
}
|
package/src/index.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Copyright (c) 2003-
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* @module page-break
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
export { default as PageBreak } from './pagebreak';
|
|
11
9
|
export { default as PageBreakEditing } from './pagebreakediting';
|
|
12
10
|
export { default as PageBreakUI } from './pagebreakui';
|
package/src/pagebreak.js
CHANGED
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Copyright (c) 2003-
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* @module page-break/pagebreak
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
import { Plugin } from 'ckeditor5/src/core';
|
|
11
9
|
import { Widget } from 'ckeditor5/src/widget';
|
|
12
10
|
import PageBreakEditing from './pagebreakediting';
|
|
13
11
|
import PageBreakUI from './pagebreakui';
|
|
14
|
-
|
|
15
12
|
/**
|
|
16
13
|
* The page break feature.
|
|
17
14
|
*
|
|
18
15
|
* It provides the possibility to insert a page break into the rich-text editor.
|
|
19
16
|
*
|
|
20
17
|
* For a detailed overview, check the {@glink features/page-break Page break feature} documentation.
|
|
21
|
-
*
|
|
22
|
-
* @extends module:core/plugin~Plugin
|
|
23
18
|
*/
|
|
24
19
|
export default class PageBreak extends Plugin {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
static get requires() {
|
|
24
|
+
return [PageBreakEditing, PageBreakUI, Widget];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @inheritDoc
|
|
28
|
+
*/
|
|
29
|
+
static get pluginName() {
|
|
30
|
+
return 'PageBreak';
|
|
31
|
+
}
|
|
38
32
|
}
|
package/src/pagebreakcommand.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Copyright (c) 2003-
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* @module page-break/pagebreakcommand
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
import { Command } from 'ckeditor5/src/core';
|
|
11
9
|
import { findOptimalInsertionRange } from 'ckeditor5/src/widget';
|
|
12
|
-
|
|
13
10
|
/**
|
|
14
11
|
* The page break command.
|
|
15
12
|
*
|
|
@@ -18,63 +15,47 @@ import { findOptimalInsertionRange } from 'ckeditor5/src/widget';
|
|
|
18
15
|
* To insert a page break at the current selection, execute the command:
|
|
19
16
|
*
|
|
20
17
|
* editor.execute( 'pageBreak' );
|
|
21
|
-
*
|
|
22
|
-
* @extends module:core/command~Command
|
|
23
18
|
*/
|
|
24
19
|
export default class PageBreakCommand extends Command {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
setSelection: 'after'
|
|
49
|
-
} );
|
|
50
|
-
} );
|
|
51
|
-
}
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
refresh() {
|
|
24
|
+
const model = this.editor.model;
|
|
25
|
+
const schema = model.schema;
|
|
26
|
+
const selection = model.document.selection;
|
|
27
|
+
this.isEnabled = isPageBreakAllowedInParent(selection, schema, model);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Executes the command.
|
|
31
|
+
*
|
|
32
|
+
* @fires execute
|
|
33
|
+
*/
|
|
34
|
+
execute() {
|
|
35
|
+
const model = this.editor.model;
|
|
36
|
+
model.change(writer => {
|
|
37
|
+
const pageBreakElement = writer.createElement('pageBreak');
|
|
38
|
+
model.insertObject(pageBreakElement, null, null, {
|
|
39
|
+
setSelection: 'after'
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
52
43
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// @returns {Boolean}
|
|
60
|
-
function isPageBreakAllowedInParent( selection, schema, model ) {
|
|
61
|
-
const parent = getInsertPageBreakParent( selection, model );
|
|
62
|
-
|
|
63
|
-
return schema.checkChild( parent, 'pageBreak' );
|
|
44
|
+
/**
|
|
45
|
+
* Checks if a page break is allowed by the schema in the optimal insertion parent.
|
|
46
|
+
*/
|
|
47
|
+
function isPageBreakAllowedInParent(selection, schema, model) {
|
|
48
|
+
const parent = getInsertPageBreakParent(selection, model);
|
|
49
|
+
return schema.checkChild(parent, 'pageBreak');
|
|
64
50
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if ( parent.isEmpty && !parent.is( 'element', '$root' ) ) {
|
|
76
|
-
return parent.parent;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return parent;
|
|
51
|
+
/**
|
|
52
|
+
* Returns a node that will be used to insert a page break with `model.insertContent` to check if the page break can be placed there.
|
|
53
|
+
*/
|
|
54
|
+
function getInsertPageBreakParent(selection, model) {
|
|
55
|
+
const insertionRange = findOptimalInsertionRange(selection, model);
|
|
56
|
+
const parent = insertionRange.start.parent;
|
|
57
|
+
if (parent.isEmpty && !parent.is('element', '$root')) {
|
|
58
|
+
return parent.parent;
|
|
59
|
+
}
|
|
60
|
+
return parent;
|
|
80
61
|
}
|
package/src/pagebreakediting.js
CHANGED
|
@@ -1,134 +1,102 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Copyright (c) 2003-
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* @module page-break/pagebreakediting
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
import { Plugin } from 'ckeditor5/src/core';
|
|
11
9
|
import { toWidget } from 'ckeditor5/src/widget';
|
|
12
|
-
|
|
13
10
|
import PageBreakCommand from './pagebreakcommand';
|
|
14
|
-
|
|
15
11
|
import '../theme/pagebreak.css';
|
|
16
|
-
|
|
17
12
|
/**
|
|
18
13
|
* The page break editing feature.
|
|
19
|
-
*
|
|
20
|
-
* @extends module:core/plugin~Plugin
|
|
21
14
|
*/
|
|
22
15
|
export default class PageBreakEditing extends Plugin {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// The child must be the "span" element that is not displayed.
|
|
101
|
-
if ( !viewSpan.is( 'element', 'span' ) || viewSpan.getStyle( 'display' ) != 'none' ) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
} else if ( element.childCount > 1 ) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return { name: true };
|
|
109
|
-
},
|
|
110
|
-
model: 'pageBreak',
|
|
111
|
-
|
|
112
|
-
// This conversion must be checked before <br> conversion because some editors use
|
|
113
|
-
// <br style="page-break-before:always"> as a page break marker.
|
|
114
|
-
converterPriority: 'high'
|
|
115
|
-
} );
|
|
116
|
-
|
|
117
|
-
editor.commands.add( 'pageBreak', new PageBreakCommand( editor ) );
|
|
118
|
-
}
|
|
16
|
+
/**
|
|
17
|
+
* @inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
static get pluginName() {
|
|
20
|
+
return 'PageBreakEditing';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @inheritDoc
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
const editor = this.editor;
|
|
27
|
+
const schema = editor.model.schema;
|
|
28
|
+
const t = editor.t;
|
|
29
|
+
const conversion = editor.conversion;
|
|
30
|
+
schema.register('pageBreak', {
|
|
31
|
+
inheritAllFrom: '$blockObject'
|
|
32
|
+
});
|
|
33
|
+
conversion.for('dataDowncast').elementToStructure({
|
|
34
|
+
model: 'pageBreak',
|
|
35
|
+
view: (modelElement, { writer }) => {
|
|
36
|
+
const divElement = writer.createContainerElement('div', {
|
|
37
|
+
class: 'page-break',
|
|
38
|
+
// If user has no `.ck-content` styles, it should always break a page during print.
|
|
39
|
+
style: 'page-break-after: always'
|
|
40
|
+
},
|
|
41
|
+
// For a rationale of using span inside a div see:
|
|
42
|
+
// https://github.com/ckeditor/ckeditor5-page-break/pull/1#discussion_r328934062.
|
|
43
|
+
writer.createContainerElement('span', {
|
|
44
|
+
style: 'display: none'
|
|
45
|
+
}));
|
|
46
|
+
return divElement;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
conversion.for('editingDowncast').elementToStructure({
|
|
50
|
+
model: 'pageBreak',
|
|
51
|
+
view: (modelElement, { writer }) => {
|
|
52
|
+
const label = t('Page break');
|
|
53
|
+
const viewWrapper = writer.createContainerElement('div');
|
|
54
|
+
const viewLabelElement = writer.createRawElement('span', { class: 'page-break__label' }, function (domElement) {
|
|
55
|
+
domElement.innerText = t('Page break');
|
|
56
|
+
});
|
|
57
|
+
writer.addClass('page-break', viewWrapper);
|
|
58
|
+
writer.insert(writer.createPositionAt(viewWrapper, 0), viewLabelElement);
|
|
59
|
+
return toPageBreakWidget(viewWrapper, writer, label);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
conversion.for('upcast')
|
|
63
|
+
.elementToElement({
|
|
64
|
+
view: element => {
|
|
65
|
+
// For upcast conversion it's enough if we check for element style and verify if it's empty
|
|
66
|
+
// or contains only hidden span element.
|
|
67
|
+
const hasPageBreakBefore = element.getStyle('page-break-before') == 'always';
|
|
68
|
+
const hasPageBreakAfter = element.getStyle('page-break-after') == 'always';
|
|
69
|
+
if (!hasPageBreakBefore && !hasPageBreakAfter) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
// The "page break" div accepts only single child or no child at all.
|
|
73
|
+
if (element.childCount == 1) {
|
|
74
|
+
const viewSpan = element.getChild(0);
|
|
75
|
+
// The child must be the "span" element that is not displayed.
|
|
76
|
+
if (!viewSpan.is('element', 'span') || viewSpan.getStyle('display') != 'none') {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (element.childCount > 1) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return { name: true };
|
|
84
|
+
},
|
|
85
|
+
model: 'pageBreak',
|
|
86
|
+
// This conversion must be checked before <br> conversion because some editors use
|
|
87
|
+
// <br style="page-break-before:always"> as a page break marker.
|
|
88
|
+
converterPriority: 'high'
|
|
89
|
+
});
|
|
90
|
+
editor.commands.add('pageBreak', new PageBreakCommand(editor));
|
|
91
|
+
}
|
|
119
92
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// @returns {module:engine/view/element~Element}
|
|
130
|
-
function toPageBreakWidget( viewElement, writer, label ) {
|
|
131
|
-
writer.setCustomProperty( 'pageBreak', true, viewElement );
|
|
132
|
-
|
|
133
|
-
return toWidget( viewElement, writer, { label } );
|
|
93
|
+
/**
|
|
94
|
+
* Converts a given {@link module:engine/view/element~Element} to a page break widget:
|
|
95
|
+
* * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to
|
|
96
|
+
* recognize the page break widget element.
|
|
97
|
+
* * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.
|
|
98
|
+
*/
|
|
99
|
+
function toPageBreakWidget(viewElement, writer, label) {
|
|
100
|
+
writer.setCustomProperty('pageBreak', true, viewElement);
|
|
101
|
+
return toWidget(viewElement, writer, { label });
|
|
134
102
|
}
|
package/src/pagebreakui.js
CHANGED
|
@@ -1,57 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Copyright (c) 2003-
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* @module page-break/pagebreakui
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
import { Plugin } from 'ckeditor5/src/core';
|
|
11
9
|
import { ButtonView } from 'ckeditor5/src/ui';
|
|
12
|
-
|
|
13
10
|
import pageBreakIcon from '../theme/icons/pagebreak.svg';
|
|
14
|
-
|
|
15
11
|
/**
|
|
16
12
|
* The page break UI plugin.
|
|
17
|
-
*
|
|
18
|
-
* @extends module:core/plugin~Plugin
|
|
19
13
|
*/
|
|
20
14
|
export default class PageBreakUI extends Plugin {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
editor.editing.view.focus();
|
|
52
|
-
} );
|
|
53
|
-
|
|
54
|
-
return view;
|
|
55
|
-
} );
|
|
56
|
-
}
|
|
15
|
+
/**
|
|
16
|
+
* @inheritDoc
|
|
17
|
+
*/
|
|
18
|
+
static get pluginName() {
|
|
19
|
+
return 'PageBreakUI';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @inheritDoc
|
|
23
|
+
*/
|
|
24
|
+
init() {
|
|
25
|
+
const editor = this.editor;
|
|
26
|
+
const t = editor.t;
|
|
27
|
+
// Add pageBreak button to feature components.
|
|
28
|
+
editor.ui.componentFactory.add('pageBreak', locale => {
|
|
29
|
+
const command = editor.commands.get('pageBreak');
|
|
30
|
+
const view = new ButtonView(locale);
|
|
31
|
+
view.set({
|
|
32
|
+
label: t('Page break'),
|
|
33
|
+
icon: pageBreakIcon,
|
|
34
|
+
tooltip: true
|
|
35
|
+
});
|
|
36
|
+
view.bind('isEnabled').to(command, 'isEnabled');
|
|
37
|
+
// Execute command.
|
|
38
|
+
this.listenTo(view, 'execute', () => {
|
|
39
|
+
editor.execute('pageBreak');
|
|
40
|
+
editor.editing.view.focus();
|
|
41
|
+
});
|
|
42
|
+
return view;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
57
45
|
}
|
package/theme/pagebreak.css
CHANGED