/** * life * 用户所在位置是
下 * 用户选中代码, 点击 <>, 则将代码贴上, 并且只贴纯文本 */ (function() { tinymce.create('tinymce.plugins.codesyntax', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed, url) { // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); ed.addCommand('mceSyntaxHL', function() { ed.windowManager.open({ title: "插入代码", file : url + '/dialog.htm', width : 520,// + parseInt(ed.getLang('.delta_width', 0)), height : 350// + parseInt(ed.getLang('.delta_height', 0)), }); }); // 切换代码 // 用户选择了/用户光标所在行 ed.addCommand('toggleCode', function() { var node = ed.selection.getNode(); var selectedContent = ed.selection.getContent(); // 包含了html标签 var everBookmark = ed.selection.getBookmark(); // 光标, 为了处理后重新定位到那个位置 var text; try { text = $.trim($(selectedContent).text()); } catch(e) { } // 可能不是一个完整的html, 可能是一个文本此时.html()无 if(!text) { text = $.trim(selectedContent); } // 如果是用户选择了某内容, 其父不会包含进来, 此时还是要判断node的父是否是PRE, if(text) { // 是pre, 那么 去掉pre之 if(node.nodeName == "PRE") { $(node).replaceWith("" + $(node).html() + "
"); } else { // 不是, 那么替换成ed.insertContent("" + text + ""); } } else { // 没有选择内容, 那么是鼠标的所处行, 同样检测该行是否是 if(node.nodeName == "PRE") { $(node).replaceWith("" + $(node).html().replace(/\n/g, "
"); } else { // 不是, 那么替换成
") + "$(node).replaceWith("" + $(node).html() + ""); } } ed.selection.moveToBookmark(everBookmark); }); // Register example button ed.addButton('codesyntax', { title : '插入代码', cmd : 'mceSyntaxHL', // icon: "code" image : url + '/img/file-xml.png' }); // Register example button ed.addButton('toggleCode', { title : '文本<->代码切换', cmd : 'toggleCode', icon: "code" // image : url + '/img/highlight.gif' }); ed.addShortcut('ctrl+shift+c', '', 'toggleCode'); ed.addShortcut('command+shift+c', '', 'toggleCode'); // 应该放在其它地方的 // indent outdent ed.on('keydown', function(e) { var num = e.which ? e.which : e.keyCode; if (num == 9) { // tab pressed if(!e.shiftKey) { // ed.execCommand('mceInsertRawHTML', false, " "); // inserts tab ed.execCommand('Indent'); } else { // shift + tab // delete 4 个空格 ed.execCommand('Outdent'); } e.preventDefault(); e.stopPropagation(); return false; } }); }, /** * Creates control instances based in the incomming name. This method is normally not * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons * but you sometimes need to create more complex controls like listboxes, split buttons etc then this * method can be used to create those. * * @param {String} n Name of the control to create. * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control. * @return {tinymce.ui.Control} New control instance or null if no control was created. */ createControl : function(n, cm) { return null; } }); /** * Parses Syntax Highlighters parameters within the class attribute and * returns them in an associative array. * * @param params string or Syntax Highlighter parameters to parse * * @return array */ function getParameters(params) { var parsedItems = params.replace(/ /g, '').replace(/;([^;]*)$/, '').split(';'); var paramArray = new Array(); for(var i = 0; i < parsedItems.length; i++) { var option = parsedItems[i].split(':'); paramArray[option[0]] = option[1]; } return paramArray; } // Register plugin tinymce.PluginManager.add('codesyntax', tinymce.plugins.codesyntax); })();