From e643a48fe85a213c11f5596fc8f22293332a3ff6 Mon Sep 17 00:00:00 2001 From: Denis Shakhov Date: Mon, 15 Sep 2014 18:40:12 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20Editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Код оформлен в виде виджетов jQuery * Управление разными редакторами сделано через один виджет lsEditor * Обновлен TinyMCE до последней версии * Адаптация TinyMCE в процессе --- application/config/config.php | 2 +- application/frontend/common/js/editor.js | 32 ----- .../frontend/common/js/editor.markup.js | 126 ------------------ .../frontend/common/js/editor.visual.js | 115 ---------------- .../frontend/skin/developer/assets/js/init.js | 2 +- .../editor/css}/editor.css | 0 .../developer/components/editor/editor.tpl | 29 ++-- .../developer/components/editor/js/editor.js | 41 ++++++ .../components/editor/js/editor.markup.js | 85 ++++++++++++ .../components/editor/js/editor.visual.js | 58 ++++++++ 10 files changed, 201 insertions(+), 289 deletions(-) delete mode 100644 application/frontend/common/js/editor.js delete mode 100644 application/frontend/common/js/editor.markup.js delete mode 100644 application/frontend/common/js/editor.visual.js rename application/frontend/skin/developer/{assets/css/components => components/editor/css}/editor.css (100%) create mode 100644 application/frontend/skin/developer/components/editor/js/editor.js create mode 100644 application/frontend/skin/developer/components/editor/js/editor.markup.js create mode 100644 application/frontend/skin/developer/components/editor/js/editor.visual.js diff --git a/application/config/config.php b/application/config/config.php index aece4428..3ff166c5 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -521,7 +521,7 @@ $config['head']['default']['js'] = array( "___path.application.web___/frontend/common/js/favourite_topic.js", "___path.application.web___/frontend/common/js/blocks.js", "___path.application.web___/frontend/common/js/pagination.js", - "___path.application.web___/frontend/common/js/editor.js", + "___path.skin.web___/components/editor/js/editor.js", "___path.application.web___/frontend/common/js/talk.js", "___path.application.web___/frontend/common/js/vote.js", "___path.application.web___/frontend/common/js/poll.js", diff --git a/application/frontend/common/js/editor.js b/application/frontend/common/js/editor.js deleted file mode 100644 index f925650a..00000000 --- a/application/frontend/common/js/editor.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Вспомгательные функции для текстового редактора - * - * @module ls/editor - * - * @license GNU General Public License, version 2 - * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} - * @author Denis Shakhov - */ - -var ls = ls || {}; - -ls.editor = (function($) { - "use strict"; - - /** - * Инициализация - */ - this.init = function(selector) { - var _this = this; - - $(selector).each(function () { - var editor = $(this), - type = editor.data('editor-type'), - set = editor.data('editor-set') || 'default'; - - ls.editor[type].init(editor, set); - }) - }; - - return this; -}).call(ls.editor || {},jQuery); \ No newline at end of file diff --git a/application/frontend/common/js/editor.markup.js b/application/frontend/common/js/editor.markup.js deleted file mode 100644 index 6952c9f0..00000000 --- a/application/frontend/common/js/editor.markup.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Markup редактор - * - * @module ls/editor - * - * @license GNU General Public License, version 2 - * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} - * @author Denis Shakhov - */ - -var ls = ls || {}; -ls.editor = ls.editor || {}; - -ls.editor.markup = (function($) { - "use strict"; - - /** - * Дефолтные опции - */ - var defaults = { - sets: { - default: { - onShiftEnter: {keepDefault:false, replaceWith:'
\n'}, - onCtrlEnter: {keepDefault:false, openWith:'\n

', closeWith:'

'}, - onTab: {keepDefault:false, replaceWith:' '}, - markupSet: [ - {name:'H4', className:'editor-h4', openWith:'

', closeWith:'

' }, - {name:'H5', className:'editor-h5', openWith:'
', closeWith:'
' }, - {name:'H6', className:'editor-h6', openWith:'
', closeWith:'
' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_b'), className:'editor-bold', key:'B', openWith:'(!(|!|)!)', closeWith:'(!(|!|)!)' }, - {name: ls.lang.get('panel_i'), className:'editor-italic', key:'I', openWith:'(!(|!|)!)', closeWith:'(!(|!|)!)' }, - {name: ls.lang.get('panel_s'), className:'editor-stroke', key:'S', openWith:'', closeWith:'' }, - {name: ls.lang.get('panel_u'), className:'editor-underline', key:'U', openWith:'', closeWith:'' }, - {name: ls.lang.get('panel_quote'), className:'editor-quote', key:'Q', replaceWith: function(m) { if (m.selectionOuter) return '
'+m.selectionOuter+'
'; else if (m.selection) return '
'+m.selection+'
'; else return '
' } }, - {name: ls.lang.get('panel_code'), className:'editor-code', openWith:'<(!(code|!|codeline)!)>', closeWith:'' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_list'), className:'editor-ul', openWith:'
  • ', closeWith:'
  • ', multiline: true, openBlockWith:'
      \n', closeBlockWith:'\n
    ' }, - {name: ls.lang.get('panel_list'), className:'editor-ol', openWith:'
  • ', closeWith:'
  • ', multiline: true, openBlockWith:'
      \n', closeBlockWith:'\n
    ' }, - {name: ls.lang.get('panel_list_li'), className:'editor-li', openWith:'
  • ', closeWith:'
  • ' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_image'), className:'editor-picture', key:'P', beforeInsert: function(h) { jQuery('#modal-image-upload').modal('show'); } }, - {name: ls.lang.get('panel_video'), className:'editor-video', replaceWith:'' }, - {name: ls.lang.get('panel_url'), className:'editor-link', key:'L', openWith:'', closeWith:'', placeHolder:'Your text to link...' }, - {name: ls.lang.get('panel_user'), className:'editor-user', replaceWith:'' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_clear_tags'), className:'editor-clean', replaceWith: function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } }, - {name: ls.lang.get('panel_cut'), className:'editor-cut', replaceWith: function(markitup) { if (markitup.selection) return ''; else return '' }} - ] - }, - light: { - onShiftEnter: {keepDefault:false, replaceWith:'
    \n'}, - onTab: {keepDefault:false, replaceWith:' '}, - markupSet: [ - {name: ls.lang.get('panel_b'), className:'editor-bold', key:'B', openWith:'(!(|!|)!)', closeWith:'(!(|!|)!)' }, - {name: ls.lang.get('panel_i'), className:'editor-italic', key:'I', openWith:'(!(|!|)!)', closeWith:'(!(|!|)!)' }, - {name: ls.lang.get('panel_s'), className:'editor-stroke', key:'S', openWith:'', closeWith:'' }, - {name: ls.lang.get('panel_u'), className:'editor-underline', key:'U', openWith:'', closeWith:'' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_quote'), className:'editor-quote', key:'Q', replaceWith: function(m) { if (m.selectionOuter) return '
    '+m.selectionOuter+'
    '; else if (m.selection) return '
    '+m.selection+'
    '; else return '
    ' } }, - {name: ls.lang.get('panel_code'), className:'editor-code', openWith:'<(!(code|!|codeline)!)>', closeWith:'' }, - {name: ls.lang.get('panel_image'), className:'editor-picture', key:'P', beforeInsert: function(h) { jQuery('#modal-image-upload').modal('show'); } }, - {name: ls.lang.get('panel_url'), className:'editor-link', key:'L', openWith:'', closeWith:'', placeHolder:'Your text to link...' }, - {name: ls.lang.get('panel_user'), className:'editor-user', replaceWith:'' }, - {separator:'---------------' }, - {name: ls.lang.get('panel_clear_tags'), className:'editor-clean', replaceWith: function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } } - ] - } - } - }; - - /** - * Инициализация - * - */ - this.init = function(element, set) { - var self = this; - - this.options = $.extend({}, defaults); - - element.markItUp(this.options.sets[set]); - - // Справка по разметке редактора - $('.js-editor-help-toggle').on('click', function (e) { - $(this).parent().next().toggle(); - e.preventDefault(); - }); - - $('.js-editor-help').each(function () { - var oEditorHelp = $(this), - oTargetForm = $('#' + oEditorHelp.data('form-id')); - - oEditorHelp.find('.js-tags-help-link').on('click', function (e) { - if ($(this).data('insert')) { - var sTag = $(this).data('insert'); - } else { - var sTag = $(this).text(); - } - - $.markItUp({ - target: oTargetForm, - replaceWith: sTag - }); - - e.preventDefault(); - }); - }); - }; - - /** - * Вставка ссылки загруженного изображения в редактор - * - * @param {String} sUrl Ссылка - * @param {String} sAlign Выравнивание - * @param {String} sTitle Описание - */ - this.insertImageUrlToEditor = function(sUrl, sAlign, sTitle) { - sAlign = sAlign == 'center' ? 'class="image-center"' : 'align="' + sAlign + '"'; - - $.markItUp({ - replaceWith: '' - }); - }; - - return this; -}).call(ls.editor.markup || {},jQuery); \ No newline at end of file diff --git a/application/frontend/common/js/editor.visual.js b/application/frontend/common/js/editor.visual.js deleted file mode 100644 index 4d38a155..00000000 --- a/application/frontend/common/js/editor.visual.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Визуальный редактор - * - * @module ls/editor - * - * @license GNU General Public License, version 2 - * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} - * @author Denis Shakhov - */ - -var ls = ls || {}; -ls.editor = ls.editor || {}; - -ls.editor.visual = (function($) { - "use strict"; - - /** - * Дефолтные опции - */ - var defaults = { - sets: { - default: { - mode : "specific_textareas", - editor_selector : "js-editor", - theme : "advanced", - skin : "livestreet", - width : "100%", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_buttons1 : "lshselect,bold,italic,underline,strikethrough,|,bullist,numlist,|,undo,redo,|,lslink,unlink,lsvideo,lsimage,pagebreak,code", - theme_advanced_buttons2 : "", - theme_advanced_buttons3 : "", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - theme_advanced_resize_horizontal : 0, - theme_advanced_resizing_use_cookie : 0, - theme_advanced_path : false, - object_resizing : true, - force_br_newlines : true, - forced_root_block : '', // Needed for 3.x - force_p_newlines : false, - plugins : "lseditor,safari,inlinepopups,media,pagebreak,autoresize", - convert_urls : false, - extended_valid_elements : "embed[src|type|allowscriptaccess|allowfullscreen|width|height]", - pagebreak_separator : "", - media_strict : false, - language : LANGUAGE, - inline_styles: false, - formats : { - underline : {inline : 'u', exact : true}, - strikethrough : {inline : 's', exact : true} - } - }, - light: { - mode : "textareas", - theme : "advanced", - skin : "livestreet", - width : "100%", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_buttons1 : "bold,italic,underline,strikethrough,lslink,lsquote", - theme_advanced_buttons2 : "", - theme_advanced_buttons3 : "", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - theme_advanced_resize_horizontal : 0, - theme_advanced_resizing_use_cookie : 0, - theme_advanced_path : false, - object_resizing : true, - force_br_newlines : true, - forced_root_block : '', // Needed for 3.x - force_p_newlines : false, - plugins : "lseditor,safari,inlinepopups,media,pagebreak,autoresize", - convert_urls : false, - extended_valid_elements : "embed[src|type|allowscriptaccess|allowfullscreen|width|height]", - pagebreak_separator : "", - media_strict : false, - language : 'ru', - inline_styles: false, - formats : { - underline : {inline : 'u', exact : true}, - strikethrough : {inline : 's', exact : true} - }, - setup : function(ed) { - // Display an alert onclick - ed.onKeyPress.add(function(ed, e) { - key = e.keyCode || e.which; - if(e.ctrlKey && (key == 13)) { - $('#comment-button-submit').click(); - return false; - } - }); - } - } - } - }; - - /** - * Инициализация - */ - this.init = function(element, set) { - this.options = $.extend({}, defaults); - - // Т.к. тини не принимает jquery элементы в качестве селектора - // пишем небольшой костыль который генерит рандомный класс и используем его как селектор - var selector = 'tinymce' + Math.floor(Math.random() * 10e10); - - element.addClass(selector); - - this.options.sets[set].editor_selector = selector; - tinyMCE.init(this.options.sets[set]); - }; - - return this; -}).call(ls.editor.visual || {},jQuery); \ No newline at end of file diff --git a/application/frontend/skin/developer/assets/js/init.js b/application/frontend/skin/developer/assets/js/init.js index fad70487..8809f9c0 100644 --- a/application/frontend/skin/developer/assets/js/init.js +++ b/application/frontend/skin/developer/assets/js/init.js @@ -232,7 +232,7 @@ jQuery(document).ready(function($){ /** * Editor */ - ls.editor.init('.js-editor'); + $( '.js-editor' ).lsEditor(); /** diff --git a/application/frontend/skin/developer/assets/css/components/editor.css b/application/frontend/skin/developer/components/editor/css/editor.css similarity index 100% rename from application/frontend/skin/developer/assets/css/components/editor.css rename to application/frontend/skin/developer/components/editor/css/editor.css diff --git a/application/frontend/skin/developer/components/editor/editor.tpl b/application/frontend/skin/developer/components/editor/editor.tpl index 9b6d8357..83648897 100644 --- a/application/frontend/skin/developer/components/editor/editor.tpl +++ b/application/frontend/skin/developer/components/editor/editor.tpl @@ -3,17 +3,17 @@ *} {* Название компонента *} -{$_sComponentName = 'editor'} +{$component = 'editor'} {* Получаем тип редактора *} -{$_sType = ( Config::Get('view.wysiwyg') ) ? 'visual' : 'markup'} -{$_sSet = $smarty.local.sSet|default:'default'} +{$type = ( ( $smarty.local.type ) ? $smarty.local.type : ( Config::Get('view.wysiwyg') ) ? 'visual' : 'markup' )} +{$set = $smarty.local.sSet|default:'default'} {* Уникальный ID *} -{$_uid = $smarty.local.sId|default:($_sComponentName|cat:rand(0, 10e10))} +{$_uid = $smarty.local.sId|default:($component|cat:rand(0, 10e10))} {* Класс на который вешается обработчик редактора *} -{$_sBindClass = $smarty.local.sBindClass|default:"js-{$_sComponentName}"} +{$_sBindClass = $smarty.local.sBindClass|default:"js-{$component}"} {** * Textarea @@ -31,16 +31,17 @@ sEntityField = $smarty.local.sEntityField sEntity = $smarty.local.sEntity sInputClasses = "$_sBindClass {$smarty.local.sInputClasses}" - sInputAttributes = "{$smarty.local.sAttributes} data-editor-type=\"{$_sType}\" data-editor-set=\"{$_sSet}\"" + sInputAttributes = "{$smarty.local.sAttributes} data-editor-type=\"{$type}\" data-editor-set=\"{$set}\"" sNote = $smarty.local.sNote iRows = $smarty.local.iRows|default:10} {/function} {* Визуальный редактор *} -{if Config::Get('view.wysiwyg')} +{if $type == 'visual'} {hookb run='editor_visual'} - {asset type='js' name='editor_visual' file="{Config::Get('path.framework.frontend.web')}/js/vendor/tinymce/tiny_mce.js"} - {asset type='js' name='editor_visual_options' file="{Config::Get('path.application.web')}/frontend/common/js/editor.visual.js"} + {asset type='js' name='editor_visual' file="{Config::Get('path.skin.web')}/components/editor/vendor/tinymce/js/tinymce/tinymce.min.js"} + {asset type='js' name='editor_visual_1' file="{Config::Get('path.skin.web')}/components/editor/vendor/tinymce/js/tinymce/jquery.tinymce.min.js"} + {asset type='js' name='editor_visual_2' file="{Config::Get('path.skin.web')}/components/editor/js/editor.visual.js"} {editor_textarea} {/hookb} @@ -48,12 +49,12 @@ {* Markup редактор *} {else} {hookb run='editor_markup'} - {asset type='js' name='editor_markup' file="{Config::Get('path.framework.frontend.web')}/js/vendor/markitup/jquery.markitup.js"} - {asset type='js' name='editor_markup_options' file="{Config::Get('path.application.web')}/frontend/common/js/editor.markup.js"} + {asset type='js' name='editor_markup' file="{Config::Get('path.skin.web')}/components/editor/vendor/markitup/jquery.markitup.js"} + {asset type='js' name='editor_markup_options' file="{Config::Get('path.skin.web')}/components/editor/js/editor.markup.js"} - {asset type='css' name='editor_markup' file="{Config::Get('path.framework.frontend.web')}/js/vendor/markitup/skins/synio/style.css"} - {asset type='css' name='editor_markup_set' file="{Config::Get('path.framework.frontend.web')}/js/vendor/markitup/sets/synio/style.css"} - {asset type='css' name='editor_markup_component' file="{Config::Get('path.skin.assets.web')}/css/components/editor.css"} + {asset type='css' name='editor_markup' file="{Config::Get('path.skin.web')}/components/editor/vendor/markitup/skins/livestreet/style.css"} + {asset type='css' name='editor_markup_set' file="{Config::Get('path.skin.web')}/components/editor/vendor/markitup/sets/livestreet/style.css"} + {asset type='css' name='editor_markup_help' file="{Config::Get('path.skin.web')}/components/editor/css/editor.css"} {editor_textarea} diff --git a/application/frontend/skin/developer/components/editor/js/editor.js b/application/frontend/skin/developer/components/editor/js/editor.js new file mode 100644 index 00000000..4c9982c4 --- /dev/null +++ b/application/frontend/skin/developer/components/editor/js/editor.js @@ -0,0 +1,41 @@ +/** + * Editor + * + * @module editor + * + * @license GNU General Public License, version 2 + * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} + * @author Denis Shakhov + */ + +$.widget( "livestreet.lsEditor", { + /** + * Дефолтные опции + */ + options: { + type: null, + set: 'default' + }, + + /** + * Конструктор + * + * @constructor + * @private + */ + _create: function() { + this.strategy = this.element.data( 'editor-type' ) == 'visual' ? 'lsEditorVisual' : 'lsEditorMarkup'; + this.option( 'set', this.element.data('editor-set') || this.option( 'set' ) ); + + this.element[ this.strategy ]( this.options ); + }, + + /** + * Вставка текста + * + * @param {String} text Текст для вставки + */ + insert: function ( text ) { + this.element[ this.strategy ]( 'insert', text ); + } +}); \ No newline at end of file diff --git a/application/frontend/skin/developer/components/editor/js/editor.markup.js b/application/frontend/skin/developer/components/editor/js/editor.markup.js new file mode 100644 index 00000000..46f90869 --- /dev/null +++ b/application/frontend/skin/developer/components/editor/js/editor.markup.js @@ -0,0 +1,85 @@ +/** + * Markup editor + * + * @module ls/editor/markup + * + * @license GNU General Public License, version 2 + * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} + * @author Denis Shakhov + */ + +$.widget( "livestreet.lsEditorMarkup", { + /** + * Дефолтные опции + */ + options: { + sets: { + default: { + onShiftEnter: { keepDefault:false, replaceWith: '
    \n' }, + onCtrlEnter: { keepDefault:false, openWith: '\n

    ', closeWith: '

    ' }, + onTab: { keepDefault:false, replaceWith: ' ' }, + markupSet: [ + { name: 'H4', className: 'editor-h4', openWith: '

    ', closeWith: '

    ' }, + { name: 'H5', className: 'editor-h5', openWith: '
    ', closeWith: '
    ' }, + { name: 'H6', className: 'editor-h6', openWith: '
    ', closeWith: '
    ' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_b'), className: 'editor-bold', key: 'B', openWith: '(!(|!|)!)', closeWith: '(!(|!|)!)' }, + { name: ls.lang.get('panel_i'), className: 'editor-italic', key: 'I', openWith: '(!(|!|)!)', closeWith: '(!(|!|)!)' }, + { name: ls.lang.get('panel_s'), className: 'editor-stroke', key: 'S', openWith: '', closeWith: '' }, + { name: ls.lang.get('panel_u'), className: 'editor-underline', key: 'U', openWith: '', closeWith: '' }, + { name: ls.lang.get('panel_quote'), className: 'editor-quote', key: 'Q', replaceWith: function( m ) { if ( m.selectionOuter ) return '
    ' + m.selectionOuter + '
    '; else if (m.selection) return '
    ' + m.selection + '
    '; else return '
    ' }}, + { name: ls.lang.get('panel_code'), className: 'editor-code', openWith: '<(!(code|!|codeline)!)>', closeWith: '' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_list'), className: 'editor-ul', openWith: '
  • ', closeWith: '
  • ', multiline: true, openBlockWith: '
      \n', closeBlockWith: '\n
    ' }, + { name: ls.lang.get('panel_list'), className: 'editor-ol', openWith: '
  • ', closeWith: '
  • ', multiline: true, openBlockWith: '
      \n', closeBlockWith: '\n
    ' }, + { name: ls.lang.get('panel_list_li'), className: 'editor-li', openWith: '
  • ', closeWith: '
  • ' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_image'), className: 'editor-picture', key: 'P', beforeInsert: function(h) { jQuery('#modal-image-upload').modal('show'); } }, + { name: ls.lang.get('panel_video'), className: 'editor-video', replaceWith: '' }, + { name: ls.lang.get('panel_url'), className: 'editor-link', key: 'L', openWith: '', closeWith: '', placeHolder: 'Your text to link...' }, + { name: ls.lang.get('panel_user'), className: 'editor-user', replaceWith: '' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_clear_tags'), className: 'editor-clean', replaceWith: function( markitup ) { return markitup.selection.replace(/<(.*?)>/g, ""); }}, + { name: ls.lang.get('panel_cut'), className: 'editor-cut', replaceWith: function( markitup ) { if ( markitup.selection ) return ''; else return '' }} + ] + }, + light: { + onShiftEnter: { keepDefault: false, replaceWith: '
    \n' }, + onTab: { keepDefault: false, replaceWith: ' ' }, + markupSet: [ + { name: ls.lang.get('panel_b'), className: 'editor-bold', key: 'B', openWith: '(!(|!|)!)', closeWith: '(!(|!|)!)' }, + { name: ls.lang.get('panel_i'), className: 'editor-italic', key: 'I', openWith: '(!(|!|)!)', closeWith: '(!(|!|)!)' }, + { name: ls.lang.get('panel_s'), className: 'editor-stroke', key: 'S', openWith: '', closeWith: '' }, + { name: ls.lang.get('panel_u'), className: 'editor-underline', key: 'U', openWith: '', closeWith: '' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_quote'), className: 'editor-quote', key: 'Q', replaceWith: function(m) { if (m.selectionOuter) return '
    ' + m.selectionOuter + '
    '; else if (m.selection) return '
    ' + m.selection + '
    '; else return '
    ' } }, + { name: ls.lang.get('panel_code'), className: 'editor-code', openWith: '<(!(code|!|codeline)!)>', closeWith: '' }, + { name: ls.lang.get('panel_image'), className: 'editor-picture', key: 'P', beforeInsert: function(h) { jQuery('#modal-image-upload').modal('show'); } }, + { name: ls.lang.get('panel_url'), className: 'editor-link', key: 'L', openWith: '', closeWith: '', placeHolder: 'Your text to link...' }, + { name: ls.lang.get('panel_user'), className: 'editor-user', replaceWith: '' }, + { separator: '---------------' }, + { name: ls.lang.get('panel_clear_tags'), className: 'editor-clean', replaceWith: function( markitup ) { return markitup.selection.replace(/<(.*?)>/g, "") } } + ] + } + }, + }, + + /** + * Конструктор + * + * @constructor + * @private + */ + _create: function () { + this.element.markItUp( this.option( 'sets.' + this.option( 'set' ) ) ); + }, + + /** + * Вставка текста + * + * @param {String} text Текст для вставки + */ + insert: function ( text ) { + $.markItUp({ target: this.element, replaceWith: text }); + } +}); \ No newline at end of file diff --git a/application/frontend/skin/developer/components/editor/js/editor.visual.js b/application/frontend/skin/developer/components/editor/js/editor.visual.js new file mode 100644 index 00000000..e629de6a --- /dev/null +++ b/application/frontend/skin/developer/components/editor/js/editor.visual.js @@ -0,0 +1,58 @@ +/** + * Visual editor + * + * @module ls/editor/visual + * + * @license GNU General Public License, version 2 + * @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com} + * @author Denis Shakhov + */ + +(function($) { + "use strict"; + + $.widget( "livestreet.lsEditorVisual", { + /** + * Дефолтные опции + */ + options: { + sets: { + default: { + language: LANGUAGE, + plugins: 'pagebreak code autoresize', + toolbar: 'undo redo | bold italic strikethrough underline blockquote | bullist numlist | removeformat pagebreak code', + menubar: false, + statusbar: false, + pagebreak_separator: '' + }, + light: { + language: LANGUAGE, + plugins: 'pagebreak code autoresize', + toolbar: 'undo redo | bold italic strikethrough underline blockquote | bullist numlist | removeformat pagebreak code', + menubar: false, + statusbar: false, + pagebreak_separator: '' + }, + } + }, + + /** + * Конструктор + * + * @constructor + * @private + */ + _create: function () { + this.element.tinymce( this.option( 'sets.' + this.option( 'set' ) ) ); + }, + + /** + * Вставка текста + * + * @param {String} text Текст для вставки + */ + insert: function ( text ) { + this.element.tinymce().insertContent( text ); + } + }); +})(jQuery); \ No newline at end of file