From a3d355ada763cefb965bbe22ab2e4b45b0f9abbb Mon Sep 17 00:00:00 2001 From: Nicolas Lempereur Date: Tue, 1 Sep 2015 12:23:24 +0200 Subject: [WIP] web_editor: rename and delete old summernote files --- .../static/lib/summernote/src/js/defaults.js | 416 ++++++++++ .../static/lib/summernote/src/js/editing/Editor.js | 861 --------------------- .../static/lib/summernote/src/js/module/Dialog.js | 1 - .../static/lib/summernote/src/js/module/Editor.js | 861 +++++++++++++++++++++ .../static/lib/summernote/src/js/settings.js | 416 ---------- 5 files changed, 1277 insertions(+), 1278 deletions(-) create mode 100644 addons/web_editor/static/lib/summernote/src/js/defaults.js delete mode 100644 addons/web_editor/static/lib/summernote/src/js/editing/Editor.js delete mode 100644 addons/web_editor/static/lib/summernote/src/js/module/Dialog.js create mode 100644 addons/web_editor/static/lib/summernote/src/js/module/Editor.js delete mode 100644 addons/web_editor/static/lib/summernote/src/js/settings.js (limited to 'addons/web_editor/static/lib/summernote/src') diff --git a/addons/web_editor/static/lib/summernote/src/js/defaults.js b/addons/web_editor/static/lib/summernote/src/js/defaults.js new file mode 100644 index 00000000000..f7b0c0c6379 --- /dev/null +++ b/addons/web_editor/static/lib/summernote/src/js/defaults.js @@ -0,0 +1,416 @@ +define('summernote/defaults', function () { + /** + * @class defaults + * + * @singleton + */ + var defaults = { + /** @property */ + version: '@VERSION', + + /** + * + * for event options, reference to EventHandler.attach + * + * @property {Object} options + * @property {String/Number} [options.width=null] set editor width + * @property {String/Number} [options.height=null] set editor height, ex) 300 + * @property {String/Number} options.minHeight set minimum height of editor + * @property {String/Number} options.maxHeight + * @property {String/Number} options.focus + * @property {Number} options.tabsize + * @property {Boolean} options.styleWithSpan + * @property {Object} options.codemirror + * @property {Object} [options.codemirror.mode='text/html'] + * @property {Object} [options.codemirror.htmlMode=true] + * @property {Object} [options.codemirror.lineNumbers=true] + * @property {String} [options.lang=en-US] language 'en-US', 'ko-KR', ... + * @property {String} [options.direction=null] text direction, ex) 'rtl' + * @property {Array} [options.toolbar] + * @property {Boolean} [options.airMode=false] + * @property {Array} [options.airPopover] + * @property {Fucntion} [options.onInit] initialize + * @property {Fucntion} [options.onsubmit] + */ + options: { + width: null, // set editor width + height: null, // set editor height, ex) 300 + + minHeight: null, // set minimum height of editor + maxHeight: null, // set maximum height of editor + + focus: false, // set focus to editable area after initializing summernote + + tabsize: 4, // size of tab ex) 2 or 4 + styleWithSpan: true, // style with span (Chrome and FF only) + + disableLinkTarget: false, // hide link Target Checkbox + disableDragAndDrop: false, // disable drag and drop event + disableResizeEditor: false, // disable resizing editor + disableResizeImage: false, // disable resizing image + + shortcuts: true, // enable keyboard shortcuts + + textareaAutoSync: true, // enable textarea auto sync + + placeholder: false, // enable placeholder text + prettifyHtml: true, // enable prettifying html while toggling codeview + + iconPrefix: 'fa fa-', // prefix for css icon classes + + icons: { + font: { + bold: 'bold', + italic: 'italic', + underline: 'underline', + clear: 'eraser', + height: 'text-height', + strikethrough: 'strikethrough', + superscript: 'superscript', + subscript: 'subscript' + }, + image: { + image: 'picture-o', + floatLeft: 'align-left', + floatRight: 'align-right', + floatNone: 'align-justify', + shapeRounded: 'square', + shapeCircle: 'circle-o', + shapeThumbnail: 'picture-o', + shapeNone: 'times', + remove: 'trash-o' + }, + link: { + link: 'link', + unlink: 'unlink', + edit: 'edit' + }, + table: { + table: 'table' + }, + hr: { + insert: 'minus' + }, + style: { + style: 'magic' + }, + lists: { + unordered: 'list-ul', + ordered: 'list-ol' + }, + options: { + help: 'question', + fullscreen: 'arrows-alt', + codeview: 'code' + }, + paragraph: { + paragraph: 'align-left', + outdent: 'outdent', + indent: 'indent', + left: 'align-left', + center: 'align-center', + right: 'align-right', + justify: 'align-justify' + }, + color: { + recent: 'font' + }, + history: { + undo: 'undo', + redo: 'repeat' + }, + misc: { + check: 'check' + } + }, + + dialogsInBody: false, // false will add dialogs into editor + + codemirror: { // codemirror options + mode: 'text/html', + htmlMode: true, + lineNumbers: true + }, + + // language + lang: 'en-US', // language 'en-US', 'ko-KR', ... + direction: null, // text direction, ex) 'rtl' + + // toolbar + toolbar: [ + ['style', ['style']], + ['font', ['bold', 'italic', 'underline', 'clear']], + // ['font', ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'clear']], + ['fontname', ['fontname']], + ['fontsize', ['fontsize']], + ['color', ['color']], + ['para', ['ul', 'ol', 'paragraph']], + ['height', ['height']], + ['table', ['table']], + ['insert', ['link', 'picture', 'hr']], + ['view', ['fullscreen', 'codeview']], + ['help', ['help']] + ], + + plugin : { }, + + // air mode: inline editor + airMode: false, + // airPopover: [ + // ['style', ['style']], + // ['font', ['bold', 'italic', 'underline', 'clear']], + // ['fontname', ['fontname']], + // ['color', ['color']], + // ['para', ['ul', 'ol', 'paragraph']], + // ['height', ['height']], + // ['table', ['table']], + // ['insert', ['link', 'picture']], + // ['help', ['help']] + // ], + airPopover: [ + ['color', ['color']], + ['font', ['bold', 'underline', 'clear']], + ['para', ['ul', 'paragraph']], + ['table', ['table']], + ['insert', ['link', 'picture']] + ], + + // style tag + styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], + + // default fontName + defaultFontName: 'Helvetica Neue', + + // fontName + fontNames: [ + 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', + 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', + 'Tahoma', 'Times New Roman', 'Verdana' + ], + fontNamesIgnoreCheck: [], + + fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'], + + // pallete colors(n x n) + colors: [ + ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], + ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], + ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], + ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], + ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], + ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], + ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], + ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'] + ], + + // lineHeight + lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'], + + // insertTable max size + insertTableMaxSize: { + col: 10, + row: 10 + }, + + // image + maximumImageFileSize: null, // size in bytes, null = no limit + + // callbacks + oninit: null, // initialize + onfocus: null, // editable has focus + onblur: null, // editable out of focus + onenter: null, // enter key pressed + onkeyup: null, // keyup + onkeydown: null, // keydown + onImageUpload: null, // imageUpload + onImageUploadError: null, // imageUploadError + onMediaDelete: null, // media delete + onToolbarClick: null, + onsubmit: null, + + /** + * manipulate link address when user create link + * @param {String} sLinkUrl + * @return {String} + */ + onCreateLink: function (sLinkUrl) { + if (sLinkUrl.indexOf('@') !== -1 && sLinkUrl.indexOf(':') === -1) { + sLinkUrl = 'mailto:' + sLinkUrl; + } + + return sLinkUrl; + }, + + keyMap: { + pc: { + 'ENTER': 'insertParagraph', + 'CTRL+Z': 'undo', + 'CTRL+Y': 'redo', + 'TAB': 'tab', + 'SHIFT+TAB': 'untab', + 'CTRL+B': 'bold', + 'CTRL+I': 'italic', + 'CTRL+U': 'underline', + 'CTRL+SHIFT+S': 'strikethrough', + 'CTRL+BACKSLASH': 'removeFormat', + 'CTRL+SHIFT+L': 'justifyLeft', + 'CTRL+SHIFT+E': 'justifyCenter', + 'CTRL+SHIFT+R': 'justifyRight', + 'CTRL+SHIFT+J': 'justifyFull', + 'CTRL+SHIFT+NUM7': 'insertUnorderedList', + 'CTRL+SHIFT+NUM8': 'insertOrderedList', + 'CTRL+LEFTBRACKET': 'outdent', + 'CTRL+RIGHTBRACKET': 'indent', + 'CTRL+NUM0': 'formatPara', + 'CTRL+NUM1': 'formatH1', + 'CTRL+NUM2': 'formatH2', + 'CTRL+NUM3': 'formatH3', + 'CTRL+NUM4': 'formatH4', + 'CTRL+NUM5': 'formatH5', + 'CTRL+NUM6': 'formatH6', + 'CTRL+ENTER': 'insertHorizontalRule', + 'CTRL+K': 'showLinkDialog' + }, + + mac: { + 'ENTER': 'insertParagraph', + 'CMD+Z': 'undo', + 'CMD+SHIFT+Z': 'redo', + 'TAB': 'tab', + 'SHIFT+TAB': 'untab', + 'CMD+B': 'bold', + 'CMD+I': 'italic', + 'CMD+U': 'underline', + 'CMD+SHIFT+S': 'strikethrough', + 'CMD+BACKSLASH': 'removeFormat', + 'CMD+SHIFT+L': 'justifyLeft', + 'CMD+SHIFT+E': 'justifyCenter', + 'CMD+SHIFT+R': 'justifyRight', + 'CMD+SHIFT+J': 'justifyFull', + 'CMD+SHIFT+NUM7': 'insertUnorderedList', + 'CMD+SHIFT+NUM8': 'insertOrderedList', + 'CMD+LEFTBRACKET': 'outdent', + 'CMD+RIGHTBRACKET': 'indent', + 'CMD+NUM0': 'formatPara', + 'CMD+NUM1': 'formatH1', + 'CMD+NUM2': 'formatH2', + 'CMD+NUM3': 'formatH3', + 'CMD+NUM4': 'formatH4', + 'CMD+NUM5': 'formatH5', + 'CMD+NUM6': 'formatH6', + 'CMD+ENTER': 'insertHorizontalRule', + 'CMD+K': 'showLinkDialog' + } + } + }, + + // default language: en-US + lang: { + 'en-US': { + font: { + bold: 'Bold', + italic: 'Italic', + underline: 'Underline', + clear: 'Remove Font Style', + height: 'Line Height', + name: 'Font Family', + strikethrough: 'Strikethrough', + subscript: 'Subscript', + superscript: 'Superscript', + size: 'Font Size' + }, + image: { + image: 'Picture', + insert: 'Insert Image', + resizeFull: 'Resize Full', + resizeHalf: 'Resize Half', + resizeQuarter: 'Resize Quarter', + floatLeft: 'Float Left', + floatRight: 'Float Right', + floatNone: 'Float None', + shapeRounded: 'Shape: Rounded', + shapeCircle: 'Shape: Circle', + shapeThumbnail: 'Shape: Thumbnail', + shapeNone: 'Shape: None', + dragImageHere: 'Drag image or text here', + dropImage: 'Drop image or Text', + selectFromFiles: 'Select from files', + maximumFileSize: 'Maximum file size', + maximumFileSizeError: 'Maximum file size exceeded.', + url: 'Image URL', + remove: 'Remove Image' + }, + link: { + link: 'Link', + insert: 'Insert Link', + unlink: 'Unlink', + edit: 'Edit', + textToDisplay: 'Text to display', + url: 'To what URL should this link go?', + openInNewWindow: 'Open in new window' + }, + table: { + table: 'Table' + }, + hr: { + insert: 'Insert Horizontal Rule' + }, + style: { + style: 'Style', + normal: 'Normal', + blockquote: 'Quote', + pre: 'Code', + h1: 'Header 1', + h2: 'Header 2', + h3: 'Header 3', + h4: 'Header 4', + h5: 'Header 5', + h6: 'Header 6' + }, + lists: { + unordered: 'Unordered list', + ordered: 'Ordered list' + }, + options: { + help: 'Help', + fullscreen: 'Full Screen', + codeview: 'Code View' + }, + paragraph: { + paragraph: 'Paragraph', + outdent: 'Outdent', + indent: 'Indent', + left: 'Align left', + center: 'Align center', + right: 'Align right', + justify: 'Justify full' + }, + color: { + recent: 'Recent Color', + more: 'More Color', + background: 'Background Color', + foreground: 'Foreground Color', + transparent: 'Transparent', + setTransparent: 'Set transparent', + reset: 'Reset', + resetToDefault: 'Reset to default' + }, + shortcut: { + shortcuts: 'Keyboard shortcuts', + close: 'Close', + textFormatting: 'Text formatting', + action: 'Action', + paragraphFormatting: 'Paragraph formatting', + documentStyle: 'Document Style', + extraKeys: 'Extra keys' + }, + history: { + undo: 'Undo', + redo: 'Redo' + } + } + } + }; + + return defaults; +}); diff --git a/addons/web_editor/static/lib/summernote/src/js/editing/Editor.js b/addons/web_editor/static/lib/summernote/src/js/editing/Editor.js deleted file mode 100644 index 732072b5d24..00000000000 --- a/addons/web_editor/static/lib/summernote/src/js/editing/Editor.js +++ /dev/null @@ -1,861 +0,0 @@ -define([ - 'summernote/core/agent', - 'summernote/core/func', - 'summernote/core/list', - 'summernote/core/dom', - 'summernote/core/range', - 'summernote/core/async', - 'summernote/editing/Style', - 'summernote/editing/Typing', - 'summernote/editing/Table', - 'summernote/editing/Bullet' -], function (agent, func, list, dom, range, async, - Style, Typing, Table, Bullet) { - - var KEY_BOGUS = 'bogus'; - - /** - * @class editing.Editor - * - * Editor - * - */ - var Editor = function (handler) { - - var self = this; - var style = new Style(); - var table = new Table(); - var typing = new Typing(); - var bullet = new Bullet(); - - this.style = style; // ODOO: allow access for override - this.table = table; // ODOO: allow access for override - this.typing = typing; // ODOO: allow access for override - this.bullet = bullet; // ODOO: allow access for override - - /** - * @method createRange - * - * create range - * - * @param {jQuery} $editable - * @return {WrappedRange} - */ - this.createRange = function ($editable) { - this.focus($editable); - return range.create(); - }; - - /** - * @method saveRange - * - * save current range - * - * @param {jQuery} $editable - * @param {Boolean} [thenCollapse=false] - */ - this.saveRange = function ($editable, thenCollapse) { - // ODOO: scroll to top when click on input in editable m (start_modification - // this.focus($editable); - var r = range.create(); - if (!r || ($editable[0] !== r.sc && !$.contains($editable[0], r.sc))) { - $editable.focus(); - } - // ODOO: end_modication) - $editable.data('range', range.create()); - if (thenCollapse) { - range.create().collapse().select(); - } - }; - - /** - * @method saveRange - * - * save current node list to $editable.data('childNodes') - * - * @param {jQuery} $editable - */ - this.saveNode = function ($editable) { - // copy child node reference - var copy = []; - for (var key = 0, len = $editable[0].childNodes.length; key < len; key++) { - copy.push($editable[0].childNodes[key]); - } - $editable.data('childNodes', copy); - }; - - /** - * @method restoreRange - * - * restore lately range - * - * @param {jQuery} $editable - */ - this.restoreRange = function ($editable) { - var rng = $editable.data('range'); - if (rng) { - rng.select(); - this.focus($editable); - } - }; - - /** - * @method restoreNode - * - * restore lately node list - * - * @param {jQuery} $editable - */ - this.restoreNode = function ($editable) { - $editable.html(''); - var child = $editable.data('childNodes'); - for (var index = 0, len = child.length; index < len; index++) { - $editable[0].appendChild(child[index]); - } - }; - - /** - * @method currentStyle - * - * current style - * - * @param {Node} target - * @return {Object|Boolean} unfocus - */ - this.currentStyle = function (target) { - var rng = range.create(); - var styleInfo = rng && rng.isOnEditable() ? style.current(rng.normalize()) : {}; - if (dom.isImg(target)) { - styleInfo.image = target; - } - return styleInfo; - }; - - /** - * style from node - * - * @param {jQuery} $node - * @return {Object} - */ - this.styleFromNode = function ($node) { - return style.fromNode($node); - }; - - var triggerOnBeforeChange = function ($editable) { - var $holder = dom.makeLayoutInfo($editable).holder(); - handler.bindCustomEvent( - $holder, $editable.data('callbacks'), 'before.command' - )($editable.html(), $editable); - }; - - var triggerOnChange = function ($editable) { - var $holder = dom.makeLayoutInfo($editable).holder(); - handler.bindCustomEvent( - $holder, $editable.data('callbacks'), 'change' - )($editable.html(), $editable); - }; - - /** - * @method undo - * undo - * @param {jQuery} $editable - */ - this.undo = function ($editable) { - triggerOnBeforeChange($editable); - $editable.data('NoteHistory').undo(); - triggerOnChange($editable); - }; - - /** - * @method redo - * redo - * @param {jQuery} $editable - */ - this.redo = function ($editable) { - triggerOnBeforeChange($editable); - $editable.data('NoteHistory').redo(); - triggerOnChange($editable); - }; - - /** - * @method beforeCommand - * before command - * @param {jQuery} $editable - */ - var beforeCommand = this.beforeCommand = function ($editable) { - triggerOnBeforeChange($editable); - // keep focus on editable before command execution - self.focus($editable); - }; - - /** - * @method afterCommand - * after command - * @param {jQuery} $editable - * @param {Boolean} isPreventTrigger - */ - var afterCommand = this.afterCommand = function ($editable, isPreventTrigger) { - $editable.data('NoteHistory').recordUndo(); - if (!isPreventTrigger) { - triggerOnChange($editable); - } - }; - - /** - * @method bold - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method italic - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method underline - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method strikethrough - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method formatBlock - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method superscript - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method subscript - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method justifyLeft - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method justifyCenter - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method justifyRight - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method justifyFull - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method formatBlock - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method removeFormat - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method backColor - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method foreColor - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method insertHorizontalRule - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /** - * @method fontName - * - * change font name - * - * @param {jQuery} $editable - * @param {Mixed} value - */ - - /* jshint ignore:start */ - // native commands(with execCommand), generate function for execCommand - var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', - 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', - 'formatBlock', 'removeFormat', - 'backColor', 'foreColor', 'fontName']; - - for (var idx = 0, len = commands.length; idx < len; idx ++) { - this[commands[idx]] = (function (sCmd) { - return function ($editable, value) { - beforeCommand($editable); - - document.execCommand(sCmd, false, value); - - afterCommand($editable, true); - }; - })(commands[idx]); - } - /* jshint ignore:end */ - - /** - * @method tab - * - * handle tab key - * - * @param {jQuery} $editable - * @param {Object} options - */ - this.tab = function ($editable, options) { - var rng = this.createRange($editable); - if (rng.isCollapsed() && rng.isOnCell()) { - table.tab(rng); - } else { - beforeCommand($editable); - typing.insertTab($editable, rng, options.tabsize); - afterCommand($editable); - } - }; - - /** - * @method untab - * - * handle shift+tab key - * - */ - this.untab = function ($editable) { - var rng = this.createRange($editable); - if (rng.isCollapsed() && rng.isOnCell()) { - table.tab(rng, true); - } - }; - - /** - * @method insertParagraph - * - * insert paragraph - * - * @param {Node} $editable - */ - this.insertParagraph = function ($editable) { - beforeCommand($editable); - typing.insertParagraph($editable); - afterCommand($editable); - }; - - /** - * @method insertOrderedList - * - * @param {jQuery} $editable - */ - this.insertOrderedList = function ($editable) { - beforeCommand($editable); - bullet.insertOrderedList($editable); - afterCommand($editable); - }; - - /** - * @param {jQuery} $editable - */ - this.insertUnorderedList = function ($editable) { - beforeCommand($editable); - bullet.insertUnorderedList($editable); - afterCommand($editable); - }; - - /** - * @param {jQuery} $editable - */ - this.indent = function ($editable) { - beforeCommand($editable); - bullet.indent($editable); - afterCommand($editable); - }; - - /** - * @param {jQuery} $editable - */ - this.outdent = function ($editable) { - beforeCommand($editable); - bullet.outdent($editable); - afterCommand($editable); - }; - - /** - * insert image - * - * @param {jQuery} $editable - * @param {String} sUrl - */ - this.insertImage = function ($editable, sUrl, filename) { - async.createImage(sUrl, filename).then(function ($image) { - beforeCommand($editable); - $image.css({ - display: '', - width: Math.min($editable.width(), $image.width()) - }); - range.create().insertNode($image[0]); - range.createFromNodeAfter($image[0]).select(); - afterCommand($editable); - }).fail(function () { - var $holder = dom.makeLayoutInfo($editable).holder(); - handler.bindCustomEvent( - $holder, $editable.data('callbacks'), 'image.upload.error' - )(); - }); - }; - - /** - * @method insertNode - * insert node - * @param {Node} $editable - * @param {Node} node - */ - this.insertNode = function ($editable, node) { - beforeCommand($editable); - range.create().insertNode(node); - range.createFromNodeAfter(node).select(); - afterCommand($editable); - }; - - /** - * insert text - * @param {Node} $editable - * @param {String} text - */ - this.insertText = function ($editable, text) { - beforeCommand($editable); - var textNode = range.create().insertNode(dom.createText(text)); - range.create(textNode, dom.nodeLength(textNode)).select(); - afterCommand($editable); - }; - - /** - * paste HTML - * @param {Node} $editable - * @param {String} markup - */ - this.pasteHTML = function ($editable, markup) { - beforeCommand($editable); - var contents = range.create().pasteHTML(markup); - range.createFromNodeAfter(list.last(contents)).select(); - afterCommand($editable); - }; - - /** - * formatBlock - * - * @param {jQuery} $editable - * @param {String} tagName - */ - this.formatBlock = function ($editable, tagName) { - beforeCommand($editable); - // [workaround] for MSIE, IE need `<` - tagName = agent.isMSIE ? '<' + tagName + '>' : tagName; - document.execCommand('FormatBlock', false, tagName); - afterCommand($editable); - }; - - this.formatPara = function ($editable) { - beforeCommand($editable); - this.formatBlock($editable, 'P'); - afterCommand($editable); - }; - - /* jshint ignore:start */ - for (var idx = 1; idx <= 6; idx ++) { - this['formatH' + idx] = function (idx) { - return function ($editable) { - this.formatBlock($editable, 'H' + idx); - }; - }(idx); - }; - /* jshint ignore:end */ - - /** - * fontSize - * - * @param {jQuery} $editable - * @param {String} value - px - */ - this.fontSize = function ($editable, value) { - var rng = range.create(); - - if (rng.isCollapsed()) { - var spans = style.styleNodes(rng); - var firstSpan = list.head(spans); - - $(spans).css({ - 'font-size': value + 'px' - }); - - // [workaround] added styled bogus span for style - // - also bogus character needed for cursor position - if (firstSpan && !dom.nodeLength(firstSpan)) { - firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR; - range.createFromNodeAfter(firstSpan.firstChild).select(); - $editable.data(KEY_BOGUS, firstSpan); - } - } else { - beforeCommand($editable); - $(style.styleNodes(rng)).css({ - 'font-size': value + 'px' - }); - afterCommand($editable); - } - }; - - /** - * insert horizontal rule - * @param {jQuery} $editable - */ - this.insertHorizontalRule = function ($editable) { - beforeCommand($editable); - - var rng = range.create(); - var hrNode = rng.insertNode($('
')[0]); - if (hrNode.nextSibling) { - range.create(hrNode.nextSibling, 0).normalize().select(); - } - - afterCommand($editable); - }; - - /** - * remove bogus node and character - */ - this.removeBogus = function ($editable) { - var bogusNode = $editable.data(KEY_BOGUS); - if (!bogusNode) { - return; - } - - var textNode = list.find(list.from(bogusNode.childNodes), dom.isText); - - var bogusCharIdx = textNode.nodeValue.indexOf(dom.ZERO_WIDTH_NBSP_CHAR); - if (bogusCharIdx !== -1) { - textNode.deleteData(bogusCharIdx, 1); - } - - if (dom.isEmpty(bogusNode)) { - dom.remove(bogusNode); - } - - $editable.removeData(KEY_BOGUS); - }; - - /** - * lineHeight - * @param {jQuery} $editable - * @param {String} value - */ - this.lineHeight = function ($editable, value) { - beforeCommand($editable); - style.stylePara(range.create(), { - lineHeight: value - }); - afterCommand($editable); - }; - - /** - * unlink - * - * @type command - * - * @param {jQuery} $editable - */ - this.unlink = function ($editable) { - var rng = this.createRange($editable); - if (rng.isOnAnchor()) { - var anchor = dom.ancestor(rng.sc, dom.isAnchor); - rng = range.createFromNode(anchor); - rng.select(); - - beforeCommand($editable); - document.execCommand('unlink'); - afterCommand($editable); - } - }; - - /** - * create link (command) - * - * @param {jQuery} $editable - * @param {Object} linkInfo - * @param {Object} options - */ - this.createLink = function ($editable, linkInfo, options) { - var linkUrl = linkInfo.url; - var linkText = linkInfo.text; - var isNewWindow = linkInfo.isNewWindow; - var className = linkInfo.className || null; // ODOO: addition - var rng = linkInfo.range || this.createRange($editable); - var isTextChanged = rng.toString() !== linkText; - - options = options || dom.makeLayoutInfo($editable).editor().data('options'); - - beforeCommand($editable); - - if (options.onCreateLink) { - linkUrl = options.onCreateLink(linkUrl); - } - - var anchors = []; - if (isTextChanged) { - // Create a new link when text changed. - var anchor = rng.insertNode($('' + linkText + '')[0]); - anchors.push(anchor); - } else { - anchors = style.styleNodes(rng, { - nodeName: 'A', - expandClosestSibling: true, - onlyPartialContains: true - }); - } - - $.each(anchors, function (idx, anchor) { - $(anchor).attr('href', linkUrl); - $(anchor).attr('class', className); // ODOO: addition - if (isNewWindow) { - $(anchor).attr('target', '_blank'); - } else { - $(anchor).removeAttr('target'); - } - }); - - var startRange = range.createFromNodeBefore(list.head(anchors)); - var startPoint = startRange.getStartPoint(); - var endRange = range.createFromNodeAfter(list.last(anchors)); - var endPoint = endRange.getEndPoint(); - - range.create( - startPoint.node, - startPoint.offset, - endPoint.node, - endPoint.offset - ).select(); - - afterCommand($editable); - }; - - /** - * returns link info - * - * @return {Object} - * @return {WrappedRange} return.range - * @return {String} return.text - * @return {Boolean} [return.isNewWindow=true] - * @return {String} [return.url=""] - */ - this.getLinkInfo = function ($editable) { - this.focus($editable); - - var rng = range.create().expand(dom.isAnchor); - - // Get the first anchor on range(for edit). - var $anchor = $(list.head(rng.nodes(dom.isAnchor))); - - return { - range: rng, - text: rng.toString(), - isNewWindow: $anchor.length ? $anchor.attr('target') === '_blank' : false, - url: $anchor.length ? $anchor.attr('href') : '' - }; - }; - - /** - * setting color - * - * @param {Node} $editable - * @param {Object} sObjColor color code - * @param {String} sObjColor.foreColor foreground color - * @param {String} sObjColor.backColor background color - */ - this.color = function ($editable, sObjColor) { - var oColor = JSON.parse(sObjColor); - var foreColor = oColor.foreColor, backColor = oColor.backColor; - - beforeCommand($editable); - - if (foreColor) { document.execCommand('foreColor', false, foreColor); } - if (backColor) { document.execCommand('backColor', false, backColor); } - - afterCommand($editable); - }; - - /** - * insert Table - * - * @param {Node} $editable - * @param {String} sDim dimension of table (ex : "5x5") - */ - this.insertTable = function ($editable, sDim) { - var dimension = sDim.split('x'); - beforeCommand($editable); - - var rng = range.create().deleteContents(); - rng.insertNode(table.createTable(dimension[0], dimension[1])); - afterCommand($editable); - }; - - /** - * float me - * - * @param {jQuery} $editable - * @param {String} value - * @param {jQuery} $target - */ - this.floatMe = function ($editable, value, $target) { - beforeCommand($editable); - // bootstrap - $target.removeClass('pull-left pull-right'); - if (value && value !== 'none') { - $target.addClass('pull-' + value); - } - - // fallback for non-bootstrap - $target.css('float', value); - afterCommand($editable); - }; - - /** - * change image shape - * - * @param {jQuery} $editable - * @param {String} value css class - * @param {Node} $target - */ - this.imageShape = function ($editable, value, $target) { - beforeCommand($editable); - - $target.removeClass('img-rounded img-circle img-thumbnail'); - - if (value) { - $target.addClass(value); - } - - afterCommand($editable); - }; - - /** - * resize overlay element - * @param {jQuery} $editable - * @param {String} value - * @param {jQuery} $target - target element - */ - this.resize = function ($editable, value, $target) { - beforeCommand($editable); - - $target.css({ - width: value * 100 + '%', - height: '' - }); - - afterCommand($editable); - }; - - /** - * @param {Position} pos - * @param {jQuery} $target - target element - * @param {Boolean} [bKeepRatio] - keep ratio - */ - this.resizeTo = function (pos, $target, bKeepRatio) { - var imageSize; - if (bKeepRatio) { - var newRatio = pos.y / pos.x; - var ratio = $target.data('ratio'); - imageSize = { - width: ratio > newRatio ? pos.x : pos.y / ratio, - height: ratio > newRatio ? pos.x * ratio : pos.y - }; - } else { - imageSize = { - width: pos.x, - height: pos.y - }; - } - - $target.css(imageSize); - }; - - /** - * remove media object - * - * @param {jQuery} $editable - * @param {String} value - dummy argument (for keep interface) - * @param {jQuery} $target - target element - */ - this.removeMedia = function ($editable, value, $target) { - beforeCommand($editable); - $target.detach(); - - handler.bindCustomEvent( - $(), $editable.data('callbacks'), 'media.delete' - )($target, $editable); - - afterCommand($editable); - }; - - /** - * set focus - * - * @param $editable - */ - this.focus = function ($editable) { - $editable.focus(); - - // [workaround] for firefox bug http://goo.gl/lVfAaI - if (agent.isFF) { - var rng = range.create(); - if (!rng || rng.isOnEditable()) { - return; - } - - range.createFromNode($editable[0]) - .normalize() - .collapse() - .select(); - } - }; - - /** - * returns whether contents is empty or not. - * - * @param {jQuery} $editable - * @return {Boolean} - */ - this.isEmpty = function ($editable) { - return dom.isEmpty($editable[0]) || dom.emptyPara === $editable.html(); - }; - }; - - return Editor; -}); diff --git a/addons/web_editor/static/lib/summernote/src/js/module/Dialog.js b/addons/web_editor/static/lib/summernote/src/js/module/Dialog.js deleted file mode 100644 index d4f4d700218..00000000000 --- a/addons/web_editor/static/lib/summernote/src/js/module/Dialog.js +++ /dev/null @@ -1 +0,0 @@ -/** TODO master: drop this file (splitted in several files) */ diff --git a/addons/web_editor/static/lib/summernote/src/js/module/Editor.js b/addons/web_editor/static/lib/summernote/src/js/module/Editor.js new file mode 100644 index 00000000000..732072b5d24 --- /dev/null +++ b/addons/web_editor/static/lib/summernote/src/js/module/Editor.js @@ -0,0 +1,861 @@ +define([ + 'summernote/core/agent', + 'summernote/core/func', + 'summernote/core/list', + 'summernote/core/dom', + 'summernote/core/range', + 'summernote/core/async', + 'summernote/editing/Style', + 'summernote/editing/Typing', + 'summernote/editing/Table', + 'summernote/editing/Bullet' +], function (agent, func, list, dom, range, async, + Style, Typing, Table, Bullet) { + + var KEY_BOGUS = 'bogus'; + + /** + * @class editing.Editor + * + * Editor + * + */ + var Editor = function (handler) { + + var self = this; + var style = new Style(); + var table = new Table(); + var typing = new Typing(); + var bullet = new Bullet(); + + this.style = style; // ODOO: allow access for override + this.table = table; // ODOO: allow access for override + this.typing = typing; // ODOO: allow access for override + this.bullet = bullet; // ODOO: allow access for override + + /** + * @method createRange + * + * create range + * + * @param {jQuery} $editable + * @return {WrappedRange} + */ + this.createRange = function ($editable) { + this.focus($editable); + return range.create(); + }; + + /** + * @method saveRange + * + * save current range + * + * @param {jQuery} $editable + * @param {Boolean} [thenCollapse=false] + */ + this.saveRange = function ($editable, thenCollapse) { + // ODOO: scroll to top when click on input in editable m (start_modification + // this.focus($editable); + var r = range.create(); + if (!r || ($editable[0] !== r.sc && !$.contains($editable[0], r.sc))) { + $editable.focus(); + } + // ODOO: end_modication) + $editable.data('range', range.create()); + if (thenCollapse) { + range.create().collapse().select(); + } + }; + + /** + * @method saveRange + * + * save current node list to $editable.data('childNodes') + * + * @param {jQuery} $editable + */ + this.saveNode = function ($editable) { + // copy child node reference + var copy = []; + for (var key = 0, len = $editable[0].childNodes.length; key < len; key++) { + copy.push($editable[0].childNodes[key]); + } + $editable.data('childNodes', copy); + }; + + /** + * @method restoreRange + * + * restore lately range + * + * @param {jQuery} $editable + */ + this.restoreRange = function ($editable) { + var rng = $editable.data('range'); + if (rng) { + rng.select(); + this.focus($editable); + } + }; + + /** + * @method restoreNode + * + * restore lately node list + * + * @param {jQuery} $editable + */ + this.restoreNode = function ($editable) { + $editable.html(''); + var child = $editable.data('childNodes'); + for (var index = 0, len = child.length; index < len; index++) { + $editable[0].appendChild(child[index]); + } + }; + + /** + * @method currentStyle + * + * current style + * + * @param {Node} target + * @return {Object|Boolean} unfocus + */ + this.currentStyle = function (target) { + var rng = range.create(); + var styleInfo = rng && rng.isOnEditable() ? style.current(rng.normalize()) : {}; + if (dom.isImg(target)) { + styleInfo.image = target; + } + return styleInfo; + }; + + /** + * style from node + * + * @param {jQuery} $node + * @return {Object} + */ + this.styleFromNode = function ($node) { + return style.fromNode($node); + }; + + var triggerOnBeforeChange = function ($editable) { + var $holder = dom.makeLayoutInfo($editable).holder(); + handler.bindCustomEvent( + $holder, $editable.data('callbacks'), 'before.command' + )($editable.html(), $editable); + }; + + var triggerOnChange = function ($editable) { + var $holder = dom.makeLayoutInfo($editable).holder(); + handler.bindCustomEvent( + $holder, $editable.data('callbacks'), 'change' + )($editable.html(), $editable); + }; + + /** + * @method undo + * undo + * @param {jQuery} $editable + */ + this.undo = function ($editable) { + triggerOnBeforeChange($editable); + $editable.data('NoteHistory').undo(); + triggerOnChange($editable); + }; + + /** + * @method redo + * redo + * @param {jQuery} $editable + */ + this.redo = function ($editable) { + triggerOnBeforeChange($editable); + $editable.data('NoteHistory').redo(); + triggerOnChange($editable); + }; + + /** + * @method beforeCommand + * before command + * @param {jQuery} $editable + */ + var beforeCommand = this.beforeCommand = function ($editable) { + triggerOnBeforeChange($editable); + // keep focus on editable before command execution + self.focus($editable); + }; + + /** + * @method afterCommand + * after command + * @param {jQuery} $editable + * @param {Boolean} isPreventTrigger + */ + var afterCommand = this.afterCommand = function ($editable, isPreventTrigger) { + $editable.data('NoteHistory').recordUndo(); + if (!isPreventTrigger) { + triggerOnChange($editable); + } + }; + + /** + * @method bold + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method italic + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method underline + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method strikethrough + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method formatBlock + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method superscript + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method subscript + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method justifyLeft + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method justifyCenter + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method justifyRight + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method justifyFull + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method formatBlock + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method removeFormat + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method backColor + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method foreColor + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method insertHorizontalRule + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /** + * @method fontName + * + * change font name + * + * @param {jQuery} $editable + * @param {Mixed} value + */ + + /* jshint ignore:start */ + // native commands(with execCommand), generate function for execCommand + var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', + 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', + 'formatBlock', 'removeFormat', + 'backColor', 'foreColor', 'fontName']; + + for (var idx = 0, len = commands.length; idx < len; idx ++) { + this[commands[idx]] = (function (sCmd) { + return function ($editable, value) { + beforeCommand($editable); + + document.execCommand(sCmd, false, value); + + afterCommand($editable, true); + }; + })(commands[idx]); + } + /* jshint ignore:end */ + + /** + * @method tab + * + * handle tab key + * + * @param {jQuery} $editable + * @param {Object} options + */ + this.tab = function ($editable, options) { + var rng = this.createRange($editable); + if (rng.isCollapsed() && rng.isOnCell()) { + table.tab(rng); + } else { + beforeCommand($editable); + typing.insertTab($editable, rng, options.tabsize); + afterCommand($editable); + } + }; + + /** + * @method untab + * + * handle shift+tab key + * + */ + this.untab = function ($editable) { + var rng = this.createRange($editable); + if (rng.isCollapsed() && rng.isOnCell()) { + table.tab(rng, true); + } + }; + + /** + * @method insertParagraph + * + * insert paragraph + * + * @param {Node} $editable + */ + this.insertParagraph = function ($editable) { + beforeCommand($editable); + typing.insertParagraph($editable); + afterCommand($editable); + }; + + /** + * @method insertOrderedList + * + * @param {jQuery} $editable + */ + this.insertOrderedList = function ($editable) { + beforeCommand($editable); + bullet.insertOrderedList($editable); + afterCommand($editable); + }; + + /** + * @param {jQuery} $editable + */ + this.insertUnorderedList = function ($editable) { + beforeCommand($editable); + bullet.insertUnorderedList($editable); + afterCommand($editable); + }; + + /** + * @param {jQuery} $editable + */ + this.indent = function ($editable) { + beforeCommand($editable); + bullet.indent($editable); + afterCommand($editable); + }; + + /** + * @param {jQuery} $editable + */ + this.outdent = function ($editable) { + beforeCommand($editable); + bullet.outdent($editable); + afterCommand($editable); + }; + + /** + * insert image + * + * @param {jQuery} $editable + * @param {String} sUrl + */ + this.insertImage = function ($editable, sUrl, filename) { + async.createImage(sUrl, filename).then(function ($image) { + beforeCommand($editable); + $image.css({ + display: '', + width: Math.min($editable.width(), $image.width()) + }); + range.create().insertNode($image[0]); + range.createFromNodeAfter($image[0]).select(); + afterCommand($editable); + }).fail(function () { + var $holder = dom.makeLayoutInfo($editable).holder(); + handler.bindCustomEvent( + $holder, $editable.data('callbacks'), 'image.upload.error' + )(); + }); + }; + + /** + * @method insertNode + * insert node + * @param {Node} $editable + * @param {Node} node + */ + this.insertNode = function ($editable, node) { + beforeCommand($editable); + range.create().insertNode(node); + range.createFromNodeAfter(node).select(); + afterCommand($editable); + }; + + /** + * insert text + * @param {Node} $editable + * @param {String} text + */ + this.insertText = function ($editable, text) { + beforeCommand($editable); + var textNode = range.create().insertNode(dom.createText(text)); + range.create(textNode, dom.nodeLength(textNode)).select(); + afterCommand($editable); + }; + + /** + * paste HTML + * @param {Node} $editable + * @param {String} markup + */ + this.pasteHTML = function ($editable, markup) { + beforeCommand($editable); + var contents = range.create().pasteHTML(markup); + range.createFromNodeAfter(list.last(contents)).select(); + afterCommand($editable); + }; + + /** + * formatBlock + * + * @param {jQuery} $editable + * @param {String} tagName + */ + this.formatBlock = function ($editable, tagName) { + beforeCommand($editable); + // [workaround] for MSIE, IE need `<` + tagName = agent.isMSIE ? '<' + tagName + '>' : tagName; + document.execCommand('FormatBlock', false, tagName); + afterCommand($editable); + }; + + this.formatPara = function ($editable) { + beforeCommand($editable); + this.formatBlock($editable, 'P'); + afterCommand($editable); + }; + + /* jshint ignore:start */ + for (var idx = 1; idx <= 6; idx ++) { + this['formatH' + idx] = function (idx) { + return function ($editable) { + this.formatBlock($editable, 'H' + idx); + }; + }(idx); + }; + /* jshint ignore:end */ + + /** + * fontSize + * + * @param {jQuery} $editable + * @param {String} value - px + */ + this.fontSize = function ($editable, value) { + var rng = range.create(); + + if (rng.isCollapsed()) { + var spans = style.styleNodes(rng); + var firstSpan = list.head(spans); + + $(spans).css({ + 'font-size': value + 'px' + }); + + // [workaround] added styled bogus span for style + // - also bogus character needed for cursor position + if (firstSpan && !dom.nodeLength(firstSpan)) { + firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR; + range.createFromNodeAfter(firstSpan.firstChild).select(); + $editable.data(KEY_BOGUS, firstSpan); + } + } else { + beforeCommand($editable); + $(style.styleNodes(rng)).css({ + 'font-size': value + 'px' + }); + afterCommand($editable); + } + }; + + /** + * insert horizontal rule + * @param {jQuery} $editable + */ + this.insertHorizontalRule = function ($editable) { + beforeCommand($editable); + + var rng = range.create(); + var hrNode = rng.insertNode($('
')[0]); + if (hrNode.nextSibling) { + range.create(hrNode.nextSibling, 0).normalize().select(); + } + + afterCommand($editable); + }; + + /** + * remove bogus node and character + */ + this.removeBogus = function ($editable) { + var bogusNode = $editable.data(KEY_BOGUS); + if (!bogusNode) { + return; + } + + var textNode = list.find(list.from(bogusNode.childNodes), dom.isText); + + var bogusCharIdx = textNode.nodeValue.indexOf(dom.ZERO_WIDTH_NBSP_CHAR); + if (bogusCharIdx !== -1) { + textNode.deleteData(bogusCharIdx, 1); + } + + if (dom.isEmpty(bogusNode)) { + dom.remove(bogusNode); + } + + $editable.removeData(KEY_BOGUS); + }; + + /** + * lineHeight + * @param {jQuery} $editable + * @param {String} value + */ + this.lineHeight = function ($editable, value) { + beforeCommand($editable); + style.stylePara(range.create(), { + lineHeight: value + }); + afterCommand($editable); + }; + + /** + * unlink + * + * @type command + * + * @param {jQuery} $editable + */ + this.unlink = function ($editable) { + var rng = this.createRange($editable); + if (rng.isOnAnchor()) { + var anchor = dom.ancestor(rng.sc, dom.isAnchor); + rng = range.createFromNode(anchor); + rng.select(); + + beforeCommand($editable); + document.execCommand('unlink'); + afterCommand($editable); + } + }; + + /** + * create link (command) + * + * @param {jQuery} $editable + * @param {Object} linkInfo + * @param {Object} options + */ + this.createLink = function ($editable, linkInfo, options) { + var linkUrl = linkInfo.url; + var linkText = linkInfo.text; + var isNewWindow = linkInfo.isNewWindow; + var className = linkInfo.className || null; // ODOO: addition + var rng = linkInfo.range || this.createRange($editable); + var isTextChanged = rng.toString() !== linkText; + + options = options || dom.makeLayoutInfo($editable).editor().data('options'); + + beforeCommand($editable); + + if (options.onCreateLink) { + linkUrl = options.onCreateLink(linkUrl); + } + + var anchors = []; + if (isTextChanged) { + // Create a new link when text changed. + var anchor = rng.insertNode($('' + linkText + '')[0]); + anchors.push(anchor); + } else { + anchors = style.styleNodes(rng, { + nodeName: 'A', + expandClosestSibling: true, + onlyPartialContains: true + }); + } + + $.each(anchors, function (idx, anchor) { + $(anchor).attr('href', linkUrl); + $(anchor).attr('class', className); // ODOO: addition + if (isNewWindow) { + $(anchor).attr('target', '_blank'); + } else { + $(anchor).removeAttr('target'); + } + }); + + var startRange = range.createFromNodeBefore(list.head(anchors)); + var startPoint = startRange.getStartPoint(); + var endRange = range.createFromNodeAfter(list.last(anchors)); + var endPoint = endRange.getEndPoint(); + + range.create( + startPoint.node, + startPoint.offset, + endPoint.node, + endPoint.offset + ).select(); + + afterCommand($editable); + }; + + /** + * returns link info + * + * @return {Object} + * @return {WrappedRange} return.range + * @return {String} return.text + * @return {Boolean} [return.isNewWindow=true] + * @return {String} [return.url=""] + */ + this.getLinkInfo = function ($editable) { + this.focus($editable); + + var rng = range.create().expand(dom.isAnchor); + + // Get the first anchor on range(for edit). + var $anchor = $(list.head(rng.nodes(dom.isAnchor))); + + return { + range: rng, + text: rng.toString(), + isNewWindow: $anchor.length ? $anchor.attr('target') === '_blank' : false, + url: $anchor.length ? $anchor.attr('href') : '' + }; + }; + + /** + * setting color + * + * @param {Node} $editable + * @param {Object} sObjColor color code + * @param {String} sObjColor.foreColor foreground color + * @param {String} sObjColor.backColor background color + */ + this.color = function ($editable, sObjColor) { + var oColor = JSON.parse(sObjColor); + var foreColor = oColor.foreColor, backColor = oColor.backColor; + + beforeCommand($editable); + + if (foreColor) { document.execCommand('foreColor', false, foreColor); } + if (backColor) { document.execCommand('backColor', false, backColor); } + + afterCommand($editable); + }; + + /** + * insert Table + * + * @param {Node} $editable + * @param {String} sDim dimension of table (ex : "5x5") + */ + this.insertTable = function ($editable, sDim) { + var dimension = sDim.split('x'); + beforeCommand($editable); + + var rng = range.create().deleteContents(); + rng.insertNode(table.createTable(dimension[0], dimension[1])); + afterCommand($editable); + }; + + /** + * float me + * + * @param {jQuery} $editable + * @param {String} value + * @param {jQuery} $target + */ + this.floatMe = function ($editable, value, $target) { + beforeCommand($editable); + // bootstrap + $target.removeClass('pull-left pull-right'); + if (value && value !== 'none') { + $target.addClass('pull-' + value); + } + + // fallback for non-bootstrap + $target.css('float', value); + afterCommand($editable); + }; + + /** + * change image shape + * + * @param {jQuery} $editable + * @param {String} value css class + * @param {Node} $target + */ + this.imageShape = function ($editable, value, $target) { + beforeCommand($editable); + + $target.removeClass('img-rounded img-circle img-thumbnail'); + + if (value) { + $target.addClass(value); + } + + afterCommand($editable); + }; + + /** + * resize overlay element + * @param {jQuery} $editable + * @param {String} value + * @param {jQuery} $target - target element + */ + this.resize = function ($editable, value, $target) { + beforeCommand($editable); + + $target.css({ + width: value * 100 + '%', + height: '' + }); + + afterCommand($editable); + }; + + /** + * @param {Position} pos + * @param {jQuery} $target - target element + * @param {Boolean} [bKeepRatio] - keep ratio + */ + this.resizeTo = function (pos, $target, bKeepRatio) { + var imageSize; + if (bKeepRatio) { + var newRatio = pos.y / pos.x; + var ratio = $target.data('ratio'); + imageSize = { + width: ratio > newRatio ? pos.x : pos.y / ratio, + height: ratio > newRatio ? pos.x * ratio : pos.y + }; + } else { + imageSize = { + width: pos.x, + height: pos.y + }; + } + + $target.css(imageSize); + }; + + /** + * remove media object + * + * @param {jQuery} $editable + * @param {String} value - dummy argument (for keep interface) + * @param {jQuery} $target - target element + */ + this.removeMedia = function ($editable, value, $target) { + beforeCommand($editable); + $target.detach(); + + handler.bindCustomEvent( + $(), $editable.data('callbacks'), 'media.delete' + )($target, $editable); + + afterCommand($editable); + }; + + /** + * set focus + * + * @param $editable + */ + this.focus = function ($editable) { + $editable.focus(); + + // [workaround] for firefox bug http://goo.gl/lVfAaI + if (agent.isFF) { + var rng = range.create(); + if (!rng || rng.isOnEditable()) { + return; + } + + range.createFromNode($editable[0]) + .normalize() + .collapse() + .select(); + } + }; + + /** + * returns whether contents is empty or not. + * + * @param {jQuery} $editable + * @return {Boolean} + */ + this.isEmpty = function ($editable) { + return dom.isEmpty($editable[0]) || dom.emptyPara === $editable.html(); + }; + }; + + return Editor; +}); diff --git a/addons/web_editor/static/lib/summernote/src/js/settings.js b/addons/web_editor/static/lib/summernote/src/js/settings.js deleted file mode 100644 index f7b0c0c6379..00000000000 --- a/addons/web_editor/static/lib/summernote/src/js/settings.js +++ /dev/null @@ -1,416 +0,0 @@ -define('summernote/defaults', function () { - /** - * @class defaults - * - * @singleton - */ - var defaults = { - /** @property */ - version: '@VERSION', - - /** - * - * for event options, reference to EventHandler.attach - * - * @property {Object} options - * @property {String/Number} [options.width=null] set editor width - * @property {String/Number} [options.height=null] set editor height, ex) 300 - * @property {String/Number} options.minHeight set minimum height of editor - * @property {String/Number} options.maxHeight - * @property {String/Number} options.focus - * @property {Number} options.tabsize - * @property {Boolean} options.styleWithSpan - * @property {Object} options.codemirror - * @property {Object} [options.codemirror.mode='text/html'] - * @property {Object} [options.codemirror.htmlMode=true] - * @property {Object} [options.codemirror.lineNumbers=true] - * @property {String} [options.lang=en-US] language 'en-US', 'ko-KR', ... - * @property {String} [options.direction=null] text direction, ex) 'rtl' - * @property {Array} [options.toolbar] - * @property {Boolean} [options.airMode=false] - * @property {Array} [options.airPopover] - * @property {Fucntion} [options.onInit] initialize - * @property {Fucntion} [options.onsubmit] - */ - options: { - width: null, // set editor width - height: null, // set editor height, ex) 300 - - minHeight: null, // set minimum height of editor - maxHeight: null, // set maximum height of editor - - focus: false, // set focus to editable area after initializing summernote - - tabsize: 4, // size of tab ex) 2 or 4 - styleWithSpan: true, // style with span (Chrome and FF only) - - disableLinkTarget: false, // hide link Target Checkbox - disableDragAndDrop: false, // disable drag and drop event - disableResizeEditor: false, // disable resizing editor - disableResizeImage: false, // disable resizing image - - shortcuts: true, // enable keyboard shortcuts - - textareaAutoSync: true, // enable textarea auto sync - - placeholder: false, // enable placeholder text - prettifyHtml: true, // enable prettifying html while toggling codeview - - iconPrefix: 'fa fa-', // prefix for css icon classes - - icons: { - font: { - bold: 'bold', - italic: 'italic', - underline: 'underline', - clear: 'eraser', - height: 'text-height', - strikethrough: 'strikethrough', - superscript: 'superscript', - subscript: 'subscript' - }, - image: { - image: 'picture-o', - floatLeft: 'align-left', - floatRight: 'align-right', - floatNone: 'align-justify', - shapeRounded: 'square', - shapeCircle: 'circle-o', - shapeThumbnail: 'picture-o', - shapeNone: 'times', - remove: 'trash-o' - }, - link: { - link: 'link', - unlink: 'unlink', - edit: 'edit' - }, - table: { - table: 'table' - }, - hr: { - insert: 'minus' - }, - style: { - style: 'magic' - }, - lists: { - unordered: 'list-ul', - ordered: 'list-ol' - }, - options: { - help: 'question', - fullscreen: 'arrows-alt', - codeview: 'code' - }, - paragraph: { - paragraph: 'align-left', - outdent: 'outdent', - indent: 'indent', - left: 'align-left', - center: 'align-center', - right: 'align-right', - justify: 'align-justify' - }, - color: { - recent: 'font' - }, - history: { - undo: 'undo', - redo: 'repeat' - }, - misc: { - check: 'check' - } - }, - - dialogsInBody: false, // false will add dialogs into editor - - codemirror: { // codemirror options - mode: 'text/html', - htmlMode: true, - lineNumbers: true - }, - - // language - lang: 'en-US', // language 'en-US', 'ko-KR', ... - direction: null, // text direction, ex) 'rtl' - - // toolbar - toolbar: [ - ['style', ['style']], - ['font', ['bold', 'italic', 'underline', 'clear']], - // ['font', ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'clear']], - ['fontname', ['fontname']], - ['fontsize', ['fontsize']], - ['color', ['color']], - ['para', ['ul', 'ol', 'paragraph']], - ['height', ['height']], - ['table', ['table']], - ['insert', ['link', 'picture', 'hr']], - ['view', ['fullscreen', 'codeview']], - ['help', ['help']] - ], - - plugin : { }, - - // air mode: inline editor - airMode: false, - // airPopover: [ - // ['style', ['style']], - // ['font', ['bold', 'italic', 'underline', 'clear']], - // ['fontname', ['fontname']], - // ['color', ['color']], - // ['para', ['ul', 'ol', 'paragraph']], - // ['height', ['height']], - // ['table', ['table']], - // ['insert', ['link', 'picture']], - // ['help', ['help']] - // ], - airPopover: [ - ['color', ['color']], - ['font', ['bold', 'underline', 'clear']], - ['para', ['ul', 'paragraph']], - ['table', ['table']], - ['insert', ['link', 'picture']] - ], - - // style tag - styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], - - // default fontName - defaultFontName: 'Helvetica Neue', - - // fontName - fontNames: [ - 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', - 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', - 'Tahoma', 'Times New Roman', 'Verdana' - ], - fontNamesIgnoreCheck: [], - - fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'], - - // pallete colors(n x n) - colors: [ - ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], - ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], - ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], - ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], - ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], - ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], - ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], - ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'] - ], - - // lineHeight - lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'], - - // insertTable max size - insertTableMaxSize: { - col: 10, - row: 10 - }, - - // image - maximumImageFileSize: null, // size in bytes, null = no limit - - // callbacks - oninit: null, // initialize - onfocus: null, // editable has focus - onblur: null, // editable out of focus - onenter: null, // enter key pressed - onkeyup: null, // keyup - onkeydown: null, // keydown - onImageUpload: null, // imageUpload - onImageUploadError: null, // imageUploadError - onMediaDelete: null, // media delete - onToolbarClick: null, - onsubmit: null, - - /** - * manipulate link address when user create link - * @param {String} sLinkUrl - * @return {String} - */ - onCreateLink: function (sLinkUrl) { - if (sLinkUrl.indexOf('@') !== -1 && sLinkUrl.indexOf(':') === -1) { - sLinkUrl = 'mailto:' + sLinkUrl; - } - - return sLinkUrl; - }, - - keyMap: { - pc: { - 'ENTER': 'insertParagraph', - 'CTRL+Z': 'undo', - 'CTRL+Y': 'redo', - 'TAB': 'tab', - 'SHIFT+TAB': 'untab', - 'CTRL+B': 'bold', - 'CTRL+I': 'italic', - 'CTRL+U': 'underline', - 'CTRL+SHIFT+S': 'strikethrough', - 'CTRL+BACKSLASH': 'removeFormat', - 'CTRL+SHIFT+L': 'justifyLeft', - 'CTRL+SHIFT+E': 'justifyCenter', - 'CTRL+SHIFT+R': 'justifyRight', - 'CTRL+SHIFT+J': 'justifyFull', - 'CTRL+SHIFT+NUM7': 'insertUnorderedList', - 'CTRL+SHIFT+NUM8': 'insertOrderedList', - 'CTRL+LEFTBRACKET': 'outdent', - 'CTRL+RIGHTBRACKET': 'indent', - 'CTRL+NUM0': 'formatPara', - 'CTRL+NUM1': 'formatH1', - 'CTRL+NUM2': 'formatH2', - 'CTRL+NUM3': 'formatH3', - 'CTRL+NUM4': 'formatH4', - 'CTRL+NUM5': 'formatH5', - 'CTRL+NUM6': 'formatH6', - 'CTRL+ENTER': 'insertHorizontalRule', - 'CTRL+K': 'showLinkDialog' - }, - - mac: { - 'ENTER': 'insertParagraph', - 'CMD+Z': 'undo', - 'CMD+SHIFT+Z': 'redo', - 'TAB': 'tab', - 'SHIFT+TAB': 'untab', - 'CMD+B': 'bold', - 'CMD+I': 'italic', - 'CMD+U': 'underline', - 'CMD+SHIFT+S': 'strikethrough', - 'CMD+BACKSLASH': 'removeFormat', - 'CMD+SHIFT+L': 'justifyLeft', - 'CMD+SHIFT+E': 'justifyCenter', - 'CMD+SHIFT+R': 'justifyRight', - 'CMD+SHIFT+J': 'justifyFull', - 'CMD+SHIFT+NUM7': 'insertUnorderedList', - 'CMD+SHIFT+NUM8': 'insertOrderedList', - 'CMD+LEFTBRACKET': 'outdent', - 'CMD+RIGHTBRACKET': 'indent', - 'CMD+NUM0': 'formatPara', - 'CMD+NUM1': 'formatH1', - 'CMD+NUM2': 'formatH2', - 'CMD+NUM3': 'formatH3', - 'CMD+NUM4': 'formatH4', - 'CMD+NUM5': 'formatH5', - 'CMD+NUM6': 'formatH6', - 'CMD+ENTER': 'insertHorizontalRule', - 'CMD+K': 'showLinkDialog' - } - } - }, - - // default language: en-US - lang: { - 'en-US': { - font: { - bold: 'Bold', - italic: 'Italic', - underline: 'Underline', - clear: 'Remove Font Style', - height: 'Line Height', - name: 'Font Family', - strikethrough: 'Strikethrough', - subscript: 'Subscript', - superscript: 'Superscript', - size: 'Font Size' - }, - image: { - image: 'Picture', - insert: 'Insert Image', - resizeFull: 'Resize Full', - resizeHalf: 'Resize Half', - resizeQuarter: 'Resize Quarter', - floatLeft: 'Float Left', - floatRight: 'Float Right', - floatNone: 'Float None', - shapeRounded: 'Shape: Rounded', - shapeCircle: 'Shape: Circle', - shapeThumbnail: 'Shape: Thumbnail', - shapeNone: 'Shape: None', - dragImageHere: 'Drag image or text here', - dropImage: 'Drop image or Text', - selectFromFiles: 'Select from files', - maximumFileSize: 'Maximum file size', - maximumFileSizeError: 'Maximum file size exceeded.', - url: 'Image URL', - remove: 'Remove Image' - }, - link: { - link: 'Link', - insert: 'Insert Link', - unlink: 'Unlink', - edit: 'Edit', - textToDisplay: 'Text to display', - url: 'To what URL should this link go?', - openInNewWindow: 'Open in new window' - }, - table: { - table: 'Table' - }, - hr: { - insert: 'Insert Horizontal Rule' - }, - style: { - style: 'Style', - normal: 'Normal', - blockquote: 'Quote', - pre: 'Code', - h1: 'Header 1', - h2: 'Header 2', - h3: 'Header 3', - h4: 'Header 4', - h5: 'Header 5', - h6: 'Header 6' - }, - lists: { - unordered: 'Unordered list', - ordered: 'Ordered list' - }, - options: { - help: 'Help', - fullscreen: 'Full Screen', - codeview: 'Code View' - }, - paragraph: { - paragraph: 'Paragraph', - outdent: 'Outdent', - indent: 'Indent', - left: 'Align left', - center: 'Align center', - right: 'Align right', - justify: 'Justify full' - }, - color: { - recent: 'Recent Color', - more: 'More Color', - background: 'Background Color', - foreground: 'Foreground Color', - transparent: 'Transparent', - setTransparent: 'Set transparent', - reset: 'Reset', - resetToDefault: 'Reset to default' - }, - shortcut: { - shortcuts: 'Keyboard shortcuts', - close: 'Close', - textFormatting: 'Text formatting', - action: 'Action', - paragraphFormatting: 'Paragraph formatting', - documentStyle: 'Document Style', - extraKeys: 'Extra keys' - }, - history: { - undo: 'Undo', - redo: 'Redo' - } - } - } - }; - - return defaults; -}); -- cgit v1.2.3