/** * $Id: editor_plugin_src.js 162 2007-01-03 16:16:52Z spocke $ * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ tinyMCE.importPluginLanguagePack('template'); var TinyMCE_TemplatePlugin = { getInfo : function() { return { longname : 'Template plugin', author : 'Moxiecode Systems AB', authorurl : 'http://www.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template', version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion }; }, initInstance : function(inst) { var cdate, mdate, content, x = 0, key, value, rvals, ds = inst.getData('template'); // ensure the required elements and sttributes are added //inst.cleanup.addRuleStr('*[' + TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR + '],div[title,tsrc]'); //setup template content functions // creation date and modified date classes cdate = tinyMCE.getParam("template_cdate_classes", '').split(/\s+/); mdate = tinyMCE.getParam("template_mdate_classes", '').split(/\s+/); // classes that specify where selected content should go content = tinyMCE.getParam("template_selected_content_classes", '').split(/\s+/); for (x = 0; x < cdate.length; x++) TinyMCE_TemplatePlugin.functions[cdate[x]] = TinyMCE_TemplatePlugin.functions['cdate']; for (x = 0; x < mdate.length; x++) TinyMCE_TemplatePlugin.functions[mdate[x]] = TinyMCE_TemplatePlugin.functions['mdate']; for (x = 0; x < content.length; x++) TinyMCE_TemplatePlugin.functions[content[x]] = TinyMCE_TemplatePlugin.functions['selectedContent']; // special template functions for replacing template content rvals = tinyMCE.getParam("template_replace_values", false); for (key in rvals) { value = rvals[key]; if (typeof value == "function") TinyMCE_TemplatePlugin.functions[key] = value; else TinyMCE_TemplatePlugin.functions[key] = TinyMCE_TemplatePlugin.functions['generateReplacer'](value); } // Setup replace_items rvals = tinyMCE.getParam("template_replace_values", false); ds.replace_items = {}; for (key in rvals) ds.replace_items[key] = rvals[key]; inst.addShortcut('ctrl', 't', 'lang_template_desc', 'mceTemplate'); // Setup data storage ds.currentAction = "insert"; ds.currentTmplNode = null; }, getControlHTML : function(cn) { switch (cn) { case "template": return tinyMCE.getButtonHTML(cn, 'lang_template_desc', '{$pluginurl}/images/template.gif', 'mceTemplate', true); } return ""; }, execCommand : function(editor_id, element, command, user_interface, value) { var nodeArray, current, newTmpl, x, inst = tinyMCE.getInstanceById(editor_id), ds = inst.getData('template'), telm; switch (command) { case "mceTemplate": if (user_interface) { // called from toolbar button - show the popup tinyMCE.openWindow({ file : '../../plugins/template/template.htm', // Relative to theme width : tinyMCE.getParam('template_popup_width', 750), height : tinyMCE.getParam('template_popup_height', 600) }, {editor_id : editor_id, resizable : "yes", scrollbars : "no", pluginObj : TinyMCE_TemplatePlugin}); } else { // internal command do the template stuff // get the returned HTML string from the pop-up and appened it to a DIV element telm = TinyMCE_TemplatePlugin._convertToNode(value.body); // Find template body nodeArray = tinyMCE.selectElements(telm, 'div', function(n) { return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL); }); telm = nodeArray.length > 0 ? nodeArray[0] : null; nodeArray = []; if (ds.currentAction == "insert") { //insert new template after applying all the template content functions // Is it a template or snippet if (telm) { tinyMCE.execCommand('mceBeginUndoLevel'); ds.currentAction = "insert-new"; TinyMCE_TemplatePlugin._insertTemplate(editor_id, telm, value.title, value.tsrc, true); ds.currentAction == "insert"; tinyMCE.execCommand('mceEndUndoLevel'); tinyMCE.execInstanceCommand(editor_id, 'mceCleanup', false); } else tinyMCE.execCommand('mceInsertContent', false, this._replaceValues(value.body)); } else { // First collect the selected template in the editor nodeArray = TinyMCE_TemplatePlugin._collectTemplateElements(ds.currentTmplNode); current = []; newTmpl = []; tinyMCE.getNodeTree(telm, newTmpl); for (x=0; x', 'gi'), '' ); // delete any empty template wrappers content = content.replace( new RegExp('
(\s| | )?(|\s)?
', 'gi'), '' ); // replace the closing wrapper tag content = content.replace( new RegExp('', 'gi'), '' ); break; case "insert_to_editor": // replace HTML comment with DIV wrapper content = content.replace( new RegExp('', 'gi'), '
' ); content = content.replace( new RegExp('', 'gi'), '
' ); break; case "get_from_editor_dom": // apply template content replacement functions nodes = tinyMCE.selectNodes(content, function(n) { return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL_ELEMENT); } ); TinyMCE_TemplatePlugin._applyFunctions(nodes, type); break; case "insert_to_editor_dom": // apply template content replacement functions nodes = tinyMCE.selectNodes(content, function(n) { return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL_ELEMENT); } ); TinyMCE_TemplatePlugin._applyFunctions(nodes, type); break; } return content; }, // Private plugin internal methods /** * Creates a HTML DIV element and sets the innerHTML to equal the temlate innerHTML so that the template can be manipulated as DOM nodes. * * @param {string} Template innerHTML * @return a HTML Element * @type HTMLElement */ _convertToNode : function(html) { var elm = document.createElement('div'); elm.innerHTML = html; return elm; }, /** * pass an array of template html elements and they will have the template class name added and any template functions applied * * @param {array} template HTML elements * @return array of template HTML elements * @type array */ _prepareTemplateContent : function(elms) { var x, n, nodes = []; if (!elms) return {}; if (!elms.length) elms = [elms]; for (x = 0; x'; html += elm.innerHTML; html += ''; tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, html); }, /** * template functions - functions for modifying template content */ functions : { blank : function(elm, editor_event) {}, cdate : function(elm, editor_event) { var d, dsrc; if (editor_event != TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT) return; d = new Date(); // find out if the creation date was previously stored dsrc = elm.innerHTML.match(new RegExp("", "gi")); if (dsrc) d = new Date(RegExp.$1); elm.innerHTML = TinyMCE_TemplatePlugin._getDateTime(d, tinyMCE.getParam("template_cdate_format", tinyMCE.getLang("lang_template_def_date_format"))); //now we have to store the date value in a format easily read again, in case a future template change changes the date format... elm.innerHTML += ""; }, mdate : function(elm, editor_event) { var d = new Date(); elm.innerHTML = TinyMCE_TemplatePlugin._getDateTime(d, tinyMCE.getParam("template_mdate_format", tinyMCE.getLang("lang_template_def_date_format"))); }, /** * This will insert the currently selected editor content into the template element. * It only does this if the template inserted is a new one and if the element does not have the special class. * The special class name prevents this from happening more than once. */ selectedContent : function(elm, editor_event) { var ds = tinyMCE.selectedInstance.getData('template'); if (editor_event != TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT) return; if (ds.currentAction == "insert-new" && !tinyMCE.hasCSSClass(elm, TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE)) { elm.innerHTML = tinyMCE.selectedInstance.selection.getSelectedHTML(); tinyMCE.addCSSClass(elm, TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE); } }, /** * When the plugin is initialised this generates the functions that insert configured strings into template elements. */ generateReplacer : function(s) { return function(elm, editor_event) {elm.innerHTML = "" + s;}; } }, /** * formats a date according to the format string - straight from the 'insert date/time' plugin * * @param {Date} date object * @param {string} format string * @return formatted date * @type string */ _getDateTime : function(d,fmt) { if (!fmt) return ""; function addZeros(value, len) { var i; value = "" + value; if (value.length < len) { for (i=0; i<(len-value.length); i++) value = "0" + value; } return value; } fmt = fmt.replace("%D", "%m/%d/%y"); fmt = fmt.replace("%r", "%I:%M:%S %p"); fmt = fmt.replace("%Y", "" + d.getFullYear()); fmt = fmt.replace("%y", "" + d.getYear()); fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); fmt = fmt.replace("%B", "" + tinyMCE.getLang("lang_template_months_long")[d.getMonth()]); fmt = fmt.replace("%b", "" + tinyMCE.getLang("lang_template_months_short")[d.getMonth()]); fmt = fmt.replace("%A", "" + tinyMCE.getLang("lang_template_day_long")[d.getDay()]); fmt = fmt.replace("%a", "" + tinyMCE.getLang("lang_template_day_short")[d.getDay()]); fmt = fmt.replace("%%", "%"); return fmt; }, TMPL_ELEMENT : 'mceTmplElm', TMPL : 'mceTmpl', TMPL_BEGINS : 'mceTmplBegins', TMPL_SEL_HTML_DONE : 'mceSelHTMLDone', TMPL_ENDS : 'mceTmplEnds', TMPL_DATE_SRC_ATTR : 'mcetmpldtesrc', TMPL_TEMPLATE_EVENT : 'prepare_template' }; tinyMCE.addPlugin("template", TinyMCE_TemplatePlugin);