@ckeditor/ckeditor5-code-block 29.0.0 → 31.0.0

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.
Files changed (44) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +5 -1
  3. package/build/code-block.js +1 -1
  4. package/build/translations/az.js +1 -0
  5. package/build/translations/cs.js +1 -0
  6. package/build/translations/da.js +1 -0
  7. package/build/translations/de-ch.js +1 -0
  8. package/build/translations/de.js +1 -0
  9. package/build/translations/en-au.js +1 -0
  10. package/build/translations/es.js +1 -0
  11. package/build/translations/et.js +1 -0
  12. package/build/translations/fa.js +1 -0
  13. package/build/translations/fr.js +1 -0
  14. package/build/translations/gl.js +1 -0
  15. package/build/translations/hi.js +1 -0
  16. package/build/translations/hr.js +1 -0
  17. package/build/translations/hu.js +1 -0
  18. package/build/translations/id.js +1 -0
  19. package/build/translations/it.js +1 -0
  20. package/build/translations/ja.js +1 -0
  21. package/build/translations/ko.js +1 -0
  22. package/build/translations/ku.js +1 -0
  23. package/build/translations/lv.js +1 -0
  24. package/build/translations/nl.js +1 -0
  25. package/build/translations/no.js +1 -0
  26. package/build/translations/pl.js +1 -0
  27. package/build/translations/pt-br.js +1 -0
  28. package/build/translations/ro.js +1 -0
  29. package/build/translations/ru.js +1 -0
  30. package/build/translations/sk.js +1 -0
  31. package/build/translations/sr-latn.js +1 -0
  32. package/build/translations/sr.js +1 -0
  33. package/build/translations/th.js +1 -0
  34. package/build/translations/tk.js +1 -0
  35. package/build/translations/tr.js +1 -0
  36. package/build/translations/ug.js +1 -0
  37. package/build/translations/uk.js +1 -0
  38. package/build/translations/zh-cn.js +1 -0
  39. package/build/translations/zh.js +1 -0
  40. package/ckeditor5-metadata.json +31 -0
  41. package/package.json +24 -22
  42. package/src/codeblockediting.js +49 -21
  43. package/CHANGELOG.md +0 -37
  44. package/build/code-block.js.map +0 -1
package/LICENSE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Software License Agreement
2
2
  ==========================
3
3
 
