nodebb-plugin-composer-quill: WYSIWYG alternative to redactor
-
Hi @julian ,
Just completed integrating quill-emoji lib. (https://github.com/contentco/quill-emoji)
First I should say that the icons will only display inside the editor, so you can't display them afterwards (without changes to the core nodebb files), nor they may be used outside the scope of the editor, for example, in a topic header. To that end, I suggest getting the standard emoji composer library to work.
if anyone wants to experiment, allow me to save you some time:
- Update your dependencies in package.json:
"quill-emoji": "^0.1.2",
- Update plugin.json:
"css": [ "./node_modules/quill/dist/quill.snow.css", "./node_modules/quill/dist/quill.bubble.css", "./node_modules/quill-emoji/dist/quill-emoji.css" ], "modules": { "quill.js": "./node_modules/quill/dist/quill.js", "quill-emoji.js": "./node_modules/quill-emoji/dist/quill-emoji.js" },
- update quill-nbb.js packages:
define('quill-nbb', [ 'quill', 'quill-emoji', ... ], function (Quill, QuillEmoji, ...
- update quill-nbb.js quill icons:
var toolbarOptions = { container: [ [ your icons], ['emoji'] ], handlers: { 'emoji': function () {} }
- Update init():
var quill = new Quill(targetEl.get(0), { theme: data.theme || 'snow', modules: { toolbar: toolbarOptions, "emoji-toolbar": true, "emoji-shortname": true, "emoji-textarea": true } });
That's it, you should be all set.
But as I said, this solution is inferior, a better solution is using nodebb-plugin-emoji.
@PitaJ , see my previous message with the error code. Will appreciate some help thanks!JJ.
-
@JJSagan could you get a screenshot of where the error occurs in the code? You might need to run in dev mode if the sourcemaps don't work.
-
The issue occurs in emoji.js at line 100:
exports.search = fuzzySearch; formatting.addButtonDispatch('emoji-add-emoji', function (textarea) { new Promise(function (resolve_4, reject_4) { require(['emoji-dialog'], resolve_4, reject_4); }).then(function (_a) { var toggleForInsert = _a.toggleForInsert; return toggleForInsert(textarea); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! this line }); }); if (callback) { setTimeout(callback, 0); }
-
Line 100 toggleForInsert(textarea) articulates the issue I discussed earlier.
Unfortunately with quill, one cannot write into the text area. The quill format is a bit different.
Maybe you can return a link to quill-nbb.js so we can take care of inserting the data property there.
Another option is for you to check if quill is in use, and then you may:
quill.insertText(ptr, markup_txt, {
"align": "??",
"color": "??",
});
where ptr is the point to which the icon should be inserted. I assume you are not saving a bitmap but a link. To that end please take a look at quill-nbb.js specifically at image upload. Once a link is uploaded quill can display it. -
While I don't like to have individual plugins integrate with Quill, sometimes it is necessary. For example, many plugins detect whether Redactor is in use, and hook methods directly into Redactor.
It is my hope that this will not be necessary with Quill, but one never knows -- with regard to the emoji in my screenshots, the emoji plugin works fine with Quill but only if you type in the
:smile:
code yourself. Otherwise it will not work as you discovered, because the plugin does not know how to insert text/images into the Quill contenteditable.I do not have time this month to work on Quill, but there is hopefully time scheduled in October I look forward to getting it to 100% compatibility so we can bundle it with NodeBB in addition to composer-default.
-
No problemo @Kosiak , do check back on this plugin after October.
If you are looking for WYSIWYG then I believe this could be the solution for you, since Redactor unfortunately may be on its way out.
Take care and good luck with your forum!
btw: i started few months ago as none-coder like you (and yeah I still suck...), so be careful you might get addicted and convert -
Hi @PitaJ .
I am trying to debug nodebb-plugin-emoji and make it work with quill.
I cloned your depository, and compiled, however I can't see the sourcemaps of emoji-dialog.ts.
I tried changing tsconfig.json to include: "inlineSourceMap": true, "inlineSources": true, but still no sourcemap. Interestingly, emoji-setup.js does have a sourcemap.
Any idea what I am doing wrong?
Thank you!
JJ. -
Hi @PitaJ
Its difficult without a debugger, but I am quite confident the issue stem from showDeferred function - see init in emoji-dialog.js and look for getBoundingClientRect.
Either tabContent[0] or elem (from callback) are undefined.The above code gets executed upon clicking the emoji icon in quill, that is, as a result of the dispatcher:
formatting.addButtonDispatch('emoji-add-emoji', function (textarea) { new Promise(function (resolve_4, reject_4) { require(['emoji-dialog'], resolve_4, reject_4); }).then(function (_a) { var toggleForInsert = _a.toggleForInsert; return toggleForInsert(textarea); }); });
Console output:
Failed to initialize emoji dialog TypeError: Cannot read property 'getBoundingClientRect' of undefined at n (emoji-dialog.js?v=q79j5o5953s:1) at emoji-dialog.js?v=q79j5o5953s:1
I wonder if this gives you any clue with regards to a potential fix.
JJ. -
@JJSagan I'll look into it and see if I can find a solution in the coming days.
-
While reviewing the composer redactor code, I noted you are using a special set of emojis, rather than nodebb-plugin-emoji.
To that end, I took another look at rendering the quill-emoji plugin (https://github.com/contentco/quill-emoji), that is, without using a deadbeat quill editor. See an earlier post how to install.
The solution was to write a customized rendering code using converter.renderCustomWith(). See my suggested changes to library.js:
plugin.parseRaw = function (raw, callback) { //Convert delta strings if((raw != null) && (raw.hasOwnProperty("ops"))) { raw = JSON.stringify(raw); } try { var unescaped = raw.replace(/"/g, '"'); var content = JSON.parse(unescaped); var converter = new QuillDeltaToHtmlConverter(content.ops, {}); converter.renderCustomWith(function(customOp, contextOp){ if (customOp.insert.type === 'emoji') { return `<span class="${customOp.attributes.class}" src="${customOp.insert.value}"><span contenteditable="false"></span></span>`; } else { return 'Unmanaged custom blot!'; } }); raw = converter.convert(); } catch (e) { // Do nothing winston.warn('[composer-quill] Input not in expected format, skipping. - ', raw); } callback(null, raw); };
I'll play with it some more, but so far it looks solid.
Perhaps its better to use quill-emoji (over nodebb-plugin-emoji), to insure long term compatibility with quill.JJ.
-
Hi @julian
One disadvantage to quill-emoji is that they are using data-uri. Rendering the pack upon refresh is slow. The png file is huge and re-downloaded for some reason on each refresh. Offloading the png to S3 also proves to be very difficult (its currently under /public).
It should be possible to integrate nodebb's plugin. I tried but its difficult to work without a debugger (for some reason I can't access the source map due to webpack config - see post above). Nevertheless I pinpointed the problematic code and asked @PitaJ for some help. Wish I had the source map available...
JJ.
-
Hi @PitaJ
My apology, I can't figure out how to create source map in nodebb-plugin-emoji, specifically for emoji-dialog.js. Can you please help? I'd like to work-around the issue we are having with quill, so that @julian won't have to spend his time on this.
A bit of guidance and i'll be on my way, scouts-honor! (no three finger emoji...).
Thank you in advance!
JJ.