// @param keepRange : leave selection range as it is semanticCode: function (force, full, keepRange) { var t = this; t.saveRange(); t.syncCode(force); if (t.o.semantic) { t.semanticTag('b'); t.semanticTag('i'); t.semanticTag('s'); t.semanticTag('strike'); if (full) { var inlineElementsSelector = t.o.inlineElementsSelector, blockElementsSelector = ':not(' + inlineElementsSelector + ')'; // Wrap text nodes in span for easier processing t.$ed.contents().filter(function () { return this.nodeType === 3 && this.nodeValue.trim().length > 0; }).wrap(''); // Wrap groups of inline elements in paragraphs (recursive) var wrapInlinesInParagraphsFrom = function ($from) { if ($from.length !== 0) { var $finalParagraph = $from.nextUntil(blockElementsSelector).addBack().wrapAll('
').parent(), $nextElement = $finalParagraph.nextAll(inlineElementsSelector).first(); $finalParagraph.next('br').remove(); wrapInlinesInParagraphsFrom($nextElement); } }; wrapInlinesInParagraphsFrom(t.$ed.children(inlineElementsSelector).first()); t.semanticTag('div', true); // Unwrap paragraphs content, containing nothing usefull t.$ed.find('p').filter(function () { // Don't remove currently being edited element if (t.range && this === t.range.startContainer) { return false; } return $(this).text().trim().length === 0 && $(this).children().not('br,span').length === 0; }).contents().unwrap(); // Get rid of temporary span's $('[data-tbw]', t.$ed).contents().unwrap(); // Remove emptyt.$ed.find('p:empty').remove(); } if (!keepRange) { t.restoreRange(); } t.syncTextarea(); } }, semanticTag: function (oldTag, copyAttributes) { var newTag; if (this.o.semantic != null && typeof this.o.semantic === 'object' && this.o.semantic.hasOwnProperty(oldTag)) { newTag = this.o.semantic[oldTag]; } else if (this.o.semantic === true && this.DEFAULT_SEMANTIC_MAP.hasOwnProperty(oldTag)) { newTag = this.DEFAULT_SEMANTIC_MAP[oldTag]; } else { return; } $(oldTag, this.$ed).each(function () { var $oldTag = $(this); if($oldTag.contents().length === 0) { return false; } $oldTag.wrap('<' + newTag + '/>'); if (copyAttributes) { $.each($oldTag.prop('attributes'), function () { $oldTag.parent().attr(this.name, this.value); }); } $oldTag.contents().unwrap(); }); }, // Function call when user click on "Insert Link" createLink: function () { var t = this, documentSelection = t.doc.getSelection(), node = documentSelection.focusNode, text = new XMLSerializer().serializeToString(documentSelection.getRangeAt(0).cloneContents()), url, title, target; while (['A', 'DIV'].indexOf(node.nodeName) < 0) { node = node.parentNode; } if (node && node.nodeName === 'A') { var $a = $(node); text = $a.text(); url = $a.attr('href'); if (!t.o.minimalLinks) { title = $a.attr('title'); target = $a.attr('target'); } var range = t.doc.createRange(); range.selectNode(node); documentSelection.removeAllRanges(); documentSelection.addRange(range); } t.saveRange(); var options = { url: { label: 'URL', required: true, value: url }, text: { label: t.lang.text, value: text } }; if (!t.o.minimalLinks) { Object.assign(options, { title: { label: t.lang.title, value: title }, target: { label: t.lang.target, value: target } }); } t.openModalInsert(t.lang.createLink, options, function (v) { // v is value var url = t.prependUrlPrefix(v.url); if (!url.length) { return false; } var link = $(['', v.text || v.url, ''].join('')); if (!t.o.minimalLinks) { if (v.title.length > 0) { link.attr('title', v.title); } if (v.target.length > 0) { link.attr('target', v.target); } } t.range.deleteContents(); t.range.insertNode(link[0]); t.syncCode(); t.$c.trigger('tbwchange'); return true; }); }, prependUrlPrefix: function (url) { var t = this; if (!t.urlPrefix) { return url; } var VALID_LINK_PREFIX = /^([a-z][-+.a-z0-9]*:|\/|#)/i; if (VALID_LINK_PREFIX.test(url)) { return url; } var SIMPLE_EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (SIMPLE_EMAIL_REGEX.test(url)) { return 'mailto:' + url; } return t.urlPrefix + url; }, unlink: function () { var t = this, documentSelection = t.doc.getSelection(), node = documentSelection.focusNode; if (documentSelection.isCollapsed) { while (['A', 'DIV'].indexOf(node.nodeName) < 0) { node = node.parentNode; } if (node && node.nodeName === 'A') { var range = t.doc.createRange(); range.selectNode(node); documentSelection.removeAllRanges(); documentSelection.addRange(range); } } t.execCmd('unlink', undefined, undefined, true); }, insertImage: function () { var t = this; t.saveRange(); var options = { url: { label: 'URL', required: true }, alt: { label: t.lang.description, value: t.getRangeText() } }; if (t.o.imageWidthModalEdit) { options.width = {}; } t.openModalInsert(t.lang.insertImage, options, function (v) { // v are values t.execCmd('insertImage', v.url, false, true); var $img = $('img[src="' + v.url + '"]:not([alt])', t.$box); $img.attr('alt', v.alt); if (t.o.imageWidthModalEdit) { $img.attr({ width: v.width }); } t.syncCode(); t.$c.trigger('tbwchange'); return true; }); }, fullscreen: function () { var t = this, prefix = t.o.prefix, fullscreenCssClass = prefix + 'fullscreen', isFullscreen; t.$box.toggleClass(fullscreenCssClass); isFullscreen = t.$box.hasClass(fullscreenCssClass); $('body').toggleClass(prefix + 'body-fullscreen', isFullscreen); $(window).trigger('scroll'); t.$c.trigger('tbw' + (isFullscreen ? 'open' : 'close') + 'fullscreen'); }, /* * Call method of trumbowyg if exist * else try to call anonymous function * and finaly native execCommand */ execCmd: function (cmd, param, forceCss, skipTrumbowyg) { var t = this; skipTrumbowyg = !!skipTrumbowyg || ''; if (cmd !== 'dropdown') { t.$ed.focus(); } try { t.doc.execCommand('styleWithCSS', false, forceCss || false); } catch (c) { } try { t[cmd + skipTrumbowyg](param); } catch (c) { try { cmd(param); } catch (e2) { if (cmd === 'insertHorizontalRule') { param = undefined; } else if (cmd === 'formatBlock' && t.isIE) { param = '<' + param + '>'; } t.doc.execCommand(cmd, false, param); t.syncCode(); t.semanticCode(false, true); } if (cmd !== 'dropdown') { t.updateButtonPaneStatus(); t.$c.trigger('tbwchange'); } } }, // Open a modal box openModal: function (title, content) { var t = this, prefix = t.o.prefix; // No open a modal box when exist other modal box if ($('.' + prefix + 'modal-box', t.$box).length > 0) { return false; } if (t.o.autogrowOnEnter) { t.autogrowOnEnterDontClose = true; } t.saveRange(); t.showOverlay(); // Disable all btnPane btns t.$btnPane.addClass(prefix + 'disable'); // Build out of ModalBox, it's the mask for animations var $modal = $('
', { class: prefix + 'modal ' + prefix + 'fixed-top' }).css({ top: t.$box.offset().top + t.$btnPane.height(), zIndex: 99999 }).appendTo($(t.doc.body)); // Click on overlay close modal by cancelling them t.$overlay.one('click', function () { $modal.trigger(CANCEL_EVENT); return false; }); // Build the form var $form = $('', { action: '', html: content }) .on('submit', function () { $modal.trigger(CONFIRM_EVENT); return false; }) .on('reset', function () { $modal.trigger(CANCEL_EVENT); return false; }) .on('submit reset', function () { if (t.o.autogrowOnEnter) { t.autogrowOnEnterDontClose = false; } }); // Build ModalBox and animate to show them var $box = $('', { class: prefix + 'modal-box', html: $form }) .css({ top: '-' + t.$btnPane.outerHeight() + 'px', opacity: 0 }) .appendTo($modal) .animate({ top: 0, opacity: 1 }, 100); // Append title $('', { text: title, class: prefix + 'modal-title' }).prependTo($box); $modal.height($box.outerHeight() + 10); // Focus in modal box $('input:first', $box).focus(); // Append Confirm and Cancel buttons t.buildModalBtn('submit', $box); t.buildModalBtn('reset', $box); $(window).trigger('scroll'); return $modal; }, // @param n is name of modal buildModalBtn: function (n, $modal) { var t = this, prefix = t.o.prefix; return $('', { class: prefix + 'modal-button ' + prefix + 'modal-' + n, type: n, text: t.lang[n] || n }).appendTo($('form', $modal)); }, // close current modal box closeModal: function () { var t = this, prefix = t.o.prefix; t.$btnPane.removeClass(prefix + 'disable'); t.$overlay.off(); // Find the modal box var $modalBox = $('.' + prefix + 'modal-box', $(t.doc.body)); $modalBox.animate({ top: '-' + $modalBox.height() }, 100, function () { $modalBox.parent().remove(); t.hideOverlay(); }); t.restoreRange(); }, // Preformated build and management modal openModalInsert: function (title, fields, cmd) { var t = this, prefix = t.o.prefix, lg = t.lang, html = ''; $.each(fields, function (fieldName, field) { var l = field.label || fieldName, n = field.name || fieldName, a = field.attributes || {}; var attr = Object.keys(a).map(function (prop) { return prop + '="' + a[prop] + '"'; }).join(' '); html += ''; }); return t.openModal(title, html) .on(CONFIRM_EVENT, function () { var $form = $('form', $(this)), valid = true, values = {}; $.each(fields, function (fieldName, field) { var n = field.name || fieldName; var $field = $('input[name="' + n + '"]', $form), inputType = $field.attr('type'); switch (inputType.toLowerCase()) { case 'checkbox': values[n] = $field.is(':checked'); break; case 'radio': values[n] = $field.filter(':checked').val(); break; default: values[n] = $.trim($field.val()); break; } // Validate value if (field.required && values[n] === '') { valid = false; t.addErrorOnModalField($field, t.lang.required); } else if (field.pattern && !field.pattern.test(values[n])) { valid = false; t.addErrorOnModalField($field, field.patternError); } }); if (valid) { t.restoreRange(); if (cmd(values, fields)) { t.syncCode(); t.$c.trigger('tbwchange'); t.closeModal(); $(this).off(CONFIRM_EVENT); } } }) .one(CANCEL_EVENT, function () { $(this).off(CONFIRM_EVENT); t.closeModal(); }); }, addErrorOnModalField: function ($field, err) { var prefix = this.o.prefix, $label = $field.parent(); $field .on('change keyup', function () { $label.removeClass(prefix + 'input-error'); }); $label .addClass(prefix + 'input-error') .find('input+span') .append( $('', { class: prefix + 'msg-error', text: err }) ); }, getDefaultImgDblClickHandler: function () { var t = this; return function () { var $img = $(this), src = $img.attr('src'), base64 = '(Base64)'; if (src.indexOf('data:image') === 0) { src = base64; } var options = { url: { label: 'URL', value: src, required: true }, alt: { label: t.lang.description, value: $img.attr('alt') } }; if (t.o.imageWidthModalEdit) { options.width = { value: $img.attr('width') ? $img.attr('width') : '' }; } t.openModalInsert(t.lang.insertImage, options, function (v) { if (v.url !== base64) { $img.attr({ src: v.url }); } $img.attr({ alt: v.alt }); if (t.o.imageWidthModalEdit) { if (parseInt(v.width) > 0) { $img.attr({ width: v.width }); } else { $img.removeAttr('width'); } } return true; }); return false; }; }, // Range management saveRange: function () { var t = this, documentSelection = t.doc.getSelection(); t.range = null; if (!documentSelection || !documentSelection.rangeCount) { return; } var savedRange = t.range = documentSelection.getRangeAt(0), range = t.doc.createRange(), rangeStart; range.selectNodeContents(t.$ed[0]); range.setEnd(savedRange.startContainer, savedRange.startOffset); rangeStart = (range + '').length; t.metaRange = { start: rangeStart, end: rangeStart + (savedRange + '').length }; }, restoreRange: function () { var t = this, metaRange = t.metaRange, savedRange = t.range, documentSelection = t.doc.getSelection(), range; if (!savedRange) { return; } if (metaRange && metaRange.start !== metaRange.end) { // Algorithm from http://jsfiddle.net/WeWy7/3/ var charIndex = 0, nodeStack = [t.$ed[0]], node, foundStart = false, stop = false; range = t.doc.createRange(); while (!stop && (node = nodeStack.pop())) { if (node.nodeType === 3) { var nextCharIndex = charIndex + node.length; if (!foundStart && metaRange.start >= charIndex && metaRange.start <= nextCharIndex) { range.setStart(node, metaRange.start - charIndex); foundStart = true; } if (foundStart && metaRange.end >= charIndex && metaRange.end <= nextCharIndex) { range.setEnd(node, metaRange.end - charIndex); stop = true; } charIndex = nextCharIndex; } else { var cn = node.childNodes, i = cn.length; while (i > 0) { i -= 1; nodeStack.push(cn[i]); } } } } documentSelection.removeAllRanges(); documentSelection.addRange(range || savedRange); }, getRangeText: function () { return this.range + ''; }, updateButtonPaneStatus: function () { var t = this, prefix = t.o.prefix, tags = t.getTagsRecursive(t.doc.getSelection().focusNode), activeClasses = prefix + 'active-button ' + prefix + 'active'; $('.' + prefix + 'active-button', t.$btnPane).removeClass(activeClasses); $.each(tags, function (i, tag) { var btnName = t.tagToButton[tag.toLowerCase()], $btn = $('.' + prefix + btnName + '-button', t.$btnPane); if ($btn.length > 0) { $btn.addClass(activeClasses); } else { try { $btn = $('.' + prefix + 'dropdown .' + prefix + btnName + '-dropdown-button', t.$box); var dropdownBtnName = $btn.parent().data('dropdown'); $('.' + prefix + dropdownBtnName + '-button', t.$box).addClass(activeClasses); } catch (e) { } } }); }, getTagsRecursive: function (element, tags) { var t = this; tags = tags || (element && element.tagName ? [element.tagName] : []); if (element && element.parentNode) { element = element.parentNode; } else { return tags; } var tag = element.tagName; if (tag === 'DIV') { return tags; } if (tag === 'P' && element.style.textAlign !== '') { tags.push(element.style.textAlign); } $.each(t.tagHandlers, function (i, tagHandler) { tags = tags.concat(tagHandler(element, t)); }); tags.push(tag); return t.getTagsRecursive(element, tags).filter(function (tag) { return tag != null; }); }, // Plugins initPlugins: function () { var t = this; t.loadedPlugins = []; $.each($.trumbowyg.plugins, function (name, plugin) { if (!plugin.shouldInit || plugin.shouldInit(t)) { plugin.init(t); if (plugin.tagHandler) { t.tagHandlers.push(plugin.tagHandler); } t.loadedPlugins.push(plugin); } }); }, destroyPlugins: function () { $.each(this.loadedPlugins, function (i, plugin) { if (plugin.destroy) { plugin.destroy(); } }); } }; })(navigator, window, document, jQuery); (function ($) { 'use strict'; $.extend(true, $.trumbowyg, { langs: { // jshint camelcase:false en: { fontFamily: 'Font' }, da: { fontFamily: 'Skrifttype' }, fr: { fontFamily: 'Police' }, de: { fontFamily: 'Schriftart' }, nl: { fontFamily: 'Lettertype' }, tr: { fontFamily: 'Yazı Tipi' }, zh_tw: { fontFamily: '字體', }, pt_br: { fontFamily: 'Fonte', } } }); // jshint camelcase:true var defaultOptions = { fontList: [ {name: 'Arial', family: 'Arial, Helvetica, sans-serif'}, {name: 'Arial Black', family: '\'Arial Black\', Gadget, sans-serif'}, {name: 'Comic Sans', family: '\'Comic Sans MS\', Textile, cursive, sans-serif'}, {name: 'Courier New', family: '\'Courier New\', Courier, monospace'}, {name: 'Georgia', family: 'Georgia, serif'}, {name: 'Impact', family: 'Impact, Charcoal, sans-serif'}, {name: 'Lucida Console', family: '\'Lucida Console\', Monaco, monospace'}, {name: 'Lucida Sans', family: '\'Lucida Sans Uncide\', \'Lucida Grande\', sans-serif'}, {name: 'Palatino', family: '\'Palatino Linotype\', \'Book Antiqua\', Palatino, serif'}, {name: 'Tahoma', family: 'Tahoma, Geneva, sans-serif'}, {name: 'Times New Roman', family: '\'Times New Roman\', Times, serif'}, {name: 'Trebuchet', family: '\'Trebuchet MS\', Helvetica, sans-serif'}, {name: 'Verdana', family: 'Verdana, Geneva, sans-serif'} ] }; // Add dropdown with web safe fonts $.extend(true, $.trumbowyg, { plugins: { fontfamily: { init: function (trumbowyg) { trumbowyg.o.plugins.fontfamily = trumbowyg.o.plugins.fontfamily || defaultOptions; trumbowyg.addBtnDef('fontfamily', { dropdown: buildDropdown(trumbowyg), hasIcon: false, text: trumbowyg.lang.fontFamily }); } } } }); function buildDropdown(trumbowyg) { var dropdown = []; $.each(trumbowyg.o.plugins.fontfamily.fontList, function (index, font) { trumbowyg.addBtnDef('fontfamily_' + index, { title: '' + font.name + '', hasIcon: false, fn: function () { trumbowyg.execCmd('fontName', font.family, true); } }); dropdown.push('fontfamily_' + index); }); return dropdown; } })(jQuery); (function ($) { 'use strict'; // jshint camelcase:true function hex(x) { return ('0' + parseInt(x).toString(16)).slice(-2); } function colorToHex(rgb) { if (rgb.search('rgb') === -1) { return rgb.replace('#', ''); } else if (rgb === 'rgba(0, 0, 0, 0)') { return 'transparent'; } else { rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/); return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); } } function colorTagHandler(element, trumbowyg) { var tags = []; if (!element.style) { return tags; } // background color if (element.style.backgroundColor !== '') { var backColor = colorToHex(element.style.backgroundColor); if (trumbowyg.o.plugins.colors.colorList.indexOf(backColor) >= 0) { tags.push('backColor' + backColor); } else { tags.push('backColorFree'); } } // text color var foreColor; if (element.style.color !== '') { foreColor = colorToHex(element.style.color); } else if (element.hasAttribute('color')) { foreColor = colorToHex(element.getAttribute('color')); } if (foreColor) { if (trumbowyg.o.plugins.colors.colorList.indexOf(foreColor) >= 0) { tags.push('foreColor' + foreColor); } else { tags.push('foreColorFree'); } } return tags; } var defaultOptions = { colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000'] }; // Default Options for font-size var fontSizedefaultOptions = { sizeList: ['x-small', 'small', 'medium', 'large', 'x-large'], allowCustomSize: true }; // Default Options for line height var lineHeightOptions = { sizeList: ['0.9', '1', '1.5', '2.0', '2.5','3.0', '3.5', '4.0', '4.5', '5.0'], allowCustomSize: true }; // If WP media is a button function openwpmediaDef(trumbowyg) { return { fn: function() { // WP media button logic var func_media = window['pagelayer_select_frame']; if(typeof func_media == 'function'){ // Load the frame var frame = pagelayer_select_frame('image'); // On select update the stuff frame.on({'select': function(){ var state = frame.state(); var url = '', alt = '', id = ''; // External URL if('props' in state){ url = state.props.attributes.url; alt = state.props.attributes.alt; // Internal from gallery }else{ var attachment = frame.state().get('selection').first().toJSON(); //console.log(attachment); // Set the new and URL url = attachment.url; alt = attachment.alt; id = attachment.id; } trumbowyg.execCmd('insertImage', url, false, true); var $img = $('img[src="' + url + '"]:not([alt])', trumbowyg.$box); $img.attr('alt', alt); $img.attr('pl-media-id', id); trumbowyg.syncCode; trumbowyg.$c.trigger('tbwchange'); return true; } }); frame.open(); } }, ico: 'insert-image' } } $.extend(true, $.trumbowyg, { // Add some translations langs: { en: { wpmedia: 'Insert Image', foreColor: 'Text color', backColor: 'Background color', fontsize: 'Font size', fontsizes: { 'x-small': 'Extra small', 'small': 'Small', 'medium': 'Regular', 'large': 'Large', 'x-large': 'Extra large', 'custom': 'Custom' }, fontCustomSize: { title: 'Custom Font Size', label: 'Font Size', value: '48px' }, lineheight: 'Line Height', lineCustomHeight: { title: 'Custom Line Height', label: 'Line Height', value: '7.0' }, lineheights: { 'normal': 'Normal', 'custom': 'Custom', } }, }, // Add our plugin to Trumbowyg registred plugins plugins: { wpmedia: { init: function(trumbowyg) { var t = $(this); // Fill current Trumbowyg instance with WP media default options trumbowyg.o.plugins.wpmedia = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.wpmedia || {} ); // If WP media is a trumbowyg.addBtnDef('wpmedia', openwpmediaDef(trumbowyg)); }, }, color: { init: function (trumbowyg) { trumbowyg.o.plugins.colors = trumbowyg.o.plugins.colors || defaultOptions; var foreColorBtnDef = { dropdown: buildDropdown('foreColor', trumbowyg) }, backColorBtnDef = { dropdown: buildDropdown('backColor', trumbowyg) }; trumbowyg.addBtnDef('foreColor', foreColorBtnDef); trumbowyg.addBtnDef('backColor', backColorBtnDef); }, tagHandler: colorTagHandler }, pasteImage: { init: function (trumbowyg) { trumbowyg.pasteHandlers.push(function (pasteEvent) { var pagelayer_ajax_func = {}; // This function for ajax success call back pagelayer_ajax_func['success'] = function(obj){ //alert(obj); if(obj['success']){ trumbowyg.execCmd('insertImage', obj['data']['url'], false, true); }else{ alert(obj['data']['message']); } } // This function for ajax before send call back pagelayer_ajax_func['beforeSend'] = function(xhr){ trumbowyg.showOverlay(); } // This function for ajax complete call back pagelayer_ajax_func['complete'] = function(xhr){ trumbowyg.hideOverlay(); } pagelayer_editable_paste_handler(pasteEvent, pagelayer_ajax_func); }); } }, fontsize: { init: function (trumbowyg) { trumbowyg.o.plugins.fontsize = $.extend({}, fontSizedefaultOptions, trumbowyg.o.plugins.fontsize || {} ); trumbowyg.addBtnDef('fontsize', { dropdown: fontSizeBuildDropdown(trumbowyg) }); } }, lineheight: { init: function (trumbowyg) { trumbowyg.o.plugins.lineheight = $.extend({}, lineHeightOptions, trumbowyg.o.plugins.lineheight || {} ); trumbowyg.addBtnDef('lineheight', { dropdown: lineHeightDropdown(trumbowyg) }); } } } }); function buildDropdown(fn, trumbowyg) { var dropdown = []; $.each(trumbowyg.o.plugins.colors.colorList, function (i, color) { var btn = fn + color, btnDef = { fn: fn, forceCss: true, param: '#' + color, style: 'background-color: #' + color + ';' }; trumbowyg.addBtnDef(btn, btnDef); dropdown.push(btn); }); var removeColorButtonName = fn + 'Remove', removeColorBtnDef = { fn: 'removeFormat', param: fn, style: 'background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);' }; trumbowyg.addBtnDef(removeColorButtonName, removeColorBtnDef); dropdown.push(removeColorButtonName); // add free color btn var freeColorButtonName = fn + 'Free', freeColorBtnDef = { fn: function () { trumbowyg.openModalInsert(trumbowyg.lang[fn], { color: { label: fn, forceCss: true, type: 'color', value: '#FFFFFF' } }, // callback function (values) { trumbowyg.execCmd(fn, values.color); return true; } ); }, text: '#', // style adjust for displaying the text style: 'text-indent: 0;line-height: 20px;padding: 0 5px;' }; trumbowyg.addBtnDef(freeColorButtonName, freeColorBtnDef); dropdown.push(freeColorButtonName); return dropdown; } // Functions for font-size widget function setFontSize(trumbowyg, size) { trumbowyg.$ed.focus(); trumbowyg.saveRange(); var text = trumbowyg.range.startContainer.parentElement; var selectedText = trumbowyg.getRangeText(); if ($(text).html() === selectedText) { $(text).css('font-size', size); } else { trumbowyg.range.deleteContents(); var html = '' + selectedText + ''; var node = $(html)[0]; trumbowyg.range.insertNode(node); } } function fontSizeBuildDropdown(trumbowyg) { var dropdown = []; $.each(trumbowyg.o.plugins.fontsize.sizeList, function (index, size) { trumbowyg.addBtnDef('fontsize_' + size, { text: '' + (trumbowyg.lang.fontsizes[size] || size) + '', hasIcon: false, fn: function () { setFontSize(trumbowyg, size); trumbowyg.syncCode(); trumbowyg.$c.trigger('tbwchange'); } }); dropdown.push('fontsize_' + size); }); if (trumbowyg.o.plugins.fontsize.allowCustomSize) { var customSizeButtonName = 'fontsize_custom'; var customSizeBtnDef = { fn: function () { trumbowyg.openModalInsert(trumbowyg.lang.fontCustomSize.title, { size: { label: trumbowyg.lang.fontCustomSize.label, value: trumbowyg.lang.fontCustomSize.value } }, function (form) { setFontSize(trumbowyg, form.size); return true; } ); }, text: '' + trumbowyg.lang.fontsizes.custom + '', hasIcon: false }; trumbowyg.addBtnDef(customSizeButtonName, customSizeBtnDef); dropdown.push(customSizeButtonName); } return dropdown; } // Build the dropdown for line-height function lineHeightDropdown(trumbowyg) { var dropdown = []; $.each(trumbowyg.o.plugins.lineheight.sizeList, function(index, size) { trumbowyg.addBtnDef('lineheight_' + size, { text: trumbowyg.lang.lineheights[size] || size, hasIcon: false, fn: function(){ setLineHight(trumbowyg, size); } }); dropdown.push('lineheight_' + size); }); if (trumbowyg.o.plugins.lineheight.allowCustomSize) { var customSizeButtonName = 'lineheight_custom'; var customSizeBtnDef = { fn: function () { trumbowyg.openModalInsert(trumbowyg.lang.lineCustomHeight.title, { size: { label: trumbowyg.lang.lineCustomHeight.label, value: trumbowyg.lang.lineCustomHeight.value } }, function (form) { setLineHight(trumbowyg, form.size); return true; } ); }, text: '' + trumbowyg.lang.lineheights.custom + '', hasIcon: false }; trumbowyg.addBtnDef(customSizeButtonName, customSizeBtnDef); dropdown.push(customSizeButtonName); } return dropdown; } // Set line-height function setLineHight(trumbowyg, size) { trumbowyg.$ed.focus(); trumbowyg.saveRange(); var parent = trumbowyg.range.startContainer.parentElement; var text = trumbowyg.getRangeText(); if ($(parent).html() === text) { $(parent).css('line-height', size); } else { trumbowyg.range.deleteContents(); var html = '' + text + ''; var node = $(html)[0]; trumbowyg.range.insertNode(node); } trumbowyg.syncCode(); trumbowyg.$c.trigger('tbwchange'); } })(jQuery); /*! Licensed under MIT, https://github.com/sofish/pen */ (function(root, doc) { var Pen, debugMode, selection, utils = {}; var toString = Object.prototype.toString; var slice = Array.prototype.slice; // allow command list var commandsReg = { block: /^(?:p|h[1-6]|blockquote|pre)$/, inline: /^(?:bold|italic|underline|insertorderedlist|insertunorderedlist|indent|outdent)$/, source: /^(?:createlink|unlink)$/, insert: /^(?:inserthorizontalrule|insertimage|insert)$/, wrap: /^(?:code)$/ }; var lineBreakReg = /^(?:blockquote|pre|div)$/i; var effectNodeReg = /(?:[pubia]|h[1-6]|blockquote|[uo]l|li)/i; var strReg = { whiteSpace: /(^\s+)|(\s+$)/g, mailTo: /^(?!mailto:|.+\/|.+#|.+\?)(.*@.*\..+)$/, http: /^(?!\w+?:\/\/|mailto:|\/|\.\/|\?|#)(.*)$/ }; var autoLinkReg = { url: /((https?|ftp):\/\/|www\.)[^\s<]{3,}/gi, prefix: /^(?:https?|ftp):\/\//i, notLink: /^(?:img|a|input|audio|video|source|code|pre|script|head|title|style)$/i, maxLength: 100 }; // type detect utils.is = function(obj, type) { return toString.call(obj).slice(8, -1) === type; }; utils.forEach = function(obj, iterator, arrayLike) { if (!obj) return; if (arrayLike == null) arrayLike = utils.is(obj, 'Array'); if (arrayLike) { for (var i = 0, l = obj.length; i < l; i++) iterator(obj[i], i, obj); } else { for (var key in obj) { if (obj.hasOwnProperty(key)) iterator(obj[key], key, obj); } } }; // copy props from a obj utils.copy = function(defaults, source) { utils.forEach(source, function (value, key) { defaults[key] = utils.is(value, 'Object') ? utils.copy({}, value) : utils.is(value, 'Array') ? utils.copy([], value) : value; }); return defaults; }; // log utils.log = function(message, force) { if (debugMode || force) console.log('%cPEN DEBUGGER: %c' + message, 'font-family:arial,sans-serif;color:#1abf89;line-height:2em;', 'font-family:cursor,monospace;color:#333;'); }; utils.delayExec = function (fn) { var timer = null; return function (delay) { clearTimeout(timer); timer = setTimeout(function() { fn(); }, delay || 1); }; }; // merge: make it easy to have a fallback utils.merge = function(config) { // default settings var defaults = { class: 'pen', debug: false, toolbar: null, // custom toolbar stay: config.stay || !config.debug, stayMsg: 'Are you going to leave here?', textarea: '', list: [ 'blockquote', 'h2', 'h3', 'p', 'code', 'insertorderedlist', 'insertunorderedlist', 'inserthorizontalrule', 'indent', 'outdent', 'bold', 'italic', 'underline', 'createlink', 'insertimage' ], titles: {}, cleanAttrs: ['id', 'class', 'style', 'name'], cleanTags: ['script'], linksInNewWindow: false }; // user-friendly config if (config.nodeType === 1) { defaults.editor = config; } else if (config.match && config.match(/^#[\S]+$/)) { defaults.editor = doc.getElementById(config.slice(1)); } else { defaults = utils.copy(defaults, config); } return defaults; }; function commandOverall(ctx, cmd, val) { var message = ' to exec 「' + cmd + '」 command' + (val ? (' with value: ' + val) : ''); try { doc.execCommand(cmd, false, val); } catch(err) { // TODO: there's an error when insert a image to document, but not a bug return utils.log('fail' + message, true); } utils.log('success' + message); } function commandInsert(ctx, name, val) { var node = getNode(ctx); if (!node) return; ctx._range.selectNode(node); ctx._range.collapse(false); // hide menu when a image was inserted if(name === 'insertimage' && ctx._menu) toggleNode(ctx._menu, true); return commandOverall(ctx, name, val); } function commandBlock(ctx, name) { var list = effectNode(ctx, getNode(ctx), true); if (list.indexOf(name) !== -1) name = 'p'; return commandOverall(ctx, 'formatblock', name); } function commandWrap(ctx, tag, value) { value = '<' + tag + '>' + (value||selection.toString()) + '' + tag + '>'; return commandOverall(ctx, 'insertHTML', value); } function commandLink(ctx, tag, value) { if (ctx.config.linksInNewWindow) { value = '< a href="' + value + '" target="_blank">' + (selection.toString()) + ''; return commandOverall(ctx, 'insertHTML', value); } else { return commandOverall(ctx, tag, value); } } function initToolbar(ctx) { var icons = '', inputStr = ''; ctx._toolbar = ctx.config.toolbar; if (!ctx._toolbar) { var toolList = ctx.config.list; utils.forEach(toolList, function (name) { var klass = 'pen-icon icon-' + name; var title = ctx.config.titles[name] || ''; icons += ''; }, true); if (toolList.indexOf('createlink') >= 0 || toolList.indexOf('insertimage') >= 0) icons += inputStr; } else if (ctx._toolbar.querySelectorAll('[data-action=createlink]').length || ctx._toolbar.querySelectorAll('[data-action=insertimage]').length) { icons += inputStr; } if (icons) { ctx._menu = doc.createElement('div'); ctx._menu.setAttribute('class', ctx.config.class + '-menu pen-menu'); ctx._menu.innerHTML = icons; ctx._inputBar = ctx._menu.querySelector('input'); toggleNode(ctx._menu, true); doc.body.appendChild(ctx._menu); } if (ctx._toolbar && ctx._inputBar) toggleNode(ctx._inputBar); } function initEvents(ctx) { var toolbar = ctx._toolbar || ctx._menu, editor = ctx.config.editor; var toggleMenu = utils.delayExec(function() { ctx.highlight().menu(); }); var outsideClick = function() {}; function updateStatus(delay) { ctx._range = ctx.getRange(); toggleMenu(delay); } if (ctx._menu) { var setpos = function() { if (ctx._menu.style.display === 'block') ctx.menu(); }; // change menu offset when window resize / scroll addListener(ctx, root, 'resize', setpos); addListener(ctx, root, 'scroll', setpos); // toggle toolbar on mouse select var selecting = false; addListener(ctx, editor, 'mousedown', function() { selecting = true; }); addListener(ctx, editor, 'mouseleave', function() { if (selecting) updateStatus(800); selecting = false; }); addListener(ctx, editor, 'mouseup', function() { if (selecting) updateStatus(100); selecting = false; }); // Hide menu when focusing outside of editor outsideClick = function(e) { if (ctx._menu && !containsNode(editor, e.target) && !containsNode(ctx._menu, e.target)) { removeListener(ctx, doc, 'click', outsideClick); toggleMenu(100); } }; } else { addListener(ctx, editor, 'click', function() { updateStatus(0); }); } addListener(ctx, editor, 'keyup', function(e) { if (e.which === 8 && ctx.isEmpty()) return lineBreak(ctx, true); // toggle toolbar on key select if (e.which !== 13 || e.shiftKey) return updateStatus(400); var node = getNode(ctx, true); if (!node || !node.nextSibling || !lineBreakReg.test(node.nodeName)) return; if (node.nodeName !== node.nextSibling.nodeName) return; // hack for webkit, make 'enter' behavior like as firefox. if (node.lastChild.nodeName !== 'BR') node.appendChild(doc.createElement('br')); utils.forEach(node.nextSibling.childNodes, function(child) { if (child) node.appendChild(child); }, true); node.parentNode.removeChild(node.nextSibling); focusNode(ctx, node.lastChild, ctx.getRange()); }); // check line break addListener(ctx, editor, 'keydown', function(e) { editor.classList.remove('pen-placeholder'); if (e.which !== 13 || e.shiftKey) return; var node = getNode(ctx, true); if (!node || !lineBreakReg.test(node.nodeName)) return; var lastChild = node.lastChild; if (!lastChild || !lastChild.previousSibling) return; if (lastChild.previousSibling.textContent || lastChild.textContent) return; // quit block mode for 2 'enter' e.preventDefault(); var p = doc.createElement('p'); p.innerHTML = ']*>(.*?)<\/pre>/ig, '\n```\n$1\n```\n'],
code: [/]*>(.*?)<\/code>/ig, '\n`\n$1\n`\n'],
p: [/]*>(.*?)<\/p>/ig, '\n$1\n'],
hr: [/
]*>/ig, '\n---\n']
};
Pen.prototype.toMd = function() {
var html = this.getContent()
.replace(/\n+/g, '') // remove line break
.replace(/<([uo])l\b[^>]*>(.*?)<\/\1l>/ig, '$2'); // remove ul/ol
for(var p in regs) {
if (regs.hasOwnProperty(p))
html = html.replace.apply(html, regs[p]);
}
return html.replace(/\*{5}/g, '**');
};
// make it accessible
if (doc.getSelection) {
selection = doc.getSelection();
root.Pen = Pen;
}
}(window, document));
function pagelayer_tlite(getTooltipOpts) {
document.addEventListener('mouseover', function (e) {
var el = e.target;
var opts = getTooltipOpts(el);
if (!opts) {
el = el.parentElement;
opts = el && getTooltipOpts(el);
}
opts && pagelayer_tlite.show(el, opts, true);
});
}
pagelayer_tlite.show = function (el, opts, isAuto) {
var fallbackAttrib = 'data-tlite';
opts = opts || {};
(el.tooltip || Tooltip(el, opts)).show();
function Tooltip(el, opts) {
var tooltipEl;
var showTimer;
var text;
el.addEventListener('mousedown', autoHide);
el.addEventListener('mouseleave', autoHide);
function show() {
text = el.title || el.getAttribute(fallbackAttrib) || text;
el.title = '';
el.setAttribute(fallbackAttrib, '');
text && !showTimer && (showTimer = setTimeout(fadeIn, isAuto ? 150 : 1))
}
function autoHide() {
pagelayer_tlite.hide(el, true);
}
function hide(isAutoHiding) {
if (isAuto === isAutoHiding) {
showTimer = clearTimeout(showTimer);
var parent = tooltipEl && tooltipEl.parentNode;
parent && parent.removeChild(tooltipEl);
tooltipEl = undefined;
}
}
function fadeIn() {
if (!tooltipEl) {
tooltipEl = createTooltip(el, text, opts);
}
}
return el.tooltip = {
show: show,
hide: hide
};
}
function createTooltip(el, text, opts) {
var tooltipEl = document.createElement('span');
var grav = opts.grav || el.getAttribute('data-tlite') || 'n';
tooltipEl.innerHTML = text;
el.appendChild(tooltipEl);
var vertGrav = grav[0] || '';
var horzGrav = grav[1] || '';
var windowInnerWidth = window.parent.innerWidth - 15;
var windowInnerHeight = window.parent.innerHeight;
function positionTooltip() {
tooltipEl.className = 'pagelayer-tlite ' + 'pagelayer-tlite-' + vertGrav + horzGrav;
var arrowSize = 10;
var top = el.offsetTop;
var left = el.offsetLeft;
if (tooltipEl.offsetParent === el) {
top = left = 0;
}
var width = el.offsetWidth;
var height = el.offsetHeight;
var tooltipHeight = tooltipEl.offsetHeight;
var tooltipWidth = tooltipEl.offsetWidth;
var centerEl = left + (width / 2);
tooltipEl.style.top = (
vertGrav === 's' ? (top - tooltipHeight - arrowSize) :
vertGrav === 'n' ? (top + height + arrowSize) :
(top + (height / 2) - (tooltipHeight / 2))
) + 'px';
tooltipEl.style.left = (
horzGrav === 'w' ? left :
horzGrav === 'e' ? left + width - tooltipWidth :
vertGrav === 'w' ? (left + width + arrowSize) :
vertGrav === 'e' ? (left - tooltipWidth - arrowSize) :
(centerEl - tooltipWidth / 2)
) + 'px';
}
positionTooltip();
var rect = tooltipEl.getBoundingClientRect();
if (vertGrav === 's' && rect.top < 0) {
vertGrav = 'n';
positionTooltip();
} else if (vertGrav === 'n' && rect.bottom > windowInnerHeight) {
vertGrav = 's';
positionTooltip();
} else if (vertGrav === 'e' && rect.left < 0) {
vertGrav = 'w';
positionTooltip();
} else if (vertGrav === 'w' && rect.right > windowInnerWidth) {
vertGrav = 'e';
positionTooltip();
}
positionTooltip();
// Additional handling
if(rect.left < 0) {
horzGrav = 'w';
positionTooltip();
} else if (rect.right > windowInnerWidth) {
horzGrav = 'e';
positionTooltip();
}
tooltipEl.className += ' pagelayer-tlite-visible';
return tooltipEl;
}
};
pagelayer_tlite.hide = function (el, isAuto) {
el.tooltip && el.tooltip.hide(isAuto);
};
if (typeof module !== 'undefined' && module.exports) {
module.exports = tlite;
}
/*!
* imagesLoaded PACKAGED v4.1.4
* JavaScript is all like "You images are done yet or what?"
* MIT License
*/
!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o",{src:a,class:"nivo-lightbox-image-display"});h.one("load",function(){var e=t('');e.append(h),o.html(e).removeClass("nivo-lightbox-loading"),e.css({"line-height":t(".nivo-lightbox-content").height()+"px",height:t(".nivo-lightbox-content").height()+"px"}),t(i).resize(function(){e.css({"line-height":t(".nivo-lightbox-content").height()+"px",height:t(".nivo-lightbox-content").height()+"px"})})}).each(function(){this.complete&&t(this).load()}),h.error(function(){var i=t(''+n.options.errorMessage+"
");o.html(i).removeClass("nivo-lightbox-loading")})}else if(l){var s="",r="nivo-lightbox-video";if("youtube"==l[1]&&(s="//www.youtube.com/embed/"+l[4],r="nivo-lightbox-youtube"),"youtube-nocookie"==l[1]&&(s=a,r="nivo-lightbox-youtube"),"youtu"==l[1]&&(s="//www.youtube.com/embed/"+l[3],r="nivo-lightbox-youtube"),"vimeo"==l[1]&&(s="//player.vimeo.com/video/"+l[3],r="nivo-lightbox-vimeo"),s){var c=t("
'+n.options.errorMessage+"