4
- **CKEditor 5 Code Block Feature** – https://github.com/ckeditor/ckeditor5-code-block <br>
4
+ **CKEditor 5 code block feature** – https://github.com/ckeditor/ckeditor5-code-block <br>
5
5
  Copyright (c) 2003-2021, [CKSource](http://cksource.com) Frederico Knabben. 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).
package/README.md CHANGED
@@ -7,9 +7,13 @@ CKEditor 5 code block feature
7
7
 
8
8
  This package implements the code block feature for CKEditor 5.
9
9
 
10
+ ## Demo
11
+
12
+ Check out the [demo in the code block feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/code-blocks.html#demo).
13
+
10
14
  ## Documentation
11
15
 
12
- See the [`@ckeditor/ckeditor5-code-block` package](https://ckeditor.com/docs/ckeditor5/latest/api/code-block.html) page as well as the [Code block feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/code-blocks.html) in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/).
16
+ See the [`@ckeditor/ckeditor5-code-block` package](https://ckeditor.com/docs/ckeditor5/latest/api/code-block.html) page as well as the [code block feature](https://ckeditor.com/docs/ckeditor5/latest/features/code-blocks.html) guide in the [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/).
13
17
 
14
18
  ## License
15
19
 
@@ -2,4 +2,4 @@
2
2
  * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
3
  * For licensing, see LICENSE.md.
4
4
  */
5
- window.CKEditor5=window.CKEditor5||{},window.CKEditor5.codeBlock=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(2)("./src/core.js")},function(e,t,n){e.exports=n(2)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(2)("./src/ui.js")},function(e,t,n){e.exports=n(2)("./src/enter.js")},function(e,t,n){e.exports=n(2)("./src/engine.js")},function(e,t,n){var o=n(7),r=n(8);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(r,i);e.exports=r.locals||{}},function(e,t,n){"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},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]}}(),a=[];function c(e){for(var t=-1,n=0;n<a.length;n++)if(a[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},o=[],r=0;r<e.length;r++){var i=e[r],s=t.base?i[0]+t.base:i[0],l=n[s]||0,d="".concat(s," ").concat(l);n[s]=l+1;var u=c(d),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(a[u].references++,a[u].updater(f)):a.push({identifier:d,updater:h(f,t),references:1}),o.push(d)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var r=n.nc;r&&(o.nonce=r)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var a=i(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 d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function f(e,t,n,o){var r=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,r);else{var i=document.createTextNode(r),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}function g(e,t,n){var o=n.css,r=n.media,i=n.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var m=null,p=0;function h(e,t){var n,o,r;if(t.singleton){var i=p++;n=m||(m=l(t)),o=f.bind(null,n,i,!1),r=f.bind(null,n,i,!0)}else n=l(t),o=g.bind(null,n,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};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 r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var r=c(n[o]);a[r].references--}for(var i=s(e,t),l=0;l<n.length;l++){var d=c(n[l]);0===a[d].references&&(a[d].updater(),a.splice(d,1))}n=i}}}},function(e,t){e.exports=".ck-content pre{padding:1em;color:#353535;background:hsla(0,0%,78%,.3);border:1px solid #c4c4c4;border-radius:2px;text-align:left;direction:ltr;tab-size:4;white-space:pre-wrap;font-style:normal;min-width:200px}.ck-content pre code{background:unset;padding:0;border-radius:0}.ck.ck-editor__editable pre{position:relative}.ck.ck-editor__editable pre[data-language]:after{content:attr(data-language);position:absolute}:root{--ck-color-code-block-label-background:#757575}.ck.ck-editor__editable pre[data-language]:after{top:-1px;right:10px;background:var(--ck-color-code-block-label-background);font-size:10px;font-family:var(--ck-font-face);line-height:16px;padding:var(--ck-spacing-tiny) var(--ck-spacing-medium);color:#fff;white-space:nowrap}.ck.ck-code-block-dropdown .ck-dropdown__panel{max-height:250px;overflow-y:auto;overflow-x:hidden}"},function(e,t,n){"use strict";n.r(t),n.d(t,"CodeBlock",(function(){return x})),n.d(t,"CodeBlockEditing",(function(){return k})),n.d(t,"CodeBlockUI",(function(){return B}));var o=n(0),r=n(4),i=n(5),a=n(1);function c(e){const t=e.t,n=e.config.get("codeBlock.languages");for(const e of n)"Plain text"===e.label&&(e.label=t("Plain text")),void 0===e.class&&(e.class="language-"+e.language);return n}function s(e,t,n){const o={};for(const r of e)"class"===t?o[r[t].split(" ").shift()]=r[n]:o[r[t]]=r[n];return o}function l(e){return e.data.match(/^(\s*)/)[0]}function d(e){const t=e.document.selection,n=[];if(t.isCollapsed)n.push(t.anchor);else{const o=t.getFirstRange().getWalker({ignoreElementEnd:!0,direction:"backward"});for(const{item:t}of o)if(t.is("$textProxy")&&t.parent.is("element","codeBlock")){const o=l(t.textNode),{parent:r,startOffset:i}=t.textNode,a=e.createPositionAt(r,i+o.length);n.push(a)}}return n}function u(e){const t=Object(a.first)(e.getSelectedBlocks());return t&&t.is("element","codeBlock")}class f extends o.Command{constructor(e){super(e),this._lastLanguage=null}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor,n=t.model,o=n.document.selection,r=c(t)[0],i=Array.from(o.getSelectedBlocks()),a=void 0===e.forceValue?!this.value:e.forceValue,s=function(e,t,n){if(e.language)return e.language;if(e.usePreviousLanguageChoice&&t)return t;return n}(e,this._lastLanguage,r.language);n.change(e=>{a?this._applyCodeBlock(e,i,s):this._removeCodeBlock(e,i)})}_getValue(){const e=this.editor.model.document.selection,t=Object(a.first)(e.getSelectedBlocks());return!!!(!t||!t.is("element","codeBlock"))&&t.getAttribute("language")}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,n=Object(a.first)(e.getSelectedBlocks());return!!n&&g(t,n)}_applyCodeBlock(e,t,n){this._lastLanguage=n;const o=this.editor.model.schema,r=t.filter(e=>g(o,e));for(const t of r)e.rename(t,"codeBlock"),e.setAttribute("language",n,t),o.removeDisallowedAttributes([t],e),Array.from(t.getChildren()).filter(e=>!o.checkChild(t,e)).forEach(t=>e.remove(t));r.reverse().forEach((t,n)=>{const o=r[n+1];t.previousSibling===o&&(e.appendElement("softBreak",o),e.merge(e.createPositionBefore(t)))})}_removeCodeBlock(e,t){const n=t.filter(e=>e.is("element","codeBlock"));for(const t of n){const n=e.createRangeOn(t);for(const t of Array.from(n.getItems()).reverse())if(t.is("element","softBreak")&&t.parent.is("element","codeBlock")){const{position:n}=e.split(e.createPositionBefore(t));e.rename(n.nodeAfter,"paragraph"),e.removeAttribute("language",n.nodeAfter),e.remove(t)}e.rename(t,"paragraph"),e.removeAttribute("language",t)}}}function g(e,t){return!t.is("rootElement")&&!e.isLimit(t)&&e.checkChild(t.parent,"codeBlock")}class m extends o.Command{constructor(e){super(e),this._indentSequence=e.config.get("codeBlock.indentSequence")}refresh(){this.isEnabled=this._checkEnabled()}execute(){const e=this.editor.model;e.change(t=>{const n=d(e);for(const e of n)t.insertText(this._indentSequence,e)})}_checkEnabled(){return!!this._indentSequence&&u(this.editor.model.document.selection)}}class p extends o.Command{constructor(e){super(e),this._indentSequence=e.config.get("codeBlock.indentSequence")}refresh(){this.isEnabled=this._checkEnabled()}execute(){const e=this.editor.model;e.change(t=>{const n=d(e);for(const e of n){const n=h(this.editor.model,e,this._indentSequence);n&&t.remove(n)}})}_checkEnabled(){if(!this._indentSequence)return!1;const e=this.editor.model;return!!u(e.document.selection)&&d(e).some(t=>h(e,t,this._indentSequence))}}function h(e,t,n){const o=function(e){let t=e.parent.getChild(e.index);t&&!t.is("element","softBreak")||(t=e.nodeBefore);if(!t||t.is("element","softBreak"))return null;return t}(t);if(!o)return null;const r=l(o),i=r.lastIndexOf(n);if(i+n.length!==r.length)return null;if(-1===i)return null;const{parent:a,startOffset:c}=o;return e.createRange(e.createPositionAt(a,c+i),e.createPositionAt(a,c+i+n.length))}function b(e,t,n=!1){const o=s(t,"language","class"),r=s(t,"language","label");return(t,i,a)=>{const{writer:c,mapper:s,consumable:l}=a;if(!l.consume(i.item,"insert"))return;const d=i.item.getAttribute("language"),u=s.toViewPosition(e.createPositionBefore(i.item)),f={};n&&(f["data-language"]=r[d],f.spellcheck="false");const g=c.createContainerElement("pre",f),m=c.createContainerElement("code",{class:o[d]||null});c.insert(c.createPositionAt(g,0),m),c.insert(u,g),s.bindElements(i.item,m)}}class k extends o.Plugin{static get pluginName(){return"CodeBlockEditing"}static get requires(){return[r.ShiftEnter]}constructor(e){super(e),e.config.define("codeBlock",{languages:[{language:"plaintext",label:"Plain text"},{language:"c",label:"C"},{language:"cs",label:"C#"},{language:"cpp",label:"C++"},{language:"css",label:"CSS"},{language:"diff",label:"Diff"},{language:"html",label:"HTML"},{language:"java",label:"Java"},{language:"javascript",label:"JavaScript"},{language:"php",label:"PHP"},{language:"python",label:"Python"},{language:"ruby",label:"Ruby"},{language:"typescript",label:"TypeScript"},{language:"xml",label:"XML"}],indentSequence:"\t"})}init(){const e=this.editor,t=e.model.schema,n=e.model,o=(e.editing.view,c(e));e.commands.add("codeBlock",new f(e)),e.commands.add("indentCodeBlock",new m(e)),e.commands.add("outdentCodeBlock",new p(e));const r=e=>(t,n)=>{this.editor.commands.get(e).isEnabled&&(this.editor.execute(e),n())};e.keystrokes.set("Tab",r("indentCodeBlock")),e.keystrokes.set("Shift+Tab",r("outdentCodeBlock")),t.register("codeBlock",{allowWhere:"$block",allowChildren:"$text",isBlock:!0,allowAttributes:["language"]}),t.addAttributeCheck(e=>{if(e.endsWith("codeBlock $text"))return!1}),e.model.schema.addChildCheck((e,t)=>{if(e.endsWith("codeBlock")&&t.isObject)return!1}),e.editing.downcastDispatcher.on("insert:codeBlock",b(n,o,!0)),e.data.downcastDispatcher.on("insert:codeBlock",b(n,o)),e.data.downcastDispatcher.on("insert:softBreak",function(e){return(t,n,o)=>{if("codeBlock"!==n.item.parent.name)return;const{writer:r,mapper:i,consumable:a}=o;if(!a.consume(n.item,"insert"))return;const c=i.toViewPosition(e.createPositionBefore(n.item));r.insert(c,r.createText("\n"))}}(n),{priority:"high"}),e.data.upcastDispatcher.on("element:code",function(e,t){const n=s(t,"class","language"),o=t[0].language;return(e,t,r)=>{const i=t.viewItem,a=i.parent;if(!a||!a.is("element","pre"))return;if(t.modelCursor.findAncestor("codeBlock"))return;const{consumable:c,writer:s}=r;if(!c.test(i,{name:!0}))return;const l=s.createElement("codeBlock"),d=[...i.getClassNames()];d.length||d.push("");for(const e of d){const t=n[e];if(t){s.setAttribute("language",t,l);break}}l.hasAttribute("language")||s.setAttribute("language",o,l),r.convertChildren(i,l),r.safeInsert(l,t.modelCursor)&&(c.consume(i,{name:!0}),r.updateConversionResult(l,t))}}(0,o)),e.data.upcastDispatcher.on("text",(e,t,{consumable:n,writer:o})=>{let r=t.modelCursor;if(!n.test(t.viewItem))return;if(!r.findAncestor("codeBlock"))return;n.consume(t.viewItem);const i=t.viewItem.data.split("\n").map(e=>o.createText(e)),a=i[i.length-1];for(const e of i)if(o.insert(e,r),r=r.getShiftedBy(e.offsetSize),e!==a){const e=o.createElement("softBreak");o.insert(e,r),r=o.createPositionAfter(e)}t.modelRange=o.createRange(t.modelCursor,r),t.modelCursor=r}),this.listenTo(e.editing.view.document,"clipboardInput",(t,o)=>{let r=n.createRange(n.document.selection.anchor);if(o.targetRanges&&(r=e.editing.mapper.toModelRange(o.targetRanges[0])),!r.start.parent.is("element","codeBlock"))return;const a=o.dataTransfer.getData("text/plain"),c=new i.UpcastWriter(e.editing.view.document);o.content=function(e,t){const n=e.createDocumentFragment(),o=t.split("\n"),r=o.reduce((t,n,r)=>(t.push(n),r<o.length-1&&t.push(e.createElement("br")),t),[]);return e.appendChild(r,n),n}(c,a)}),this.listenTo(n,"getSelectedContent",(e,[o])=>{const r=o.anchor;!o.isCollapsed&&r.parent.is("element","codeBlock")&&r.hasSameParentAs(o.focus)&&n.change(n=>{const i=e.return;if(i.childCount>1||o.containsEntireContent(r.parent)){const t=n.createElement("codeBlock",r.parent.getAttributes());n.append(i,t);const o=n.createDocumentFragment();n.append(t,o),e.return=o}else{const e=i.getChild(0);t.checkAttribute(e,"code")&&n.setAttribute("code",!0,e)}})})}afterInit(){const e=this.editor,t=e.commands,n=t.get("indent"),o=t.get("outdent");n&&n.registerChildCommand(t.get("indentCodeBlock")),o&&o.registerChildCommand(t.get("outdentCodeBlock")),this.listenTo(e.editing.view.document,"enter",(t,n)=>{e.model.document.selection.getLastPosition().parent.is("element","codeBlock")&&(function(e,t){const n=e.model.document,o=e.editing.view,r=n.selection.getLastPosition(),i=r.nodeAfter;if(t||!n.selection.isCollapsed||!r.isAtStart)return!1;if(!i||!i.is("element","softBreak"))return!1;return e.model.change(t=>{e.execute("enter");const o=n.selection.anchor.parent.previousSibling;t.rename(o,"paragraph"),t.setSelection(o,"in"),e.model.schema.removeDisallowedAttributes([o],t),t.remove(i)}),o.scrollToTheSelection(),!0}(e,n.isSoft)||function(e,t){const n=e.model,o=n.document,r=e.editing.view,i=o.selection.getLastPosition(),a=i.nodeBefore;let c;if(t||!o.selection.isCollapsed||!i.isAtEnd||!a)return!1;if(a.is("element","softBreak"))c=n.createRangeOn(a);else{if(!a.is("$text")||a.data.match(/\S/)||!a.previousSibling||!a.previousSibling.is("element","softBreak"))return!1;c=n.createRange(n.createPositionBefore(a.previousSibling),n.createPositionAfter(a))}return e.model.change(t=>{t.remove(c),e.execute("enter");const n=o.selection.anchor.parent;t.rename(n,"paragraph"),e.model.schema.removeDisallowedAttributes([n],t)}),r.scrollToTheSelection(),!0}(e,n.isSoft)||function(e){const t=e.model.document,n=t.selection.getLastPosition(),o=n.nodeBefore||n.textNode;let r;o&&o.is("$text")&&(r=l(o));e.model.change(n=>{e.execute("shiftEnter"),r&&n.insertText(r,t.selection.anchor)})}(e),n.preventDefault(),t.stop())},{context:"pre"})}}var v=n(3);n(6);class B extends o.Plugin{static get pluginName(){return"CodeBlockUI"}init(){const e=this.editor,t=e.t,n=e.ui.componentFactory,o=c(e);n.add("codeBlock",n=>{const r=e.commands.get("codeBlock"),i=Object(v.createDropdown)(n,v.SplitButtonView),a=i.buttonView;return a.set({label:t("Insert code block"),tooltip:!0,icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M12.87 12.61a.75.75 0 0 1-.089.976l-.085.07-3.154 2.254 3.412 2.414a.75.75 0 0 1 .237.95l-.057.095a.75.75 0 0 1-.95.237l-.096-.058-4.272-3.022-.003-1.223 4.01-2.867a.75.75 0 0 1 1.047.174zm2.795-.231.095.057 4.011 2.867-.003 1.223-4.272 3.022-.095.058a.75.75 0 0 1-.88-.151l-.07-.086-.058-.095a.75.75 0 0 1 .15-.88l.087-.07 3.412-2.414-3.154-2.253-.085-.071a.75.75 0 0 1 .862-1.207zM16 0a2 2 0 0 1 2 2v9.354l-.663-.492-.837-.001V2a.5.5 0 0 0-.5-.5H2a.5.5 0 0 0-.5.5v15a.5.5 0 0 0 .5.5h3.118L7.156 19H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h14zM5.009 15l.003 1H3v-1h2.009zm2.188-2-1.471 1H5v-1h2.197zM10 11v.095L8.668 12H7v-1h3zm4-2v1H7V9h7zm0-2v1H7V7h7zm-4-2v1H5V5h5zM6 3v1H3V3h3z"/></svg>',isToggleable:!0}),a.bind("isOn").to(r,"value",e=>!!e),a.on("execute",()=>{e.execute("codeBlock",{usePreviousLanguageChoice:!0}),e.editing.view.focus()}),i.on("execute",t=>{e.execute("codeBlock",{language:t.source._codeBlockLanguage,forceValue:!0}),e.editing.view.focus()}),i.class="ck-code-block-dropdown",i.bind("isEnabled").to(r),Object(v.addListToDropdown)(i,this._getLanguageListItemDefinitions(o)),i})}_getLanguageListItemDefinitions(e){const t=this.editor.commands.get("codeBlock"),n=new a.Collection;for(const o of e){const e={type:"button",model:new v.Model({_codeBlockLanguage:o.language,label:o.label,withText:!0})};e.model.bind("isOn").to(t,"value",t=>t===e.model._codeBlockLanguage),n.add(e)}return n}}class x extends o.Plugin{static get requires(){return[k,B]}static get pluginName(){return"CodeBlock"}}}]);
5
+ !function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Insert code block","Plain text":"Plain text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.codeBlock=function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(2)("./src/core.js")},function(e,t,n){e.exports=n(2)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(2)("./src/ui.js")},function(e,t,n){e.exports=n(2)("./src/enter.js")},function(e,t,n){e.exports=n(2)("./src/engine.js")},function(e,t,n){var o=n(7),i=n(8);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(i,r);e.exports=i.locals||{}},function(e,t,n){"use strict";var o,i=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 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]}}(),c=[];function a(e){for(var t=-1,n=0;n<c.length;n++)if(c[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},o=[],i=0;i<e.length;i++){var r=e[i],s=t.base?r[0]+t.base:r[0],l=n[s]||0,d="".concat(s," ").concat(l);n[s]=l+1;var u=a(d),g={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(c[u].references++,c[u].updater(g)):c.push({identifier:d,updater:h(g,t),references:1}),o.push(d)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var i=n.nc;i&&(o.nonce=i)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var c=r(e.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function g(e,t,n,o){var i=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,i);else{var r=document.createTextNode(i),c=e.childNodes;c[t]&&e.removeChild(c[t]),c.length?e.insertBefore(r,c[t]):e.appendChild(r)}}function f(e,t,n){var o=n.css,i=n.media,r=n.sourceMap;if(i?e.setAttribute("media",i):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 m=null,p=0;function h(e,t){var n,o,i;if(t.singleton){var r=p++;n=m||(m=l(t)),o=g.bind(null,n,r,!1),i=g.bind(null,n,r,!0)}else n=l(t),o=f.bind(null,n,t),i=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};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 i()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=i());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var i=a(n[o]);c[i].references--}for(var r=s(e,t),l=0;l<n.length;l++){var d=a(n[l]);0===c[d].references&&(c[d].updater(),c.splice(d,1))}n=r}}}},function(e,t){e.exports=".ck-content pre{padding:1em;color:#353535;background:hsla(0,0%,78%,.3);border:1px solid #c4c4c4;border-radius:2px;text-align:left;direction:ltr;tab-size:4;white-space:pre-wrap;font-style:normal;min-width:200px}.ck-content pre code{background:unset;padding:0;border-radius:0}.ck.ck-editor__editable pre{position:relative}.ck.ck-editor__editable pre[data-language]:after{content:attr(data-language);position:absolute}:root{--ck-color-code-block-label-background:#757575}.ck.ck-editor__editable pre[data-language]:after{top:-1px;right:10px;background:var(--ck-color-code-block-label-background);font-size:10px;font-family:var(--ck-font-face);line-height:16px;padding:var(--ck-spacing-tiny) var(--ck-spacing-medium);color:#fff;white-space:nowrap}.ck.ck-code-block-dropdown .ck-dropdown__panel{max-height:250px;overflow-y:auto;overflow-x:hidden}"},function(e,t,n){"use strict";n.r(t),n.d(t,"CodeBlock",(function(){return C})),n.d(t,"CodeBlockEditing",(function(){return v})),n.d(t,"CodeBlockUI",(function(){return x}));var o=n(0),i=n(4),r=n(5),c=n(1);function a(e){const t=e.t,n=e.config.get("codeBlock.languages");for(const e of n)"Plain text"===e.label&&(e.label=t("Plain text")),void 0===e.class&&(e.class="language-"+e.language);return n}function s(e,t,n){const o={};for(const i of e)"class"===t?o[i[t].split(" ").shift()]=i[n]:o[i[t]]=i[n];return o}function l(e){return e.data.match(/^(\s*)/)[0]}function d(e){const t=e.document.selection,n=[];if(t.isCollapsed)n.push(t.anchor);else{const o=t.getFirstRange().getWalker({ignoreElementEnd:!0,direction:"backward"});for(const{item:t}of o)if(t.is("$textProxy")&&t.parent.is("element","codeBlock")){const o=l(t.textNode),{parent:i,startOffset:r}=t.textNode,c=e.createPositionAt(i,r+o.length);n.push(c)}}return n}function u(e){const t=Object(c.first)(e.getSelectedBlocks());return t&&t.is("element","codeBlock")}class g extends o.Command{constructor(e){super(e),this._lastLanguage=null}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor,n=t.model,o=n.document.selection,i=a(t)[0],r=Array.from(o.getSelectedBlocks()),c=void 0===e.forceValue?!this.value:e.forceValue,s=function(e,t,n){if(e.language)return e.language;if(e.usePreviousLanguageChoice&&t)return t;return n}(e,this._lastLanguage,i.language);n.change(e=>{c?this._applyCodeBlock(e,r,s):this._removeCodeBlock(e,r)})}_getValue(){const e=this.editor.model.document.selection,t=Object(c.first)(e.getSelectedBlocks());return!!!(!t||!t.is("element","codeBlock"))&&t.getAttribute("language")}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,n=Object(c.first)(e.getSelectedBlocks());return!!n&&f(t,n)}_applyCodeBlock(e,t,n){this._lastLanguage=n;const o=this.editor.model.schema,i=t.filter(e=>f(o,e));for(const t of i)e.rename(t,"codeBlock"),e.setAttribute("language",n,t),o.removeDisallowedAttributes([t],e),Array.from(t.getChildren()).filter(e=>!o.checkChild(t,e)).forEach(t=>e.remove(t));i.reverse().forEach((t,n)=>{const o=i[n+1];t.previousSibling===o&&(e.appendElement("softBreak",o),e.merge(e.createPositionBefore(t)))})}_removeCodeBlock(e,t){const n=t.filter(e=>e.is("element","codeBlock"));for(const t of n){const n=e.createRangeOn(t);for(const t of Array.from(n.getItems()).reverse())if(t.is("element","softBreak")&&t.parent.is("element","codeBlock")){const{position:n}=e.split(e.createPositionBefore(t));e.rename(n.nodeAfter,"paragraph"),e.removeAttribute("language",n.nodeAfter),e.remove(t)}e.rename(t,"paragraph"),e.removeAttribute("language",t)}}}function f(e,t){return!t.is("rootElement")&&!e.isLimit(t)&&e.checkChild(t.parent,"codeBlock")}class m extends o.Command{constructor(e){super(e),this._indentSequence=e.config.get("codeBlock.indentSequence")}refresh(){this.isEnabled=this._checkEnabled()}execute(){const e=this.editor.model;e.change(t=>{const n=d(e);for(const e of n)t.insertText(this._indentSequence,e)})}_checkEnabled(){return!!this._indentSequence&&u(this.editor.model.document.selection)}}class p extends o.Command{constructor(e){super(e),this._indentSequence=e.config.get("codeBlock.indentSequence")}refresh(){this.isEnabled=this._checkEnabled()}execute(){const e=this.editor.model;e.change(t=>{const n=d(e);for(const e of n){const n=h(this.editor.model,e,this._indentSequence);n&&t.remove(n)}})}_checkEnabled(){if(!this._indentSequence)return!1;const e=this.editor.model;return!!u(e.document.selection)&&d(e).some(t=>h(e,t,this._indentSequence))}}function h(e,t,n){const o=function(e){let t=e.parent.getChild(e.index);t&&!t.is("element","softBreak")||(t=e.nodeBefore);if(!t||t.is("element","softBreak"))return null;return t}(t);if(!o)return null;const i=l(o),r=i.lastIndexOf(n);if(r+n.length!==i.length)return null;if(-1===r)return null;const{parent:c,startOffset:a}=o;return e.createRange(e.createPositionAt(c,a+r),e.createPositionAt(c,a+r+n.length))}function b(e,t,n=!1){const o=s(t,"language","class"),i=s(t,"language","label");return(t,r,c)=>{const{writer:a,mapper:s,consumable:l}=c;if(!l.consume(r.item,"insert"))return;const d=r.item.getAttribute("language"),u=s.toViewPosition(e.createPositionBefore(r.item)),g={};n&&(g["data-language"]=i[d],g.spellcheck="false");const f=a.createContainerElement("pre",g),m=a.createContainerElement("code",{class:o[d]||null});a.insert(a.createPositionAt(f,0),m),a.insert(u,f),s.bindElements(r.item,m)}}class v extends o.Plugin{static get pluginName(){return"CodeBlockEditing"}static get requires(){return[i.ShiftEnter]}constructor(e){super(e),e.config.define("codeBlock",{languages:[{language:"plaintext",label:"Plain text"},{language:"c",label:"C"},{language:"cs",label:"C#"},{language:"cpp",label:"C++"},{language:"css",label:"CSS"},{language:"diff",label:"Diff"},{language:"html",label:"HTML"},{language:"java",label:"Java"},{language:"javascript",label:"JavaScript"},{language:"php",label:"PHP"},{language:"python",label:"Python"},{language:"ruby",label:"Ruby"},{language:"typescript",label:"TypeScript"},{language:"xml",label:"XML"}],indentSequence:"\t"})}init(){const e=this.editor,t=e.model.schema,n=e.model,o=(e.editing.view,a(e));e.commands.add("codeBlock",new g(e)),e.commands.add("indentCodeBlock",new m(e)),e.commands.add("outdentCodeBlock",new p(e));const i=e=>(t,n)=>{this.editor.commands.get(e).isEnabled&&(this.editor.execute(e),n())};e.keystrokes.set("Tab",i("indentCodeBlock")),e.keystrokes.set("Shift+Tab",i("outdentCodeBlock")),t.register("codeBlock",{allowWhere:"$block",allowChildren:"$text",isBlock:!0,allowAttributes:["language"]}),t.addAttributeCheck(e=>{if(e.endsWith("codeBlock $text"))return!1}),e.model.schema.addChildCheck((e,t)=>{if(e.endsWith("codeBlock")&&t.isObject)return!1}),e.editing.downcastDispatcher.on("insert:codeBlock",b(n,o,!0)),e.data.downcastDispatcher.on("insert:codeBlock",b(n,o)),e.data.downcastDispatcher.on("insert:softBreak",function(e){return(t,n,o)=>{if("codeBlock"!==n.item.parent.name)return;const{writer:i,mapper:r,consumable:c}=o;if(!c.consume(n.item,"insert"))return;const a=r.toViewPosition(e.createPositionBefore(n.item));i.insert(a,i.createText("\n"))}}(n),{priority:"high"}),e.data.upcastDispatcher.on("element:code",function(e,t){const n=s(t,"class","language"),o=t[0].language;return(e,t,i)=>{const r=t.viewItem,c=r.parent;if(!c||!c.is("element","pre"))return;if(t.modelCursor.findAncestor("codeBlock"))return;const{consumable:a,writer:s}=i;if(!a.test(r,{name:!0}))return;const l=s.createElement("codeBlock"),d=[...r.getClassNames()];d.length||d.push("");for(const e of d){const t=n[e];if(t){s.setAttribute("language",t,l);break}}l.hasAttribute("language")||s.setAttribute("language",o,l),i.convertChildren(r,l),i.safeInsert(l,t.modelCursor)&&(a.consume(r,{name:!0}),i.updateConversionResult(l,t))}}(0,o)),e.data.upcastDispatcher.on("text",(e,t,{consumable:n,writer:o})=>{let i=t.modelCursor;if(!n.test(t.viewItem))return;if(!i.findAncestor("codeBlock"))return;n.consume(t.viewItem);const r=t.viewItem.data.split("\n").map(e=>o.createText(e)),c=r[r.length-1];for(const e of r)if(o.insert(e,i),i=i.getShiftedBy(e.offsetSize),e!==c){const e=o.createElement("softBreak");o.insert(e,i),i=o.createPositionAfter(e)}t.modelRange=o.createRange(t.modelCursor,i),t.modelCursor=i}),this.listenTo(e.editing.view.document,"clipboardInput",(t,o)=>{let i=n.createRange(n.document.selection.anchor);if(o.targetRanges&&(i=e.editing.mapper.toModelRange(o.targetRanges[0])),!i.start.parent.is("element","codeBlock"))return;const c=o.dataTransfer.getData("text/plain"),a=new r.UpcastWriter(e.editing.view.document);o.content=function(e,t){const n=e.createDocumentFragment(),o=t.split("\n"),i=o.reduce((t,n,i)=>(t.push(n),i<o.length-1&&t.push(e.createElement("br")),t),[]);return e.appendChild(i,n),n}(a,c)}),this.listenTo(n,"getSelectedContent",(e,[o])=>{const i=o.anchor;!o.isCollapsed&&i.parent.is("element","codeBlock")&&i.hasSameParentAs(o.focus)&&n.change(n=>{const r=e.return;if(r.childCount>1||o.containsEntireContent(i.parent)){const t=n.createElement("codeBlock",i.parent.getAttributes());n.append(r,t);const o=n.createDocumentFragment();n.append(t,o),e.return=o}else{const e=r.getChild(0);t.checkAttribute(e,"code")&&n.setAttribute("code",!0,e)}})})}afterInit(){const e=this.editor,t=e.commands,n=t.get("indent"),o=t.get("outdent");n&&n.registerChildCommand(t.get("indentCodeBlock")),o&&o.registerChildCommand(t.get("outdentCodeBlock")),this.listenTo(e.editing.view.document,"enter",(t,n)=>{e.model.document.selection.getLastPosition().parent.is("element","codeBlock")&&(function(e,t){const n=e.model.document,o=e.editing.view,i=n.selection.getLastPosition(),r=i.nodeAfter;if(t||!n.selection.isCollapsed||!i.isAtStart)return!1;if(!B(r))return!1;return e.model.change(t=>{e.execute("enter");const o=n.selection.anchor.parent.previousSibling;t.rename(o,"paragraph"),t.setSelection(o,"in"),e.model.schema.removeDisallowedAttributes([o],t),t.remove(r)}),o.scrollToTheSelection(),!0}(e,n.isSoft)||function(e,t){const n=e.model,o=n.document,i=e.editing.view,r=o.selection.getLastPosition(),c=r.nodeBefore;let a;if(t||!o.selection.isCollapsed||!r.isAtEnd||!c||!c.previousSibling)return!1;if(B(c)&&B(c.previousSibling))a=n.createRange(n.createPositionBefore(c.previousSibling),n.createPositionAfter(c));else if(k(c)&&B(c.previousSibling)&&B(c.previousSibling.previousSibling))a=n.createRange(n.createPositionBefore(c.previousSibling.previousSibling),n.createPositionAfter(c));else{if(!(k(c)&&B(c.previousSibling)&&k(c.previousSibling.previousSibling)&&B(c.previousSibling.previousSibling.previousSibling)))return!1;a=n.createRange(n.createPositionBefore(c.previousSibling.previousSibling.previousSibling),n.createPositionAfter(c))}return e.model.change(t=>{t.remove(a),e.execute("enter");const n=o.selection.anchor.parent;t.rename(n,"paragraph"),e.model.schema.removeDisallowedAttributes([n],t)}),i.scrollToTheSelection(),!0}(e,n.isSoft)||function(e){const t=e.model.document,n=t.selection.getLastPosition(),o=n.nodeBefore||n.textNode;let i;o&&o.is("$text")&&(i=l(o));e.model.change(n=>{e.execute("shiftEnter"),i&&n.insertText(i,t.selection.anchor)})}(e),n.preventDefault(),t.stop())},{context:"pre"})}}function k(e){return e&&e.is("$text")&&!e.data.match(/\S/)}function B(e){return e&&e.is("element","softBreak")}var w=n(3);n(6);class x extends o.Plugin{static get pluginName(){return"CodeBlockUI"}init(){const e=this.editor,t=e.t,n=e.ui.componentFactory,o=a(e);n.add("codeBlock",n=>{const i=e.commands.get("codeBlock"),r=Object(w.createDropdown)(n,w.SplitButtonView),c=r.buttonView;return c.set({label:t("Insert code block"),tooltip:!0,icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M12.87 12.61a.75.75 0 0 1-.089.976l-.085.07-3.154 2.254 3.412 2.414a.75.75 0 0 1 .237.95l-.057.095a.75.75 0 0 1-.95.237l-.096-.058-4.272-3.022-.003-1.223 4.01-2.867a.75.75 0 0 1 1.047.174zm2.795-.231.095.057 4.011 2.867-.003 1.223-4.272 3.022-.095.058a.75.75 0 0 1-.88-.151l-.07-.086-.058-.095a.75.75 0 0 1 .15-.88l.087-.07 3.412-2.414-3.154-2.253-.085-.071a.75.75 0 0 1 .862-1.207zM16 0a2 2 0 0 1 2 2v9.354l-.663-.492-.837-.001V2a.5.5 0 0 0-.5-.5H2a.5.5 0 0 0-.5.5v15a.5.5 0 0 0 .5.5h3.118L7.156 19H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h14zM5.009 15l.003 1H3v-1h2.009zm2.188-2-1.471 1H5v-1h2.197zM10 11v.095L8.668 12H7v-1h3zm4-2v1H7V9h7zm0-2v1H7V7h7zm-4-2v1H5V5h5zM6 3v1H3V3h3z"/></svg>',isToggleable:!0}),c.bind("isOn").to(i,"value",e=>!!e),c.on("execute",()=>{e.execute("codeBlock",{usePreviousLanguageChoice:!0}),e.editing.view.focus()}),r.on("execute",t=>{e.execute("codeBlock",{language:t.source._codeBlockLanguage,forceValue:!0}),e.editing.view.focus()}),r.class="ck-code-block-dropdown",r.bind("isEnabled").to(i),Object(w.addListToDropdown)(r,this._getLanguageListItemDefinitions(o)),r})}_getLanguageListItemDefinitions(e){const t=this.editor.commands.get("codeBlock"),n=new c.Collection;for(const o of e){const e={type:"button",model:new w.Model({_codeBlockLanguage:o.language,label:o.label,withText:!0})};e.model.bind("isOn").to(t,"value",t=>t===e.model._codeBlockLanguage),n.add(e)}return n}}class C extends o.Plugin{static get requires(){return[v,x]}static get pluginName(){return"CodeBlock"}}}]);
@@ -0,0 +1 @@
1
+ !function(n){const o=n.az=n.az||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"Kod blokunu əlavə et","Plain text":"Sadə mətn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(o){const t=o.cs=o.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Vložit blok zdrojového kódu","Plain text":"Prostý text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n.da=n.da||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Indsæt kodeblok","Plain text":"Plain tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const c=n["de-ch"]=n["de-ch"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Insert code block":"Code-Block einfügen","Plain text":"Nur Text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{"Insert code block":"Code-Block einfügen","Plain text":"Nur Text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n["en-au"]=n["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Insert code block","Plain text":"Plain text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const o=n.es=n.es||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"Insertar bloque de código","Plain text":"Texto plano"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Sisesta koodiplokk","Plain text":"Lihtsalt tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"درج بلوک کد","Plain text":"متن ساده"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const o=n.fr=n.fr||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"Insérer un bloc de code","Plain text":"Texte brut"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Inserir bloque de código","Plain text":"Texto simple"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Insert code block","Plain text":"Plain text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.hr=n.hr||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Umetni blok koda","Plain text":"Običan tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.hu=n.hu||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Kód blokk beszúrása","Plain text":"Egyszerű szöveg"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Sisipkan blok kode","Plain text":"Teks mentah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(i){const c=i.it=i.it||{};c.dictionary=Object.assign(c.dictionary||{},{"Insert code block":"Inserisci blocco di codice","Plain text":"Testo semplice"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"コードブロックの挿入","Plain text":"プレインテキスト"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const o=n.ko=n.ko||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"코드 블럭 삽입","Plain text":"평문"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"دانانی خشتەی کۆد","Plain text":"تێکستی سادە"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(t){const i=t.lv=t.lv||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Ievietot koda bloku","Plain text":"Vienkāršs teksts"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n.nl=n.nl||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Codeblok invoegen","Plain text":"Platte tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const o=n.no=n.no||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"Sett inn kodeblokk","Plain text":"Ren tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(t){const n=t.pl=t.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Wstaw blok kodu","Plain text":"Zwykły tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(o){const n=o["pt-br"]=o["pt-br"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Inserir bloco de código","Plain text":"Texto plano"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const o=n.ro=n.ro||{};o.dictionary=Object.assign(o.dictionary||{},{"Insert code block":"Inserează un bloc code","Plain text":"Text simplu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Вставить код","Plain text":"Простой текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(t){const i=t.sk=t.sk||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Vložte blok kódu","Plain text":"Čistý text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Dodaj blok koda","Plain text":"Običan tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Додај блок кода","Plain text":"Обичан текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n.th=n.th||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"เพิ่มโค้ดบล็อก","Plain text":"ข้อความธรรมดา"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(t){const n=t.tk=t.tk||{};n.dictionary=Object.assign(n.dictionary||{},{"Insert code block":"Kod blogyna goýuň","Plain text":"Düz tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const t=n.tr=n.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Insert code block":"Kod bloğu ekle","Plain text":"Düz metin"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"","Plain text":"ساپ تېكىست"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"Вставте блок коду","Plain text":"Простий текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Insert code block":"插入代码块","Plain text":"纯文本"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1 @@
1
+ !function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Insert code block":"插入程式碼區塊","Plain text":"純文字"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -0,0 +1,31 @@
1
+ {
2
+ "plugins": [
3
+ {
4
+ "name": "Code blocks",
5
+ "className": "CodeBlock",
6
+ "description": "Allows for inserting and editing of blocks of pre–formatted code with the programming language assigned.",
7
+ "docs": "features/code-blocks.html",
8
+ "path": "src/codeblock.js",
9
+ "uiComponents": [
10
+ {
11
+ "type": "Button",
12
+ "name": "codeBlock",
13
+ "iconPath": "theme/icons/codeblock.svg"
14
+ }
15
+ ],
16
+ "htmlOutput": [
17
+ {
18
+ "elements": "pre"
19
+ },
20
+ {
21
+ "elements": "code",
22
+ "classes": [
23
+ "*",
24
+ "language-*"
25
+ ],
26
+ "_comment": "By default, the language of the code block is represented as a CSS class prefixed by `language-`. The CSS class name can be customized via the `config.codeBlock.languages` array."
27
+ }
28
+ ]
29
+ }
30
+ ]
31
+ }
package/package.json CHANGED
@@ -1,36 +1,37 @@
1
1
  {
2
2
  "name": "@ckeditor/ckeditor5-code-block",
3
- "version": "29.0.0",
4
- "description": "Code Block feature for CKEditor 5.",
3
+ "version": "31.0.0",
4
+ "description": "Code block feature for CKEditor 5.",
5
5
  "keywords": [
6
6
  "ckeditor",
7
7
  "ckeditor5",
8
8
  "ckeditor 5",
9
9
  "ckeditor5-feature",
10
- "ckeditor5-plugin"
10
+ "ckeditor5-plugin",
11
+ "ckeditor5-dll"
11
12
  ],
12
13
  "main": "src/index.js",
13
14
  "dependencies": {
14
- "ckeditor5": "^29.0.0"
15
+ "ckeditor5": "^31.0.0"
15
16
  },
16
17
  "devDependencies": {
17
- "@ckeditor/ckeditor5-alignment": "^29.0.0",
18
- "@ckeditor/ckeditor5-autoformat": "^29.0.0",
19
- "@ckeditor/ckeditor5-basic-styles": "^29.0.0",
20
- "@ckeditor/ckeditor5-block-quote": "^29.0.0",
21
- "@ckeditor/ckeditor5-clipboard": "^29.0.0",
22
- "@ckeditor/ckeditor5-core": "^29.0.0",
23
- "@ckeditor/ckeditor5-dev-utils": "^25.0.0",
24
- "@ckeditor/ckeditor5-engine": "^29.0.0",
25
- "@ckeditor/ckeditor5-enter": "^29.0.0",
26
- "@ckeditor/ckeditor5-editor-classic": "^29.0.0",
27
- "@ckeditor/ckeditor5-image": "^29.0.0",
28
- "@ckeditor/ckeditor5-indent": "^29.0.0",
29
- "@ckeditor/ckeditor5-markdown-gfm": "^29.0.0",
30
- "@ckeditor/ckeditor5-paragraph": "^29.0.0",
31
- "@ckeditor/ckeditor5-theme-lark": "^29.0.0",
32
- "@ckeditor/ckeditor5-undo": "^29.0.0",
33
- "@ckeditor/ckeditor5-utils": "^29.0.0",
18
+ "@ckeditor/ckeditor5-alignment": "^31.0.0",
19
+ "@ckeditor/ckeditor5-autoformat": "^31.0.0",
20
+ "@ckeditor/ckeditor5-basic-styles": "^31.0.0",
21
+ "@ckeditor/ckeditor5-block-quote": "^31.0.0",
22
+ "@ckeditor/ckeditor5-clipboard": "^31.0.0",
23
+ "@ckeditor/ckeditor5-core": "^31.0.0",
24
+ "@ckeditor/ckeditor5-dev-utils": "^25.4.0",
25
+ "@ckeditor/ckeditor5-engine": "^31.0.0",
26
+ "@ckeditor/ckeditor5-enter": "^31.0.0",
27
+ "@ckeditor/ckeditor5-editor-classic": "^31.0.0",
28
+ "@ckeditor/ckeditor5-image": "^31.0.0",
29
+ "@ckeditor/ckeditor5-indent": "^31.0.0",
30
+ "@ckeditor/ckeditor5-markdown-gfm": "^31.0.0",
31
+ "@ckeditor/ckeditor5-paragraph": "^31.0.0",
32
+ "@ckeditor/ckeditor5-theme-lark": "^31.0.0",
33
+ "@ckeditor/ckeditor5-undo": "^31.0.0",
34
+ "@ckeditor/ckeditor5-utils": "^31.0.0",
34
35
  "webpack": "^4.43.0",
35
36
  "webpack-cli": "^3.3.11"
36
37
  },
@@ -51,7 +52,8 @@
51
52
  "lang",
52
53
  "src",
53
54
  "theme",
54
- "build"
55
+ "build",
56
+ "ckeditor5-metadata.json"
55
57
  ],
56
58
  "scripts": {
57
59
  "dll:build": "webpack"
@@ -219,7 +219,7 @@ export default class CodeBlockEditing extends Plugin {
219
219
 
220
220
  // Customize the response to the <kbd>Enter</kbd> and <kbd>Shift</kbd>+<kbd>Enter</kbd>
221
221
  // key press when the selection is in the code block. Upon enter key press we can either
222
- // leave the block if it's "two enters" in a row or create a new code block line, preserving
222
+ // leave the block if it's "two or three enters" in a row or create a new code block line, preserving
223
223
  // previous line's indentation.
224
224
  this.listenTo( editor.editing.view.document, 'enter', ( evt, data ) => {
225
225
  const positionParent = editor.model.document.selection.getLastPosition().parent;
@@ -301,7 +301,7 @@ function leaveBlockStartOnEnter( editor, isSoftEnter ) {
301
301
  return false;
302
302
  }
303
303
 
304
- if ( !nodeAfter || !nodeAfter.is( 'element', 'softBreak' ) ) {
304
+ if ( !isSoftBreakNode( nodeAfter ) ) {
305
305
  return false;
306
306
  }
307
307
 
@@ -352,42 +352,61 @@ function leaveBlockEndOnEnter( editor, isSoftEnter ) {
352
352
 
353
353
  let emptyLineRangeToRemoveOnEnter;
354
354
 
355
- if ( isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtEnd || !nodeBefore ) {
355
+ if ( isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtEnd || !nodeBefore || !nodeBefore.previousSibling ) {
356
356
  return false;
357
357
  }
358
358
 
359
- // When the position is directly preceded by a soft break
359
+ // When the position is directly preceded by two soft breaks
360
360
  //
361
- // <codeBlock>foo<softBreak></softBreak>[]</codeBlock>
361
+ // <codeBlock>foo<softBreak></softBreak><softBreak></softBreak>[]</codeBlock>
362
362
  //
363
363
  // it creates the following range that will be cleaned up before leaving:
364
364
  //
365
- // <codeBlock>foo[<softBreak></softBreak>]</codeBlock>
365
+ // <codeBlock>foo[<softBreak></softBreak><softBreak></softBreak>]</codeBlock>
366
366
  //
367
- if ( nodeBefore.is( 'element', 'softBreak' ) ) {
368
- emptyLineRangeToRemoveOnEnter = model.createRangeOn( nodeBefore );
367
+ if ( isSoftBreakNode( nodeBefore ) && isSoftBreakNode( nodeBefore.previousSibling ) ) {
368
+ emptyLineRangeToRemoveOnEnter = model.createRange(
369
+ model.createPositionBefore( nodeBefore.previousSibling ), model.createPositionAfter( nodeBefore )
370
+ );
369
371
  }
370
372
 
371
- // When there's some text before the position made purely of white–space characters
373
+ // When there's some text before the position that is
374
+ // preceded by two soft breaks and made purely of white–space characters
375
+ //
376
+ // <codeBlock>foo<softBreak></softBreak><softBreak></softBreak> []</codeBlock>
372
377
  //
373
- // <codeBlock>foo<softBreak></softBreak> []</codeBlock>
378
+ // it creates the following range to clean up before leaving:
374
379
  //
375
- // but NOT when it's the first one of the kind
380
+ // <codeBlock>foo[<softBreak></softBreak><softBreak></softBreak> ]</codeBlock>
376
381
  //
377
- // <codeBlock> []</codeBlock>
382
+ else if (
383
+ isEmptyishTextNode( nodeBefore ) &&
384
+ isSoftBreakNode( nodeBefore.previousSibling ) &&
385
+ isSoftBreakNode( nodeBefore.previousSibling.previousSibling )
386
+ ) {
387
+ emptyLineRangeToRemoveOnEnter = model.createRange(
388
+ model.createPositionBefore( nodeBefore.previousSibling.previousSibling ), model.createPositionAfter( nodeBefore )
389
+ );
390
+ }
391
+
392
+ // When there's some text before the position that is made purely of white–space characters
393
+ // and is preceded by some other text made purely of white–space characters
394
+ //
395
+ // <codeBlock>foo<softBreak></softBreak> <softBreak></softBreak> []</codeBlock>
378
396
  //
379
397
  // it creates the following range to clean up before leaving:
380
398
  //
381
- // <codeBlock>foo[<softBreak></softBreak> ]</codeBlock>
399
+ // <codeBlock>foo[<softBreak></softBreak> <softBreak></softBreak> ]</codeBlock>
382
400
  //
383
401
  else if (
384
- nodeBefore.is( '$text' ) &&
385
- !nodeBefore.data.match( /\S/ ) &&
386
- nodeBefore.previousSibling &&
387
- nodeBefore.previousSibling.is( 'element', 'softBreak' )
402
+ isEmptyishTextNode( nodeBefore ) &&
403
+ isSoftBreakNode( nodeBefore.previousSibling ) &&
404
+ isEmptyishTextNode( nodeBefore.previousSibling.previousSibling ) &&
405
+ isSoftBreakNode( nodeBefore.previousSibling.previousSibling.previousSibling )
388
406
  ) {
389
407
  emptyLineRangeToRemoveOnEnter = model.createRange(
390
- model.createPositionBefore( nodeBefore.previousSibling ), model.createPositionAfter( nodeBefore )
408
+ model.createPositionBefore( nodeBefore.previousSibling.previousSibling.previousSibling ),
409
+ model.createPositionAfter( nodeBefore )
391
410
  );
392
411
  }
393
412
 
@@ -395,8 +414,9 @@ function leaveBlockEndOnEnter( editor, isSoftEnter ) {
395
414
  //
396
415
  // <codeBlock> []</codeBlock>
397
416
  // <codeBlock> a []</codeBlock>
398
- // <codeBlock>foo<softBreak></softBreak>bar[]</codeBlock>
399
- // <codeBlock>foo<softBreak></softBreak> a []</codeBlock>
417
+ // <codeBlock>foo<softBreak></softBreak>[]</codeBlock>
418
+ // <codeBlock>foo<softBreak></softBreak><softBreak></softBreak>bar[]</codeBlock>
419
+ // <codeBlock>foo<softBreak></softBreak><softBreak></softBreak> a []</codeBlock>
400
420
  //
401
421
  else {
402
422
  return false;
@@ -404,7 +424,7 @@ function leaveBlockEndOnEnter( editor, isSoftEnter ) {
404
424
 
405
425
  // We're doing everything in a single change block to have a single undo step.
406
426
  editor.model.change( writer => {
407
- // Remove the last <softBreak> and all white space characters that followed it.
427
+ // Remove the last <softBreak>s and all white space characters that followed them.
408
428
  writer.remove( emptyLineRangeToRemoveOnEnter );
409
429
 
410
430
  // "Clone" the <codeBlock> in the standard way.
@@ -422,3 +442,11 @@ function leaveBlockEndOnEnter( editor, isSoftEnter ) {
422
442
 
423
443
  return true;
424
444
  }
445
+
446
+ function isEmptyishTextNode( node ) {
447
+ return node && node.is( '$text' ) && !node.data.match( /\S/ );
448
+ }
449
+
450
+ function isSoftBreakNode( node ) {
451
+ return node && node.is( 'element', 'softBreak' );
452
+ }
package/CHANGELOG.md DELETED
@@ -1,37 +0,0 @@
1
- Changelog
2
- =========
3
-
4
- All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md.
5
-
6
- Changes for the past releases are available below.
7
-
8
- ## [19.0.0](https://github.com/ckeditor/ckeditor5-code-block/compare/v18.0.0...v19.0.0) (2020-04-29)
9
-
10
- ### Other changes
11
-
12
- * XML and HTML are no longer treated as the same language. Closes [ckeditor/ckeditor5#5794](https://github.com/ckeditor/ckeditor5/issues/5794). ([58a7009](https://github.com/ckeditor/ckeditor5-code-block/commit/58a7009))
13
- * Updated translations. ([5300e22](https://github.com/ckeditor/ckeditor5-code-block/commit/5300e22))
14
-
15
-
16
- ## [18.0.0](https://github.com/ckeditor/ckeditor5-code-block/compare/v17.0.0...v18.0.0) (2020-03-19)
17
-
18
- ### Other changes
19
-
20
- * Updated translations. ([8613554](https://github.com/ckeditor/ckeditor5-code-block/commit/8613554))
21
-
22
-
23
- ## [17.0.0](https://github.com/ckeditor/ckeditor5-code-block/compare/v16.0.0...v17.0.0) (2020-02-19)
24
-
25
- ### Bug fixes
26
-
27
- * It should be possible to use multiple CSS classes in the language configuration. Closes [ckeditor/ckeditor5#5924](https://github.com/ckeditor/ckeditor5/issues/5924). ([dca0fe4](https://github.com/ckeditor/ckeditor5-code-block/commit/dca0fe4))
28
- * Spell checker is now disabled inside code blocks. Closes [ckeditor/ckeditor5#5978](https://github.com/ckeditor/ckeditor5/issues/5978). ([cd03e20](https://github.com/ckeditor/ckeditor5-code-block/commit/cd03e20))
29
-
30
- ### Other changes
31
-
32
- * Updated translations. ([3604224](https://github.com/ckeditor/ckeditor5-code-block/commit/3604224))
33
-
34
-
35
- ## [16.0.0](https://github.com/ckeditor/ckeditor5-code-block/tree/v16.0.0) (2019-12-04)
36
-
37
- The initial release.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack://CKEditor5.codeBlock/webpack/bootstrap","webpack://CKEditor5.codeBlock/./theme/codeblock.css","webpack://CKEditor5.codeBlock//Users/pomek/Projects/ckeditor/ckeditor5/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://CKEditor5.codeBlock/./src/codeblock.js","webpack://CKEditor5.codeBlock/./src/codeblockcommand.js","webpack://CKEditor5.codeBlock/./src/codeblockediting.js","webpack://CKEditor5.codeBlock/./src/codeblockui.js","webpack://CKEditor5.codeBlock/./src/converters.js","webpack://CKEditor5.codeBlock/./src/indentcodeblockcommand.js","webpack://CKEditor5.codeBlock/./src/index.js","webpack://CKEditor5.codeBlock/./src/outdentcodeblockcommand.js","webpack://CKEditor5.codeBlock/./src/utils.js","webpack://CKEditor5.codeBlock/./theme/codeblock.css?0449","webpack://CKEditor5.codeBlock/./theme/icons/codeblock.svg","webpack://CKEditor5.codeBlock/delegated ./core.js from dll-reference CKEditor5.dll","webpack://CKEditor5.codeBlock/delegated ./enter.js from dll-reference CKEditor5.dll","webpack://CKEditor5.codeBlock/delegated ./ui.js from dll-reference CKEditor5.dll","webpack://CKEditor5.codeBlock/delegated ./utils.js from dll-reference CKEditor5.dll","webpack://CKEditor5.codeBlock/external \"CKEditor5.dll\""],"names":[],"mappings":";;;;;;QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;AClFA,kCAAkC,YAAY,cAAc,6BAA6B,yBAAyB,kBAAkB,gBAAgB,cAAc,WAAW,qBAAqB,kBAAkB,gBAAgB,qBAAqB,iBAAiB,UAAU,gBAAgB,4BAA4B,kBAAkB,iDAAiD,4BAA4B,kBAAkB,MAAM,+CAA+C,iDAAiD,SAAS,WAAW,uDAAuD,eAAe,gCAAgC,iBAAiB,wDAAwD,WAAW,mBAAmB,+CAA+C,iBAAiB,gBAAgB,kBAAkB,C;;;;;;;;;;;;ACA70B;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,KAAwC,GAAG,sBAAiB,GAAG,SAAI;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,qEAAqE,qBAAqB,aAAa;;AAEvG;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA,yDAAyD;AACzD,GAAG;;AAEH;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mBAAmB,4BAA4B;AAC/C;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,6BAA6B;AACjD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,E;;;;;;;;;;;;AC5QA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAEM;AACV;;AAExC;AACA;AACA;AACA,sDAAsD,mCAAmC;AACzF,IAAI,qDAAqD;AACzD;AACA,2CAA2C;AAC3C,YAAY,sEAAsE;AAClF;AACA;AACA;AACe,wBAAwB,yDAAM;AAC7C;AACA;AACA;AACA;AACA,WAAW,yDAAgB,EAAE,oDAAW;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,4CAA4C;AACzE;AACA,iBAAiB,kDAAkD;AACnE;AACA,YAAY,4CAA4C;AACxD;;AAEA;AACA,6BAA6B,+DAA+D;AAC5F;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ,sEAAsE;AAC9E;AACA;AACA;;AAEA;AACA,4CAA4C,4DAA4D;AACxG;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,8CAA8C;AACvD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,wDAAwD;AACjE;AACA;AACA,SAAS,mDAAmD;AAC5D;AACA;AACA;AACA,SAAS,8EAA8E;AACvF;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,6CAA6C;AACnD,MAAM,4BAA4B;AAClC,MAAM,8BAA8B;AACpC,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AACtC,MAAM,kCAAkC;AACxC,MAAM,kCAAkC;AACxC,MAAM,kCAAkC;AACxC,MAAM,8CAA8C;AACpD,MAAM,gCAAgC;AACtC,MAAM,sCAAsC;AAC5C,MAAM,kCAAkC;AACxC,MAAM,8CAA8C;AACpD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gEAAgE;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,sEAAsE;AAC1E;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;;;;;;;;;;;;;AC1KA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;AACD;;AAE2B;;AAEvE;AACA;AACA;AACA;AACA;AACe,+BAA+B,0DAAO;AACrD;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,mBAAmB;AAC/D;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,kCAAkC,2FAA4C;AAC9E;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,qBAAqB,iEAAK;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qBAAqB,iEAAK;;AAE1B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,kCAAkC;AAC9C,YAAY,4CAA4C;AACxD,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,YAAY,kCAAkC;AAC9C,YAAY,4CAA4C;AACxD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,WAAW;;AAEvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;AClKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACK;;AAEC;AACY;AACE;AAK/C;AAKK;;AAEtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,+BAA+B,yDAAM;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,8DAAU;AACrB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK,6CAA6C;AAClD,KAAK,4BAA4B;AACjC,KAAK,8BAA8B;AACnC,KAAK,gCAAgC;AACrC,KAAK,gCAAgC;AACrC,KAAK,kCAAkC;AACvC,KAAK,kCAAkC;AACvC,KAAK,kCAAkC;AACvC,KAAK,8CAA8C;AACnD,KAAK,gCAAgC;AACrC,KAAK,sCAAsC;AAC3C,KAAK,kCAAkC;AACvC,KAAK,8CAA8C;AACnD,KAAK;AACL;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC,2FAA4C;;AAE9E;AACA,wCAAwC,yDAAgB;;AAExD;AACA,8CAA8C,+DAAsB;AACpE,+CAA+C,gEAAuB;;AAEtE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,4DAA4D,iFAA6B;AACzF,yDAAyD,iFAA6B;AACtF,yDAAyD,qFAAiC,YAAY,mBAAmB;AACzH,kDAAkD,qFAAiC;;AAEnF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,yBAAyB,oFAAqC;AAC9D;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iCAAiC;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,oEAAqB;AAC5C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iCAAiC;AAC5C,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iCAAiC;AAC5C,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;;;;;;;;;;;;;AC1ZA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACK;AAC4C;;AAEtB;;AAEd;AACzB;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,0BAA0B,yDAAM;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2FAA4C;AAC7E;;AAEA;AACA;AACA,wBAAwB,uEAAc,UAAU,gEAAe;AAC/D;;AAEA;AACA;AACA;AACA,UAAU,kEAAa;AACvB;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI;;AAEJ;AACA;;AAEA,GAAG,0EAAiB;;AAEpB;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,gEAAgE;AAC5E,cAAc;AACd;AACA;AACA;AACA;AACA,8BAA8B,8DAAU;;AAExC;AACA;AACA;AACA,eAAe,sDAAK;AACpB;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACnHA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAKiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,2CAA2C,6BAA6B;AACxE;AACA;AACA;AACA,4EAA4E,YAAY;AACxF;AACA,6BAA6B,qEAAqE;AAClG;AACA,iDAAiD,QAAQ;AACzD;AACA,WAAW,gCAAgC;AAC3C,WAAW,gEAAgE;AAC3E;AACA,WAAW,QAAQ;AACnB;AACA,aAAa,SAAS;AACtB;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qEAAsB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qEAAsB;;AAEjD;AACA,SAAS,6BAA6B;;AAEtC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6BAA6B;AACtD;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA,WAAW,gCAAgC;AAC3C,aAAa,SAAS;AACtB;AACO;AACP;AACA;AACA;AACA;;AAEA,SAAS,6BAA6B;;AAEtC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,QAAQ;AACzD;AACA;AACA;AACA,2CAA2C,6BAA6B;AACxE;AACA,WAAW,6BAA6B;AACxC,WAAW,gEAAgE;AAC3E;AACA,aAAa,SAAS;AACtB;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qEAAsB;AAClD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,SAAS,qBAAqB;;AAE9B,oCAAoC,aAAa,oCAAoC,aAAa;AAClG;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA,mBAAmB,oFAAqC;;AAExD;;AAEA;AACA;AACA;AACA;;AAEA,iCAAiC,aAAa;AAC9C,kCAAkC,aAAa;;AAE/C;AACA;AACA;;;;;;;;;;;;;AC7MA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAK5B;;AAEjB;AACA;AACA;AACA;AACA;AACe,qCAAqC,0DAAO;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,4BAA4B;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,wEAAyB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,0EAA2B;AACpC;AACA;;;;;;;;;;;;;AClGA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEoC;AACc;AACV;;AAEzB;AACf,CAAC,6DAAS;AACV,CAAC,2EAAgB;AACjB,CAAC,iEAAW;AACZ,CAAC,EAAC;;;;;;;;;;;;;ACjBF;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAM5B;;AAEjB;AACA;AACA;AACA;AACA;AACe,sCAAsC,0DAAO;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,4BAA4B;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,wEAAyB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAQ,0EAA2B;AACnC;AACA;;AAEA;AACA;AACA,SAAS,wEAAyB;AAClC;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW,wCAAwC;AACnD,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,oEAAqB;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAQ,sBAAsB;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;AC3LA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAE5C;AACA;AACA;AACA,2DAA2D;AAC3D,oDAAoD,mCAAmC;AACvF;AACA;AACA;AACA;AACA,WAAW,iCAAiC;AAC5C,aAAa,gEAAgE;AAC7E;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,eAAe;AAC1C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uDAAuD;AAC7D,MAAM,2DAA2D;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW;AACX;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,8BAA8B;AACzC,aAAa;AACb;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW,OAAO;AAClB;AACO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa;AACb;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,eAAe,OAAO;AACtB;AACA;AACA,WAAW,sBAAsB;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,wCAAwC;AACnD,aAAa;AACb;AACO;AACP,oBAAoB,iEAAK;;AAEzB;AACA;;;;;;;;;;;;ACxNA,UAAU,mBAAO,CAAC,6JAA8E;AAChG,0BAA0B,mBAAO,CAAC,kJAA+E;;AAEjH;;AAEA;AACA,0BAA0B,QAAS;AACnC;;AAEA,eAAe,+CAA+C;;AAE9D;AACA;;AAEA;;;;AAIA,sC;;;;;;;;;;;;AClBA;AAAe,uzBAAwvB,E;;;;;;;;;;;ACAvwB,0H;;;;;;;;;;;ACAA,2H;;;;;;;;;;;ACAA,wH;;;;;;;;;;;ACAA,2H;;;;;;;;;;;ACAA,+B","file":"code-block.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/index.js\");\n","module.exports = \".ck-content pre{padding:1em;color:#353535;background:hsla(0,0%,78%,.3);border:1px solid #c4c4c4;border-radius:2px;text-align:left;direction:ltr;tab-size:4;white-space:pre-wrap;font-style:normal;min-width:200px}.ck-content pre code{background:unset;padding:0;border-radius:0}.ck.ck-editor__editable pre{position:relative}.ck.ck-editor__editable pre[data-language]:after{content:attr(data-language);position:absolute}:root{--ck-color-code-block-label-background:#757575}.ck.ck-editor__editable pre[data-language]:after{top:-1px;right:10px;background:var(--ck-color-code-block-label-background);font-size:10px;font-family:var(--ck-font-face);line-height:16px;padding:var(--ck-spacing-tiny) var(--ck-spacing-medium);color:#fff;white-space:nowrap}.ck.ck-code-block-dropdown .ck-dropdown__panel{max-height:250px;overflow-y:auto;overflow-x:hidden}\"","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && typeof btoa !== 'undefined') {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/codeblock\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\n\nimport CodeBlockEditing from './codeblockediting';\nimport CodeBlockUI from './codeblockui';\n\n/**\n * The code block plugin.\n *\n * For more information about this feature check the {@glink api/code-block package page} and the\n * {@glink features/code-blocks code block feature guide}.\n *\n * This is a \"glue\" plugin that loads the {@link module:code-block/codeblockediting~CodeBlockEditing code block editing feature}\n * and the {@link module:code-block/codeblockui~CodeBlockUI code block UI feature}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class CodeBlock extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ CodeBlockEditing, CodeBlockUI ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'CodeBlock';\n\t}\n}\n\n/**\n * The configuration of the {@link module:code-block/codeblock~CodeBlock} feature.\n *\n * Read more in {@link module:code-block/codeblock~CodeBlockConfig}.\n *\n * @member {module:code-block/codeblock~CodeBlockConfig} module:core/editor/editorconfig~EditorConfig#codeBlock\n */\n\n/**\n * The configuration of the {@link module:code-block/codeblock~CodeBlock code block feature}.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\tcodeBlock: ... // The code block feature configuration.\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * See {@link module:core/editor/editorconfig~EditorConfig all editor options}.\n *\n * @interface CodeBlockConfig\n */\n\n/**\n * The code block language descriptor. See {@link module:code-block/codeblock~CodeBlockConfig#languages} to learn more.\n *\n *\t\t{\n *\t\t\t language: 'javascript',\n *\t\t\t label: 'JavaScript'\n *\t\t}\n *\n * @typedef {Object} module:code-block/codeblock~CodeBlockLanguageDefinition\n * @property {String} language The name of the language that will be stored in the model attribute. Also, when `class`\n * is not specified, it will be used to create the CSS class associated with the language (prefixed by \"language-\").\n * @property {String} label The human–readable label associated with the language and displayed in the UI.\n * @property {String} [class] The CSS class associated with the language. When not specified the `language`\n * property is used to create a class prefixed by \"language-\".\n */\n\n/**\n * The list of code languages available in the user interface to choose for a particular code block.\n *\n * The language of the code block is represented as a CSS class (by default prefixed by \"language-\") set on the\n * `<code>` element, both when editing and in the editor data. The CSS class associated with the language\n * can be used by third–party code syntax highlighters to detect and apply the correct highlighting.\n *\n * For instance, this language configuration:\n *\n *\t\tClassicEditor\n *\t\t\t.create( document.querySelector( '#editor' ), {\n *\t\t\t\tcodeBlock: {\n *\t\t\t\t\tlanguages: [\n *\t\t\t\t\t\t// ...\n *\t\t\t\t\t\t{ language: 'javascript', label: 'JavaScript' },\n *\t\t\t\t\t\t// ...\n *\t\t\t\t\t]\n *\t\t\t\t}\n *\t\t} )\n *\t\t.then( ... )\n *\t\t.catch( ... );\n *\n * will result in the following structure of JavaScript code blocks in the editor editing and data:\n *\n *\t\t<pre><code class=\"language-javascript\">window.alert( 'Hello world!' )</code></pre>\n *\n * You can customize the CSS class by specifying an optional `class` property in the language definition.\n * You can set **multiple classes** but **only the first one** will be used as defining language class:\n *\n *\t\tClassicEditor\n *\t\t\t.create( document.querySelector( '#editor' ), {\n *\t\t\t\tcodeBlock: {\n *\t\t\t\t\tlanguages: [\n *\t\t\t\t\t\t// Do not render the CSS class for the plain text code blocks.\n *\t\t\t\t\t\t{ language: 'plaintext', label: 'Plain text', class: '' },\n *\n *\t\t\t\t\t\t// Use the \"php-code\" class for PHP code blocks.\n *\t\t\t\t\t\t{ language: 'php', label: 'PHP', class: 'php-code' },\n *\n *\t\t\t\t\t\t// Use the \"js\" class for JavaScript code blocks.\n *\t\t\t\t\t\t// Note that only the first (\"js\") class will determine the language of the block when loading data.\n *\t\t\t\t\t\t{ language: 'javascript', label: 'JavaScript', class: 'js javascript js-code' },\n *\n *\t\t\t\t\t\t// Python code blocks will have the default \"language-python\" CSS class.\n *\t\t\t\t\t\t{ language: 'python', label: 'Python' }\n *\t\t\t\t\t]\n *\t\t\t\t}\n *\t\t} )\n *\t\t.then( ... )\n *\t\t.catch( ... );\n *\n * The default value of the language configuration is as follows:\n *\n *\t\tlanguages: [\n *\t\t\t{ language: 'plaintext', label: 'Plain text' }, // The default language.\n *\t\t\t{ language: 'c', label: 'C' },\n *\t\t\t{ language: 'cs', label: 'C#' },\n *\t\t\t{ language: 'cpp', label: 'C++' },\n *\t\t\t{ language: 'css', label: 'CSS' },\n *\t\t\t{ language: 'diff', label: 'Diff' },\n *\t\t\t{ language: 'html', label: 'HTML' },\n *\t\t\t{ language: 'java', label: 'Java' },\n *\t\t\t{ language: 'javascript', label: 'JavaScript' },\n *\t\t\t{ language: 'php', label: 'PHP' },\n *\t\t\t{ language: 'python', label: 'Python' },\n *\t\t\t{ language: 'ruby', label: 'Ruby' },\n *\t\t\t{ language: 'typescript', label: 'TypeScript' },\n *\t\t\t{ language: 'xml', label: 'XML' }\n *\t\t]\n *\n * **Note**: The first language defined in the configuration is considered the default one. This means it will be\n * applied to code blocks loaded from the data that have no CSS `class` specified (or no matching `class` in the configuration).\n * It will also be used when creating new code blocks using the main UI button. By default it is \"Plain text\".\n *\n * @member {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>} module:code-block/codeblock~CodeBlockConfig#languages\n */\n\n/**\n * A sequence of characters inserted or removed from the code block lines when its indentation\n * is changed by the user, for instance, using <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> keys.\n *\n * The default value is a single tab character (\"\t\", `\\u0009` in Unicode).\n *\n * This configuration is used by `indentCodeBlock` and `outdentCodeBlock` commands (instances of\n * {@link module:code-block/indentcodeblockcommand~IndentCodeBlockCommand}).\n *\n * **Note**: Setting this configuration to `false` will disable the code block indentation commands\n * and associated keystrokes.\n *\n * @member {String} module:code-block/codeblock~CodeBlockConfig#indentSequence\n */\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/codeblockcommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\nimport { first } from 'ckeditor5/src/utils';\n\nimport { getNormalizedAndLocalizedLanguageDefinitions } from './utils';\n\n/**\n * The code block command plugin.\n *\n * @extends module:core/command~Command\n */\nexport default class CodeBlockCommand extends Command {\n\t/**\n\t * Whether the selection starts in a code block.\n\t *\n\t * @observable\n\t * @readonly\n\t * @member {Boolean} #value\n\t */\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tthis.value = this._getValue();\n\t\tthis.isEnabled = this._checkEnabled();\n\t}\n\n\t/**\n\t * Executes the command. When the command {@link #value is on}, all topmost code blocks within\n\t * the selection will be removed. If it is off, all selected blocks will be flattened and\n\t * wrapped by a code block.\n\t *\n\t * @fires execute\n\t * @param {Object} [options] Command options.\n\t * @param {Boolean} [options.forceValue] If set, it will force the command behavior. If `true`, the command will apply a code block,\n\t * otherwise the command will remove the code block. If not set, the command will act basing on its current value.\n\t */\n\texecute( options = {} ) {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst selection = model.document.selection;\n\t\tconst normalizedLanguagesDefs = getNormalizedAndLocalizedLanguageDefinitions( editor );\n\t\tconst firstLanguageInConfig = normalizedLanguagesDefs[ 0 ];\n\n\t\tconst blocks = Array.from( selection.getSelectedBlocks() );\n\t\tconst value = ( options.forceValue === undefined ) ? !this.value : options.forceValue;\n\t\tconst language = options.language || firstLanguageInConfig.language;\n\n\t\tmodel.change( writer => {\n\t\t\tif ( value ) {\n\t\t\t\tthis._applyCodeBlock( writer, blocks, language );\n\t\t\t} else {\n\t\t\t\tthis._removeCodeBlock( writer, blocks );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Checks the command's {@link #value}.\n\t *\n\t * @private\n\t * @returns {Boolean} The current value.\n\t */\n\t_getValue() {\n\t\tconst selection = this.editor.model.document.selection;\n\t\tconst firstBlock = first( selection.getSelectedBlocks() );\n\t\tconst isCodeBlock = !!( firstBlock && firstBlock.is( 'element', 'codeBlock' ) );\n\n\t\treturn isCodeBlock ? firstBlock.getAttribute( 'language' ) : false;\n\t}\n\n\t/**\n\t * Checks whether the command can be enabled in the current context.\n\t *\n\t * @private\n\t * @returns {Boolean} Whether the command should be enabled.\n\t */\n\t_checkEnabled() {\n\t\tif ( this.value ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst selection = this.editor.model.document.selection;\n\t\tconst schema = this.editor.model.schema;\n\n\t\tconst firstBlock = first( selection.getSelectedBlocks() );\n\n\t\tif ( !firstBlock ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn canBeCodeBlock( schema, firstBlock );\n\t}\n\n\t/**\n\t * @private\n\t * @param {module:engine/model/writer~Writer} writer\n\t * @param {Array.<module:engine/model/element~Element>} blocks\n\t * @param {String} [language]\n\t */\n\t_applyCodeBlock( writer, blocks, language ) {\n\t\tconst schema = this.editor.model.schema;\n\t\tconst allowedBlocks = blocks.filter( block => canBeCodeBlock( schema, block ) );\n\n\t\tfor ( const block of allowedBlocks ) {\n\t\t\twriter.rename( block, 'codeBlock' );\n\t\t\twriter.setAttribute( 'language', language, block );\n\t\t\tschema.removeDisallowedAttributes( [ block ], writer );\n\t\t}\n\n\t\tallowedBlocks.reverse().forEach( ( currentBlock, i ) => {\n\t\t\tconst nextBlock = allowedBlocks[ i + 1 ];\n\n\t\t\tif ( currentBlock.previousSibling === nextBlock ) {\n\t\t\t\twriter.appendElement( 'softBreak', nextBlock );\n\t\t\t\twriter.merge( writer.createPositionBefore( currentBlock ) );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @private\n\t * @param {module:engine/model/writer~Writer} writer\n\t * @param {Array.<module:engine/model/element~Element>} blocks\n\t */\n\t_removeCodeBlock( writer, blocks ) {\n\t\tconst codeBlocks = blocks.filter( block => block.is( 'element', 'codeBlock' ) );\n\n\t\tfor ( const block of codeBlocks ) {\n\t\t\tconst range = writer.createRangeOn( block );\n\n\t\t\tfor ( const item of Array.from( range.getItems() ).reverse() ) {\n\t\t\t\tif ( item.is( 'element', 'softBreak' ) && item.parent.is( 'element', 'codeBlock' ) ) {\n\t\t\t\t\tconst { position } = writer.split( writer.createPositionBefore( item ) );\n\n\t\t\t\t\twriter.rename( position.nodeAfter, 'paragraph' );\n\t\t\t\t\twriter.removeAttribute( 'language', position.nodeAfter );\n\t\t\t\t\twriter.remove( item );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twriter.rename( block, 'paragraph' );\n\t\t\twriter.removeAttribute( 'language', block );\n\t\t}\n\t}\n}\n\nfunction canBeCodeBlock( schema, element ) {\n\tif ( element.is( 'rootElement' ) || schema.isLimit( element ) ) {\n\t\treturn false;\n\t}\n\n\treturn schema.checkChild( element.parent, 'codeBlock' );\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/codeblockediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { ShiftEnter } from 'ckeditor5/src/enter';\n\nimport CodeBlockCommand from './codeblockcommand';\nimport IndentCodeBlockCommand from './indentcodeblockcommand';\nimport OutdentCodeBlockCommand from './outdentcodeblockcommand';\nimport {\n\tgetNormalizedAndLocalizedLanguageDefinitions,\n\tgetLeadingWhiteSpaces,\n\trawSnippetTextToModelDocumentFragment\n} from './utils';\nimport {\n\tmodelToViewCodeBlockInsertion,\n\tmodelToDataViewSoftBreakInsertion,\n\tdataViewToModelCodeBlockInsertion\n} from './converters';\n\nconst DEFAULT_ELEMENT = 'paragraph';\n\n/**\n * The editing part of the code block feature.\n *\n * Introduces the `'codeBlock'` command and the `'codeBlock'` model element.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class CodeBlockEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'CodeBlockEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ShiftEnter ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\teditor.config.define( 'codeBlock', {\n\t\t\tlanguages: [\n\t\t\t\t{ language: 'plaintext', label: 'Plain text' },\n\t\t\t\t{ language: 'c', label: 'C' },\n\t\t\t\t{ language: 'cs', label: 'C#' },\n\t\t\t\t{ language: 'cpp', label: 'C++' },\n\t\t\t\t{ language: 'css', label: 'CSS' },\n\t\t\t\t{ language: 'diff', label: 'Diff' },\n\t\t\t\t{ language: 'html', label: 'HTML' },\n\t\t\t\t{ language: 'java', label: 'Java' },\n\t\t\t\t{ language: 'javascript', label: 'JavaScript' },\n\t\t\t\t{ language: 'php', label: 'PHP' },\n\t\t\t\t{ language: 'python', label: 'Python' },\n\t\t\t\t{ language: 'ruby', label: 'Ruby' },\n\t\t\t\t{ language: 'typescript', label: 'TypeScript' },\n\t\t\t\t{ language: 'xml', label: 'XML' }\n\t\t\t],\n\n\t\t\t// A single tab.\n\t\t\tindentSequence: '\\t'\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\t\tconst model = editor.model;\n\n\t\tconst normalizedLanguagesDefs = getNormalizedAndLocalizedLanguageDefinitions( editor );\n\n\t\t// The main command.\n\t\teditor.commands.add( 'codeBlock', new CodeBlockCommand( editor ) );\n\n\t\t// Commands that change the indentation.\n\t\teditor.commands.add( 'indentCodeBlock', new IndentCodeBlockCommand( editor ) );\n\t\teditor.commands.add( 'outdentCodeBlock', new OutdentCodeBlockCommand( editor ) );\n\n\t\tconst getCommandExecuter = commandName => {\n\t\t\treturn ( data, cancel ) => {\n\t\t\t\tconst command = this.editor.commands.get( commandName );\n\n\t\t\t\tif ( command.isEnabled ) {\n\t\t\t\t\tthis.editor.execute( commandName );\n\t\t\t\t\tcancel();\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\n\t\teditor.keystrokes.set( 'Tab', getCommandExecuter( 'indentCodeBlock' ) );\n\t\teditor.keystrokes.set( 'Shift+Tab', getCommandExecuter( 'outdentCodeBlock' ) );\n\n\t\tschema.register( 'codeBlock', {\n\t\t\tallowWhere: '$block',\n\t\t\tisBlock: true,\n\t\t\tallowAttributes: [ 'language' ]\n\t\t} );\n\n\t\tschema.extend( '$text', {\n\t\t\tallowIn: 'codeBlock'\n\t\t} );\n\n\t\t// Disallow all attributes on $text inside `codeBlock`.\n\t\tschema.addAttributeCheck( context => {\n\t\t\tif ( context.endsWith( 'codeBlock $text' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t\t// Conversion.\n\t\teditor.editing.downcastDispatcher.on( 'insert:codeBlock', modelToViewCodeBlockInsertion( model, normalizedLanguagesDefs, true ) );\n\t\teditor.data.downcastDispatcher.on( 'insert:codeBlock', modelToViewCodeBlockInsertion( model, normalizedLanguagesDefs ) );\n\t\teditor.data.downcastDispatcher.on( 'insert:softBreak', modelToDataViewSoftBreakInsertion( model ), { priority: 'high' } );\n\t\teditor.data.upcastDispatcher.on( 'element:pre', dataViewToModelCodeBlockInsertion( editor.editing.view, normalizedLanguagesDefs ) );\n\n\t\t// Intercept the clipboard input (paste) when the selection is anchored in the code block and force the clipboard\n\t\t// data to be pasted as a single plain text. Otherwise, the code lines will split the code block and\n\t\t// \"spill out\" as separate paragraphs.\n\t\tthis.listenTo( editor.editing.view.document, 'clipboardInput', ( evt, data ) => {\n\t\t\tconst modelSelection = model.document.selection;\n\n\t\t\tif ( !modelSelection.anchor.parent.is( 'element', 'codeBlock' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = data.dataTransfer.getData( 'text/plain' );\n\n\t\t\tmodel.change( writer => {\n\t\t\t\tmodel.insertContent( rawSnippetTextToModelDocumentFragment( writer, text ), modelSelection );\n\t\t\t\tevt.stop();\n\t\t\t} );\n\t\t} );\n\n\t\t// Make sure multi–line selection is always wrapped in a code block when `getSelectedContent()`\n\t\t// is used (e.g. clipboard copy). Otherwise, only the raw text will be copied to the clipboard and,\n\t\t// upon next paste, this bare text will not be inserted as a code block, which is not the best UX.\n\t\t// Similarly, when the selection in a single line, the selected content should be an inline code\n\t\t// so it can be pasted later on and retain it's preformatted nature.\n\t\tthis.listenTo( model, 'getSelectedContent', ( evt, [ selection ] ) => {\n\t\t\tconst anchor = selection.anchor;\n\n\t\t\tif ( selection.isCollapsed || !anchor.parent.is( 'element', 'codeBlock' ) || !anchor.hasSameParentAs( selection.focus ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmodel.change( writer => {\n\t\t\t\tconst docFragment = evt.return;\n\n\t\t\t\t// fo[o<softBreak></softBreak>b]ar -> <codeBlock language=\"...\">[o<softBreak></softBreak>b]<codeBlock>\n\t\t\t\tif ( docFragment.childCount > 1 || selection.containsEntireContent( anchor.parent ) ) {\n\t\t\t\t\tconst codeBlock = writer.createElement( 'codeBlock', anchor.parent.getAttributes() );\n\t\t\t\t\twriter.append( docFragment, codeBlock );\n\n\t\t\t\t\tconst newDocumentFragment = writer.createDocumentFragment();\n\t\t\t\t\twriter.append( codeBlock, newDocumentFragment );\n\n\t\t\t\t\tevt.return = newDocumentFragment;\n\t\t\t\t}\n\n\t\t\t\t// \"f[oo]\" -> <$text code=\"true\">oo</text>\n\t\t\t\telse {\n\t\t\t\t\tconst textNode = docFragment.getChild( 0 );\n\n\t\t\t\t\tif ( schema.checkAttribute( textNode, 'code' ) ) {\n\t\t\t\t\t\twriter.setAttribute( 'code', true, textNode );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tafterInit() {\n\t\tconst editor = this.editor;\n\t\tconst commands = editor.commands;\n\t\tconst indent = commands.get( 'indent' );\n\t\tconst outdent = commands.get( 'outdent' );\n\n\t\tif ( indent ) {\n\t\t\tindent.registerChildCommand( commands.get( 'indentCodeBlock' ) );\n\t\t}\n\n\t\tif ( outdent ) {\n\t\t\toutdent.registerChildCommand( commands.get( 'outdentCodeBlock' ) );\n\t\t}\n\n\t\t// Customize the response to the <kbd>Enter</kbd> and <kbd>Shift</kbd>+<kbd>Enter</kbd>\n\t\t// key press when the selection is in the code block. Upon enter key press we can either\n\t\t// leave the block if it's \"two enters\" in a row or create a new code block line, preserving\n\t\t// previous line's indentation.\n\t\tthis.listenTo( editor.editing.view.document, 'enter', ( evt, data ) => {\n\t\t\tconst positionParent = editor.model.document.selection.getLastPosition().parent;\n\n\t\t\tif ( !positionParent.is( 'element', 'codeBlock' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !leaveBlockStartOnEnter( editor, data.isSoft ) && !leaveBlockEndOnEnter( editor, data.isSoft ) ) {\n\t\t\t\tbreakLineOnEnter( editor );\n\t\t\t}\n\n\t\t\tdata.preventDefault();\n\t\t\tevt.stop();\n\t\t} );\n\t}\n}\n\n// Normally, when the Enter (or Shift+Enter) key is pressed, a soft line break is to be added to the\n// code block. Let's try to follow the indentation of the previous line when possible, for instance:\n//\n//\t\t// Before pressing enter (or shift enter)\n//\t\t<codeBlock>\n//\t\t\" foo()\"[] // Indent of 4 spaces.\n//\t\t</codeBlock>\n//\n//\t\t// After pressing:\n//\t\t<codeBlock>\n//\t\t\" foo()\" // Indent of 4 spaces.\n//\t\t<softBreak></softBreak> // A new soft break created by pressing enter.\n//\t\t\" \"[] // Retain the indent of 4 spaces.\n//\t\t</codeBlock>\n//\n// @param {module:core/editor/editor~Editor} editor\nfunction breakLineOnEnter( editor ) {\n\tconst model = editor.model;\n\tconst modelDoc = model.document;\n\tconst lastSelectionPosition = modelDoc.selection.getLastPosition();\n\tconst node = lastSelectionPosition.nodeBefore || lastSelectionPosition.textNode;\n\tlet leadingWhiteSpaces;\n\n\t// Figure out the indentation (white space chars) at the beginning of the line.\n\tif ( node && node.is( '$text' ) ) {\n\t\tleadingWhiteSpaces = getLeadingWhiteSpaces( node );\n\t}\n\n\t// Keeping everything in a change block for a single undo step.\n\teditor.model.change( writer => {\n\t\teditor.execute( 'shiftEnter' );\n\n\t\t// If the line before being broken in two had some indentation, let's retain it\n\t\t// in the new line.\n\t\tif ( leadingWhiteSpaces ) {\n\t\t\twriter.insertText( leadingWhiteSpaces, modelDoc.selection.anchor );\n\t\t}\n\t} );\n}\n\n// Leave the code block when Enter (but NOT Shift+Enter) has been pressed twice at the beginning\n// of the code block:\n//\n//\t\t// Before:\n//\t\t<codeBlock>[]<softBreak></softBreak>foo</codeBlock>\n//\n//\t\t// After pressing:\n//\t\t<paragraph>[]</paragraph><codeBlock>foo</codeBlock>\n//\n// @param {module:core/editor/editor~Editor} editor\n// @param {Boolean} isSoftEnter When `true`, enter was pressed along with <kbd>Shift</kbd>.\n// @returns {Boolean} `true` when selection left the block. `false` if stayed.\nfunction leaveBlockStartOnEnter( editor, isSoftEnter ) {\n\tconst model = editor.model;\n\tconst modelDoc = model.document;\n\tconst view = editor.editing.view;\n\tconst lastSelectionPosition = modelDoc.selection.getLastPosition();\n\tconst nodeAfter = lastSelectionPosition.nodeAfter;\n\n\tif ( isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtStart ) {\n\t\treturn false;\n\t}\n\n\tif ( !nodeAfter || !nodeAfter.is( 'element', 'softBreak' ) ) {\n\t\treturn false;\n\t}\n\n\t// We're doing everything in a single change block to have a single undo step.\n\teditor.model.change( writer => {\n\t\t// \"Clone\" the <codeBlock> in the standard way.\n\t\teditor.execute( 'enter' );\n\n\t\t// The cloned block exists now before the original code block.\n\t\tconst newBlock = modelDoc.selection.anchor.parent.previousSibling;\n\n\t\t// Make the cloned <codeBlock> a regular <paragraph> (with clean attributes, so no language).\n\t\twriter.rename( newBlock, DEFAULT_ELEMENT );\n\t\twriter.setSelection( newBlock, 'in' );\n\t\teditor.model.schema.removeDisallowedAttributes( [ newBlock ], writer );\n\n\t\t// Remove the <softBreak> that originally followed the selection position.\n\t\twriter.remove( nodeAfter );\n\t} );\n\n\t// Eye candy.\n\tview.scrollToTheSelection();\n\n\treturn true;\n}\n\n// Leave the code block when Enter (but NOT Shift+Enter) has been pressed twice at the end\n// of the code block:\n//\n//\t\t// Before:\n//\t\t<codeBlock>foo[]</codeBlock>\n//\n//\t\t// After first press:\n//\t\t<codeBlock>foo<softBreak></softBreak>[]</codeBlock>\n//\n//\t\t// After second press:\n//\t\t<codeBlock>foo</codeBlock><paragraph>[]</paragraph>\n//\n// @param {module:core/editor/editor~Editor} editor\n// @param {Boolean} isSoftEnter When `true`, enter was pressed along with <kbd>Shift</kbd>.\n// @returns {Boolean} `true` when selection left the block. `false` if stayed.\nfunction leaveBlockEndOnEnter( editor, isSoftEnter ) {\n\tconst model = editor.model;\n\tconst modelDoc = model.document;\n\tconst view = editor.editing.view;\n\tconst lastSelectionPosition = modelDoc.selection.getLastPosition();\n\tconst nodeBefore = lastSelectionPosition.nodeBefore;\n\n\tlet emptyLineRangeToRemoveOnEnter;\n\n\tif ( isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtEnd || !nodeBefore ) {\n\t\treturn false;\n\t}\n\n\t// When the position is directly preceded by a soft break\n\t//\n\t//\t\t<codeBlock>foo<softBreak></softBreak>[]</codeBlock>\n\t//\n\t// it creates the following range that will be cleaned up before leaving:\n\t//\n\t//\t\t<codeBlock>foo[<softBreak></softBreak>]</codeBlock>\n\t//\n\tif ( nodeBefore.is( 'element', 'softBreak' ) ) {\n\t\temptyLineRangeToRemoveOnEnter = model.createRangeOn( nodeBefore );\n\t}\n\n\t// When there's some text before the position made purely of white–space characters\n\t//\n\t//\t\t<codeBlock>foo<softBreak></softBreak> []</codeBlock>\n\t//\n\t// but NOT when it's the first one of the kind\n\t//\n\t//\t\t<codeBlock> []</codeBlock>\n\t//\n\t// it creates the following range to clean up before leaving:\n\t//\n\t//\t\t<codeBlock>foo[<softBreak></softBreak> ]</codeBlock>\n\t//\n\telse if (\n\t\tnodeBefore.is( '$text' ) &&\n\t\t!nodeBefore.data.match( /\\S/ ) &&\n\t\tnodeBefore.previousSibling &&\n\t\tnodeBefore.previousSibling.is( 'element', 'softBreak' )\n\t) {\n\t\temptyLineRangeToRemoveOnEnter = model.createRange(\n\t\t\tmodel.createPositionBefore( nodeBefore.previousSibling ), model.createPositionAfter( nodeBefore )\n\t\t);\n\t}\n\n\t// Not leaving the block in the following cases:\n\t//\n\t//\t\t<codeBlock> []</codeBlock>\n\t//\t\t<codeBlock> a []</codeBlock>\n\t//\t\t<codeBlock>foo<softBreak></softBreak>bar[]</codeBlock>\n\t//\t\t<codeBlock>foo<softBreak></softBreak> a []</codeBlock>\n\t//\n\telse {\n\t\treturn false;\n\t}\n\n\t// We're doing everything in a single change block to have a single undo step.\n\teditor.model.change( writer => {\n\t\t// Remove the last <softBreak> and all white space characters that followed it.\n\t\twriter.remove( emptyLineRangeToRemoveOnEnter );\n\n\t\t// \"Clone\" the <codeBlock> in the standard way.\n\t\teditor.execute( 'enter' );\n\n\t\tconst newBlock = modelDoc.selection.anchor.parent;\n\n\t\t// Make the cloned <codeBlock> a regular <paragraph> (with clean attributes, so no language).\n\t\twriter.rename( newBlock, DEFAULT_ELEMENT );\n\t\teditor.model.schema.removeDisallowedAttributes( [ newBlock ], writer );\n\t} );\n\n\t// Eye candy.\n\tview.scrollToTheSelection();\n\n\treturn true;\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/codeblockui\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { Collection } from 'ckeditor5/src/utils';\nimport { Model, SplitButtonView, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\n\nimport { getNormalizedAndLocalizedLanguageDefinitions } from './utils';\n\nimport codeBlockIcon from '../theme/icons/codeblock.svg';\nimport '../theme/codeblock.css';\n\n/**\n * The code block UI plugin.\n *\n * Introduces the `'codeBlock'` dropdown.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class CodeBlockUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'CodeBlockUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst componentFactory = editor.ui.componentFactory;\n\t\tconst normalizedLanguageDefs = getNormalizedAndLocalizedLanguageDefinitions( editor );\n\t\tconst defaultLanguageDefinition = normalizedLanguageDefs[ 0 ];\n\n\t\tcomponentFactory.add( 'codeBlock', locale => {\n\t\t\tconst command = editor.commands.get( 'codeBlock' );\n\t\t\tconst dropdownView = createDropdown( locale, SplitButtonView );\n\t\t\tconst splitButtonView = dropdownView.buttonView;\n\n\t\t\tsplitButtonView.set( {\n\t\t\t\tlabel: t( 'Insert code block' ),\n\t\t\t\ttooltip: true,\n\t\t\t\ticon: codeBlockIcon,\n\t\t\t\tisToggleable: true\n\t\t\t} );\n\n\t\t\tsplitButtonView.bind( 'isOn' ).to( command, 'value', value => !!value );\n\n\t\t\tsplitButtonView.on( 'execute', () => {\n\t\t\t\teditor.execute( 'codeBlock', {\n\t\t\t\t\tlanguage: defaultLanguageDefinition.language\n\t\t\t\t} );\n\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\tdropdownView.on( 'execute', evt => {\n\t\t\t\teditor.execute( 'codeBlock', {\n\t\t\t\t\tlanguage: evt.source._codeBlockLanguage,\n\t\t\t\t\tforceValue: true\n\t\t\t\t} );\n\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\tdropdownView.class = 'ck-code-block-dropdown';\n\t\t\tdropdownView.bind( 'isEnabled' ).to( command );\n\n\t\t\taddListToDropdown( dropdownView, this._getLanguageListItemDefinitions( normalizedLanguageDefs ) );\n\n\t\t\treturn dropdownView;\n\t\t} );\n\t}\n\n\t/**\n\t * A helper returning a collection of the `codeBlock` dropdown items representing languages\n\t * available for the user to choose from.\n\t *\n\t * @private\n\t * @param {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>} normalizedLanguageDefs\n\t * @returns {Iterable.<module:ui/dropdown/utils~ListDropdownItemDefinition>}\n\t */\n\t_getLanguageListItemDefinitions( normalizedLanguageDefs ) {\n\t\tconst editor = this.editor;\n\t\tconst command = editor.commands.get( 'codeBlock' );\n\t\tconst itemDefinitions = new Collection();\n\n\t\tfor ( const languageDef of normalizedLanguageDefs ) {\n\t\t\tconst definition = {\n\t\t\t\ttype: 'button',\n\t\t\t\tmodel: new Model( {\n\t\t\t\t\t_codeBlockLanguage: languageDef.language,\n\t\t\t\t\tlabel: languageDef.label,\n\t\t\t\t\twithText: true\n\t\t\t\t} )\n\t\t\t};\n\n\t\t\tdefinition.model.bind( 'isOn' ).to( command, 'value', value => {\n\t\t\t\treturn value === definition.model._codeBlockLanguage;\n\t\t\t} );\n\n\t\t\titemDefinitions.add( definition );\n\t\t}\n\n\t\treturn itemDefinitions;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/converters\n */\n\nimport {\n\trawSnippetTextToModelDocumentFragment,\n\tgetPropertyAssociation\n} from './utils';\n\n/**\n * A model-to-view (both editing and data) converter for the `codeBlock` element.\n *\n * Sample input:\n *\n *\t\t<codeBlock language=\"javascript\">foo();<softBreak></softBreak>bar();</codeBlock>\n *\n * Sample output (editing):\n *\n *\t\t<pre data-language=\"JavaScript\"><code class=\"language-javascript\">foo();<br />bar();</code></pre>\n *\n * Sample output (data, see {@link module:code-block/converters~modelToDataViewSoftBreakInsertion}):\n *\n *\t\t<pre><code class=\"language-javascript\">foo();\\nbar();</code></pre>\n *\n * @param {module:engine/model/model~Model} model\n * @param {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>} languageDefs The normalized language\n * configuration passed to the feature.\n * @param {Boolean} [useLabels=false] When `true`, the `<pre>` element will get a `data-language` attribute with a\n * human–readable label of the language. Used only in the editing.\n * @returns {Function} Returns a conversion callback.\n */\nexport function modelToViewCodeBlockInsertion( model, languageDefs, useLabels = false ) {\n\t// Language CSS classes:\n\t//\n\t//\t\t{\n\t//\t\t\tphp: 'language-php',\n\t//\t\t\tpython: 'language-python',\n\t//\t\t\tjavascript: 'js',\n\t//\t\t\t...\n\t//\t\t}\n\tconst languagesToClasses = getPropertyAssociation( languageDefs, 'language', 'class' );\n\n\t// Language labels:\n\t//\n\t//\t\t{\n\t//\t\t\tphp: 'PHP',\n\t//\t\t\tpython: 'Python',\n\t//\t\t\tjavascript: 'JavaScript',\n\t//\t\t\t...\n\t//\t\t}\n\tconst languagesToLabels = getPropertyAssociation( languageDefs, 'language', 'label' );\n\n\treturn ( evt, data, conversionApi ) => {\n\t\tconst { writer, mapper, consumable } = conversionApi;\n\n\t\tif ( !consumable.consume( data.item, 'insert' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst codeBlockLanguage = data.item.getAttribute( 'language' );\n\t\tconst targetViewPosition = mapper.toViewPosition( model.createPositionBefore( data.item ) );\n\t\tconst preAttributes = {};\n\n\t\t// Attributes added only in the editing view.\n\t\tif ( useLabels ) {\n\t\t\tpreAttributes[ 'data-language' ] = languagesToLabels[ codeBlockLanguage ];\n\t\t\tpreAttributes.spellcheck = 'false';\n\t\t}\n\n\t\tconst pre = writer.createContainerElement( 'pre', preAttributes );\n\t\tconst code = writer.createContainerElement( 'code', {\n\t\t\tclass: languagesToClasses[ codeBlockLanguage ] || null\n\t\t} );\n\n\t\twriter.insert( writer.createPositionAt( pre, 0 ), code );\n\t\twriter.insert( targetViewPosition, pre );\n\t\tmapper.bindElements( data.item, code );\n\t};\n}\n\n/**\n * A model-to-data view converter for the new line (`softBreak`) separator.\n *\n * Sample input:\n *\n *\t\t<codeBlock ...>foo();<softBreak></softBreak>bar();</codeBlock>\n *\n * Sample output:\n *\n *\t\t<pre><code ...>foo();\\nbar();</code></pre>\n *\n * @param {module:engine/model/model~Model} model\n * @returns {Function} Returns a conversion callback.\n */\nexport function modelToDataViewSoftBreakInsertion( model ) {\n\treturn ( evt, data, conversionApi ) => {\n\t\tif ( data.item.parent.name !== 'codeBlock' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { writer, mapper, consumable } = conversionApi;\n\n\t\tif ( !consumable.consume( data.item, 'insert' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst position = mapper.toViewPosition( model.createPositionBefore( data.item ) );\n\n\t\twriter.insert( position, writer.createText( '\\n' ) );\n\t};\n}\n\n/**\n * A view-to-model converter for `<pre>` with the `<code>` HTML.\n *\n * Sample input:\n *\n *\t\t<pre><code class=\"language-javascript\">foo();\\nbar();</code></pre>\n *\n * Sample output:\n *\n *\t\t<codeBlock language=\"javascript\">foo();<softBreak></softBreak>bar();</codeBlock>\n *\n * @param {module:engine/view/view~View} editingView\n * @param {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>} languageDefs The normalized language\n * configuration passed to the feature.\n * @returns {Function} Returns a conversion callback.\n */\nexport function dataViewToModelCodeBlockInsertion( editingView, languageDefs ) {\n\t// Language names associated with CSS classes:\n\t//\n\t//\t\t{\n\t//\t\t\t'language-php': 'php',\n\t//\t\t\t'language-python': 'python',\n\t//\t\t\tjs: 'javascript',\n\t//\t\t\t...\n\t//\t\t}\n\tconst classesToLanguages = getPropertyAssociation( languageDefs, 'class', 'language' );\n\tconst defaultLanguageName = languageDefs[ 0 ].language;\n\n\treturn ( evt, data, conversionApi ) => {\n\t\tconst viewItem = data.viewItem;\n\t\tconst viewChild = viewItem.getChild( 0 );\n\n\t\tif ( !viewChild || !viewChild.is( 'element', 'code' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { consumable, writer } = conversionApi;\n\n\t\tif ( !consumable.test( viewItem, { name: true } ) || !consumable.test( viewChild, { name: true } ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst codeBlock = writer.createElement( 'codeBlock' );\n\t\tconst viewChildClasses = [ ...viewChild.getClassNames() ];\n\n\t\t// As we're to associate each class with a model language, a lack of class (empty class) can be\n\t\t// also associated with a language if the language definition was configured so. Pushing an empty\n\t\t// string to make sure the association will work.\n\t\tif ( !viewChildClasses.length ) {\n\t\t\tviewChildClasses.push( '' );\n\t\t}\n\n\t\t// Figure out if any of the <code> element's class names is a valid programming\n\t\t// language class. If so, use it on the model element (becomes the language of the entire block).\n\t\tfor ( const className of viewChildClasses ) {\n\t\t\tconst language = classesToLanguages[ className ];\n\n\t\t\tif ( language ) {\n\t\t\t\twriter.setAttribute( 'language', language, codeBlock );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If no language value was set, use the default language from the config.\n\t\tif ( !codeBlock.hasAttribute( 'language' ) ) {\n\t\t\twriter.setAttribute( 'language', defaultLanguageName, codeBlock );\n\t\t}\n\n\t\t// HTML elements are invalid content for `<code>`.\n\t\t// Read only text nodes.\n\t\tconst textData = [ ...editingView.createRangeIn( viewChild ) ]\n\t\t\t.filter( current => current.type === 'text' )\n\t\t\t.map( ( { item } ) => item.data )\n\t\t\t.join( '' );\n\t\tconst fragment = rawSnippetTextToModelDocumentFragment( writer, textData );\n\n\t\twriter.append( fragment, codeBlock );\n\n\t\t// Let's try to insert code block.\n\t\tif ( !conversionApi.safeInsert( codeBlock, data.modelCursor ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconsumable.consume( viewItem, { name: true } );\n\t\tconsumable.consume( viewChild, { name: true } );\n\n\t\tconversionApi.updateConversionResult( codeBlock, data );\n\t};\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/indentcodeblockcommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\nimport {\n\tgetIndentOutdentPositions,\n\tisModelSelectionInCodeBlock\n} from './utils';\n\n/**\n * The code block indentation increase command plugin.\n *\n * @extends module:core/command~Command\n */\nexport default class IndentCodeBlockCommand extends Command {\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * A sequence of characters added to the line when the command is executed.\n\t\t *\n\t\t * @readonly\n\t\t * @private\n\t\t * @member {String}\n\t\t */\n\t\tthis._indentSequence = editor.config.get( 'codeBlock.indentSequence' );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tthis.isEnabled = this._checkEnabled();\n\t}\n\n\t/**\n\t * Executes the command. When the command {@link #isEnabled is enabled}, the indentation of the\n\t * code lines in the selection will be increased.\n\t *\n\t * @fires execute\n\t */\n\texecute() {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\n\t\tmodel.change( writer => {\n\t\t\tconst positions = getIndentOutdentPositions( model );\n\n\t\t\t// Indent all positions, for instance assuming the indent sequence is 4x space (\" \"):\n\t\t\t//\n\t\t\t//\t\t<codeBlock>^foo</codeBlock> -> <codeBlock> foo</codeBlock>\n\t\t\t//\n\t\t\t//\t\t<codeBlock>foo^bar</codeBlock> -> <codeBlock>foo bar</codeBlock>\n\t\t\t//\n\t\t\t// Also, when there is more than one position:\n\t\t\t//\n\t\t\t//\t\t<codeBlock>\n\t\t\t//\t\t\t^foobar\n\t\t\t//\t\t\t<softBreak></softBreak>\n\t\t\t//\t\t\t^bazqux\n\t\t\t//\t\t</codeBlock>\n\t\t\t//\n\t\t\t//\t\t->\n\t\t\t//\n\t\t\t//\t\t<codeBlock>\n\t\t\t//\t\t\t foobar\n\t\t\t//\t\t\t<softBreak></softBreak>\n\t\t\t//\t\t\t bazqux\n\t\t\t//\t\t</codeBlock>\n\t\t\t//\n\t\t\tfor ( const position of positions ) {\n\t\t\t\twriter.insertText( this._indentSequence, position );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Checks whether the command can be enabled in the current context.\n\t *\n\t * @private\n\t * @returns {Boolean} Whether the command should be enabled.\n\t */\n\t_checkEnabled() {\n\t\tif ( !this._indentSequence ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Indent (forward) command is always enabled when there's any code block in the selection\n\t\t// because you can always indent code lines.\n\t\treturn isModelSelectionInCodeBlock( this.editor.model.document.selection );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block\n */\n\nimport CodeBlock from './codeblock';\nimport CodeBlockEditing from './codeblockediting';\nimport CodeBlockUI from './codeblockui';\n\nexport default {\n\tCodeBlock,\n\tCodeBlockEditing,\n\tCodeBlockUI\n};\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/outdentcodeblockcommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\nimport {\n\tgetLeadingWhiteSpaces,\n\tgetIndentOutdentPositions,\n\tisModelSelectionInCodeBlock\n} from './utils';\n\n/**\n * The code block indentation decrease command plugin.\n *\n * @extends module:core/command~Command\n */\nexport default class OutdentCodeBlockCommand extends Command {\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * A sequence of characters removed from the line when the command is executed.\n\t\t *\n\t\t * @readonly\n\t\t * @private\n\t\t * @member {String}\n\t\t */\n\t\tthis._indentSequence = editor.config.get( 'codeBlock.indentSequence' );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tthis.isEnabled = this._checkEnabled();\n\t}\n\n\t/**\n\t * Executes the command. When the command {@link #isEnabled is enabled}, the indentation of the\n\t * code lines in the selection will be decreased.\n\t *\n\t * @fires execute\n\t */\n\texecute() {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\n\t\tmodel.change( writer => {\n\t\t\tconst positions = getIndentOutdentPositions( model );\n\n\t\t\t// Outdent all positions, for instance assuming the indent sequence is 4x space (\" \"):\n\t\t\t//\n\t\t\t//\t\t<codeBlock>^foo</codeBlock> -> <codeBlock>foo</codeBlock>\n\t\t\t//\n\t\t\t//\t\t<codeBlock> ^bar</codeBlock> -> <codeBlock>bar</codeBlock>\n\t\t\t//\n\t\t\t// Also, when there is more than one position:\n\t\t\t//\n\t\t\t//\t\t<codeBlock>\n\t\t\t//\t\t\t ^foobar\n\t\t\t//\t\t\t<softBreak></softBreak>\n\t\t\t//\t\t\t ^bazqux\n\t\t\t//\t\t</codeBlock>\n\t\t\t//\n\t\t\t//\t\t->\n\t\t\t//\n\t\t\t//\t\t<codeBlock>\n\t\t\t//\t\t\tfoobar\n\t\t\t//\t\t\t<softBreak></softBreak>\n\t\t\t//\t\t\tbazqux\n\t\t\t//\t\t</codeBlock>\n\t\t\tfor ( const position of positions ) {\n\t\t\t\tconst range = getLastOutdentableSequenceRange( this.editor.model, position, this._indentSequence );\n\n\t\t\t\tif ( range ) {\n\t\t\t\t\twriter.remove( range );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Checks whether the command can be enabled in the current context.\n\t *\n\t * @private\n\t * @returns {Boolean} Whether the command should be enabled.\n\t */\n\t_checkEnabled() {\n\t\tif ( !this._indentSequence ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst model = this.editor.model;\n\n\t\tif ( !isModelSelectionInCodeBlock( model.document.selection ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Outdent command can execute only when there is an indent character sequence\n\t\t// in some of the lines.\n\t\treturn getIndentOutdentPositions( model ).some( position => {\n\t\t\treturn getLastOutdentableSequenceRange( model, position, this._indentSequence );\n\t\t} );\n\t}\n}\n\n// For a position coming from `getIndentOutdentPositions()`, it returns the range representing\n// the last occurrence of the indent sequence among the leading whitespaces of the code line the\n// position represents.\n//\n// For instance, assuming the indent sequence is 4x space (\" \"):\n//\n//\t\t<codeBlock>foo^</codeBlock> -> null\n//\t\t<codeBlock>foo^<softBreak></softBreak>bar</codeBlock> -> null\n//\t\t<codeBlock> ^foo</codeBlock> -> null\n//\t\t<codeBlock> ^foo</codeBlock> -> <codeBlock> [ ]foo</codeBlock>\n//\t\t<codeBlock> ^foo bar</codeBlock> -> <codeBlock>[ ]foo bar</codeBlock>\n//\n// @param {<module:engine/model/model~Model>} model\n// @param {<module:engine/model/position~Position>} position\n// @param {String} sequence\n// @returns {<module:engine/model/range~Range>|null}\nfunction getLastOutdentableSequenceRange( model, position, sequence ) {\n\t// Positions start before each text node (code line). Get the node corresponding to the position.\n\tconst nodeAtPosition = getCodeLineTextNodeAtPosition( position );\n\n\tif ( !nodeAtPosition ) {\n\t\treturn null;\n\t}\n\n\tconst leadingWhiteSpaces = getLeadingWhiteSpaces( nodeAtPosition );\n\tconst lastIndexOfSequence = leadingWhiteSpaces.lastIndexOf( sequence );\n\n\t// For instance, assuming the indent sequence is 4x space (\" \"):\n\t//\n\t//\t\t<codeBlock> \t^foo</codeBlock> -> null\n\t//\n\tif ( lastIndexOfSequence + sequence.length !== leadingWhiteSpaces.length ) {\n\t\treturn null;\n\t}\n\n\t// For instance, assuming the indent sequence is 4x space (\" \"):\n\t//\n\t//\t\t<codeBlock> ^foo</codeBlock> -> null\n\t//\n\tif ( lastIndexOfSequence === -1 ) {\n\t\treturn null;\n\t}\n\n\tconst { parent, startOffset } = nodeAtPosition;\n\n\t// Create a range that contains the **last** indent sequence among the leading whitespaces\n\t// of the line.\n\t//\n\t// For instance, assuming the indent sequence is 4x space (\" \"):\n\t//\n\t//\t\t<codeBlock> ^foo</codeBlock> -> <codeBlock> [ ]foo</codeBlock>\n\t//\n\treturn model.createRange(\n\t\tmodel.createPositionAt( parent, startOffset + lastIndexOfSequence ),\n\t\tmodel.createPositionAt( parent, startOffset + lastIndexOfSequence + sequence.length )\n\t);\n}\n\nfunction getCodeLineTextNodeAtPosition( position ) {\n\t// Positions start before each text node (code line). Get the node corresponding to the position.\n\tlet nodeAtPosition = position.parent.getChild( position.index );\n\n\t// <codeBlock>foo^</codeBlock>\n\t// <codeBlock>foo^<softBreak></softBreak>bar</codeBlock>\n\tif ( !nodeAtPosition || nodeAtPosition.is( 'element', 'softBreak' ) ) {\n\t\tnodeAtPosition = position.nodeBefore;\n\t}\n\n\t// <codeBlock>^</codeBlock>\n\t// <codeBlock>foo^<softBreak></softBreak>bar</codeBlock>\n\tif ( !nodeAtPosition || nodeAtPosition.is( 'element', 'softBreak' ) ) {\n\t\treturn null;\n\t}\n\n\treturn nodeAtPosition;\n}\n","/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module code-block/utils\n */\n\nimport { first } from 'ckeditor5/src/utils';\n\n/**\n * Returns code block languages as defined in `config.codeBlock.languages` but processed:\n *\n * * To consider the editor localization, i.e. to display {@link module:code-block/codeblock~CodeBlockLanguageDefinition}\n * in the correct language. There is no way to use {@link module:utils/locale~Locale#t} when the user\n * configuration is defined because the editor does not exist yet.\n * * To make sure each definition has a CSS class associated with it even if not specified\n * in the original configuration.\n *\n * @param {module:core/editor/editor~Editor} editor\n * @returns {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>}.\n */\nexport function getNormalizedAndLocalizedLanguageDefinitions( editor ) {\n\tconst t = editor.t;\n\tconst languageDefs = editor.config.get( 'codeBlock.languages' );\n\n\tfor ( const def of languageDefs ) {\n\t\tif ( def.label === 'Plain text' ) {\n\t\t\tdef.label = t( 'Plain text' );\n\t\t}\n\n\t\tif ( def.class === undefined ) {\n\t\t\tdef.class = `language-${ def.language }`;\n\t\t}\n\t}\n\n\treturn languageDefs;\n}\n\n/**\n * Returns an object associating certain language definition properties with others. For instance:\n *\n * For:\n *\n *\t\tconst definitions = {\n *\t\t\t{ language: 'php', class: 'language-php', label: 'PHP' },\n *\t\t\t{ language: 'javascript', class: 'js', label: 'JavaScript' },\n *\t\t};\n *\n *\t\tgetPropertyAssociation( definitions, 'class', 'language' );\n *\n * returns:\n *\n *\t\t{\n *\t\t\t'language-php': 'php'\n *\t\t\t'js': 'javascript'\n *\t\t}\n *\n * and\n *\n *\t\tgetPropertyAssociation( definitions, 'language', 'label' );\n *\n * returns:\n *\n *\t\t{\n *\t\t\t'php': 'PHP'\n *\t\t\t'javascript': 'JavaScript'\n *\t\t}\n *\n * @param {Array.<module:code-block/codeblock~CodeBlockLanguageDefinition>}\n * @param {String} key\n * @param {String} value\n * @param {Object.<String,String>}\n */\nexport function getPropertyAssociation( languageDefs, key, value ) {\n\tconst association = {};\n\n\tfor ( const def of languageDefs ) {\n\t\tif ( key === 'class' ) {\n\t\t\t// Only the first class is considered.\n\t\t\tassociation[ def[ key ].split( ' ' ).shift() ] = def[ value ];\n\t\t} else {\n\t\t\tassociation[ def[ key ] ] = def[ value ];\n\t\t}\n\t}\n\n\treturn association;\n}\n\n/**\n * For a given model text node, it returns white spaces that precede other characters in that node.\n * This corresponds to the indentation part of the code block line.\n *\n * @param {module:engine/model/text~Text} codeLineNodes\n * @returns {String}\n */\nexport function getLeadingWhiteSpaces( textNode ) {\n\treturn textNode.data.match( /^(\\s*)/ )[ 0 ];\n}\n\n/**\n * For a plain text containing the code (snippet), it returns a document fragment containing\n * model text nodes separated by soft breaks (in place of new line characters \"\\n\"), for instance:\n *\n * Input:\n *\n *\t\t\"foo()\\n\n *\t\tbar()\"\n *\n * Output:\n *\n *\t\t<DocumentFragment>\n *\t\t\t\"foo()\"\n *\t\t\t<softBreak></softBreak>\n *\t\t\t\"bar()\"\n *\t\t</DocumentFragment>\n *\n * @param {module:engine/model/writer~Writer} writer\n * @param {String} text The raw code text to be converted.\n */\nexport function rawSnippetTextToModelDocumentFragment( writer, text ) {\n\tconst fragment = writer.createDocumentFragment();\n\tconst textLines = text.split( '\\n' ).map( data => writer.createText( data ) );\n\tconst lastLine = textLines[ textLines.length - 1 ];\n\n\tfor ( const node of textLines ) {\n\t\twriter.append( node, fragment );\n\n\t\tif ( node !== lastLine ) {\n\t\t\twriter.appendElement( 'softBreak', fragment );\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n/**\n * Returns an array of all model positions within the selection that represent code block lines.\n *\n * If the selection is collapsed, it returns the exact selection anchor position:\n *\n *\t\t<codeBlock>[]foo</codeBlock> -> <codeBlock>^foo</codeBlock>\n *\t\t<codeBlock>foo[]bar</codeBlock> -> <codeBlock>foo^bar</codeBlock>\n *\n * Otherwise, it returns positions **before** each text node belonging to all code blocks contained by the selection:\n *\n *\t\t<codeBlock> <codeBlock>\n *\t\t foo[bar ^foobar\n *\t\t <softBreak></softBreak> -> <softBreak></softBreak>\n *\t\t baz]qux ^bazqux\n *\t\t</codeBlock> </codeBlock>\n *\n * It also works across other non–code blocks:\n *\n *\t\t<codeBlock> <codeBlock>\n *\t\t foo[bar ^foobar\n *\t\t</codeBlock> </codeBlock>\n *\t\t<paragraph>text</paragraph> -> <paragraph>text</paragraph>\n *\t\t<codeBlock> <codeBlock>\n *\t\t baz]qux ^bazqux\n *\t\t</codeBlock> </codeBlock>\n *\n * **Note:** The positions are in reverse order so they do not get outdated when iterating over them and\n * the writer inserts or removes things at the same time.\n *\n * **Note:** The position is situated after the leading white spaces in the text node.\n *\n * @param {module:engine/model/model~Model} model\n * @returns {Array.<module:engine/model/position~Position>}\n */\nexport function getIndentOutdentPositions( model ) {\n\tconst selection = model.document.selection;\n\tconst positions = [];\n\n\t// When the selection is collapsed, there's only one position we can indent or outdent.\n\tif ( selection.isCollapsed ) {\n\t\tpositions.push( selection.anchor );\n\t}\n\n\t// When the selection is NOT collapsed, collect all positions starting before text nodes\n\t// (code lines) in any <codeBlock> within the selection.\n\telse {\n\t\t// Walk backward so positions we're about to collect here do not get outdated when\n\t\t// inserting or deleting using the writer.\n\t\tconst walker = selection.getFirstRange().getWalker( {\n\t\t\tignoreElementEnd: true,\n\t\t\tdirection: 'backward'\n\t\t} );\n\n\t\tfor ( const { item } of walker ) {\n\t\t\tif ( item.is( '$textProxy' ) && item.parent.is( 'element', 'codeBlock' ) ) {\n\t\t\t\tconst leadingWhiteSpaces = getLeadingWhiteSpaces( item.textNode );\n\t\t\t\tconst { parent, startOffset } = item.textNode;\n\n\t\t\t\t// Make sure the position is after all leading whitespaces in the text node.\n\t\t\t\tconst position = model.createPositionAt( parent, startOffset + leadingWhiteSpaces.length );\n\n\t\t\t\tpositions.push( position );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn positions;\n}\n\n/**\n * Checks if any of the blocks within the model selection is a code block.\n *\n * @param {module:engine/model/selection~Selection} selection\n * @returns {Boolean}\n */\nexport function isModelSelectionInCodeBlock( selection ) {\n\tconst firstBlock = first( selection.getSelectedBlocks() );\n\n\treturn firstBlock && firstBlock.is( 'element', 'codeBlock' );\n}\n","var api = require(\"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../node_modules/postcss-loader/src/index.js??ref--5-1!./codeblock.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M12.87 12.61a.75.75 0 0 1-.089.976l-.085.07-3.154 2.254 3.412 2.414a.75.75 0 0 1 .237.95l-.057.095a.75.75 0 0 1-.95.237l-.096-.058-4.272-3.022-.003-1.223 4.01-2.867a.75.75 0 0 1 1.047.174zm2.795-.231l.095.057 4.011 2.867-.003 1.223-4.272 3.022-.095.058a.75.75 0 0 1-.88-.151l-.07-.086-.058-.095a.75.75 0 0 1 .15-.88l.087-.07 3.412-2.414-3.154-2.253-.085-.071a.75.75 0 0 1 .862-1.207zM16 0a2 2 0 0 1 2 2v9.354l-.663-.492-.837-.001V2a.5.5 0 0 0-.5-.5H2a.5.5 0 0 0-.5.5v15a.5.5 0 0 0 .5.5h3.118L7.156 19H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h14zM5.009 15l.003 1H3v-1h2.009zm2.188-2l-1.471 1H5v-1h2.197zM10 11v.095L8.668 12H7v-1h3zm4-2v1H7V9h7zm0-2v1H7V7h7zm-4-2v1H5V5h5zM6 3v1H3V3h3z\\\"/></svg>\";","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/core.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/enter.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/ui.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/utils.js\");","module.exports = CKEditor5.dll;"],"sourceRoot":""}