changeset 33:c23475f3f466

improve emoticons
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 14 Aug 2022 20:36:17 -0600
parents 98f11d0cbbd8
children 20d1f23225fe
files src/formats/bbcode.js src/formats/xhtml.js src/sceditor.js
diffstat 3 files changed, 40 insertions(+), 77 deletions(-) [+]
line wrap: on
line diff
--- a/src/formats/bbcode.js	Sat Aug 13 22:37:46 2022 -0600
+++ b/src/formats/bbcode.js	Sun Aug 14 20:36:17 2022 -0600
@@ -210,6 +210,13 @@
 		quote: {
 			txtExec: ['[quote]', '[/quote]']
 		},
+		emoticon: {
+			txtExec: function (editor, caller) {
+				editor.commands.emoticon.base(editor, caller, function(target) {
+					return '[emoticon]' + target.getAttribute(EMOTICON_DATA_ATTR) + '[/emoticon]';
+				} );
+			},
+		},
 		youtube: {
 			txtExec: function (editor, caller) {
 				getEditorCommand('youtube')._dropDown(
@@ -506,7 +513,9 @@
 			format: function (element, content) {
 				return attr(element, EMOTICON_DATA_ATTR) + content;
 			},
-			html: '{0}'
+			html: function (token, attrs, content, editor) {
+				return editor.allEmoticons[content] || token.val + content + token.closing.val;
+			}
 		},
 		// END_COMMAND
 
@@ -542,7 +551,7 @@
 
 				// check if this is an emoticon image
 				if (attr(element, EMOTICON_DATA_ATTR)) {
-					return content;
+					return '[emoticon]' + content + '[/emoticon]';
 				}
 
 				width = attr(element, 'width') || style('width');
@@ -1025,10 +1034,10 @@
 	 * @name BBCodeParser
 	 * @since v1.4.0
 	 */
-	function newBBCodeParser(options) {
+	function newBBCodeParser(editor) {
 		var base = {};
 
-		base.opts = extend({}, BBCodeParser.defaults, options);
+		base.opts = extend({}, BBCodeParser.defaults, editor.opts.parserOptions);
 
 		/**
 		 * Takes a BBCode string and splits it into open,
@@ -1829,7 +1838,8 @@
 							html = bbcode.html(
 								token,
 								token.attrs,
-								content
+								content,
+								editor
 							);
 						}
 					} else {
@@ -2503,6 +2513,7 @@
 		 * @private
 		 */
 		base.init = function (editor) {
+			base.editor = editor;
 			base.opts = editor.opts;
 			base.elementToBbcode = elementToBbcode;
 
@@ -2510,7 +2521,7 @@
 			buildBbcodeCache();
 
 			editor.commands = extendDeep(
-				{}, defaultCommandsOverrides, editor.commands
+				{}, editor.commands, defaultCommandsOverrides
 			);
 
 			// Add BBCode helper methods
@@ -2527,7 +2538,7 @@
 		 */
 		function toHtml(asFragment) {
 			return function(source, legacyAsFragment) {
-				var	parser = newBBCodeParser(base.opts.parserOptions);
+				var	parser = newBBCodeParser(base.editor);
 				var html = parser.toHTML(
 					base.opts.bbcodeTrim ? source.trim() : source
 				);
@@ -2554,7 +2565,7 @@
 				var	bbcode, elements;
 				var containerParent = context.createElement('div');
 				var container = context.createElement('div');
-				var parser = newBBCodeParser(base.opts.parserOptions);
+				var parser = newBBCodeParser(base.editor);
 
 				container.innerHTML = html;
 				css(containerParent, 'visibility', 'hidden');
--- a/src/formats/xhtml.js	Sat Aug 13 22:37:46 2022 -0600
+++ b/src/formats/xhtml.js	Sun Aug 14 20:36:17 2022 -0600
@@ -21,6 +21,7 @@
 	var removeAttr = dom.removeAttr;
 	var convertElement = dom.convertElement;
 	var extend = utils.extend;
+	var extendDeep = utils.extendDeep;
 	var each = utils.each;
 	var isEmptyObject = utils.isEmptyObject;
 
@@ -524,8 +525,7 @@
 				);
 			}
 
-			editor.commands = extend(true,
-				{}, defaultCommandsOverrides, editor.commands);
+			editor.commands = extendDeep({}, defaultCommandsOverrides, editor.commands);
 		};
 
 		/**
--- a/src/sceditor.js	Sat Aug 13 22:37:46 2022 -0600
+++ b/src/sceditor.js	Sun Aug 14 20:36:17 2022 -0600
@@ -2541,17 +2541,12 @@
 
 		// START_COMMAND: Emoticons
 		emoticon: {
-			exec: function (editor, caller) {
+			base: function (editor, caller, targetToHtml) {
 				var createContent = function (includeMore) {
 					var	moreLink,
 						opts            = editor.opts,
 						emoticonsRoot   = opts.emoticonsRoot || '',
 						emoticonsCompat = opts.emoticonsCompat,
-						rangeHelper     = editor.getRangeHelper(),
-						startSpace      = emoticonsCompat &&
-							rangeHelper.getOuterText(true, 1) !== ' ' ? ' ' : '',
-						endSpace        = emoticonsCompat &&
-							rangeHelper.getOuterText(false, 1) !== ' ' ? ' ' : '',
 						content         = createElement('div'),
 						line            = createElement('div'),
 						perLine         = 0,
@@ -2566,8 +2561,8 @@
 					perLine = Math.sqrt(Object.keys(emoticons).length);
 
 					onEvent1(content, 'click', 'img', function (target, e) {
-						editor.insert(startSpace + attr(target, 'alt') + endSpace,
-							null, false).closeDropDown(true);
+						editor.insert(targetToHtml(target), null, false);
+						editor.closeDropDown(true);
 
 						e.preventDefault();
 					});
@@ -2575,6 +2570,7 @@
 					each(emoticons, function (code, emoticon) {
 						appendChild(line, createElement('img', {
 							src: emoticonsRoot + (emoticon.url || emoticon),
+							'data-sceditor-emoticon': code,
 							alt: code,
 							title: emoticon.tooltip || code
 						}));
@@ -2609,8 +2605,13 @@
 
 				editor.createDropDown(caller, 'emoticons', createContent(false));
 			},
+			exec: function (editor, caller) {
+				editor.commands.emoticon.base(editor, caller
+					, function(target) { return target.outerHTML; }
+				);
+			},
 			txtExec: function (editor, caller) {
-				defaultCmds.emoticon.exec(editor, caller);
+				editor.commands.emoticon.exec(editor, caller);
 			},
 			tooltip: 'Insert an emoticon'
 		},
@@ -4044,7 +4045,7 @@
 	 * @param {boolean} emoticonsCompat
 	 * @return {void}
 	 */
-	function replace(root, emoticons, emoticonsCompat) {
+	function doReplaceEmoticons(root, emoticons, emoticonsCompat) {
 		var	doc           = root.ownerDocument;
 		var space         = '(^|\\s|\xA0|\u2002|\u2003|\u2009|$)';
 		var emoticonCodes = [];
@@ -4254,14 +4255,6 @@
 		var locale;
 
 		/**
-		 * Stores a cache of preloaded images
-		 *
-		 * @private
-		 * @type {Array.<HTMLImageElement>}
-		 */
-		var preLoadCache = [];
-
-		/**
 		 * The editors rangeHelper instance
 		 *
 		 * @type {RangeHelper}
@@ -4998,13 +4991,6 @@
 					url: root + (url.url || url),
 					tooltip: url.tooltip || key
 				});
-
-				// Preload the emoticon
-				if (options.emoticonsEnabled) {
-					preLoadCache.push(createElement('img', {
-						src: root + (url.url || url)
-					}));
-				}
 			});
 		};
 
@@ -5098,8 +5084,6 @@
 			sourceEditor.readonly = !readOnly;
 
 			updateToolBar(readOnly);
-
-			return base;
 		};
 
 		/**
@@ -5138,8 +5122,6 @@
 			if (icons.rtl) {
 				icons.rtl(rtl);
 			}
-
-			return base;
 		};
 
 		/**
@@ -5193,8 +5175,6 @@
 			}
 
 			base.dimensions(width$1, null, saveWidth);
-
-			return base;
 		};
 
 		/**
@@ -5262,8 +5242,6 @@
 
 				height(editorContainer, height$1);
 			}
-
-			return base;
 		};
 
 		/**
@@ -5307,8 +5285,6 @@
 			}
 
 			base.dimensions(null, height$1, saveHeight);
-
-			return base;
 		};
 
 		/**
@@ -5354,8 +5330,6 @@
 			}
 
 			autoExpand();
-
-			return base;
 		};
 
 		autoExpand = function () {
@@ -5820,8 +5794,6 @@
 			} else {
 				base.wysiwygEditorInsertText(text, endText);
 			}
-
-			return base;
 		};
 
 		/**
@@ -5904,8 +5876,7 @@
 			if (position) {
 				sourceEditor.selectionStart = position.start;
 				sourceEditor.selectionEnd = position.end;
-
-				return base;
+				return;
 			}
 
 			return {
@@ -5960,8 +5931,6 @@
 			} else {
 				base.setSourceEditorValue(val);
 			}
-
-			return base;
 		};
 
 		/**
@@ -6016,7 +5985,7 @@
 		) {
 			if (base.inSourceMode()) {
 				base.sourceEditorInsertText(start, end);
-				return base;
+				return;
 			}
 
 			// Add the selection between start and end
@@ -6043,8 +6012,6 @@
 			}
 
 			base.wysiwygEditorInsertHtml(start);
-
-			return base;
 		};
 
 		/**
@@ -6151,7 +6118,7 @@
 			}
 
 			wysiwygBody.innerHTML = value;
-			replaceEmoticons();
+			//replaceEmoticons();
 
 			appendNewLine();
 			triggerValueChanged();
@@ -6192,7 +6159,7 @@
 		 */
 		replaceEmoticons = function () {
 			if (options.emoticonsEnabled) {
-				replace(wysiwygBody, allEmoticons, options.emoticonsCompat);
+				doReplaceEmoticons(wysiwygBody, allEmoticons, options.emoticonsCompat);
 			}
 		};
 
@@ -6235,8 +6202,6 @@
 			if ((inSourceMode && !enable) || (!inSourceMode && enable)) {
 				base.toggleSourceMode();
 			}
-
-			return base;
 		};
 
 		/**
@@ -6738,8 +6703,6 @@
 					}
 				}
 			}
-
-			return base;
 		};
 
 		/**
@@ -6775,8 +6738,6 @@
 					}
 				}
 			}
-
-			return base;
 		};
 
 		/**
@@ -6810,8 +6771,6 @@
 			} else {
 				sourceEditor.blur();
 			}
-
-			return base;
 		};
 
 		/**
@@ -6875,8 +6834,6 @@
 			}
 
 			updateActiveButtons();
-
-			return base;
 		};
 
 		/**
@@ -7098,8 +7055,6 @@
 
 				triggerValueChanged();
 			}
-
-			return base;
 		};
 
 		/**
@@ -7140,8 +7095,6 @@
 			} else {
 				inlineCss.innerHTML = css;
 			}
-
-			return base;
 		};
 
 		/**
@@ -7305,7 +7258,7 @@
 				shortcutHandlers[shortcut] = cmd;
 			}
 
-			return base;
+			return true;
 		};
 
 		/**
@@ -7315,8 +7268,6 @@
 		 */
 		base.removeShortcut = function (shortcut) {
 			delete shortcutHandlers[shortcut.toLowerCase()];
-
-			return base;
 		};
 
 		/**
@@ -7392,7 +7343,7 @@
 			block = block || currentStyledBlockNode();
 
 			if (!block || is(block, 'body')) {
-				return base;
+				return;
 			}
 
 			rangeHelper.saveRange();
@@ -7406,7 +7357,6 @@
 			}
 
 			rangeHelper.restoreRange();
-			return base;
 		};
 
 		/**
@@ -7541,6 +7491,8 @@
 		// run the initializer
 		init();
 
+		base.allEmoticons = allEmoticons;
+
 		return base;
 	}