@ckeditor/ckeditor5-source-editing 41.0.0 → 41.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/build/source-editing.js +1 -1
- package/lang/translations/he.po +1 -1
- package/package.json +3 -3
- package/src/augmentation.d.ts +9 -1
- package/src/index.d.ts +1 -0
- package/src/sourceediting.d.ts +1 -4
- package/src/sourceediting.js +43 -25
- package/src/sourceeditingconfig.d.ts +34 -0
- package/src/sourceeditingconfig.js +5 -0
- package/src/utils/formathtml.js +25 -0
package/build/source-editing.js
CHANGED
@@ -2,4 +2,4 @@
|
|
2
2
|
/*!
|
3
3
|
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
4
4
|
* For licensing, see LICENSE.md.
|
5
|
-
*/(()=>{var e={821:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var o=i(609),n=i.n(o)()((function(e){return e[1]}));n.push([e.id,'.ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}',""]);const r=n},609:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i=e(t);return t[2]?"@media ".concat(t[2]," {").concat(i,"}"):i})).join("")},t.i=function(e,i,o){"string"==typeof e&&(e=[[null,e,""]]);var n={};if(o)for(var r=0;r<this.length;r++){var a=this[r][0];null!=a&&(n[a]=!0)}for(var s=0;s<e.length;s++){var d=[].concat(e[s]);o&&n[d[0]]||(i&&(d[2]?d[2]="".concat(i," and ").concat(d[2]):d[2]=i),t.push(d))}},t}},62:(e,t,i)=>{"use strict";var o,n=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),a=[];function s(e){for(var t=-1,i=0;i<a.length;i++)if(a[i].identifier===e){t=i;break}return t}function d(e,t){for(var i={},o=[],n=0;n<e.length;n++){var r=e[n],d=t.base?r[0]+t.base:r[0],c=i[d]||0,l="".concat(d," ").concat(c);i[d]=c+1;var u=s(l),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(a[u].references++,a[u].updater(h)):a.push({identifier:l,updater:p(h,t),references:1}),o.push(l)}return o}function c(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var n=i.nc;n&&(o.nonce=n)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var a=r(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var l,u=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join("\n")});function h(e,t,i,o){var n=i?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,n);else{var r=document.createTextNode(n),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(r,a[t]):e.appendChild(r)}}function m(e,t,i){var o=i.css,n=i.media,r=i.sourceMap;if(n?e.setAttribute("media",n):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var g=null,f=0;function p(e,t){var i,o,n;if(t.singleton){var r=f++;i=g||(g=c(t)),o=h.bind(null,i,r,!1),n=h.bind(null,i,r,!0)}else i=c(t),o=m.bind(null,i,t),n=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=n());var i=d(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<i.length;o++){var n=s(i[o]);a[n].references--}for(var r=d(e,t),c=0;c<i.length;c++){var l=s(i[c]);0===a[l].references&&(a[l].updater(),a.splice(l,1))}i=r}}}},704:(e,t,i)=>{e.exports=i(79)("./src/core.js")},273:(e,t,i)=>{e.exports=i(79)("./src/ui.js")},209:(e,t,i)=>{e.exports=i(79)("./src/utils.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(o){var n=t[o];if(void 0!==n)return n.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var o in t)i.o(t,o)&&!i.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0;var o={};(()=>{"use strict";i.r(o),i.d(o,{SourceEditing:()=>h});var e=i(704),t=i(273),n=i(209);function r(e){const t=[{name:"address",isVoid:!1},{name:"article",isVoid:!1},{name:"aside",isVoid:!1},{name:"blockquote",isVoid:!1},{name:"details",isVoid:!1},{name:"dialog",isVoid:!1},{name:"dd",isVoid:!1},{name:"div",isVoid:!1},{name:"dl",isVoid:!1},{name:"dt",isVoid:!1},{name:"fieldset",isVoid:!1},{name:"figcaption",isVoid:!1},{name:"figure",isVoid:!1},{name:"footer",isVoid:!1},{name:"form",isVoid:!1},{name:"h1",isVoid:!1},{name:"h2",isVoid:!1},{name:"h3",isVoid:!1},{name:"h4",isVoid:!1},{name:"h5",isVoid:!1},{name:"h6",isVoid:!1},{name:"header",isVoid:!1},{name:"hgroup",isVoid:!1},{name:"hr",isVoid:!0},{name:"li",isVoid:!1},{name:"main",isVoid:!1},{name:"nav",isVoid:!1},{name:"ol",isVoid:!1},{name:"p",isVoid:!1},{name:"section",isVoid:!1},{name:"table",isVoid:!1},{name:"tbody",isVoid:!1},{name:"td",isVoid:!1},{name:"th",isVoid:!1},{name:"thead",isVoid:!1},{name:"tr",isVoid:!1},{name:"ul",isVoid:!1}],i=t.map((e=>e.name)).join("|"),o=e.replace(new RegExp(`</?(${i})( .*?)?>`,"g"),"\n$&\n").replace(/<br[^>]*>/g,"$&\n").split("\n");let n=0;return o.filter((e=>e.length)).map((e=>function(e,t){return t.some((t=>!t.isVoid&&!!new RegExp(`<${t.name}( .*?)?>`).test(e)))}(e,t)?a(e,n++):function(e,t){return t.some((t=>new RegExp(`</${t.name}>`).test(e)))}(e,t)?a(e,--n):a(e,n))).join("\n")}function a(e,t,i=" "){return`${i.repeat(Math.max(0,t))}${e}`}var s=i(62),d=i.n(s),c=i(821),l={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};d()(c.Z,l);c.Z.locals;const u="SourceEditingMode";class h extends e.Plugin{static get pluginName(){return"SourceEditing"}static get requires(){return[e.PendingActions]}constructor(e){super(e),this.set("isSourceEditingMode",!1),this._elementReplacer=new n.ElementReplacer,this._replacedRoots=new Map,this._dataFromRoots=new Map}init(){const i=this.editor,o=i.t;i.ui.componentFactory.add("sourceEditing",(n=>{const r=new t.ButtonView(n);return r.set({label:o("Source"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>',tooltip:!0,withText:!0,class:"ck-source-editing-button"}),r.bind("isOn").to(this,"isSourceEditingMode"),r.bind("isEnabled").to(this,"isEnabled",i,"isReadOnly",i.plugins.get(e.PendingActions),"hasAny",((e,t,i)=>!!e&&(!t&&!i))),this.listenTo(r,"execute",(()=>{this.isSourceEditingMode=!this.isSourceEditingMode})),r})),this._isAllowedToHandleSourceEditingMode()&&(this.on("change:isSourceEditingMode",((e,t,i)=>{i?(this._hideVisibleDialog(),this._showSourceEditing(),this._disableCommands()):(this._hideSourceEditing(),this._enableCommands())})),this.on("change:isEnabled",((e,t,i)=>this._handleReadOnlyMode(!i))),this.listenTo(i,"change:isReadOnly",((e,t,i)=>this._handleReadOnlyMode(i)))),i.data.on("get",(()=>{this.isSourceEditingMode&&this.updateEditorData()}),{priority:"high"})}afterInit(){const e=this.editor;["RealTimeCollaborativeEditing","CommentsEditing","TrackChangesEditing","RevisionHistory"].some((t=>e.plugins.has(t)))&&console.warn("You initialized the editor with the source editing feature and at least one of the collaboration features. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the collaboration features."),e.plugins.has("RestrictedEditingModeEditing")&&console.warn("You initialized the editor with the source editing feature and restricted editing feature. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the restricted editing feature.")}updateEditorData(){const e=this.editor,t={};for(const[e,i]of this._replacedRoots){const o=this._dataFromRoots.get(e),n=i.dataset.value;o!==n&&(t[e]=n,this._dataFromRoots.set(e,n))}Object.keys(t).length&&e.data.set(t,{batchType:{isUndoable:!0}})}_showSourceEditing(){const e=this.editor,t=e.editing.view,i=e.model;i.change((e=>{e.setSelection(null),e.removeSelectionAttribute(i.document.selection.getAttributeKeys())}));for(const[i,o]of t.domRoots){const r=m(e.data.get({rootName:i})),a=(0,n.createElement)(o.ownerDocument,"textarea",{rows:"1","aria-label":"Source code editing area"}),s=(0,n.createElement)(o.ownerDocument,"div",{class:"ck-source-editing-area","data-value":r},[a]);a.value=r,a.setSelectionRange(0,0),a.addEventListener("input",(()=>{s.dataset.value=a.value,e.ui.update()})),t.change((e=>{const o=t.document.getRoot(i);e.addClass("ck-hidden",o)})),e.ui.setEditableElement("sourceEditing:"+i,a),this._replacedRoots.set(i,s),this._elementReplacer.replace(o,s),this._dataFromRoots.set(i,r)}this._focusSourceEditing()}_hideSourceEditing(){const e=this.editor.editing.view;this.updateEditorData(),e.change((t=>{for(const[i]of this._replacedRoots)t.removeClass("ck-hidden",e.document.getRoot(i))})),this._elementReplacer.restore(),this._replacedRoots.clear(),this._dataFromRoots.clear(),e.focus()}_focusSourceEditing(){const e=this.editor,[t]=this._replacedRoots.values(),i=t.querySelector("textarea");e.editing.view.document.isFocused=!1,i.focus()}_disableCommands(){const e=this.editor;for(const t of e.commands.commands())t.forceDisabled(u)}_enableCommands(){const e=this.editor;for(const t of e.commands.commands())t.clearForceDisabled(u)}_handleReadOnlyMode(e){if(this.isSourceEditingMode)for(const[,t]of this._replacedRoots)t.querySelector("textarea").readOnly=e}_isAllowedToHandleSourceEditingMode(){const e=this.editor.ui.view.editable;return e&&!e.hasExternalElement}_hideVisibleDialog(){if(this.editor.plugins.has("Dialog")){const e=this.editor.plugins.get("Dialog");e.isOpen&&e.hide()}}}function m(e){return function(e){return e.startsWith("<")}(e)?r(e):e}})(),(window.CKEditor5=window.CKEditor5||{}).sourceEditing=o})();
|
5
|
+
*/(()=>{var e={896:(e,t,i)=>{"use strict";i.d(t,{A:()=>r});var o=i(935),n=i.n(o)()((function(e){return e[1]}));n.push([e.id,'.ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}',""]);const r=n},935:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i=e(t);return t[2]?"@media ".concat(t[2]," {").concat(i,"}"):i})).join("")},t.i=function(e,i,o){"string"==typeof e&&(e=[[null,e,""]]);var n={};if(o)for(var r=0;r<this.length;r++){var a=this[r][0];null!=a&&(n[a]=!0)}for(var s=0;s<e.length;s++){var d=[].concat(e[s]);o&&n[d[0]]||(i&&(d[2]?d[2]="".concat(i," and ").concat(d[2]):d[2]=i),t.push(d))}},t}},591:(e,t,i)=>{"use strict";var o,n=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),a=[];function s(e){for(var t=-1,i=0;i<a.length;i++)if(a[i].identifier===e){t=i;break}return t}function d(e,t){for(var i={},o=[],n=0;n<e.length;n++){var r=e[n],d=t.base?r[0]+t.base:r[0],c=i[d]||0,l="".concat(d," ").concat(c);i[d]=c+1;var u=s(l),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(a[u].references++,a[u].updater(h)):a.push({identifier:l,updater:p(h,t),references:1}),o.push(l)}return o}function c(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var n=i.nc;n&&(o.nonce=n)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var a=r(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var l,u=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join("\n")});function h(e,t,i,o){var n=i?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,n);else{var r=document.createTextNode(n),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(r,a[t]):e.appendChild(r)}}function m(e,t,i){var o=i.css,n=i.media,r=i.sourceMap;if(n?e.setAttribute("media",n):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var g=null,f=0;function p(e,t){var i,o,n;if(t.singleton){var r=f++;i=g||(g=c(t)),o=h.bind(null,i,r,!1),n=h.bind(null,i,r,!0)}else i=c(t),o=m.bind(null,i,t),n=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=n());var i=d(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<i.length;o++){var n=s(i[o]);a[n].references--}for(var r=d(e,t),c=0;c<i.length;c++){var l=s(i[c]);0===a[l].references&&(a[l].updater(),a.splice(l,1))}i=r}}}},782:(e,t,i)=>{e.exports=i(237)("./src/core.js")},311:(e,t,i)=>{e.exports=i(237)("./src/ui.js")},584:(e,t,i)=>{e.exports=i(237)("./src/utils.js")},237:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(o){var n=t[o];if(void 0!==n)return n.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var o in t)i.o(t,o)&&!i.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0;var o={};(()=>{"use strict";i.r(o),i.d(o,{SourceEditing:()=>h});var e=i(782),t=i(311),n=i(584);function r(e){const t=[{name:"address",isVoid:!1},{name:"article",isVoid:!1},{name:"aside",isVoid:!1},{name:"blockquote",isVoid:!1},{name:"details",isVoid:!1},{name:"dialog",isVoid:!1},{name:"dd",isVoid:!1},{name:"div",isVoid:!1},{name:"dl",isVoid:!1},{name:"dt",isVoid:!1},{name:"fieldset",isVoid:!1},{name:"figcaption",isVoid:!1},{name:"figure",isVoid:!1},{name:"footer",isVoid:!1},{name:"form",isVoid:!1},{name:"h1",isVoid:!1},{name:"h2",isVoid:!1},{name:"h3",isVoid:!1},{name:"h4",isVoid:!1},{name:"h5",isVoid:!1},{name:"h6",isVoid:!1},{name:"header",isVoid:!1},{name:"hgroup",isVoid:!1},{name:"hr",isVoid:!0},{name:"li",isVoid:!1},{name:"main",isVoid:!1},{name:"nav",isVoid:!1},{name:"ol",isVoid:!1},{name:"p",isVoid:!1},{name:"section",isVoid:!1},{name:"table",isVoid:!1},{name:"tbody",isVoid:!1},{name:"td",isVoid:!1},{name:"th",isVoid:!1},{name:"thead",isVoid:!1},{name:"tr",isVoid:!1},{name:"ul",isVoid:!1}],i=t.map((e=>e.name)).join("|"),o=e.replace(new RegExp(`</?(${i})( .*?)?>`,"g"),"\n$&\n").replace(/<br[^>]*>/g,"$&\n").split("\n");let n=0,r=!1;return o.filter((e=>e.length)).map((e=>(r=function(e,t){return new RegExp("<pre( .*?)?>").test(e)?"first":new RegExp("</pre>").test(e)?"last":("first"===t||"middle"===t)&&"middle"}(e,r),function(e,t){return t.some((t=>!t.isVoid&&!!new RegExp(`<${t.name}( .*?)?>`).test(e)))}(e,t)?a(e,n++):function(e,t){return t.some((t=>new RegExp(`</${t.name}>`).test(e)))}(e,t)?a(e,--n):"middle"===r||"last"===r?e:a(e,n)))).join("\n")}function a(e,t,i=" "){return`${i.repeat(Math.max(0,t))}${e}`}var s=i(591),d=i.n(s),c=i(896),l={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};d()(c.A,l);c.A.locals;const u="SourceEditingMode";class h extends e.Plugin{static get pluginName(){return"SourceEditing"}static get requires(){return[e.PendingActions]}constructor(e){super(e),this.set("isSourceEditingMode",!1),this._elementReplacer=new n.ElementReplacer,this._replacedRoots=new Map,this._dataFromRoots=new Map,e.config.define("sourceEditing.allowCollaborationFeatures",!1)}init(){this._checkCompatibility();const i=this.editor,o=i.t;i.ui.componentFactory.add("sourceEditing",(n=>{const r=new t.ButtonView(n);return r.set({label:o("Source"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>',tooltip:!0,withText:!0,class:"ck-source-editing-button"}),r.bind("isOn").to(this,"isSourceEditingMode"),r.bind("isEnabled").to(this,"isEnabled",i,"isReadOnly",i.plugins.get(e.PendingActions),"hasAny",((e,t,i)=>!!e&&(!t&&!i))),this.listenTo(r,"execute",(()=>{this.isSourceEditingMode=!this.isSourceEditingMode})),r})),this._isAllowedToHandleSourceEditingMode()&&(this.on("change:isSourceEditingMode",((e,t,i)=>{i?(this._hideVisibleDialog(),this._showSourceEditing(),this._disableCommands()):(this._hideSourceEditing(),this._enableCommands())})),this.on("change:isEnabled",((e,t,i)=>this._handleReadOnlyMode(!i))),this.listenTo(i,"change:isReadOnly",((e,t,i)=>this._handleReadOnlyMode(i)))),i.data.on("get",(()=>{this.isSourceEditingMode&&this.updateEditorData()}),{priority:"high"})}updateEditorData(){const e=this.editor,t={};for(const[e,i]of this._replacedRoots){const o=this._dataFromRoots.get(e),n=i.dataset.value;o!==n&&(t[e]=n,this._dataFromRoots.set(e,n))}Object.keys(t).length&&e.data.set(t,{batchType:{isUndoable:!0},suppressErrorInCollaboration:!0})}_checkCompatibility(){const e=this.editor,t=e.config.get("sourceEditing.allowCollaborationFeatures");if(!t&&e.plugins.has("RealTimeCollaborativeEditing"))throw new n.CKEditorError("source-editing-incompatible-with-real-time-collaboration",null);!t&&["CommentsEditing","TrackChangesEditing","RevisionHistory"].some((t=>e.plugins.has(t)))&&console.warn("You initialized the editor with the source editing feature and at least one of the collaboration features. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the collaboration features."),e.plugins.has("RestrictedEditingModeEditing")&&console.warn("You initialized the editor with the source editing feature and restricted editing feature. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the restricted editing feature.")}_showSourceEditing(){const e=this.editor,t=e.editing.view,i=e.model;i.change((e=>{e.setSelection(null),e.removeSelectionAttribute(i.document.selection.getAttributeKeys())}));for(const[i,o]of t.domRoots){const r=m(e.data.get({rootName:i})),a=(0,n.createElement)(o.ownerDocument,"textarea",{rows:"1","aria-label":"Source code editing area"}),s=(0,n.createElement)(o.ownerDocument,"div",{class:"ck-source-editing-area","data-value":r},[a]);a.value=r,a.setSelectionRange(0,0),a.addEventListener("input",(()=>{s.dataset.value=a.value,e.ui.update()})),t.change((e=>{const o=t.document.getRoot(i);e.addClass("ck-hidden",o)})),e.ui.setEditableElement("sourceEditing:"+i,a),this._replacedRoots.set(i,s),this._elementReplacer.replace(o,s),this._dataFromRoots.set(i,r)}this._focusSourceEditing()}_hideSourceEditing(){const e=this.editor.editing.view;this.updateEditorData(),e.change((t=>{for(const[i]of this._replacedRoots)t.removeClass("ck-hidden",e.document.getRoot(i))})),this._elementReplacer.restore(),this._replacedRoots.clear(),this._dataFromRoots.clear(),e.focus()}_focusSourceEditing(){const e=this.editor,[t]=this._replacedRoots.values(),i=t.querySelector("textarea");e.editing.view.document.isFocused=!1,i.focus()}_disableCommands(){const e=this.editor;for(const t of e.commands.commands())t.forceDisabled(u)}_enableCommands(){const e=this.editor;for(const t of e.commands.commands())t.clearForceDisabled(u)}_handleReadOnlyMode(e){if(this.isSourceEditingMode)for(const[,t]of this._replacedRoots)t.querySelector("textarea").readOnly=e}_isAllowedToHandleSourceEditingMode(){const e=this.editor.ui.view.editable;return e&&!e.hasExternalElement}_hideVisibleDialog(){if(this.editor.plugins.has("Dialog")){const e=this.editor.plugins.get("Dialog");e.isOpen&&e.hide()}}}function m(e){return function(e){return e.startsWith("<")}(e)?r(e):e}})(),(window.CKEditor5=window.CKEditor5||{}).sourceEditing=o})();
|
package/lang/translations/he.po
CHANGED
@@ -14,7 +14,7 @@ msgid ""
|
|
14
14
|
msgstr ""
|
15
15
|
"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n"
|
16
16
|
"Language: he\n"
|
17
|
-
"Plural-Forms: nplurals=
|
17
|
+
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n"
|
18
18
|
"Content-Type: text/plain; charset=UTF-8\n"
|
19
19
|
|
20
20
|
msgctxt "The label of the source editing feature toolbar button."
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ckeditor/ckeditor5-source-editing",
|
3
|
-
"version": "41.
|
3
|
+
"version": "41.2.0",
|
4
4
|
"description": "Source editing feature for CKEditor 5.",
|
5
5
|
"keywords": [
|
6
6
|
"ckeditor",
|
@@ -13,8 +13,8 @@
|
|
13
13
|
"type": "module",
|
14
14
|
"main": "src/index.js",
|
15
15
|
"dependencies": {
|
16
|
-
"@ckeditor/ckeditor5-theme-lark": "41.
|
17
|
-
"ckeditor5": "41.
|
16
|
+
"@ckeditor/ckeditor5-theme-lark": "41.2.0",
|
17
|
+
"ckeditor5": "41.2.0"
|
18
18
|
},
|
19
19
|
"author": "CKSource (http://cksource.com/)",
|
20
20
|
"license": "GPL-2.0-or-later",
|
package/src/augmentation.d.ts
CHANGED
@@ -2,8 +2,16 @@
|
|
2
2
|
* @license Copyright (c) 2003-2024, 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
|
-
import type { SourceEditing } from './index.js';
|
5
|
+
import type { SourceEditing, SourceEditingConfig } from './index.js';
|
6
6
|
declare module '@ckeditor/ckeditor5-core' {
|
7
|
+
interface EditorConfig {
|
8
|
+
/**
|
9
|
+
* The configuration of the source editing feature.
|
10
|
+
*
|
11
|
+
* Read more in {@link module:source-editing/sourceeditingconfig~SourceEditingConfig}.
|
12
|
+
*/
|
13
|
+
sourceEditing?: SourceEditingConfig;
|
14
|
+
}
|
7
15
|
interface PluginsMap {
|
8
16
|
[SourceEditing.pluginName]: SourceEditing;
|
9
17
|
}
|
package/src/index.d.ts
CHANGED
package/src/sourceediting.d.ts
CHANGED
@@ -50,14 +50,11 @@ export default class SourceEditing extends Plugin {
|
|
50
50
|
* @inheritDoc
|
51
51
|
*/
|
52
52
|
init(): void;
|
53
|
-
/**
|
54
|
-
* @inheritDoc
|
55
|
-
*/
|
56
|
-
afterInit(): void;
|
57
53
|
/**
|
58
54
|
* Updates the source data in all hidden editing roots.
|
59
55
|
*/
|
60
56
|
updateEditorData(): void;
|
57
|
+
private _checkCompatibility;
|
61
58
|
/**
|
62
59
|
* Creates source editing wrappers that replace each editing root. Each wrapper contains the document source from the corresponding
|
63
60
|
* root.
|
package/src/sourceediting.js
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
/* global console */
|
9
9
|
import { Plugin, PendingActions } from 'ckeditor5/src/core.js';
|
10
10
|
import { ButtonView } from 'ckeditor5/src/ui.js';
|
11
|
-
import { createElement, ElementReplacer } from 'ckeditor5/src/utils.js';
|
11
|
+
import { CKEditorError, createElement, ElementReplacer } from 'ckeditor5/src/utils.js';
|
12
12
|
import { formatHtml } from './utils/formathtml.js';
|
13
13
|
import '../theme/sourceediting.css';
|
14
14
|
import sourceEditingIcon from '../theme/icons/source-editing.svg';
|
@@ -43,11 +43,13 @@ export default class SourceEditing extends Plugin {
|
|
43
43
|
this._elementReplacer = new ElementReplacer();
|
44
44
|
this._replacedRoots = new Map();
|
45
45
|
this._dataFromRoots = new Map();
|
46
|
+
editor.config.define('sourceEditing.allowCollaborationFeatures', false);
|
46
47
|
}
|
47
48
|
/**
|
48
49
|
* @inheritDoc
|
49
50
|
*/
|
50
51
|
init() {
|
52
|
+
this._checkCompatibility();
|
51
53
|
const editor = this.editor;
|
52
54
|
const t = editor.t;
|
53
55
|
editor.ui.componentFactory.add('sourceEditing', locale => {
|
@@ -107,18 +109,54 @@ export default class SourceEditing extends Plugin {
|
|
107
109
|
}, { priority: 'high' });
|
108
110
|
}
|
109
111
|
/**
|
110
|
-
*
|
112
|
+
* Updates the source data in all hidden editing roots.
|
111
113
|
*/
|
112
|
-
|
114
|
+
updateEditorData() {
|
113
115
|
const editor = this.editor;
|
116
|
+
const data = {};
|
117
|
+
for (const [rootName, domSourceEditingElementWrapper] of this._replacedRoots) {
|
118
|
+
const oldData = this._dataFromRoots.get(rootName);
|
119
|
+
const newData = domSourceEditingElementWrapper.dataset.value;
|
120
|
+
// Do not set the data unless some changes have been made in the meantime.
|
121
|
+
// This prevents empty undo steps after switching to the normal editor.
|
122
|
+
if (oldData !== newData) {
|
123
|
+
data[rootName] = newData;
|
124
|
+
this._dataFromRoots.set(rootName, newData);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
if (Object.keys(data).length) {
|
128
|
+
editor.data.set(data, { batchType: { isUndoable: true }, suppressErrorInCollaboration: true });
|
129
|
+
}
|
130
|
+
}
|
131
|
+
_checkCompatibility() {
|
132
|
+
const editor = this.editor;
|
133
|
+
const allowCollaboration = editor.config.get('sourceEditing.allowCollaborationFeatures');
|
134
|
+
if (!allowCollaboration && editor.plugins.has('RealTimeCollaborativeEditing')) {
|
135
|
+
/**
|
136
|
+
* Source editing feature is not fully compatible with real-time collaboration,
|
137
|
+
* and using it may lead to data loss. Please read
|
138
|
+
* {@glink features/source-editing#limitations-and-incompatibilities source editing feature guide} to learn more.
|
139
|
+
*
|
140
|
+
* If you understand the possible risk of data loss, you can enable the source editing
|
141
|
+
* by setting the
|
142
|
+
* {@link module:source-editing/sourceeditingconfig~SourceEditingConfig#allowCollaborationFeatures}
|
143
|
+
* configuration flag to `true`.
|
144
|
+
*
|
145
|
+
* @error source-editing-incompatible-with-real-time-collaboration
|
146
|
+
*/
|
147
|
+
throw new CKEditorError('source-editing-incompatible-with-real-time-collaboration', null);
|
148
|
+
}
|
114
149
|
const collaborationPluginNamesToWarn = [
|
115
|
-
'RealTimeCollaborativeEditing',
|
116
150
|
'CommentsEditing',
|
117
151
|
'TrackChangesEditing',
|
118
152
|
'RevisionHistory'
|
119
153
|
];
|
120
154
|
// Currently, the basic integration with Collaboration Features is to display a warning in the console.
|
121
|
-
|
155
|
+
//
|
156
|
+
// If `allowCollaboration` flag is set, do not show these warnings. If the flag is set, we assume that the integrator read
|
157
|
+
// appropriate section of the guide so there's no use to spam the console with warnings.
|
158
|
+
//
|
159
|
+
if (!allowCollaboration && collaborationPluginNamesToWarn.some(pluginName => editor.plugins.has(pluginName))) {
|
122
160
|
console.warn('You initialized the editor with the source editing feature and at least one of the collaboration features. ' +
|
123
161
|
'Please be advised that the source editing feature may not work, and be careful when editing document source ' +
|
124
162
|
'that contains markers created by the collaboration features.');
|
@@ -130,26 +168,6 @@ export default class SourceEditing extends Plugin {
|
|
130
168
|
'that contains markers created by the restricted editing feature.');
|
131
169
|
}
|
132
170
|
}
|
133
|
-
/**
|
134
|
-
* Updates the source data in all hidden editing roots.
|
135
|
-
*/
|
136
|
-
updateEditorData() {
|
137
|
-
const editor = this.editor;
|
138
|
-
const data = {};
|
139
|
-
for (const [rootName, domSourceEditingElementWrapper] of this._replacedRoots) {
|
140
|
-
const oldData = this._dataFromRoots.get(rootName);
|
141
|
-
const newData = domSourceEditingElementWrapper.dataset.value;
|
142
|
-
// Do not set the data unless some changes have been made in the meantime.
|
143
|
-
// This prevents empty undo steps after switching to the normal editor.
|
144
|
-
if (oldData !== newData) {
|
145
|
-
data[rootName] = newData;
|
146
|
-
this._dataFromRoots.set(rootName, newData);
|
147
|
-
}
|
148
|
-
}
|
149
|
-
if (Object.keys(data).length) {
|
150
|
-
editor.data.set(data, { batchType: { isUndoable: true } });
|
151
|
-
}
|
152
|
-
}
|
153
171
|
/**
|
154
172
|
* Creates source editing wrappers that replace each editing root. Each wrapper contains the document source from the corresponding
|
155
173
|
* root.
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* @module source-editing/sourceeditingconfig
|
7
|
+
*/
|
8
|
+
/**
|
9
|
+
* The configuration of the source editing feature.
|
10
|
+
*
|
11
|
+
* ```ts
|
12
|
+
* ClassicEditor
|
13
|
+
* .create( {
|
14
|
+
* sourceEditing: {
|
15
|
+
* allowCollaborationFeatures: true
|
16
|
+
* }
|
17
|
+
* } )
|
18
|
+
* .then( ... )
|
19
|
+
* .catch( ... );
|
20
|
+
* ```
|
21
|
+
*
|
22
|
+
* See {@link module:core/editor/editorconfig~EditorConfig all editor options}.
|
23
|
+
*/
|
24
|
+
export interface SourceEditingConfig {
|
25
|
+
/**
|
26
|
+
* Set to `true` to enable source editing feature for real-time collaboration.
|
27
|
+
*
|
28
|
+
* Please note that source editing feature is not fully compatible with real-time collaboration and using it may lead to data loss.
|
29
|
+
* {@glink features/source-editing#limitations-and-incompatibilities Read more}.
|
30
|
+
*
|
31
|
+
* @default false
|
32
|
+
*/
|
33
|
+
allowCollaborationFeatures?: boolean;
|
34
|
+
}
|
package/src/utils/formathtml.js
CHANGED
@@ -74,15 +74,20 @@ export function formatHtml(input) {
|
|
74
74
|
// Divide input string into lines, which start with either an opening tag, a closing tag, or just a text.
|
75
75
|
.split('\n');
|
76
76
|
let indentCount = 0;
|
77
|
+
let isPreformattedLine = false;
|
77
78
|
return lines
|
78
79
|
.filter(line => line.length)
|
79
80
|
.map(line => {
|
81
|
+
isPreformattedLine = isPreformattedBlockLine(line, isPreformattedLine);
|
80
82
|
if (isNonVoidOpeningTag(line, elementsToFormat)) {
|
81
83
|
return indentLine(line, indentCount++);
|
82
84
|
}
|
83
85
|
if (isClosingTag(line, elementsToFormat)) {
|
84
86
|
return indentLine(line, --indentCount);
|
85
87
|
}
|
88
|
+
if (isPreformattedLine === 'middle' || isPreformattedLine === 'last') {
|
89
|
+
return line;
|
90
|
+
}
|
86
91
|
return indentLine(line, indentCount);
|
87
92
|
})
|
88
93
|
.join('\n');
|
@@ -126,3 +131,23 @@ function indentLine(line, indentCount, indentChar = ' ') {
|
|
126
131
|
// More about Math.max() here in https://github.com/ckeditor/ckeditor5/issues/10698.
|
127
132
|
return `${indentChar.repeat(Math.max(0, indentCount))}${line}`;
|
128
133
|
}
|
134
|
+
/**
|
135
|
+
* Checks whether a line belongs to a preformatted (`<pre>`) block.
|
136
|
+
*
|
137
|
+
* @param line Line to check.
|
138
|
+
* @param isPreviousLinePreFormatted Information on whether the previous line was preformatted (and how).
|
139
|
+
*/
|
140
|
+
function isPreformattedBlockLine(line, isPreviousLinePreFormatted) {
|
141
|
+
if (new RegExp('<pre( .*?)?>').test(line)) {
|
142
|
+
return 'first';
|
143
|
+
}
|
144
|
+
else if (new RegExp('</pre>').test(line)) {
|
145
|
+
return 'last';
|
146
|
+
}
|
147
|
+
else if (isPreviousLinePreFormatted === 'first' || isPreviousLinePreFormatted === 'middle') {
|
148
|
+
return 'middle';
|
149
|
+
}
|
150
|
+
else {
|
151
|
+
return false;
|
152
|
+
}
|
153
|
+
}
|