(function (global, factory) { if (typeof define === "function" && define.amd) { define('ss.TinyMCE_SSPlugin', [], factory); } else if (typeof exports !== "undefined") { factory(); } else { var mod = { exports: {} }; factory(); global.ssTinyMCE_SSPlugin = mod.exports; } })(this, function () { 'use strict'; (function () { var ssbuttons = { getInfo: function getInfo() { return { longname: 'Special buttons for SilverStripe CMS', author: 'Sam Minnée', authorurl: 'http://www.siverstripe.com/', infourl: 'http://www.silverstripe.com/', version: "1.0" }; }, init: function init(ed) { ed.addButton('sslink', { icon: 'link', title: 'Insert Link', cmd: 'sslink' }); ed.addMenuItem('sslink', { icon: 'link', text: 'Insert Link', cmd: 'sslink' }); ed.addButton('ssmedia', { icon: 'image', title: 'Insert Media', cmd: 'ssmedia' }); ed.addMenuItem('ssmedia', { icon: 'image', text: 'Insert Media', cmd: 'ssmedia' }); ed.addCommand('sslink', function (ed) { jQuery('#' + this.id).entwine('ss').openLinkDialog(); }); ed.addCommand('ssmedia', function (ed) { jQuery('#' + this.id).entwine('ss').openMediaDialog(); }); ed.on('BeforeExecCommand', function (e) { var cmd = e.command; var ui = e.ui; var val = e.value; if (cmd == 'mceAdvLink' || cmd == 'mceLink') { e.preventDefault(); ed.execCommand('sslink', ui, val); } else if (cmd == 'mceAdvImage' || cmd == 'mceImage') { e.preventDefault(); ed.execCommand('ssmedia', ui, val); } }); ed.on('SaveContent', function (o) { var content = jQuery(o.content); var attrsFn = function attrsFn(attrs) { return Object.keys(attrs).map(function (name) { return attrs[name] ? name + '="' + attrs[name] + '"' : null; }).filter(function (el) { return el !== null; }).join(' '); }; content.find('.ss-htmleditorfield-file.embed').each(function () { var el = jQuery(this); var attrs = { width: el.attr('width'), class: el.attr('cssclass'), thumbnail: el.data('thumbnail') }; var shortCode = '[embed ' + attrsFn(attrs) + ']' + el.data('url') + '[/embed]'; el.replaceWith(shortCode); }); content.find('img').each(function () { var el = jQuery(this); var attrs = { src: el.attr('src'), id: el.data('id'), width: el.attr('width'), height: el.attr('height'), class: el.attr('class'), title: el.attr('title'), alt: el.attr('alt') }; var shortCode = '[image ' + attrsFn(attrs) + ']'; el.replaceWith(shortCode); }); o.content = ''; content.each(function () { if (this.outerHTML !== undefined) { o.content += this.outerHTML; } }); }); ed.on('BeforeSetContent', function (o) { var matches; var content = o.content; var attrFromStrFn = function attrFromStrFn(str) { return str.match(/([^\s\/'"=,]+)\s*=\s*(('([^']+)')|("([^"]+)")|([^\s,\]]+))/g).reduce(function (coll, val) { var match = val.match(/^([^\s\/'"=,]+)\s*=\s*(?:(?:'([^']+)')|(?:"([^"]+)")|(?:[^\s,\]]+))$/), key = match[1], value = match[2] || match[3] || match[4]; coll[key] = value; return coll; }, {}); }; var shortTagRegex = /\[embed(.*?)\](.+?)\[\/\s*embed\s*\]/gi; while (matches = shortTagRegex.exec(content)) { var attrs = attrFromStrFn(matches[1]); var el; el = jQuery('').attr({ 'src': attrs['thumbnail'], 'width': attrs['width'], 'height': attrs['height'], 'class': attrs['class'], 'data-url': matches[2] }).addClass('ss-htmleditorfield-file embed'); attrs['cssclass'] = attrs['class']; Object.keys(attrs).forEach(function (key) { return el.attr('data-' + key, attrs[key]); }); content = content.replace(matches[0], jQuery('
').append(el).html()); } var shortTagRegex = /\[image(.*?)\]/gi; while (matches = shortTagRegex.exec(content)) { var attrs = attrFromStrFn(matches[1]); var el = jQuery('').attr({ 'src': attrs['src'], 'width': attrs['width'], 'height': attrs['height'], 'class': attrs['class'], 'alt': attrs['alt'], 'title': attrs['title'], 'data-id': attrs['id'] }); content = content.replace(matches[0], jQuery('').append(el).html()); } o.content = content; }); } }; tinymce.PluginManager.add("ssbuttons", function (editor) { ssbuttons.init(editor); }); })(); });