From 855c450a97615b0ff0087c4cf0d2366bf0bae82c Mon Sep 17 00:00:00 2001 From: "qingwei.li" Date: Wed, 22 Feb 2017 21:29:26 +0800 Subject: [PATCH] feat(emoji): add emoji plugin --- build/build.js | 3 +- docs/README.md | 2 +- docs/_sidebar.md | 3 +- docs/plugins.md | 79 ++---------------- docs/quickstart.md | 6 +- docs/write-a-plugin.md | 71 ++++++++++++++++ docs/zh-cn/README.md | 1 + docs/zh-cn/_sidebar.md | 3 +- docs/zh-cn/plugins.md | 78 ++---------------- docs/zh-cn/pwa.md | 2 +- docs/zh-cn/quickstart.md | 5 -- docs/zh-cn/write-a-plugin.md | 69 ++++++++++++++++ src/core/render/emojify.js | 12 ++- src/plugins/emoji.js | 153 +++++++++++++++++++++++++++++++++++ 14 files changed, 322 insertions(+), 165 deletions(-) create mode 100644 docs/write-a-plugin.md create mode 100644 docs/zh-cn/write-a-plugin.md create mode 100644 src/plugins/emoji.js diff --git a/build/build.js b/build/build.js index a64089be6..b01ee22b6 100644 --- a/build/build.js +++ b/build/build.js @@ -33,7 +33,8 @@ build({ var plugins = [ { name: 'search', entry: 'search/index.js', moduleName: 'Search' }, - { name: 'ga', entry: 'ga.js', moduleName: 'GA' } + { name: 'ga', entry: 'ga.js', moduleName: 'GA' }, + { name: 'emoji', entry: 'emoji.js', moduleName: 'Emoji' } // { name: 'front-matter', entry: 'front-matter/index.js', moduleName: 'FrontMatter' } ] diff --git a/docs/README.md b/docs/README.md index 203b49674..dfe580aed 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,6 +15,7 @@ See the [Quick start](/quickstart) for more details. - Smart full-text search plugin - Multiple themes - Useful plugin API +- Emoji support - Compatible with IE10+ ## Examples @@ -24,4 +25,3 @@ Check out the [Showcase](https://github.com/QingWei-Li/docsify/#showcase) to doc ## Donate Please consider donating if you think docsify is helpful to you or that my work is valuable. I am happy if you can help me [buy a cup of coffee](https://github.com/QingWei-Li/donate). :heart: - diff --git a/docs/_sidebar.md b/docs/_sidebar.md index bed7c76b9..e747a918d 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -7,7 +7,8 @@ - Customization - [Configuration](/configuration) - [Themes](/themes) - - [Using plugins](/plugins) + - [List of Plugins](/plugins) + - [Write a Plugin](/write-a-plugin) - [Markdown configuration](/markdown) - [Lanuage highlighting](/language-highlight) diff --git a/docs/plugins.md b/docs/plugins.md index 8c2d4cfd3..29f434874 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1,8 +1,6 @@ -# Using plugins +# List of Plugins -## List of Plugins - -### Full text search +## Full text search By default, the hyperlink on the current page is recognized and the content is saved in `localStorage`. You can also specify the path to the files. @@ -38,7 +36,7 @@ By default, the hyperlink on the current page is recognized and the content is s ``` -### Google Analytics +## Google Analytics Install the plugin and configure the track id. @@ -60,75 +58,12 @@ Configure by `data-ga`. ``` +## emoji -## Write a plugin - -A plugin is simply a function that takes `hook` as arguments. -The hook supports handling asynchronous tasks. - -#### Full configuration - -```js -window.$docsify = { - plugins: [ - function (hook, vm) { - hook.init(function() { - // Called when the script starts running, only trigger once, no arguments, - }) +The default is to support parsing emoji. For example `:100:` will be parsed to :100:. But it is not precise because there is no matching non-emoji string. If you need to correctly parse the emoji string, you need install this plugin. - hook.beforeEach(function(content) { - // Invoked each time before parsing the Markdown file. - // ... - return content - }) - hook.afterEach(function(html, next) { - // Invoked each time after the Markdown file is parsed. - // beforeEach and afterEach support asynchronous。 - // ... - // call `next(html)` when task is done. - next(html) - }) - - hook.doneEach(function() { - // Invoked each time after the data is fully loaded, no arguments, - // ... - }) - - hook.mounted(function() { - // Called after initial completion. Only trigger once, no arguments. - }) - - hook.ready(function() { - // Called after initial completion, no arguments. - }) - } - ] -} +```html + ``` -!> You can get internal methods through `window.Docsify`. Get the current instance through the second argument. - -#### Example - -Add footer component in each pages. - -```js -window.$docsify = { - plugins: [ - function (hook) { - var footer = [ - '
', - '' - ].join('') - - hook.afterEach(function (html) { - return html + footer - }) - } - ] -} -``` diff --git a/docs/quickstart.md b/docs/quickstart.md index 58325576f..845ea184e 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -76,7 +76,7 @@ You should set the `data-app` attribute if you changed `el`: ```html - +
Please wait...
``` - -## Emoji support - -Support [github emoji](https://github.com/scotch-io/All-Github-Emoji-Icons) :smile: diff --git a/docs/write-a-plugin.md b/docs/write-a-plugin.md new file mode 100644 index 000000000..71a74a538 --- /dev/null +++ b/docs/write-a-plugin.md @@ -0,0 +1,71 @@ +# Write a plugin + +A plugin is simply a function that takes `hook` as arguments. +The hook supports handling asynchronous tasks. + +## Full configuration + +```js +window.$docsify = { + plugins: [ + function (hook, vm) { + hook.init(function() { + // Called when the script starts running, only trigger once, no arguments, + }) + + hook.beforeEach(function(content) { + // Invoked each time before parsing the Markdown file. + // ... + return content + }) + + hook.afterEach(function(html, next) { + // Invoked each time after the Markdown file is parsed. + // beforeEach and afterEach support asynchronous。 + // ... + // call `next(html)` when task is done. + next(html) + }) + + hook.doneEach(function() { + // Invoked each time after the data is fully loaded, no arguments, + // ... + }) + + hook.mounted(function() { + // Called after initial completion. Only trigger once, no arguments. + }) + + hook.ready(function() { + // Called after initial completion, no arguments. + }) + } + ] +} +``` + +!> You can get internal methods through `window.Docsify`. Get the current instance through the second argument. + +## Example + +Add footer component in each pages. + +```js +window.$docsify = { + plugins: [ + function (hook) { + var footer = [ + '
', + '' + ].join('') + + hook.afterEach(function (html) { + return html + footer + }) + } + ] +} +``` \ No newline at end of file diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md index 5f6e9fa94..8c317cc9d 100644 --- a/docs/zh-cn/README.md +++ b/docs/zh-cn/README.md @@ -16,6 +16,7 @@ docsify 是一个动态生成文档网站的工具。不同于 GitBook、Hexo - 智能的全文搜索 - 提供多套主题 - 丰富的 API +- 支持 Emoji - 兼容 IE10+ ## 例子 diff --git a/docs/zh-cn/_sidebar.md b/docs/zh-cn/_sidebar.md index 9d374bba2..47d970e50 100644 --- a/docs/zh-cn/_sidebar.md +++ b/docs/zh-cn/_sidebar.md @@ -7,7 +7,8 @@ - 定制化 - [配置项](zh-cn/configuration) - [主题](zh-cn/themes) - - [使用插件](zh-cn/plugins) + - [插件列表](zh-cn/plugins) + - [开发插件](zh-cn/write-a-plugin) - [Markdown 配置](zh-cn/markdown) - [代码高亮](zh-cn/language-highlight) diff --git a/docs/zh-cn/plugins.md b/docs/zh-cn/plugins.md index b5811d25f..aa29eab90 100644 --- a/docs/zh-cn/plugins.md +++ b/docs/zh-cn/plugins.md @@ -1,8 +1,6 @@ -# 使用插件 +# 插件列表 -## 内置插件 - -### 全文搜索 - Search +## 全文搜索 - Search 全文搜索插件会根据当前页面上的超链接获取文档内容,在 `localStorage` 内建立文档索引。默认过期时间为一天,当然我们可以自己指定需要缓存的文件列表或者配置过期时间。 @@ -37,7 +35,7 @@ ``` -### 谷歌统计 - Google Analytics +## 谷歌统计 - Google Analytics 需要配置 track id 才能使用。 @@ -58,72 +56,10 @@ ``` -## 自定义插件 - -docsify 提供了一套插件机制,其中提供的钩子(hook)支持处理异步逻辑,可以很方便的扩展功能。 - -#### 完整功能 - -```js -window.$docsify = { - plugins: [ - function (hook, vm) { - hook.init(function() { - // 初始化时调用,只调用一次,没有参数。 - }) - - hook.beforeEach(function(content) { - // 每次开始解析 Markdown 内容时调用 - // ... - return content - }) - - hook.afterEach(function(html, next) { - // 解析成 html 后调用。beforeEach 和 afterEach 支持处理异步逻辑 - // ... - // 异步处理完成后调用 next(html) 返回结果 - next(html) - }) - - hook.doneEach(function() { - // 每次路由切换时数据全部加载完成后调用,没有参数。 - // ... - }) - - hook.mounted(function() { - // 初始化完成后调用 ,只调用一次,没有参数。 - }) - - hook.ready(function() { - // 初始化并第一次加完成数据后调用,没有参数。 - }) - } - ] -} -``` - -!> 如果需要用 docsify 的内部方法,可以通过 `window.Docsify` 获取,通过 `vm` 获取当前实例。 +## emoji -#### 例子 +默认是提供 emoji 解析的,能将类似 `:100:` 解析成 :100:。但是它不是精准的,因为没有处理非 emoji 的字符串。如果你需要正确解析 emoji 字符串,你可以引入这个插件。 -给每个页面的末尾加上 `footer` - -```js -window.$docsify = { - plugins: [ - function (hook) { - var footer = [ - '
', - '' - ].join('') - - hook.afterEach(function (html) { - return html + footer - }) - } - ] -} +```html + ``` diff --git a/docs/zh-cn/pwa.md b/docs/zh-cn/pwa.md index f8d03ff59..2337e9f46 100644 --- a/docs/zh-cn/pwa.md +++ b/docs/zh-cn/pwa.md @@ -4,7 +4,7 @@ 要使用它也非常容易。 ## 创建 serviceWorker -这里已经整理好了一份代码,你只需要在网站根目录下创建一个 `sw.js` 文件,并张贴下面的代码。 +这里已经整理好了一份代码,你只需要在网站根目录下创建一个 `sw.js` 文件,并粘贴下面的代码。 *sw.js* diff --git a/docs/zh-cn/quickstart.md b/docs/zh-cn/quickstart.md index 1bd7ff225..a495ec5d5 100644 --- a/docs/zh-cn/quickstart.md +++ b/docs/zh-cn/quickstart.md @@ -81,8 +81,3 @@ cd docs && python -m SimpleHTTPServer 3000 } ``` - -## Emoji 支持 - -自动转义 [github 支持的 emoji](https://github.com/scotch-io/All-Github-Emoji-Icons):smile: - diff --git a/docs/zh-cn/write-a-plugin.md b/docs/zh-cn/write-a-plugin.md new file mode 100644 index 000000000..27544e450 --- /dev/null +++ b/docs/zh-cn/write-a-plugin.md @@ -0,0 +1,69 @@ +# 自定义插件 + +docsify 提供了一套插件机制,其中提供的钩子(hook)支持处理异步逻辑,可以很方便的扩展功能。 + +## 完整功能 + +```js +window.$docsify = { + plugins: [ + function (hook, vm) { + hook.init(function() { + // 初始化时调用,只调用一次,没有参数。 + }) + + hook.beforeEach(function(content) { + // 每次开始解析 Markdown 内容时调用 + // ... + return content + }) + + hook.afterEach(function(html, next) { + // 解析成 html 后调用。beforeEach 和 afterEach 支持处理异步逻辑 + // ... + // 异步处理完成后调用 next(html) 返回结果 + next(html) + }) + + hook.doneEach(function() { + // 每次路由切换时数据全部加载完成后调用,没有参数。 + // ... + }) + + hook.mounted(function() { + // 初始化完成后调用 ,只调用一次,没有参数。 + }) + + hook.ready(function() { + // 初始化并第一次加完成数据后调用,没有参数。 + }) + } + ] +} +``` + +!> 如果需要用 docsify 的内部方法,可以通过 `window.Docsify` 获取,通过 `vm` 获取当前实例。 + +## 例子 + +给每个页面的末尾加上 `footer` + +```js +window.$docsify = { + plugins: [ + function (hook) { + var footer = [ + '
', + '' + ].join('') + + hook.afterEach(function (html) { + return html + footer + }) + } + ] +} +``` \ No newline at end of file diff --git a/src/core/render/emojify.js b/src/core/render/emojify.js index 58fc79153..8d7983c3e 100644 --- a/src/core/render/emojify.js +++ b/src/core/render/emojify.js @@ -1,12 +1,10 @@ -// emoji from All-Github-Emoji-Icons -// https://github.com/scotch-io/All-Github-Emoji-Icons -var AllGithubEmoji = ['+1', '100', '1234', '8ball', 'a', 'ab', 'abc', 'abcd', 'accept', 'aerial_tramway', 'airplane', 'alarm_clock', 'alien', 'ambulance', 'anchor', 'angel', 'anger', 'angry', 'anguished', 'ant', 'apple', 'aquarius', 'aries', 'arrow_backward', 'arrow_double_down', 'arrow_double_up', 'arrow_down', 'arrow_down_small', 'arrow_forward', 'arrow_heading_down', 'arrow_heading_up', 'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right', 'arrow_right_hook', 'arrow_up', 'arrow_up_down', 'arrow_up_small', 'arrow_upper_left', 'arrow_upper_right', 'arrows_clockwise', 'arrows_counterclockwise', 'art', 'articulated_lorry', 'astonished', 'athletic_shoe', 'atm', 'b', 'baby', 'baby_bottle', 'baby_chick', 'baby_symbol', 'back', 'baggage_claim', 'balloon', 'ballot_box_with_check', 'bamboo', 'banana', 'bangbang', 'bank', 'bar_chart', 'barber', 'baseball', 'basketball', 'bath', 'bathtub', 'battery', 'bear', 'bee', 'beer', 'beers', 'beetle', 'beginner', 'bell', 'bento', 'bicyclist', 'bike', 'bikini', 'bird', 'birthday', 'black_circle', 'black_joker', 'black_large_square', 'black_medium_small_square', 'black_medium_square', 'black_nib', 'black_small_square', 'black_square_button', 'blossom', 'blowfish', 'blue_book', 'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', 'bookmark', 'bookmark_tabs', 'books', 'boom', 'boot', 'bouquet', 'bow', 'bowling', 'bowtie', 'boy', 'bread', 'bride_with_veil', 'bridge_at_night', 'briefcase', 'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus', 'busstop', 'bust_in_silhouette', 'busts_in_silhouette', 'cactus', 'cake', 'calendar', 'calling', 'camel', 'camera', 'cancer', 'candy', 'capital_abcd', 'capricorn', 'car', 'card_index', 'carousel_horse', 'cat', 'cat2', 'cd', 'chart', 'chart_with_downwards_trend', 'chart_with_upwards_trend', 'checkered_flag', 'cherries', 'cherry_blossom', 'chestnut', 'chicken', 'children_crossing', 'chocolate_bar', 'christmas_tree', 'church', 'cinema', 'circus_tent', 'city_sunrise', 'city_sunset', 'cl', 'clap', 'clapper', 'clipboard', 'clock1', 'clock10', 'clock1030', 'clock11', 'clock1130', 'clock12', 'clock1230', 'clock130', 'clock2', 'clock230', 'clock3', 'clock330', 'clock4', 'clock430', 'clock5', 'clock530', 'clock6', 'clock630', 'clock7', 'clock730', 'clock8', 'clock830', 'clock9', 'clock930', 'closed_book', 'closed_lock_with_key', 'closed_umbrella', 'cloud', 'clubs', 'cn', 'cocktail', 'coffee', 'cold_sweat', 'collision', 'computer', 'confetti_ball', 'confounded', 'confused', 'congratulations', 'construction', 'construction_worker', 'convenience_store', 'cookie', 'cool', 'cop', 'copyright', 'corn', 'couple', 'couple_with_heart', 'couplekiss', 'cow', 'cow2', 'credit_card', 'crescent_moon', 'crocodile', 'crossed_flags', 'crown', 'cry', 'crying_cat_face', 'crystal_ball', 'cupid', 'curly_loop', 'currency_exchange', 'curry', 'custard', 'customs', 'cyclone', 'dancer', 'dancers', 'dango', 'dart', 'dash', 'date', 'de', 'deciduous_tree', 'department_store', 'diamond_shape_with_a_dot_inside', 'diamonds', 'disappointed', 'disappointed_relieved', 'dizzy', 'dizzy_face', 'do_not_litter', 'dog', 'dog2', 'dollar', 'dolls', 'dolphin', 'door', 'doughnut', 'dragon', 'dragon_face', 'dress', 'dromedary_camel', 'droplet', 'dvd', 'e-mail', 'ear', 'ear_of_rice', 'earth_africa', 'earth_americas', 'earth_asia', 'egg', 'eggplant', 'eight', 'eight_pointed_black_star', 'eight_spoked_asterisk', 'electric_plug', 'elephant', 'email', 'end', 'envelope', 'envelope_with_arrow', 'es', 'euro', 'european_castle', 'european_post_office', 'evergreen_tree', 'exclamation', 'expressionless', 'eyeglasses', 'eyes', 'facepunch', 'factory', 'fallen_leaf', 'family', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel', 'file_folder', 'finnadie', 'fire', 'fire_engine', 'fireworks', 'first_quarter_moon', 'first_quarter_moon_with_face', 'fish', 'fish_cake', 'fishing_pole_and_fish', 'fist', 'five', 'flags', 'flashlight', 'flipper', 'floppy_disk', 'flower_playing_cards', 'flushed', 'foggy', 'football', 'footprints', 'fork_and_knife', 'fountain', 'four', 'four_leaf_clover', 'fr', 'free', 'fried_shrimp', 'fries', 'frog', 'frowning', 'fu', 'fuelpump', 'full_moon', 'full_moon_with_face', 'game_die', 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl', 'globe_with_meridians', 'goat', 'goberserk', 'godmode', 'golf', 'grapes', 'green_apple', 'green_book', 'green_heart', 'grey_exclamation', 'grey_question', 'grimacing', 'grin', 'grinning', 'guardsman', 'guitar', 'gun', 'haircut', 'hamburger', 'hammer', 'hamster', 'hand', 'handbag', 'hankey', 'hash', 'hatched_chick', 'hatching_chick', 'headphones', 'hear_no_evil', 'heart', 'heart_decoration', 'heart_eyes', 'heart_eyes_cat', 'heartbeat', 'heartpulse', 'hearts', 'heavy_check_mark', 'heavy_division_sign', 'heavy_dollar_sign', 'heavy_exclamation_mark', 'heavy_minus_sign', 'heavy_multiplication_x', 'heavy_plus_sign', 'helicopter', 'herb', 'hibiscus', 'high_brightness', 'high_heel', 'hocho', 'honey_pot', 'honeybee', 'horse', 'horse_racing', 'hospital', 'hotel', 'hotsprings', 'hourglass', 'hourglass_flowing_sand', 'house', 'house_with_garden', 'hurtrealbad', 'hushed', 'ice_cream', 'icecream', 'id', 'ideograph_advantage', 'imp', 'inbox_tray', 'incoming_envelope', 'information_desk_person', 'information_source', 'innocent', 'interrobang', 'iphone', 'it', 'izakaya_lantern', 'jack_o_lantern', 'japan', 'japanese_castle', 'japanese_goblin', 'japanese_ogre', 'jeans', 'joy', 'joy_cat', 'jp', 'key', 'keycap_ten', 'kimono', 'kiss', 'kissing', 'kissing_cat', 'kissing_closed_eyes', 'kissing_heart', 'kissing_smiling_eyes', 'koala', 'koko', 'kr', 'lantern', 'large_blue_circle', 'large_blue_diamond', 'large_orange_diamond', 'last_quarter_moon', 'last_quarter_moon_with_face', 'laughing', 'leaves', 'ledger', 'left_luggage', 'left_right_arrow', 'leftwards_arrow_with_hook', 'lemon', 'leo', 'leopard', 'libra', 'light_rail', 'link', 'lips', 'lipstick', 'lock', 'lock_with_ink_pen', 'lollipop', 'loop', 'loud_sound', 'loudspeaker', 'love_hotel', 'love_letter', 'low_brightness', 'm', 'mag', 'mag_right', 'mahjong', 'mailbox', 'mailbox_closed', 'mailbox_with_mail', 'mailbox_with_no_mail', 'man', 'man_with_gua_pi_mao', 'man_with_turban', 'mans_shoe', 'maple_leaf', 'mask', 'massage', 'meat_on_bone', 'mega', 'melon', 'memo', 'mens', 'metal', 'metro', 'microphone', 'microscope', 'milky_way', 'minibus', 'minidisc', 'mobile_phone_off', 'money_with_wings', 'moneybag', 'monkey', 'monkey_face', 'monorail', 'moon', 'mortar_board', 'mount_fuji', 'mountain_bicyclist', 'mountain_cableway', 'mountain_railway', 'mouse', 'mouse2', 'movie_camera', 'moyai', 'muscle', 'mushroom', 'musical_keyboard', 'musical_note', 'musical_score', 'mute', 'nail_care', 'name_badge', 'neckbeard', 'necktie', 'negative_squared_cross_mark', 'neutral_face', 'new', 'new_moon', 'new_moon_with_face', 'newspaper', 'ng', 'night_with_stars', 'nine', 'no_bell', 'no_bicycles', 'no_entry', 'no_entry_sign', 'no_good', 'no_mobile_phones', 'no_mouth', 'no_pedestrians', 'no_smoking', 'non-potable_water', 'nose', 'notebook', 'notebook_with_decorative_cover', 'notes', 'nut_and_bolt', 'o', 'o2', 'ocean', 'octocat', 'octopus', 'oden', 'office', 'ok', 'ok_hand', 'ok_woman', 'older_man', 'older_woman', 'on', 'oncoming_automobile', 'oncoming_bus', 'oncoming_police_car', 'oncoming_taxi', 'one', 'open_book', 'open_file_folder', 'open_hands', 'open_mouth', 'ophiuchus', 'orange_book', 'outbox_tray', 'ox', 'package', 'page_facing_up', 'page_with_curl', 'pager', 'palm_tree', 'panda_face', 'paperclip', 'parking', 'part_alternation_mark', 'partly_sunny', 'passport_control', 'paw_prints', 'peach', 'pear', 'pencil', 'pencil2', 'penguin', 'pensive', 'performing_arts', 'persevere', 'person_frowning', 'person_with_blond_hair', 'person_with_pouting_face', 'phone', 'pig', 'pig2', 'pig_nose', 'pill', 'pineapple', 'pisces', 'pizza', 'point_down', 'point_left', 'point_right', 'point_up', 'point_up_2', 'police_car', 'poodle', 'poop', 'post_office', 'postal_horn', 'postbox', 'potable_water', 'pouch', 'poultry_leg', 'pound', 'pouting_cat', 'pray', 'princess', 'punch', 'purple_heart', 'purse', 'pushpin', 'put_litter_in_its_place', 'question', 'rabbit', 'rabbit2', 'racehorse', 'radio', 'radio_button', 'rage', 'rage1', 'rage2', 'rage3', 'rage4', 'railway_car', 'rainbow', 'raised_hand', 'raised_hands', 'raising_hand', 'ram', 'ramen', 'rat', 'recycle', 'red_car', 'red_circle', 'registered', 'relaxed', 'relieved', 'repeat', 'repeat_one', 'restroom', 'revolving_hearts', 'rewind', 'ribbon', 'rice', 'rice_ball', 'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', 'rooster', 'rose', 'rotating_light', 'round_pushpin', 'rowboat', 'ru', 'rugby_football', 'runner', 'running', 'running_shirt_with_sash', 'sa', 'sagittarius', 'sailboat', 'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school', 'school_satchel', 'scissors', 'scorpius', 'scream', 'scream_cat', 'scroll', 'seat', 'secret', 'see_no_evil', 'seedling', 'seven', 'shaved_ice', 'sheep', 'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'shower', 'signal_strength', 'six', 'six_pointed_star', 'ski', 'skull', 'sleeping', 'sleepy', 'slot_machine', 'small_blue_diamond', 'small_orange_diamond', 'small_red_triangle', 'small_red_triangle_down', 'smile', 'smile_cat', 'smiley', 'smiley_cat', 'smiling_imp', 'smirk', 'smirk_cat', 'smoking', 'snail', 'snake', 'snowboarder', 'snowflake', 'snowman', 'sob', 'soccer', 'soon', 'sos', 'sound', 'space_invader', 'spades', 'spaghetti', 'sparkle', 'sparkler', 'sparkles', 'sparkling_heart', 'speak_no_evil', 'speaker', 'speech_balloon', 'speedboat', 'squirrel', 'star', 'star2', 'stars', 'station', 'statue_of_liberty', 'steam_locomotive', 'stew', 'straight_ruler', 'strawberry', 'stuck_out_tongue', 'stuck_out_tongue_closed_eyes', 'stuck_out_tongue_winking_eye', 'sun_with_face', 'sunflower', 'sunglasses', 'sunny', 'sunrise', 'sunrise_over_mountains', 'surfer', 'sushi', 'suspect', 'suspension_railway', 'sweat', 'sweat_drops', 'sweat_smile', 'sweet_potato', 'swimmer', 'symbols', 'syringe', 'tada', 'tanabata_tree', 'tangerine', 'taurus', 'taxi', 'tea', 'telephone', 'telephone_receiver', 'telescope', 'tennis', 'tent', 'thought_balloon', 'three', 'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tiger2', 'tired_face', 'tm', 'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', 'tractor', 'traffic_light', 'train', 'train2', 'tram', 'triangular_flag_on_post', 'triangular_ruler', 'trident', 'triumph', 'trolleybus', 'trollface', 'trophy', 'tropical_drink', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip', 'turtle', 'tv', 'twisted_rightwards_arrows', 'two', 'two_hearts', 'two_men_holding_hands', 'two_women_holding_hands', 'u5272', 'u5408', 'u55b6', 'u6307', 'u6708', 'u6709', 'u6e80', 'u7121', 'u7533', 'u7981', 'u7a7a', 'uk', 'umbrella', 'unamused', 'underage', 'unlock', 'up', 'us', 'v', 'vertical_traffic_light', 'vhs', 'vibration_mode', 'video_camera', 'video_game', 'violin', 'virgo', 'volcano', 'vs', 'walking', 'waning_crescent_moon', 'waning_gibbous_moon', 'warning', 'watch', 'water_buffalo', 'watermelon', 'wave', 'wavy_dash', 'waxing_crescent_moon', 'waxing_gibbous_moon', 'wc', 'weary', 'wedding', 'whale', 'whale2', 'wheelchair', 'white_check_mark', 'white_circle', 'white_flower', 'white_large_square', 'white_medium_small_square', 'white_medium_square', 'white_small_square', 'white_square_button', 'wind_chime', 'wine_glass', 'wink', 'wolf', 'woman', 'womans_clothes', 'womans_hat', 'womens', 'worried', 'wrench', 'x', 'yellow_heart', 'yen', 'yum', 'zap', 'zero', 'zzz'] -function replaceEmoji (match, $1) { - return AllGithubEmoji.indexOf($1) === -1 ? match : '' + $1 + '' +function replace (m, $1) { + return '' + $1 + '' } + export function emojify (text) { return text - .replace(/<(pre|template)[^>]*?>([\s\S]+)<\/(pre|template)>/g, m => m.replace(/:/g, '__colon__')) - .replace(/:(\w+?):/ig, replaceEmoji) + .replace(/<(pre|template|code)[^>]*?>[\s\S]+?<\/(pre|template|code)>/g, m => m.replace(/:/g, '__colon__')) + .replace(/:(\w+?):/ig, window.emojify || replace) .replace(/__colon__/g, ':') } diff --git a/src/plugins/emoji.js b/src/plugins/emoji.js new file mode 100644 index 000000000..9b71c65e3 --- /dev/null +++ b/src/plugins/emoji.js @@ -0,0 +1,153 @@ +const AllGithubEmoji = ['+1', '100', '1234', '8ball', 'a', 'ab', 'abc', 'abcd', + 'accept', 'aerial_tramway', 'airplane', 'alarm_clock', 'alien', 'ambulance', + 'anchor', 'angel', 'anger', 'angry', 'anguished', 'ant', 'apple', 'aquarius', + 'aries', 'arrow_backward', 'arrow_double_down', 'arrow_double_up', 'arrow_down', + 'arrow_down_small', 'arrow_forward', 'arrow_heading_down', 'arrow_heading_up', + 'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right', + 'arrow_right_hook', 'arrow_up', 'arrow_up_down', 'arrow_up_small', 'arrow_upper_left', + 'arrow_upper_right', 'arrows_clockwise', 'arrows_counterclockwise', 'art', + 'articulated_lorry', 'astonished', 'athletic_shoe', 'atm', 'b', 'baby', 'baby_bottle', + 'baby_chick', 'baby_symbol', 'back', 'baggage_claim', 'balloon', 'ballot_box_with_check', + 'bamboo', 'banana', 'bangbang', 'bank', 'bar_chart', 'barber', 'baseball', 'basketball', + 'bath', 'bathtub', 'battery', 'bear', 'bee', 'beer', 'beers', 'beetle', 'beginner', + 'bell', 'bento', 'bicyclist', 'bike', 'bikini', 'bird', 'birthday', 'black_circle', + 'black_joker', 'black_large_square', 'black_medium_small_square', 'black_medium_square', + 'black_nib', 'black_small_square', 'black_square_button', 'blossom', 'blowfish', + 'blue_book', 'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', + 'bookmark', 'bookmark_tabs', 'books', 'boom', 'boot', 'bouquet', 'bow', 'bowling', + 'bowtie', 'boy', 'bread', 'bride_with_veil', 'bridge_at_night', 'briefcase', + 'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus', + 'busstop', 'bust_in_silhouette', 'busts_in_silhouette', 'cactus', 'cake', 'calendar', + 'calling', 'camel', 'camera', 'cancer', 'candy', 'capital_abcd', 'capricorn', 'car', + 'card_index', 'carousel_horse', 'cat', 'cat2', 'cd', 'chart', 'chart_with_downwards_trend', + 'chart_with_upwards_trend', 'checkered_flag', 'cherries', 'cherry_blossom', 'chestnut', + 'chicken', 'children_crossing', 'chocolate_bar', 'christmas_tree', 'church', 'cinema', + 'circus_tent', 'city_sunrise', 'city_sunset', 'cl', 'clap', 'clapper', 'clipboard', + 'clock1', 'clock10', 'clock1030', 'clock11', 'clock1130', 'clock12', 'clock1230', + 'clock130', 'clock2', 'clock230', 'clock3', 'clock330', 'clock4', 'clock430', + 'clock5', 'clock530', 'clock6', 'clock630', 'clock7', 'clock730', 'clock8', 'clock830', + 'clock9', 'clock930', 'closed_book', 'closed_lock_with_key', 'closed_umbrella', + 'cloud', 'clubs', 'cn', 'cocktail', 'coffee', 'cold_sweat', 'collision', 'computer', + 'confetti_ball', 'confounded', 'confused', 'congratulations', 'construction', + 'construction_worker', 'convenience_store', 'cookie', 'cool', 'cop', 'copyright', + 'corn', 'couple', 'couple_with_heart', 'couplekiss', 'cow', 'cow2', 'credit_card', + 'crescent_moon', 'crocodile', 'crossed_flags', 'crown', 'cry', 'crying_cat_face', + 'crystal_ball', 'cupid', 'curly_loop', 'currency_exchange', 'curry', 'custard', + 'customs', 'cyclone', 'dancer', 'dancers', 'dango', 'dart', 'dash', 'date', 'de', + 'deciduous_tree', 'department_store', 'diamond_shape_with_a_dot_inside', 'diamonds', + 'disappointed', 'disappointed_relieved', 'dizzy', 'dizzy_face', 'do_not_litter', + 'dog', 'dog2', 'dollar', 'dolls', 'dolphin', 'door', 'doughnut', 'dragon', + 'dragon_face', 'dress', 'dromedary_camel', 'droplet', 'dvd', 'e-mail', 'ear', + 'ear_of_rice', 'earth_africa', 'earth_americas', 'earth_asia', 'egg', 'eggplant', + 'eight', 'eight_pointed_black_star', 'eight_spoked_asterisk', 'electric_plug', + 'elephant', 'email', 'end', 'envelope', 'envelope_with_arrow', 'es', 'euro', + 'european_castle', 'european_post_office', 'evergreen_tree', 'exclamation', + 'expressionless', 'eyeglasses', 'eyes', 'facepunch', 'factory', 'fallen_leaf', + 'family', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel', + 'file_folder', 'finnadie', 'fire', 'fire_engine', 'fireworks', 'first_quarter_moon', + 'first_quarter_moon_with_face', 'fish', 'fish_cake', 'fishing_pole_and_fish', + 'fist', 'five', 'flags', 'flashlight', 'flipper', 'floppy_disk', 'flower_playing_cards', + 'flushed', 'foggy', 'football', 'footprints', 'fork_and_knife', 'fountain', + 'four', 'four_leaf_clover', 'fr', 'free', 'fried_shrimp', 'fries', 'frog', + 'frowning', 'fu', 'fuelpump', 'full_moon', 'full_moon_with_face', 'game_die', + 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl', 'globe_with_meridians', + 'goat', 'goberserk', 'godmode', 'golf', 'grapes', 'green_apple', 'green_book', + 'green_heart', 'grey_exclamation', 'grey_question', 'grimacing', 'grin', + 'grinning', 'guardsman', 'guitar', 'gun', 'haircut', 'hamburger', 'hammer', + 'hamster', 'hand', 'handbag', 'hankey', 'hash', 'hatched_chick', 'hatching_chick', + 'headphones', 'hear_no_evil', 'heart', 'heart_decoration', 'heart_eyes', + 'heart_eyes_cat', 'heartbeat', 'heartpulse', 'hearts', 'heavy_check_mark', + 'heavy_division_sign', 'heavy_dollar_sign', 'heavy_exclamation_mark', 'heavy_minus_sign', + 'heavy_multiplication_x', 'heavy_plus_sign', 'helicopter', 'herb', 'hibiscus', + 'high_brightness', 'high_heel', 'hocho', 'honey_pot', 'honeybee', 'horse', + 'horse_racing', 'hospital', 'hotel', 'hotsprings', 'hourglass', 'hourglass_flowing_sand', + 'house', 'house_with_garden', 'hurtrealbad', 'hushed', 'ice_cream', 'icecream', + 'id', 'ideograph_advantage', 'imp', 'inbox_tray', 'incoming_envelope', + 'information_desk_person', 'information_source', 'innocent', 'interrobang', + 'iphone', 'it', 'izakaya_lantern', 'jack_o_lantern', 'japan', 'japanese_castle', + 'japanese_goblin', 'japanese_ogre', 'jeans', 'joy', 'joy_cat', 'jp', 'key', + 'keycap_ten', 'kimono', 'kiss', 'kissing', 'kissing_cat', 'kissing_closed_eyes', + 'kissing_heart', 'kissing_smiling_eyes', 'koala', 'koko', 'kr', 'lantern', + 'large_blue_circle', 'large_blue_diamond', 'large_orange_diamond', 'last_quarter_moon', + 'last_quarter_moon_with_face', 'laughing', 'leaves', 'ledger', 'left_luggage', + 'left_right_arrow', 'leftwards_arrow_with_hook', 'lemon', 'leo', 'leopard', + 'libra', 'light_rail', 'link', 'lips', 'lipstick', 'lock', 'lock_with_ink_pen', + 'lollipop', 'loop', 'loud_sound', 'loudspeaker', 'love_hotel', 'love_letter', + 'low_brightness', 'm', 'mag', 'mag_right', 'mahjong', 'mailbox', 'mailbox_closed', + 'mailbox_with_mail', 'mailbox_with_no_mail', 'man', 'man_with_gua_pi_mao', + 'man_with_turban', 'mans_shoe', 'maple_leaf', 'mask', 'massage', 'meat_on_bone', + 'mega', 'melon', 'memo', 'mens', 'metal', 'metro', 'microphone', 'microscope', + 'milky_way', 'minibus', 'minidisc', 'mobile_phone_off', 'money_with_wings', + 'moneybag', 'monkey', 'monkey_face', 'monorail', 'moon', 'mortar_board', 'mount_fuji', + 'mountain_bicyclist', 'mountain_cableway', 'mountain_railway', 'mouse', 'mouse2', + 'movie_camera', 'moyai', 'muscle', 'mushroom', 'musical_keyboard', 'musical_note', + 'musical_score', 'mute', 'nail_care', 'name_badge', 'neckbeard', 'necktie', + 'negative_squared_cross_mark', 'neutral_face', 'new', 'new_moon', 'new_moon_with_face', + 'newspaper', 'ng', 'night_with_stars', 'nine', 'no_bell', 'no_bicycles', 'no_entry', + 'no_entry_sign', 'no_good', 'no_mobile_phones', 'no_mouth', 'no_pedestrians', + 'no_smoking', 'non-potable_water', 'nose', 'notebook', 'notebook_with_decorative_cover', + 'notes', 'nut_and_bolt', 'o', 'o2', 'ocean', 'octocat', 'octopus', 'oden', 'office', + 'ok', 'ok_hand', 'ok_woman', 'older_man', 'older_woman', 'on', 'oncoming_automobile', + 'oncoming_bus', 'oncoming_police_car', 'oncoming_taxi', 'one', 'open_book', + 'open_file_folder', 'open_hands', 'open_mouth', 'ophiuchus', 'orange_book', + 'outbox_tray', 'ox', 'package', 'page_facing_up', 'page_with_curl', 'pager', + 'palm_tree', 'panda_face', 'paperclip', 'parking', 'part_alternation_mark', + 'partly_sunny', 'passport_control', 'paw_prints', 'peach', 'pear', 'pencil', + 'pencil2', 'penguin', 'pensive', 'performing_arts', 'persevere', 'person_frowning', + 'person_with_blond_hair', 'person_with_pouting_face', 'phone', 'pig', 'pig2', + 'pig_nose', 'pill', 'pineapple', 'pisces', 'pizza', 'point_down', 'point_left', + 'point_right', 'point_up', 'point_up_2', 'police_car', 'poodle', 'poop', + 'post_office', 'postal_horn', 'postbox', 'potable_water', 'pouch', 'poultry_leg', + 'pound', 'pouting_cat', 'pray', 'princess', 'punch', 'purple_heart', 'purse', + 'pushpin', 'put_litter_in_its_place', 'question', 'rabbit', 'rabbit2', 'racehorse', + 'radio', 'radio_button', 'rage', 'rage1', 'rage2', 'rage3', 'rage4', 'railway_car', + 'rainbow', 'raised_hand', 'raised_hands', 'raising_hand', 'ram', 'ramen', 'rat', + 'recycle', 'red_car', 'red_circle', 'registered', 'relaxed', 'relieved', 'repeat', + 'repeat_one', 'restroom', 'revolving_hearts', 'rewind', 'ribbon', 'rice', + 'rice_ball', 'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', + 'rooster', 'rose', 'rotating_light', 'round_pushpin', 'rowboat', 'ru', 'rugby_football', + 'runner', 'running', 'running_shirt_with_sash', 'sa', 'sagittarius', 'sailboat', + 'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school', + 'school_satchel', 'scissors', 'scorpius', 'scream', 'scream_cat', 'scroll', + 'seat', 'secret', 'see_no_evil', 'seedling', 'seven', 'shaved_ice', 'sheep', + 'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'shower', 'signal_strength', + 'six', 'six_pointed_star', 'ski', 'skull', 'sleeping', 'sleepy', 'slot_machine', + 'small_blue_diamond', 'small_orange_diamond', 'small_red_triangle', + 'small_red_triangle_down', 'smile', 'smile_cat', 'smiley', 'smiley_cat', + 'smiling_imp', 'smirk', 'smirk_cat', 'smoking', 'snail', 'snake', 'snowboarder', + 'snowflake', 'snowman', 'sob', 'soccer', 'soon', 'sos', 'sound', 'space_invader', + 'spades', 'spaghetti', 'sparkle', 'sparkler', 'sparkles', 'sparkling_heart', + 'speak_no_evil', 'speaker', 'speech_balloon', 'speedboat', 'squirrel', 'star', + 'star2', 'stars', 'station', 'statue_of_liberty', 'steam_locomotive', 'stew', + 'straight_ruler', 'strawberry', 'stuck_out_tongue', 'stuck_out_tongue_closed_eyes', + 'stuck_out_tongue_winking_eye', 'sun_with_face', 'sunflower', 'sunglasses', + 'sunny', 'sunrise', 'sunrise_over_mountains', 'surfer', 'sushi', 'suspect', + 'suspension_railway', 'sweat', 'sweat_drops', 'sweat_smile', 'sweet_potato', + 'swimmer', 'symbols', 'syringe', 'tada', 'tanabata_tree', 'tangerine', 'taurus', + 'taxi', 'tea', 'telephone', 'telephone_receiver', 'telescope', 'tennis', 'tent', + 'thought_balloon', 'three', 'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tiger2', + 'tired_face', 'tm', 'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', + 'tractor', 'traffic_light', 'train', 'train2', 'tram', 'triangular_flag_on_post', + 'triangular_ruler', 'trident', 'triumph', 'trolleybus', 'trollface', 'trophy', + 'tropical_drink', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip', + 'turtle', 'tv', 'twisted_rightwards_arrows', 'two', 'two_hearts', 'two_men_holding_hands', + 'two_women_holding_hands', 'u5272', 'u5408', 'u55b6', 'u6307', 'u6708', 'u6709', + 'u6e80', 'u7121', 'u7533', 'u7981', 'u7a7a', 'uk', 'umbrella', 'unamused', + 'underage', 'unlock', 'up', 'us', 'v', 'vertical_traffic_light', 'vhs', + 'vibration_mode', 'video_camera', 'video_game', 'violin', 'virgo', 'volcano', + 'vs', 'walking', 'waning_crescent_moon', 'waning_gibbous_moon', 'warning', + 'watch', 'water_buffalo', 'watermelon', 'wave', 'wavy_dash', 'waxing_crescent_moon', + 'waxing_gibbous_moon', 'wc', 'weary', 'wedding', 'whale', 'whale2', 'wheelchair', + 'white_check_mark', 'white_circle', 'white_flower', 'white_large_square', + 'white_medium_small_square', 'white_medium_square', 'white_small_square', + 'white_square_button', 'wind_chime', 'wine_glass', 'wink', 'wolf', 'woman', + 'womans_clothes', 'womans_hat', 'womens', 'worried', 'wrench', 'x', 'yellow_heart', + 'yen', 'yum', 'zap', 'zero', 'zzz'] + +// emoji from All-Github-Emoji-Icons +// https://github.com/scotch-io/All-Github-Emoji-Icons +window.emojify = function (match, $1) { + return AllGithubEmoji.indexOf($1) === -1 + ? match + : '' + $1 + '' +}