(function ($) { CKEDITOR.plugins.add("codesnippet", { requires: "widget,dialog,contextmenu", icons: "codesnippet", onLoad: function () { CKEDITOR.dialog.add("codeSnippet", this.path + "dialogs/codesnippet.js"); }, init: function (editor) { editor.ui.addButton && editor.ui.addButton("codesnippet", { label: "Codesnippet", command: "codeSnippet", toolbar: "insert,99", group: "44", icon: this.path + "icons/codesnippet.png", }); editor.addCommand("removewidget", createDef({ exec: function (editor) { if (editor.widgets.focused) { let element = editor.widgets.focused; let range = editor.createRange(); range.moveToPosition( element.element, CKEDITOR.POSITION_BEFORE_START ); range.select(); element.destroy(); element.element.remove(); } }, })); editor.addMenuGroup("codesnippet"); editor.addMenuItems({ myCommand: { label: "Delete Snippet", command: "removewidget", group: "codesnippet", order: 1 }, }); if (editor.contextMenu) editor.contextMenu.addListener(() => {return { myCommand: CKEDITOR.TRISTATE_OFF } }); }, afterInit: function (editor) { registerWidget(editor, this.path); }, }); function createDef( def ) { return CKEDITOR.tools.extend( def || {}, { contextSensitive: 1, refresh: function( editor, path ) { this.setState((editor.widgets.focused) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED); } }); } function registerWidget(editor, path) { var codeClass = editor.config.codeSnippet_codeClass; editor.config.shiftEnterMode = CKEDITOR.ENTER_P; editor.settings = CKEDITOR.tools.extend( { cls: "", modes: [ //[View for pre, type for aceEditor, type for highlightjs] ["ObjectScript", "text", "cls"], ["SQL", "sql", "sql"], ["Python", "python", "python"], ["JSON", "json", "json"], ["YAML", "yaml", "yaml"], ["JavaScript", "javascript", "javascript"], ["Dockerfile", "dockerfile", "dockerfile"], ["HTML", "html", "html"], ["CSS", "css", "css"], ["Java", "java", "java"], ["XML", "xml", "xml"], ["Bash", "bash", "bash"], ["Shell Session", "shell", "shell"], ["PHP", "php", "php"], ], tab_size: 4, js: "//cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/", }, editor.config.codeSnippet, true ); CKEDITOR.scriptLoader.load([ (editor.settings.js + "ace.js"), "/sites/all/libraries/highlightjs/highlight.pack.min.js", ]); editor.addContentsCss(`/sites/all/libraries/highlightjs/styles/${editor.config.codeSnippet_theme}.css`); editor.addContentsCss(path + "dialogs/style.css"); editor.on( "instanceReady", function () { CKEDITOR.document.appendStyleSheet(path + "dialogs/style.css"); CKEDITOR.scriptLoader.load([(editor.settings.js + "ext-whitespace.js")]); }.bind(this) ); editor.widgets.add("codeSnippet", { allowedContent: "pre; code(language-*); p;", requiredContent: "pre", styleableElements: "pre", template: `
`,
dialog: "codeSnippet",
pathName: "codesnippet",
mask: true,
parts: {
pre: "pre",
code: "code"
},
upcast: function (element, data) {
if(element.hasClass("codeblock-container")) data.lang = element.attributes.idlang;
data.tabsize = (element.attributes.tabsize) ? element.attributes.tabsize : 4;
return element.hasClass("codeblock-container");
},
data: function () {
var data = this.data;
if(data.code === undefined) data.code = this.parts.code.getText();
if (data.lang !== undefined) {
this.parts.code.setHtml(CKEDITOR.tools.htmlEncode(data.code));
this.parts.code.$.className = `language-${editor.settings.modes[data.lang][2]} ${editor.config.codeSnippet_codeClass}`;
hljs.highlightBlock(this.parts.code.$, editor.settings.modes[data.lang][2]);
}
},
});
}
})(jQuery);
CKEDITOR.config.codeSnippet_codeClass = "hljs";
CKEDITOR.config.codeSnippet_theme = "idea";