/*! * Code block dialog plugin for Editor.md * * @file code-block-dialog.js * @author pandao * @version 1.2.0 * @updateTime 2015-03-07 * {@link https://github.com/pandao/editor.md} * @license MIT */ (function() { var factory = function (exports) { var cmEditor; var pluginName = "code-block-dialog"; // for CodeBlock dialog select var codeLanguages = exports.codeLanguages = { asp : ["ASP", "vbscript"], actionscript : ["ActionScript(3.0)/Flash/Flex", "clike"], bash : ["Bash/Bat", "shell"], css : ["CSS", "css"], c : ["C", "clike"], cpp : ["C++", "clike"], csharp : ["C#", "clike"], coffeescript : ["CoffeeScript", "coffeescript"], d : ["D", "d"], dart : ["Dart", "dart"], delphi : ["Delphi/Pascal", "pascal"], erlang : ["Erlang", "erlang"], go : ["Golang", "go"], groovy : ["Groovy", "groovy"], html : ["HTML", "text/html"], java : ["Java", "clike"], json : ["JSON", "text/json"], javascript : ["Javascript", "javascript"], lua : ["Lua", "lua"], less : ["LESS", "css"], markdown : ["Markdown", "gfm"], "objective-c" : ["Objective-C", "clike"], php : ["PHP", "php"], perl : ["Perl", "perl"], python : ["Python", "python"], r : ["R", "r"], rst : ["reStructedText", "rst"], ruby : ["Ruby", "ruby"], sql : ["SQL", "sql"], sass : ["SASS/SCSS", "sass"], shell : ["Shell", "shell"], scala : ["Scala", "clike"], swift : ["Swift", "clike"], vb : ["VB/VBScript", "vb"], xml : ["XML", "text/xml"], yaml : ["YAML", "yaml"] }; exports.fn.codeBlockDialog = function() { var _this = this; var cm = this.cm; var lang = this.lang; var editor = this.editor; var settings = this.settings; var cursor = cm.getCursor(); var selection = cm.getSelection(); var classPrefix = this.classPrefix; var dialogName = classPrefix + pluginName, dialog; var dialogLang = lang.dialog.codeBlock; cm.focus(); if (editor.find("." + dialogName).length > 0) { dialog = editor.find("." + dialogName); dialog.find("option:first").attr("selected", "selected"); dialog.find("textarea").val(selection); this.dialogShowMask(dialog); this.dialogLockScreen(); dialog.show(); } else { var dialogHTML = "
" + dialogLang.selectLabel + "" + "
" + ""; dialog = this.createDialog({ name : dialogName, title : dialogLang.title, width : 780, height : 565, mask : settings.dialogShowMask, drag : settings.dialogDraggable, content : dialogHTML, lockScreen : settings.dialogLockScreen, maskStyle : { opacity : settings.dialogMaskOpacity, backgroundColor : settings.dialogMaskBgColor }, buttons : { enter : [lang.buttons.enter, function() { var codeTexts = this.find("textarea").val(); var langName = this.find("select").val(); if (langName === "") { alert(lang.dialog.codeBlock.unselectedLanguageAlert); return false; } if (codeTexts === "") { alert(lang.dialog.codeBlock.codeEmptyAlert); return false; } langName = (langName === "other") ? "" : langName; cm.replaceSelection(["```" + langName, codeTexts, "```"].join("\n")); if (langName === "") { cm.setCursor(cursor.line, cursor.ch + 3); } this.hide().lockScreen(false).hideMask(); cm.focus && cm.focus(); return false; }], cancel : [lang.buttons.cancel, function() { this.hide().lockScreen(false).hideMask(); cm.focus && cm.focus(); return false; }] } }); } var langSelect = dialog.find("select"); if (langSelect.find("option").length === 1) { for (var key in codeLanguages) { var codeLang = codeLanguages[key]; langSelect.append(""); } langSelect.append(""); } var mode = langSelect.find("option:selected").attr("mode"); var cmConfig = { mode : (mode) ? mode : "text/html", theme : settings.theme, tabSize : 4, autofocus : true, autoCloseTags : true, indentUnit : 4, lineNumbers : true, lineWrapping : true, extraKeys : {"Ctrl-Q": function(cm){ cm.foldCode(cm.getCursor()); }}, foldGutter : true, gutters : ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], matchBrackets : true, indentWithTabs : true, styleActiveLine : true, styleSelectedText : true, autoCloseBrackets : true, showTrailingSpace : true, highlightSelectionMatches : true }; var textarea = dialog.find("textarea"); var cmObj = dialog.find(".CodeMirror"); if (dialog.find(".CodeMirror").length < 1) { cmEditor = exports.$CodeMirror.fromTextArea(textarea[0], cmConfig); cmObj = dialog.find(".CodeMirror"); cmObj.css({ "float" : "none", margin : "8px 0", border : "1px solid #ddd", fontSize : settings.fontSize, width : "100%", height : "390px" }); cmEditor.on("change", function(cm) { textarea.val(cm.getValue()); }); } else { cmEditor.setValue(cm.getSelection()); } langSelect.change(function(){ var _mode = $(this).find("option:selected").attr("mode"); cmEditor.setOption("mode", _mode); }); }; }; // CommonJS/Node.js if (typeof require === "function" && typeof exports === "object" && typeof module === "object") { module.exports = factory; } else if (typeof define === "function") // AMD/CMD/Sea.js { if (define.amd) { // for Require.js define(["editormd"], function(editormd) { factory(editormd); }); } else { // for Sea.js define(function(require) { var editormd = require("./../../editormd"); factory(editormd); }); } } else { factory(window.editormd); } })();