From 3eb3db874eff1eb10b9aec25fbb26c561a27018f Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 10 May 2018 20:08:10 +0800 Subject: [PATCH] markdown-it: support emoji --- README.md | 1 + README_zh.md | 1 + src/markdownitoption.h | 20 +++++++++++++++---- src/resources/markdown-it.js | 4 ++++ src/utils/markdown-it/README.md | 4 ++++ .../markdown-it/markdown-it-emoji.min.js | 3 +++ src/utils/vutils.cpp | 10 ++++++++-- src/vmainwindow.cpp | 12 +++++++++++ src/vnote.cpp | 1 + src/vnote.h | 1 + src/vnote.qrc | 1 + 11 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 src/utils/markdown-it/markdown-it-emoji.min.js diff --git a/README.md b/README.md index a5d48261..11985ac1 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,7 @@ In VNote, almost everything is configurable, such as background color, font, and - [markdown-it-sup](https://github.com/markdown-it/markdown-it-sup) (MIT License) - [markdown-it-front-matter](https://github.com/craigdmckenna/markdown-it-front-matter) (MIT License) - [markdown-it-imsize](https://github.com/tatsy/markdown-it-imsize) (Unknown) (Thanks @Kinka for help) +- [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) (MIT License) - [mermaid 7.0.0](https://github.com/knsv/mermaid) (MIT License) - [MathJax](https://www.mathjax.org/) (Apache-2.0) - [showdown](https://github.com/showdownjs/showdown) (Unknown) diff --git a/README_zh.md b/README_zh.md index cb75f7aa..866dc4d5 100644 --- a/README_zh.md +++ b/README_zh.md @@ -197,6 +197,7 @@ VNote中,几乎一切都是可以定制的,例如背景颜色、字体以及 - [markdown-it-sup](https://github.com/markdown-it/markdown-it-sup) (MIT License) - [markdown-it-front-matter](https://github.com/craigdmckenna/markdown-it-front-matter) (MIT License) - [markdown-it-imsize](https://github.com/tatsy/markdown-it-imsize) (Unknown) (Thanks @Kinka for help) +- [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) (MIT License) - [mermaid 7.0.0](https://github.com/knsv/mermaid) (MIT License) - [MathJax](https://www.mathjax.org/) (Apache-2.0) - [showdown](https://github.com/showdownjs/showdown) (Unknown) diff --git a/src/markdownitoption.h b/src/markdownitoption.h index 7f8c3ca4..8c555b0e 100644 --- a/src/markdownitoption.h +++ b/src/markdownitoption.h @@ -11,6 +11,7 @@ struct MarkdownitOption true, false, false, + false, false) { } @@ -20,13 +21,15 @@ struct MarkdownitOption bool p_linkify, bool p_sub, bool p_sup, - bool p_metadata) + bool p_metadata, + bool p_emoji) : m_html(p_html), m_breaks(p_breaks), m_linkify(p_linkify), m_sub(p_sub), m_sup(p_sup), - m_metadata(p_metadata) + m_metadata(p_metadata), + m_emoji(p_emoji) { } @@ -57,6 +60,10 @@ struct MarkdownitOption conf << "metadata"; } + if (m_emoji) { + conf << "emoji"; + } + return conf; } @@ -67,7 +74,8 @@ struct MarkdownitOption testOption(p_conf, "linkify"), testOption(p_conf, "sub"), testOption(p_conf, "sup"), - testOption(p_conf, "metadata")); + testOption(p_conf, "metadata"), + testOption(p_conf, "emoji")); } bool operator==(const MarkdownitOption &p_opt) const @@ -77,7 +85,8 @@ struct MarkdownitOption && m_linkify == p_opt.m_linkify && m_sub == p_opt.m_sub && m_sup == p_opt.m_sup - && m_metadata == p_opt.m_metadata; + && m_metadata == p_opt.m_metadata + && m_emoji == p_opt.m_emoji; } // Eanble HTML tags in source. @@ -98,6 +107,9 @@ struct MarkdownitOption // Enable metadata in YML format. bool m_metadata; + // Enable emoji and emoticon. + bool m_emoji; + private: static bool testOption(const QStringList &p_conf, const QString &p_opt) { diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js index c075a0c0..70d00ca8 100644 --- a/src/resources/markdown-it.js +++ b/src/resources/markdown-it.js @@ -94,6 +94,10 @@ if (VMarkdownitOption.metadata) { mdit = mdit.use(window.markdownitFrontMatter, function(text){}); } +if (VMarkdownitOption.emoji) { + mdit = mdit.use(window.markdownitEmoji); +} + mdit = mdit.use(window.markdownitFootnote); mdit = mdit.use(window["markdown-it-imsize.js"]); diff --git a/src/utils/markdown-it/README.md b/src/utils/markdown-it/README.md index c6b4a166..ac1c1e0a 100644 --- a/src/utils/markdown-it/README.md +++ b/src/utils/markdown-it/README.md @@ -31,3 +31,7 @@ Craig McKenna # [markdown-it-imsize](https://github.com/tatsy/markdown-it-imsize) v2.0.1 Tatsuya Yatagawa + +# [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) +v1.4.0 +Vitaly Puzrin diff --git a/src/utils/markdown-it/markdown-it-emoji.min.js b/src/utils/markdown-it/markdown-it-emoji.min.js new file mode 100644 index 00000000..feee94b6 --- /dev/null +++ b/src/utils/markdown-it/markdown-it-emoji.min.js @@ -0,0 +1,3 @@ +/*! markdown-it-emoji 1.4.0 https://github.com//markdown-it/markdown-it-emoji @license MIT */ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.markdownitEmoji=a()}}(function(){return function a(e,n,o){function i(_,t){if(!n[_]){if(!e[_]){var s="function"==typeof require&&require;if(!t&&s)return s(_,!0);if(r)return r(_,!0);var l=new Error("Cannot find module '"+_+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[_]={exports:{}};e[_][0].call(c.exports,function(a){var n=e[_][1][a];return i(n?n:a)},c,c.exports,a,e,n,o)}return n[_].exports}for(var r="function"==typeof require&&require,_=0;_:(",">:-("],blush:[':")',':-")'],broken_heart:["=0&&(e[o]=n[o]),e},{})),e=Object.keys(a.shortcuts).reduce(function(e,o){return n[o]?Array.isArray(a.shortcuts[o])?(a.shortcuts[o].forEach(function(a){e[a]=o}),e):(e[a.shortcuts[o]]=o,e):e},{});var i=Object.keys(n).map(function(a){return":"+a+":"}).concat(Object.keys(e)).sort().reverse().map(function(a){return o(a)}).join("|"),r=RegExp(i),_=RegExp(i,"g");return{defs:n,shortcuts:e,scanRE:r,replaceRE:_}}},{}],4:[function(a,e,n){"use strict";e.exports=function(a,e){return a[e].content}},{}],5:[function(a,e,n){"use strict";e.exports=function(a,e,n,o,i){function r(a,o,r){var _,t=0,l=[];return a.replace(i,function(o,i,c){var m;if(n.hasOwnProperty(o)){if(m=n[o],i>0&&!s.test(c[i-1]))return;if(i+o.lengtht&&(_=new r("text","",0),_.content=a.slice(t,i),l.push(_)),_=new r("emoji","",0),_.markup=m,_.content=e[m],l.push(_),t=i+o.length}),t=0;e--)s=t[e],"link_open"!==s.type&&"link_close"!==s.type||"auto"===s.info&&(c-=s.nesting),"text"===s.type&&0===c&&o.test(s.content)&&(l[n].children=t=_(t,e,r(s.content,s.level,a.Token)))}}},{}],6:[function(a,e,n){"use strict";var o=a("./lib/data/full.json"),i=a("./lib/data/shortcuts"),r=a("./lib/render"),_=a("./lib/replace"),t=a("./lib/normalize_opts");e.exports=function(a,e){var n={defs:o,shortcuts:i,enabled:[]},s=t(a.utils.assign({},n,e||{}));a.renderer.rules.emoji=r,a.core.ruler.push("emoji",_(a,s.defs,s.shortcuts,s.scanRE,s.replaceRE))}},{"./lib/data/full.json":1,"./lib/data/shortcuts":2,"./lib/normalize_opts":3,"./lib/render":4,"./lib/replace":5}]},{},[6])(6)}); diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index 0541c2f5..6e84fc07 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -673,20 +673,26 @@ QString VUtils::generateHtmlTemplate(const QString &p_template, extraFile += "\n"; } + if (opt.m_emoji) { + extraFile += "\n"; + } + QString optJs = QString("\n") .arg(opt.m_html ? QStringLiteral("true") : QStringLiteral("false")) .arg(opt.m_breaks ? QStringLiteral("true") : QStringLiteral("false")) .arg(opt.m_linkify ? QStringLiteral("true") : QStringLiteral("false")) .arg(opt.m_sub ? QStringLiteral("true") : QStringLiteral("false")) .arg(opt.m_sup ? QStringLiteral("true") : QStringLiteral("false")) - .arg(opt.m_metadata ? QStringLiteral("true") : QStringLiteral("false")); + .arg(opt.m_metadata ? QStringLiteral("true") : QStringLiteral("false")) + .arg(opt.m_emoji ? QStringLiteral("true") : QStringLiteral("false")); extraFile += optJs; break; } diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index 6156829d..70dd57e6 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -1617,12 +1617,24 @@ void VMainWindow::initMarkdownitOptionMenu(QMenu *p_menu) g_config->setMarkdownitOption(opt); }); + QAction *emojiAct = new QAction(tr("Emoji"), this); + emojiAct->setToolTip(tr("Enable emoji and emoticon")); + emojiAct->setCheckable(true); + emojiAct->setChecked(opt.m_emoji); + connect(emojiAct, &QAction::triggered, + this, [this](bool p_checked) { + MarkdownitOption opt = g_config->getMarkdownitOption(); + opt.m_emoji = p_checked; + g_config->setMarkdownitOption(opt); + }); + optMenu->addAction(htmlAct); optMenu->addAction(breaksAct); optMenu->addAction(linkifyAct); optMenu->addAction(supAct); optMenu->addAction(subAct); optMenu->addAction(metadataAct); + optMenu->addAction(emojiAct); } void VMainWindow::initRenderBackgroundMenu(QMenu *menu) diff --git a/src/vnote.cpp b/src/vnote.cpp index 7d5171a0..afb5661b 100644 --- a/src/vnote.cpp +++ b/src/vnote.cpp @@ -41,6 +41,7 @@ const QString VNote::c_markdownitSupExtraFile = ":/utils/markdown-it/markdown-it const QString VNote::c_markdownitFootnoteExtraFile = ":/utils/markdown-it/markdown-it-footnote.min.js"; const QString VNote::c_markdownitFrontMatterExtraFile = ":/utils/markdown-it/markdown-it-front-matter.js"; const QString VNote::c_markdownitImsizeExtraFile = ":/utils/markdown-it/markdown-it-imsize.min.js"; +const QString VNote::c_markdownitEmojiExtraFile = ":/utils/markdown-it/markdown-it-emoji.min.js"; const QString VNote::c_showdownJsFile = ":/resources/showdown.js"; const QString VNote::c_showdownExtraFile = ":/utils/showdown/showdown.min.js"; diff --git a/src/vnote.h b/src/vnote.h index b94bef15..3f69ec22 100644 --- a/src/vnote.h +++ b/src/vnote.h @@ -52,6 +52,7 @@ public: static const QString c_markdownitFootnoteExtraFile; static const QString c_markdownitFrontMatterExtraFile; static const QString c_markdownitImsizeExtraFile; + static const QString c_markdownitEmojiExtraFile; // Showdown static const QString c_showdownJsFile; diff --git a/src/vnote.qrc b/src/vnote.qrc index fe9f9a75..7bd0ee56 100644 --- a/src/vnote.qrc +++ b/src/vnote.qrc @@ -215,5 +215,6 @@ utils/dom-to-image/dom-to-image.js utils/markdown-it/markdown-it-front-matter.js utils/markdown-it/markdown-it-imsize.min.js + utils/markdown-it/markdown-it-emoji.min.js