├── .babelrc ├── .gitignore ├── README.md ├── README_ZH-CN.md ├── docs ├── favicon.ico ├── index.html ├── logo.png ├── main.9a93404d7b68575f32de.js ├── main.9a93404d7b68575f32de.js.map └── sw.js ├── favicon.ico ├── img ├── favicon.ico ├── favicon.png └── logo.png ├── index.html ├── index.tpl ├── package.json ├── src ├── App.vue ├── components │ ├── inputer.vue │ ├── lineNumber.vue │ ├── navBar.vue │ ├── navBarItems │ │ ├── bold.vue │ │ ├── chrome.vue │ │ ├── code.vue │ │ ├── emoji.vue │ │ ├── fullscreen.vue │ │ ├── github.vue │ │ ├── headline.vue │ │ ├── image.vue │ │ ├── italic.vue │ │ ├── link.vue │ │ ├── list.vue │ │ ├── menu.vue │ │ ├── preview.vue │ │ ├── question.vue │ │ ├── quote.vue │ │ ├── strikethrough.vue │ │ ├── table.vue │ │ ├── tasks.vue │ │ ├── theme.vue │ │ └── underline.vue │ ├── outputer.vue │ └── sideMenu.vue ├── containers │ └── navBar.vue ├── emoji.js ├── emoji.json ├── full.json ├── main.js ├── markdownConf.js └── utils │ └── insertContent.js ├── static └── markdown.less ├── vuex ├── readme.js ├── readme_zh.js └── store.js ├── webpack.config.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }] 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | ![](http://oiwfsj4xe.bkt.clouddn.com/slogan.png) 5 | 6 | 7 | > :lollipop::lollipop::lollipop: **wow, Such a beautiful and powerful markdown editor** 8 | 9 | 10 | > :gem::gem::gem: **Download [Chrome extension](https://chrome.google.com/webstore/detail/silkdown/kojpddcdcddckmdnimmodeaejonfefee)** 11 | 12 | > [以中文查看](./README_ZH-CN.md) 13 | 14 | ## Features 15 | 16 | - Real-time HTML preview 17 | 18 | - Markdown Extra/GitHub Flavored Markdown support 19 | 20 | - Todo lists support 21 | 22 | - Unicode Emoji support :kissing_heart: :dart: 23 | 24 | - Smart layout 25 | 26 | - Offline editing 27 | 28 | - Save HTML file support 29 | 30 | - Save markdown file support 31 | 32 | - Theme day/night support 33 | 34 | - Fullscreen preview/edit support 35 | 36 | 37 | ## ToDos 38 | 39 | - [ ] Google Drive support 40 | 41 | - [ ] qiniu cloud Support 42 | 43 | ## Preview 44 | 45 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot1.png) 46 | 47 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot2.png) 48 | 49 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot3.png) 50 | 51 | ## Run and Build 52 | 53 | ```shell 54 | git clone https://github.com/huruji/SilkDown.git 55 | 56 | cd SilkDown & yarn 57 | 58 | yarn run dev 59 | 60 | // or 61 | 62 | yarn run build 63 | ``` 64 | 65 | ## How to contribute 66 | 67 | you can open [issues](https://github.com/huruji/SilkDown/issues/new) or make [pull requests](https://github.com/huruji/SilkDown/pulls), just enjoy! 68 | 69 | ## Contact 70 | - **:e-mail: E-mail**: huruji3@foxmail.com 71 | 72 | - **wechat** 73 | 74 | ![](http://oiwfsj4xe.bkt.clouddn.com/wechat.png) 75 | 76 | ## Thanks 77 | This project is based on [markcook](https://github.com/jrainlau/markcook),thanks for [jrainlau](https://github.com/jrainlau)'s work. 78 | 79 | ## License 80 | MIT -------------------------------------------------------------------------------- /README_ZH-CN.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | ![](http://oiwfsj4xe.bkt.clouddn.com/slogan.png) 5 | 6 | 7 | > :lollipop::lollipop::lollipop: **wow, Such a beautiful and powerful markdown editor** 8 | 9 | 10 | > :gem::gem::gem: **下载 [Chrome 插件](https://chrome.google.com/webstore/detail/silkdown/kojpddcdcddckmdnimmodeaejonfefee) [备用地址](http://oiwfsj4xe.bkt.clouddn.com/SilkDown.1.1.1.crx)** 11 | 12 | 13 | ## 特性 14 | 15 | - 实时预览 16 | 17 | - 支持 Gtihub markdown 特性 18 | 19 | - 支持 todo lists 20 | 21 | - 支持 unicode 表情:kissing_heart: :dart: 22 | 23 | - 优美的布局 24 | 25 | - 离线编辑 26 | 27 | - 支持保存为 HTML 文件 28 | 29 | - 支持保存为 markdown 文件 30 | 31 | - 支持白天/夜间两种主题 32 | 33 | - 支持全屏阅览/编辑 34 | 35 | 36 | ## ToDos 37 | 38 | - [ ] 支持 Google Drive 39 | 40 | - [ ] 支持七牛云 41 | 42 | ## 效果预览 43 | 44 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot1.png) 45 | 46 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot2.png) 47 | 48 | ![](http://oiwfsj4xe.bkt.clouddn.com/shoot3.png) 49 | 50 | ## Run and Build 51 | 52 | ```shell 53 | git clone https://github.com/huruji/SilkDown.git 54 | 55 | cd SilkDown & yarn 56 | 57 | yarn run dev 58 | 59 | // or 60 | 61 | yarn run build 62 | ``` 63 | 64 | ## How to contribute 65 | 66 | 欢迎你提出[issues](https://github.com/huruji/SilkDown/issues/new) 或者直接提[pull requests](https://github.com/huruji/SilkDown/pulls)。 67 | 68 | ## 联系我 69 | - **:e-mail: E-mail**: huruji3@foxmail.com 70 | 71 | - **微信** 72 | 73 | ![](http://oiwfsj4xe.bkt.clouddn.com/wechat.png) 74 | 75 | ## 感谢 76 | 这个项目是基于项目[markcook](https://github.com/jrainlau/markcook)开发的,感谢[jrainlau](https://github.com/jrainlau)所做的工作. 77 | 78 | ## License 79 | MIT -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huruji/SilkDown/8ff30345d2bc75519e8428592478a73e6d1778ab/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | SilkDown 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huruji/SilkDown/8ff30345d2bc75519e8428592478a73e6d1778ab/docs/logo.png -------------------------------------------------------------------------------- /docs/sw.js: -------------------------------------------------------------------------------- 1 | var __wpo = {"assets":{"main":["./logo.png?a89eef68f2e9882a51e235c65498ef4e","./main.9a93404d7b68575f32de.js","./","./favicon.ico","https://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css","https://cdn.bootcss.com/highlight.js/9.7.0/styles/atom-one-dark.min.css"],"additional":[],"optional":[]},"externals":["https://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css","https://cdn.bootcss.com/highlight.js/9.7.0/styles/atom-one-dark.min.css"],"hashesMap":{"1dd7ba86e7c46efae42ff589f91a4f98a032007f":"./logo.png?a89eef68f2e9882a51e235c65498ef4e","2977cbcf69711acf27da677b0ff433515ef1bc3c":"./main.9a93404d7b68575f32de.js","65f7c516bc0d93d866f5cf1728203e8683ed1a27":"./","2b9cc8d95c670e52b5eb65f19ea8d6653993ea2c":"./favicon.ico"},"strategy":"changed","responseStrategy":"cache-first","version":"2018-5-15 22:05:29","name":"webpack-offline","pluginVersion":"4.9.0","relativePaths":true}; 2 | 3 | !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=0)}([function(e,n,t){"use strict";function r(e,n){return caches.match(e,{cacheName:n}).then(function(t){return a()?t:c(t).then(function(t){return caches.open(n).then(function(n){return n.put(e,t)}).then(function(){return t})})}).catch(function(){})}function o(e,n){return e+(-1!==e.indexOf("?")?"&":"?")+"__uncache="+encodeURIComponent(n)}function i(e){return"navigate"===e.mode||e.headers.get("Upgrade-Insecure-Requests")||-1!==(e.headers.get("Accept")||"").indexOf("text/html")}function a(e){return!e||!e.redirected||!e.ok||"opaqueredirect"===e.type}function c(e){return a(e)?Promise.resolve(e):("body"in e?Promise.resolve(e.body):e.blob()).then(function(n){return new Response(n,{headers:e.headers,status:e.status})})}function u(e){return Object.keys(e).reduce(function(n,t){return n[t]=e[t],n},{})}function s(e,n){console.groupCollapsed("[SW]:",e),n.forEach(function(e){console.log("Asset:",e)}),console.groupEnd()}if(function(){var e=ExtendableEvent.prototype.waitUntil,n=FetchEvent.prototype.respondWith,t=new WeakMap;ExtendableEvent.prototype.waitUntil=function(n){var r=this,o=t.get(r);return o?void o.push(Promise.resolve(n)):(o=[Promise.resolve(n)],t.set(r,o),e.call(r,Promise.resolve().then(function e(){var n=o.length;return Promise.all(o.map(function(e){return e.catch(function(){})})).then(function(){return o.length!=n?e():(t.delete(r),Promise.all(o))})})))},FetchEvent.prototype.respondWith=function(e){return this.waitUntil(e),n.call(this,e)}}(),void 0===f)var f=!1;!function(e,n){function t(){if(!E.additional.length)return Promise.resolve();f&&console.log("[SW]:","Caching additional");var e=void 0;return e="changed"===W?l("additional"):a("additional"),e.catch(function(e){console.error("[SW]:","Cache section `additional` failed to load")})}function a(n){var t=E[n];return caches.open(A).then(function(n){return O(n,t,{bust:e.version,request:e.prefetchRequest})}).then(function(){s("Cached assets: "+n,t)}).catch(function(e){throw console.error(e),e})}function l(n){return d().then(function(t){if(!t)return a(n);var r=t[0],o=t[1],i=t[2],c=i.hashmap,u=i.version;if(!i.hashmap||u===e.version)return a(n);var f=Object.keys(c).map(function(e){return c[e]}),l=o.map(function(e){var n=new URL(e.url);return n.search="",n.hash="",n.toString()}),h=E[n],d=[],p=h.filter(function(e){return-1===l.indexOf(e)||-1===f.indexOf(e)});Object.keys(_).forEach(function(e){var n=_[e];if(-1!==h.indexOf(n)&&-1===p.indexOf(n)&&-1===d.indexOf(n)){var t=c[e];t&&-1!==l.indexOf(t)?d.push([t,n]):p.push(n)}}),s("Changed assets: "+n,p),s("Moved assets: "+n,d);var v=Promise.all(d.map(function(e){return r.match(e[0]).then(function(n){return[e[1],n]})}));return caches.open(A).then(function(n){var t=v.then(function(e){return Promise.all(e.map(function(e){return n.put(e[0],e[1])}))});return Promise.all([t,O(n,p,{bust:e.version,request:e.prefetchRequest})])})})}function h(){return caches.keys().then(function(e){var n=e.map(function(e){if(0===e.indexOf(M)&&0!==e.indexOf(A))return console.log("[SW]:","Delete cache:",e),caches.delete(e)});return Promise.all(n)})}function d(){return caches.keys().then(function(e){for(var n=e.length,t=void 0;n--&&(t=e[n],0!==t.indexOf(M)););if(t){var r=void 0;return caches.open(t).then(function(e){return r=e,e.match(new URL(T,location).toString())}).then(function(e){if(e)return Promise.all([r,r.keys(),e.json()])})}})}function p(){return caches.open(A).then(function(n){var t=new Response(JSON.stringify({version:e.version,hashmap:_}));return n.put(new URL(T,location).toString(),t)})}function v(e,n,t){return m(e),r(t,A).then(function(r){return r?(f&&console.log("[SW]:","URL ["+t+"]("+n+") from cache"),r):fetch(e.request).then(function(r){return r.ok?(f&&console.log("[SW]:","URL ["+n+"] from network"),t===n&&function(){var t=r.clone(),o=caches.open(A).then(function(e){return e.put(n,t)}).then(function(){console.log("[SW]:","Cache asset: "+n)});e.waitUntil(o)}(),r):(f&&console.log("[SW]:","URL ["+n+"] wrong response: ["+r.status+"] "+r.type),r)})})}function g(e,n,t){return P(e).then(function(e){if(e.ok)return f&&console.log("[SW]:","URL ["+n+"] from network"),e;throw new Error("Response is not ok")}).catch(function(){return f&&console.log("[SW]:","URL ["+n+"] from cache if possible"),r(t,A)})}function m(e){if(L&&"function"==typeof L.map&&e.preloadResponse&&"navigate"===e.request.mode){var n=L.map(new URL(e.request.url),e.request);n&&w(n,e)}}function w(e,n){var t=new URL(e,location),r=n.preloadResponse;J.set(r,{url:t,response:r});var o=function(){return J.has(r)},i=r.then(function(e){if(e&&o()){var n=e.clone();return caches.open(I).then(function(e){if(o())return e.put(t,n).then(function(){if(!o())return caches.open(I).then(function(e){return e.delete(t)})})})}});n.waitUntil(i)}function y(e){if(J){var n=void 0,t=void 0;return J.forEach(function(r,o){r.url.href===e.href&&(n=r.response,t=o)}),n?(J.delete(t),n):void 0}}function R(e){var n=new URL(e.request.url);if(self.registration.navigationPreload&&L&&L.test&&L.test(n,e.request)){var t=y(n),o=e.request;return t?(e.waitUntil(caches.open(I).then(function(e){return e.delete(o)})),t):r(o,I).then(function(n){return n&&e.waitUntil(caches.open(I).then(function(e){return e.delete(o)})),n||fetch(e.request)})}}function x(e){return e.catch(function(){}).then(function(e){var n=e&&e.ok,t=e&&"opaqueredirect"===e.type;return n||t&&!G?e:(f&&console.log("[SW]:","Loading navigation fallback ["+D+"] from cache"),r(D,A))})}function O(e,n,t){var r=!1!==t.allowLoaders,i=t&&t.bust,a=t.request||{credentials:"omit",mode:"cors"};return Promise.all(n.map(function(e){return i&&(e=o(e,i)),fetch(e,a).then(c)})).then(function(o){if(o.some(function(e){return!e.ok}))return Promise.reject(new Error("Wrong response status"));var i=[],a=o.map(function(t,o){return r&&i.push(U(n[o],t)),e.put(n[o],t)});return i.length?function(){var r=u(t);r.allowLoaders=!1;var o=a;a=Promise.all(i).then(function(t){var i=[].concat.apply([],t);return n.length&&(o=o.concat(O(e,i,r))),Promise.all(o)})}():a=Promise.all(a),a})}function U(e,n){var t=Object.keys(j).map(function(t){if(-1!==j[t].indexOf(e)&&b[t])return b[t](n.clone())}).filter(function(e){return!!e});return Promise.all(t).then(function(e){return[].concat.apply([],e)})}function k(e){var n=e.url,t=new URL(n),r=void 0;r=i(e)?"navigate":t.origin===location.origin?"same-origin":"cross-origin";for(var o=0;o 2 | 3 | 4 | 5 | 6 | SilkDown 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /index.tpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | SilkDown 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SilkDown", 3 | "description": "", 4 | "author": "", 5 | "scripts": { 6 | "dev": "webpack-dev-server --inline --hot", 7 | "build": "cross-env NODE_ENV=production webpack --progress --hide-modules", 8 | "build:watch": "cross-env NODE_ENV=production webpack --watch", 9 | "start": "http-server ./docs -c no-cache" 10 | }, 11 | "dependencies": { 12 | "highlight.js": "^9.12.0", 13 | "markdown-it": "^8.4.1", 14 | "markdown-it-checkbox": "^1.1.0", 15 | "markdown-it-emoji": "^1.4.0", 16 | "marked": "^0.3.6", 17 | "twemoji": "^2.5.1", 18 | "vue": "^2.4.2" 19 | }, 20 | "devDependencies": { 21 | "babel-core": "^6.26.0", 22 | "babel-loader": "^7.1.1", 23 | "babel-preset-env": "^1.6.0", 24 | "clean-webpack-plugin": "^0.1.16", 25 | "copy-webpack-plugin": "^4.0.1", 26 | "cross-env": "^5.0.5", 27 | "css-loader": "^0.28.4", 28 | "file-loader": "^0.11.2", 29 | "html-webpack-plugin": "^2.30.1", 30 | "less": "^2.7.2", 31 | "less-loader": "^4.0.5", 32 | "offline-plugin": "^4.8.3", 33 | "vue-loader": "^12.1.0", 34 | "vue-template-compiler": "^2.4.2", 35 | "vuex": "^2.3.1", 36 | "webpack": "^3.5.5", 37 | "webpack-dev-server": "^2.7.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 13 | 42 | 43 | 126 | -------------------------------------------------------------------------------- /src/components/inputer.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 58 | 59 | -------------------------------------------------------------------------------- /src/components/lineNumber.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 23 | 24 | -------------------------------------------------------------------------------- /src/components/navBar.vue: -------------------------------------------------------------------------------- 1 | 87 | 88 | 194 | 195 | -------------------------------------------------------------------------------- /src/components/navBarItems/bold.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/chrome.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/code.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | -------------------------------------------------------------------------------- /src/components/navBarItems/emoji.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 101 | 102 | -------------------------------------------------------------------------------- /src/components/navBarItems/fullscreen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/github.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/headline.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/image.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/italic.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/link.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/list.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/menu.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/preview.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/question.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/quote.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/strikethrough.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/table.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/tasks.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/theme.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/navBarItems/underline.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/outputer.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/sideMenu.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 98 | 99 | -------------------------------------------------------------------------------- /src/containers/navBar.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 80 | 81 | -------------------------------------------------------------------------------- /src/emoji.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | people:[ 3 | ":smile:", 4 | ":laughing:", 5 | ":blush:", 6 | ":smiley:", 7 | ":relaxed:", 8 | ":smirk:", 9 | ":heart_eyes:", 10 | ":kissing_heart:", 11 | ":kissing_closed_eyes:", 12 | ":flushed:", 13 | ":relieved:", 14 | ":grin:", 15 | ":wink:", 16 | ":stuck_out_tongue_winking_eye:", 17 | ":stuck_out_tongue_closed_eyes:", 18 | ":grinning:", 19 | ":kissing:", 20 | ":kissing_smiling_eyes:", 21 | ":stuck_out_tongue:", 22 | ":sleeping:", 23 | ":worried:", 24 | ":frowning:", 25 | ":anguished:", 26 | ":open_mouth:", 27 | ":grimacing:", 28 | ":confused:", 29 | ":hushed:", 30 | ":expressionless:", 31 | ":unamused:", 32 | ":sweat_smile:", 33 | ":sweat:", 34 | ":disappointed_relieved:", 35 | ":weary:", 36 | ":confounded:", 37 | ":cold_sweat:", 38 | ":persevere:", 39 | ":cry:", 40 | ":sob:", 41 | ":joy:", 42 | ":astonished:", 43 | ":scream:", 44 | ":tired_face:", 45 | ":angry:", 46 | ":rage:", 47 | ":triumph:", 48 | ":sleepy:", 49 | ":yum:", 50 | ":mask:", 51 | ":sunglasses:", 52 | ":dizzy_face:", 53 | ":imp:", 54 | ":neutral_face:", 55 | ":no_mouth:", 56 | ":innocent:", 57 | ":heart:", 58 | ":broken_heart:", 59 | ":heartbeat:", 60 | ":heartpulse:", 61 | ":two_hearts:", 62 | ":revolving_hearts:", 63 | ":cupid:", 64 | ":sparkling_heart:", 65 | ":sparkles:", 66 | ":dizzy:", 67 | ":exclamation:", 68 | ":question:", 69 | ":zzz:", 70 | ":dash:", 71 | ":sweat_drops:", 72 | ":notes:", 73 | ":musical_note:", 74 | ":fire:", 75 | ":+1:", 76 | ":-1:", 77 | ":ok_hand:", 78 | ":fist_raised:", 79 | ":v:", 80 | ":wave:", 81 | ":hand:", 82 | ":open_hands:", 83 | ":point_up:", 84 | ":point_down:", 85 | ":point_left:", 86 | ":point_right:", 87 | ":raised_hands:", 88 | ":pray:", 89 | ":point_up_2:", 90 | ":clap:", 91 | ":muscle:", 92 | ":running_man:", 93 | ":couple:", 94 | ":family_man_woman_boy:", 95 | ":couple_with_heart_woman_man:", 96 | ":smiley_cat:", 97 | ":smile_cat:", 98 | ":heart_eyes_cat:", 99 | ":kissing_cat:", 100 | ":smirk_cat:", 101 | ":scream_cat:", 102 | ":crying_cat_face:", 103 | ":joy_cat:", 104 | ":pouting_cat:", 105 | ":see_no_evil:", 106 | ":hear_no_evil:", 107 | ":speak_no_evil:", 108 | ":feet:", 109 | ":lips:", 110 | ":kiss:", 111 | ], 112 | nature:[ 113 | ":sunny:", 114 | ":umbrella:", 115 | ":cloud:", 116 | ":snowflake:", 117 | ":snowman:", 118 | ":zap:", 119 | ":cyclone:", 120 | ":foggy:", 121 | ":ocean:", 122 | ":sun_with_face:", 123 | ":cat:", 124 | ":dog:", 125 | ":mouse:", 126 | ":hamster:", 127 | ":rabbit:", 128 | ":wolf:", 129 | ":frog:", 130 | ":tiger:", 131 | ":koala:", 132 | ":bear:", 133 | ":pig:", 134 | ":pig_nose:", 135 | ":cow:", 136 | ":boar:", 137 | ":monkey_face:", 138 | ":monkey:", 139 | ":horse:", 140 | ":racehorse:", 141 | ":camel:", 142 | ":sheep:", 143 | ":elephant:", 144 | ":panda_face:", 145 | ":snake:", 146 | ":bird:", 147 | ":baby_chick:", 148 | ":hatching_chick:", 149 | ":chicken:", 150 | ":penguin:", 151 | ":turtle:", 152 | ":bug:", 153 | ":bee:", 154 | ":ant:", 155 | ":beetle:", 156 | ":snail:", 157 | ":octopus:", 158 | ":tropical_fish:", 159 | ":fish:", 160 | ":whale:", 161 | ":whale2:", 162 | ":dolphin:", 163 | ":cow2:", 164 | ":ram:", 165 | ":rat:", 166 | ":water_buffalo:", 167 | ":tiger2:", 168 | ":dragon:", 169 | ":goat:", 170 | ":rooster:", 171 | ":ox:", 172 | ":dragon_face:", 173 | ":blowfish:" 174 | ], 175 | object: [ 176 | ":bamboo:", 177 | ":gift_heart:", 178 | ":dolls:", 179 | ":school_satchel:", 180 | ":mortar_board:", 181 | ":flags:", 182 | ":fireworks:", 183 | ":wind_chime:", 184 | ":rice_scene:", 185 | ":ghost:", 186 | ":christmas_tree:", 187 | ":gift:", 188 | ":bell:", 189 | ":no_bell:", 190 | ":tada:", 191 | ":confetti_ball:", 192 | ":balloon:", 193 | ":crystal_ball:", 194 | ":cd:", 195 | ":dvd:", 196 | ":floppy_disk:", 197 | ":camera:", 198 | ":video_camera:", 199 | ":movie_camera:", 200 | ":computer:", 201 | ":tv:", 202 | ":iphone:", 203 | ":phone:", 204 | ":telephone_receiver:", 205 | ":pager:", 206 | ":fax:", 207 | ":minidisc:", 208 | ":vhs:", 209 | ":sound:", 210 | ":speaker:", 211 | ":mute:", 212 | ":loudspeaker:", 213 | ":hourglass_flowing_sand:", 214 | ":alarm_clock:", 215 | ":watch:", 216 | ":radio:", 217 | ":satellite:", 218 | ":loop:", 219 | ":mag:", 220 | ":mag_right:", 221 | ":unlock:", 222 | ":lock:", 223 | ":lock_with_ink_pen:", 224 | ":closed_lock_with_key:", 225 | ":key:", 226 | ":bulb:", 227 | ":flashlight:", 228 | ":high_brightness:", 229 | ":low_brightness:", 230 | ":electric_plug:", 231 | ":battery:", 232 | ":calling:", 233 | ":email:", 234 | ":mailbox:", 235 | ":postbox:", 236 | ":bath:", 237 | ":bathtub:", 238 | ":shower:", 239 | ":toilet:", 240 | ":wrench:", 241 | ":nut_and_bolt:", 242 | ":hammer:", 243 | ":seat:", 244 | ":moneybag:", 245 | ":yen:", 246 | ":dollar:", 247 | ":pound:", 248 | ":euro:", 249 | ":credit_card:", 250 | ":money_with_wings:", 251 | ":inbox_tray:", 252 | ":outbox_tray:", 253 | ":incoming_envelope:", 254 | ":postal_horn:", 255 | ":mailbox_closed:", 256 | ":mailbox_with_mail:", 257 | ":door:", 258 | ":smoking:", 259 | ":bomb:", 260 | ":gun:", 261 | ":hocho:", 262 | ":pill:", 263 | ":syringe:", 264 | ":page_facing_up:", 265 | ":page_with_curl:", 266 | ":bookmark_tabs:", 267 | ":bar_chart:", 268 | ":chart_with_upwards_trend:", 269 | ":chart_with_downwards_trend:", 270 | ":scroll:", 271 | ":scroll:", 272 | ":clipboard:", 273 | ":calendar:", 274 | ":card_index:", 275 | ":file_folder:", 276 | ":open_file_folder:", 277 | ":scissors:", 278 | ":pushpin:", 279 | ":paperclip:", 280 | ":black_nib:", 281 | ":pencil2:", 282 | ":straight_ruler:", 283 | ":triangular_ruler:", 284 | ":closed_book:", 285 | ":green_book:", 286 | ":blue_book:", 287 | ":orange_book:", 288 | ":notebook:", 289 | ":notebook_with_decorative_cover:", 290 | ":ledger:", 291 | ":books:", 292 | ":bookmark:", 293 | ":name_badge:", 294 | ":microscope:", 295 | ":telescope:", 296 | ":newspaper:", 297 | ":football:", 298 | ":basketball:", 299 | ":soccer:", 300 | ":baseball:", 301 | ":tennis:", 302 | ":8ball:", 303 | ":rugby_football:", 304 | ":bowling:", 305 | ":golf:", 306 | ":mountain_biking_man:", 307 | ":biking_man:", 308 | ":horse_racing:", 309 | ":snowboarder:", 310 | ":swimming_man:", 311 | ":surfing_man:", 312 | ":ski:", 313 | ":spades:", 314 | ":hearts:", 315 | ":clubs:", 316 | ":diamonds:", 317 | ":gem:", 318 | ":ring:", 319 | ":trophy:", 320 | ":musical_score:", 321 | ":violin:", 322 | ":space_invader:", 323 | ":video_game:", 324 | ":black_joker:", 325 | ":flower_playing_cards:", 326 | ":game_die:", 327 | ":dart:", 328 | ":clapper:", 329 | ":memo:", 330 | ":art:", 331 | ":microphone:", 332 | ":headphones:", 333 | ":trumpet:", 334 | ":saxophone:", 335 | ":guitar:", 336 | ":mans_shoe:", 337 | ":sandal:", 338 | ":high_heel:", 339 | ":lipstick:", 340 | ":boot:", 341 | ":shirt:", 342 | ":necktie:", 343 | ":womans_clothes:", 344 | ":dress:", 345 | ":running_shirt_with_sash:", 346 | ":jeans:", 347 | ":bikini:", 348 | ":bikini:", 349 | ":ribbon:", 350 | ":tophat:", 351 | ":crown:", 352 | ":womans_hat:", 353 | ":briefcase:", 354 | ":handbag:", 355 | ":pouch:", 356 | ":purse:", 357 | ":eyeglasses:", 358 | ":fishing_pole_and_fish:", 359 | ":coffee:", 360 | ":tea:", 361 | ":sake:", 362 | ":baby_bottle:", 363 | ":beer:", 364 | ":dango:", 365 | ":birthday:", 366 | ":cookie:", 367 | ":candy:", 368 | ":lollipop:" 369 | ], 370 | place: [ 371 | ":house:", 372 | ":house_with_garden:", 373 | ":school:", 374 | ":office:", 375 | ":post_office:", 376 | ":hospital:", 377 | ":bank:", 378 | ":convenience_store:", 379 | ":love_hotel:", 380 | ":hotel:", 381 | ":wedding:", 382 | ":church:", 383 | ":department_store:", 384 | ":european_post_office:", 385 | ":city_sunrise:", 386 | ":city_sunset:", 387 | ":japanese_castle:", 388 | ":european_castle:", 389 | ":tent:", 390 | ":factory:", 391 | ":tokyo_tower:", 392 | ":japan:", 393 | ":mount_fuji:", 394 | ":sunrise_over_mountains:", 395 | ":sunrise:", 396 | ":stars:", 397 | ":statue_of_liberty:", 398 | ":bridge_at_night:", 399 | ":carousel_horse:", 400 | ":rainbow:", 401 | ":ferris_wheel:", 402 | ":fountain:", 403 | ":roller_coaster:", 404 | ":ship:", 405 | ":speedboat:", 406 | ":boat:", 407 | ":rowing_man:", 408 | ":anchor:", 409 | ":rocket:", 410 | ":airplane:", 411 | ":helicopter:", 412 | ":steam_locomotive:", 413 | ":tram:", 414 | ":mountain_railway:", 415 | ":bike:", 416 | ":aerial_tramway:", 417 | ":suspension_railway:", 418 | ":mountain_cableway:", 419 | ":tractor:", 420 | ":blue_car:", 421 | ":oncoming_automobile:", 422 | ":car:", 423 | ":taxi:", 424 | ":oncoming_taxi:", 425 | ":articulated_lorry:", 426 | ":bus:", 427 | ":oncoming_bus:", 428 | ":rotating_light:", 429 | ":police_car:", 430 | ":oncoming_police_car:", 431 | ":fire_engine:", 432 | ":ambulance:", 433 | ":minibus:", 434 | ":truck:", 435 | ":train:", 436 | ":station:", 437 | ":train2:", 438 | ":bullettrain_front:", 439 | ":bullettrain_side:", 440 | ":light_rail:", 441 | ":monorail:", 442 | ":railway_car:", 443 | ":trolleybus:", 444 | ":ticket:", 445 | ":fuelpump:", 446 | ":vertical_traffic_light:", 447 | ":traffic_light:", 448 | ":warning:", 449 | ":construction:", 450 | ":beginner:", 451 | ":atm:", 452 | ":slot_machine:", 453 | ":busstop:", 454 | ":barber:", 455 | ":hotsprings:", 456 | ":checkered_flag:", 457 | ":crossed_flags:", 458 | ":performing_arts:", 459 | ":round_pushpin:", 460 | ":triangular_flag_on_post:", 461 | ":jp:", 462 | ":kr:", 463 | ":cn:", 464 | ":us:", 465 | ":fr:", 466 | ":es:", 467 | ":it:", 468 | ":ru:", 469 | ":gb:", 470 | ":de:" 471 | ], 472 | symbol: [ 473 | ":1234:", 474 | ":symbols:", 475 | ":arrow_backward:", 476 | ":arrow_down:", 477 | ":arrow_forward:", 478 | ":arrow_left:", 479 | ":abcd:", 480 | ":vs:", 481 | ":chart:", 482 | ":link:", 483 | ":heart_decoration:", 484 | ":vibration_mode:", 485 | ":100:" 486 | ] 487 | } -------------------------------------------------------------------------------- /src/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | // people 3 | ":smile:": "\u1F601" 4 | } -------------------------------------------------------------------------------- /src/full.json: -------------------------------------------------------------------------------- 1 | { 2 | "100": "💯", 3 | "1234": "🔢", 4 | "grinning": "😀", 5 | "smiley": "😃", 6 | "smile": "😄", 7 | "grin": "😁", 8 | "laughing": "😆", 9 | "satisfied": "😆", 10 | "sweat_smile": "😅", 11 | "joy": "😂", 12 | "rofl": "🤣", 13 | "relaxed": "☺️", 14 | "blush": "😊", 15 | "innocent": "😇", 16 | "slightly_smiling_face": "🙂", 17 | "upside_down_face": "🙃", 18 | "wink": "😉", 19 | "relieved": "😌", 20 | "heart_eyes": "😍", 21 | "kissing_heart": "😘", 22 | "kissing": "😗", 23 | "kissing_smiling_eyes": "😙", 24 | "kissing_closed_eyes": "😚", 25 | "yum": "😋", 26 | "stuck_out_tongue_winking_eye": "😜", 27 | "stuck_out_tongue_closed_eyes": "😝", 28 | "stuck_out_tongue": "😛", 29 | "money_mouth_face": "🤑", 30 | "hugs": "🤗", 31 | "nerd_face": "🤓", 32 | "sunglasses": "😎", 33 | "clown_face": "🤡", 34 | "cowboy_hat_face": "🤠", 35 | "smirk": "😏", 36 | "unamused": "😒", 37 | "disappointed": "😞", 38 | "pensive": "😔", 39 | "worried": "😟", 40 | "confused": "😕", 41 | "slightly_frowning_face": "🙁", 42 | "frowning_face": "☹️", 43 | "persevere": "😣", 44 | "confounded": "😖", 45 | "tired_face": "😫", 46 | "weary": "😩", 47 | "triumph": "😤", 48 | "angry": "😠", 49 | "rage": "😡", 50 | "pout": "😡", 51 | "no_mouth": "😶", 52 | "neutral_face": "😐", 53 | "expressionless": "😑", 54 | "hushed": "😯", 55 | "frowning": "😦", 56 | "anguished": "😧", 57 | "open_mouth": "😮", 58 | "astonished": "😲", 59 | "dizzy_face": "😵", 60 | "flushed": "😳", 61 | "scream": "😱", 62 | "fearful": "😨", 63 | "cold_sweat": "😰", 64 | "cry": "😢", 65 | "disappointed_relieved": "😥", 66 | "drooling_face": "🤤", 67 | "sob": "😭", 68 | "sweat": "😓", 69 | "sleepy": "😪", 70 | "sleeping": "😴", 71 | "roll_eyes": "🙄", 72 | "thinking": "🤔", 73 | "lying_face": "🤥", 74 | "grimacing": "😬", 75 | "zipper_mouth_face": "🤐", 76 | "nauseated_face": "🤢", 77 | "sneezing_face": "🤧", 78 | "mask": "😷", 79 | "face_with_thermometer": "🤒", 80 | "face_with_head_bandage": "🤕", 81 | "smiling_imp": "😈", 82 | "imp": "👿", 83 | "japanese_ogre": "👹", 84 | "japanese_goblin": "👺", 85 | "hankey": "💩", 86 | "poop": "💩", 87 | "shit": "💩", 88 | "ghost": "👻", 89 | "skull": "💀", 90 | "skull_and_crossbones": "☠️", 91 | "alien": "👽", 92 | "space_invader": "👾", 93 | "robot": "🤖", 94 | "jack_o_lantern": "🎃", 95 | "smiley_cat": "😺", 96 | "smile_cat": "😸", 97 | "joy_cat": "😹", 98 | "heart_eyes_cat": "😻", 99 | "smirk_cat": "😼", 100 | "kissing_cat": "😽", 101 | "scream_cat": "🙀", 102 | "crying_cat_face": "😿", 103 | "pouting_cat": "😾", 104 | "open_hands": "👐", 105 | "raised_hands": "🙌", 106 | "clap": "👏", 107 | "pray": "🙏", 108 | "handshake": "🤝", 109 | "+1": "👍", 110 | "thumbsup": "👍", 111 | "-1": "👎", 112 | "thumbsdown": "👎", 113 | "fist_oncoming": "👊", 114 | "facepunch": "👊", 115 | "punch": "👊", 116 | "fist_raised": "✊", 117 | "fist": "✊", 118 | "fist_left": "🤛", 119 | "fist_right": "🤜", 120 | "crossed_fingers": "🤞", 121 | "v": "✌️", 122 | "metal": "🤘", 123 | "ok_hand": "👌", 124 | "point_left": "👈", 125 | "point_right": "👉", 126 | "point_up_2": "👆", 127 | "point_down": "👇", 128 | "point_up": "☝️", 129 | "hand": "✋", 130 | "raised_hand": "✋", 131 | "raised_back_of_hand": "🤚", 132 | "raised_hand_with_fingers_splayed": "🖐", 133 | "vulcan_salute": "🖖", 134 | "wave": "👋", 135 | "call_me_hand": "🤙", 136 | "muscle": "💪", 137 | "middle_finger": "🖕", 138 | "fu": "🖕", 139 | "writing_hand": "✍️", 140 | "selfie": "🤳", 141 | "nail_care": "💅", 142 | "ring": "💍", 143 | "lipstick": "💄", 144 | "kiss": "💋", 145 | "lips": "👄", 146 | "tongue": "👅", 147 | "ear": "👂", 148 | "nose": "👃", 149 | "footprints": "👣", 150 | "eye": "👁", 151 | "eyes": "👀", 152 | "speaking_head": "🗣", 153 | "bust_in_silhouette": "👤", 154 | "busts_in_silhouette": "👥", 155 | "baby": "👶", 156 | "boy": "👦", 157 | "girl": "👧", 158 | "man": "👨", 159 | "woman": "👩", 160 | "blonde_woman": "👱‍♀", 161 | "blonde_man": "👱", 162 | "person_with_blond_hair": "👱", 163 | "older_man": "👴", 164 | "older_woman": "👵", 165 | "man_with_gua_pi_mao": "👲", 166 | "woman_with_turban": "👳‍♀", 167 | "man_with_turban": "👳", 168 | "policewoman": "👮‍♀", 169 | "policeman": "👮", 170 | "cop": "👮", 171 | "construction_worker_woman": "👷‍♀", 172 | "construction_worker_man": "👷", 173 | "construction_worker": "👷", 174 | "guardswoman": "💂‍♀", 175 | "guardsman": "💂", 176 | "female_detective": "🕵️‍♀️", 177 | "male_detective": "🕵", 178 | "detective": "🕵", 179 | "woman_health_worker": "👩‍⚕", 180 | "man_health_worker": "👨‍⚕", 181 | "woman_farmer": "👩‍🌾", 182 | "man_farmer": "👨‍🌾", 183 | "woman_cook": "👩‍🍳", 184 | "man_cook": "👨‍🍳", 185 | "woman_student": "👩‍🎓", 186 | "man_student": "👨‍🎓", 187 | "woman_singer": "👩‍🎤", 188 | "man_singer": "👨‍🎤", 189 | "woman_teacher": "👩‍🏫", 190 | "man_teacher": "👨‍🏫", 191 | "woman_factory_worker": "👩‍🏭", 192 | "man_factory_worker": "👨‍🏭", 193 | "woman_technologist": "👩‍💻", 194 | "man_technologist": "👨‍💻", 195 | "woman_office_worker": "👩‍💼", 196 | "man_office_worker": "👨‍💼", 197 | "woman_mechanic": "👩‍🔧", 198 | "man_mechanic": "👨‍🔧", 199 | "woman_scientist": "👩‍🔬", 200 | "man_scientist": "👨‍🔬", 201 | "woman_artist": "👩‍🎨", 202 | "man_artist": "👨‍🎨", 203 | "woman_firefighter": "👩‍🚒", 204 | "man_firefighter": "👨‍🚒", 205 | "woman_pilot": "👩‍✈", 206 | "man_pilot": "👨‍✈", 207 | "woman_astronaut": "👩‍🚀", 208 | "man_astronaut": "👨‍🚀", 209 | "woman_judge": "👩‍⚖", 210 | "man_judge": "👨‍⚖", 211 | "mrs_claus": "🤶", 212 | "santa": "🎅", 213 | "princess": "👸", 214 | "prince": "🤴", 215 | "bride_with_veil": "👰", 216 | "man_in_tuxedo": "🤵", 217 | "angel": "👼", 218 | "pregnant_woman": "🤰", 219 | "bowing_woman": "🙇‍♀", 220 | "bowing_man": "🙇", 221 | "bow": "🙇", 222 | "tipping_hand_woman": "💁", 223 | "information_desk_person": "💁", 224 | "sassy_woman": "💁", 225 | "tipping_hand_man": "💁‍♂", 226 | "sassy_man": "💁‍♂", 227 | "no_good_woman": "🙅", 228 | "no_good": "🙅", 229 | "ng_woman": "🙅", 230 | "no_good_man": "🙅‍♂", 231 | "ng_man": "🙅‍♂", 232 | "ok_woman": "🙆", 233 | "ok_man": "🙆‍♂", 234 | "raising_hand_woman": "🙋", 235 | "raising_hand": "🙋", 236 | "raising_hand_man": "🙋‍♂", 237 | "woman_facepalming": "🤦‍♀", 238 | "man_facepalming": "🤦‍♂", 239 | "woman_shrugging": "🤷‍♀", 240 | "man_shrugging": "🤷‍♂", 241 | "pouting_woman": "🙎", 242 | "person_with_pouting_face": "🙎", 243 | "pouting_man": "🙎‍♂", 244 | "frowning_woman": "🙍", 245 | "person_frowning": "🙍", 246 | "frowning_man": "🙍‍♂", 247 | "haircut_woman": "💇", 248 | "haircut": "💇", 249 | "haircut_man": "💇‍♂", 250 | "massage_woman": "💆", 251 | "massage": "💆", 252 | "massage_man": "💆‍♂", 253 | "business_suit_levitating": "🕴", 254 | "dancer": "💃", 255 | "man_dancing": "🕺", 256 | "dancing_women": "👯", 257 | "dancers": "👯", 258 | "dancing_men": "👯‍♂", 259 | "walking_woman": "🚶‍♀", 260 | "walking_man": "🚶", 261 | "walking": "🚶", 262 | "running_woman": "🏃‍♀", 263 | "running_man": "🏃", 264 | "runner": "🏃", 265 | "running": "🏃", 266 | "couple": "👫", 267 | "two_women_holding_hands": "👭", 268 | "two_men_holding_hands": "👬", 269 | "couple_with_heart_woman_man": "💑", 270 | "couple_with_heart": "💑", 271 | "couple_with_heart_woman_woman": "👩‍❤️‍👩", 272 | "couple_with_heart_man_man": "👨‍❤️‍👨", 273 | "couplekiss_man_woman": "💏", 274 | "couplekiss_woman_woman": "👩‍❤️‍💋‍👩", 275 | "couplekiss_man_man": "👨‍❤️‍💋‍👨", 276 | "family_man_woman_boy": "👪", 277 | "family": "👪", 278 | "family_man_woman_girl": "👨‍👩‍👧", 279 | "family_man_woman_girl_boy": "👨‍👩‍👧‍👦", 280 | "family_man_woman_boy_boy": "👨‍👩‍👦‍👦", 281 | "family_man_woman_girl_girl": "👨‍👩‍👧‍👧", 282 | "family_woman_woman_boy": "👩‍👩‍👦", 283 | "family_woman_woman_girl": "👩‍👩‍👧", 284 | "family_woman_woman_girl_boy": "👩‍👩‍👧‍👦", 285 | "family_woman_woman_boy_boy": "👩‍👩‍👦‍👦", 286 | "family_woman_woman_girl_girl": "👩‍👩‍👧‍👧", 287 | "family_man_man_boy": "👨‍👨‍👦", 288 | "family_man_man_girl": "👨‍👨‍👧", 289 | "family_man_man_girl_boy": "👨‍👨‍👧‍👦", 290 | "family_man_man_boy_boy": "👨‍👨‍👦‍👦", 291 | "family_man_man_girl_girl": "👨‍👨‍👧‍👧", 292 | "family_woman_boy": "👩‍👦", 293 | "family_woman_girl": "👩‍👧", 294 | "family_woman_girl_boy": "👩‍👧‍👦", 295 | "family_woman_boy_boy": "👩‍👦‍👦", 296 | "family_woman_girl_girl": "👩‍👧‍👧", 297 | "family_man_boy": "👨‍👦", 298 | "family_man_girl": "👨‍👧", 299 | "family_man_girl_boy": "👨‍👧‍👦", 300 | "family_man_boy_boy": "👨‍👦‍👦", 301 | "family_man_girl_girl": "👨‍👧‍👧", 302 | "womans_clothes": "👚", 303 | "shirt": "👕", 304 | "tshirt": "👕", 305 | "jeans": "👖", 306 | "necktie": "👔", 307 | "dress": "👗", 308 | "bikini": "👙", 309 | "kimono": "👘", 310 | "high_heel": "👠", 311 | "sandal": "👡", 312 | "boot": "👢", 313 | "mans_shoe": "👞", 314 | "shoe": "👞", 315 | "athletic_shoe": "👟", 316 | "womans_hat": "👒", 317 | "tophat": "🎩", 318 | "mortar_board": "🎓", 319 | "crown": "👑", 320 | "rescue_worker_helmet": "⛑", 321 | "school_satchel": "🎒", 322 | "pouch": "👝", 323 | "purse": "👛", 324 | "handbag": "👜", 325 | "briefcase": "💼", 326 | "eyeglasses": "👓", 327 | "dark_sunglasses": "🕶", 328 | "closed_umbrella": "🌂", 329 | "open_umbrella": "☂️", 330 | "dog": "🐶", 331 | "cat": "🐱", 332 | "mouse": "🐭", 333 | "hamster": "🐹", 334 | "rabbit": "🐰", 335 | "fox_face": "🦊", 336 | "bear": "🐻", 337 | "panda_face": "🐼", 338 | "koala": "🐨", 339 | "tiger": "🐯", 340 | "lion": "🦁", 341 | "cow": "🐮", 342 | "pig": "🐷", 343 | "pig_nose": "🐽", 344 | "frog": "🐸", 345 | "monkey_face": "🐵", 346 | "see_no_evil": "🙈", 347 | "hear_no_evil": "🙉", 348 | "speak_no_evil": "🙊", 349 | "monkey": "🐒", 350 | "chicken": "🐔", 351 | "penguin": "🐧", 352 | "bird": "🐦", 353 | "baby_chick": "🐤", 354 | "hatching_chick": "🐣", 355 | "hatched_chick": "🐥", 356 | "duck": "🦆", 357 | "eagle": "🦅", 358 | "owl": "🦉", 359 | "bat": "🦇", 360 | "wolf": "🐺", 361 | "boar": "🐗", 362 | "horse": "🐴", 363 | "unicorn": "🦄", 364 | "bee": "🐝", 365 | "honeybee": "🐝", 366 | "bug": "🐛", 367 | "butterfly": "🦋", 368 | "snail": "🐌", 369 | "shell": "🐚", 370 | "beetle": "🐞", 371 | "ant": "🐜", 372 | "spider": "🕷", 373 | "spider_web": "🕸", 374 | "turtle": "🐢", 375 | "snake": "🐍", 376 | "lizard": "🦎", 377 | "scorpion": "🦂", 378 | "crab": "🦀", 379 | "squid": "🦑", 380 | "octopus": "🐙", 381 | "shrimp": "🦐", 382 | "tropical_fish": "🐠", 383 | "fish": "🐟", 384 | "blowfish": "🐡", 385 | "dolphin": "🐬", 386 | "flipper": "🐬", 387 | "shark": "🦈", 388 | "whale": "🐳", 389 | "whale2": "🐋", 390 | "crocodile": "🐊", 391 | "leopard": "🐆", 392 | "tiger2": "🐅", 393 | "water_buffalo": "🐃", 394 | "ox": "🐂", 395 | "cow2": "🐄", 396 | "deer": "🦌", 397 | "dromedary_camel": "🐪", 398 | "camel": "🐫", 399 | "elephant": "🐘", 400 | "rhinoceros": "🦏", 401 | "gorilla": "🦍", 402 | "racehorse": "🐎", 403 | "pig2": "🐖", 404 | "goat": "🐐", 405 | "ram": "🐏", 406 | "sheep": "🐑", 407 | "dog2": "🐕", 408 | "poodle": "🐩", 409 | "cat2": "🐈", 410 | "rooster": "🐓", 411 | "turkey": "🦃", 412 | "dove": "🕊", 413 | "rabbit2": "🐇", 414 | "mouse2": "🐁", 415 | "rat": "🐀", 416 | "chipmunk": "🐿", 417 | "feet": "🐾", 418 | "paw_prints": "🐾", 419 | "dragon": "🐉", 420 | "dragon_face": "🐲", 421 | "cactus": "🌵", 422 | "christmas_tree": "🎄", 423 | "evergreen_tree": "🌲", 424 | "deciduous_tree": "🌳", 425 | "palm_tree": "🌴", 426 | "seedling": "🌱", 427 | "herb": "🌿", 428 | "shamrock": "☘️", 429 | "four_leaf_clover": "🍀", 430 | "bamboo": "🎍", 431 | "tanabata_tree": "🎋", 432 | "leaves": "🍃", 433 | "fallen_leaf": "🍂", 434 | "maple_leaf": "🍁", 435 | "mushroom": "🍄", 436 | "ear_of_rice": "🌾", 437 | "bouquet": "💐", 438 | "tulip": "🌷", 439 | "rose": "🌹", 440 | "wilted_flower": "🥀", 441 | "sunflower": "🌻", 442 | "blossom": "🌼", 443 | "cherry_blossom": "🌸", 444 | "hibiscus": "🌺", 445 | "earth_americas": "🌎", 446 | "earth_africa": "🌍", 447 | "earth_asia": "🌏", 448 | "full_moon": "🌕", 449 | "waning_gibbous_moon": "🌖", 450 | "last_quarter_moon": "🌗", 451 | "waning_crescent_moon": "🌘", 452 | "new_moon": "🌑", 453 | "waxing_crescent_moon": "🌒", 454 | "first_quarter_moon": "🌓", 455 | "moon": "🌔", 456 | "waxing_gibbous_moon": "🌔", 457 | "new_moon_with_face": "🌚", 458 | "full_moon_with_face": "🌝", 459 | "sun_with_face": "🌞", 460 | "first_quarter_moon_with_face": "🌛", 461 | "last_quarter_moon_with_face": "🌜", 462 | "crescent_moon": "🌙", 463 | "dizzy": "💫", 464 | "star": "⭐️", 465 | "star2": "🌟", 466 | "sparkles": "✨", 467 | "zap": "⚡️", 468 | "fire": "🔥", 469 | "boom": "💥", 470 | "collision": "💥", 471 | "comet": "☄", 472 | "sunny": "☀️", 473 | "sun_behind_small_cloud": "🌤", 474 | "partly_sunny": "⛅️", 475 | "sun_behind_large_cloud": "🌥", 476 | "sun_behind_rain_cloud": "🌦", 477 | "rainbow": "🌈", 478 | "cloud": "☁️", 479 | "cloud_with_rain": "🌧", 480 | "cloud_with_lightning_and_rain": "⛈", 481 | "cloud_with_lightning": "🌩", 482 | "cloud_with_snow": "🌨", 483 | "snowman_with_snow": "☃️", 484 | "snowman": "⛄️", 485 | "snowflake": "❄️", 486 | "wind_face": "🌬", 487 | "dash": "💨", 488 | "tornado": "🌪", 489 | "fog": "🌫", 490 | "ocean": "🌊", 491 | "droplet": "💧", 492 | "sweat_drops": "💦", 493 | "umbrella": "☔️", 494 | "green_apple": "🍏", 495 | "apple": "🍎", 496 | "pear": "🍐", 497 | "tangerine": "🍊", 498 | "orange": "🍊", 499 | "mandarin": "🍊", 500 | "lemon": "🍋", 501 | "banana": "🍌", 502 | "watermelon": "🍉", 503 | "grapes": "🍇", 504 | "strawberry": "🍓", 505 | "melon": "🍈", 506 | "cherries": "🍒", 507 | "peach": "🍑", 508 | "pineapple": "🍍", 509 | "kiwi_fruit": "🥝", 510 | "avocado": "🥑", 511 | "tomato": "🍅", 512 | "eggplant": "🍆", 513 | "cucumber": "🥒", 514 | "carrot": "🥕", 515 | "corn": "🌽", 516 | "hot_pepper": "🌶", 517 | "potato": "🥔", 518 | "sweet_potato": "🍠", 519 | "chestnut": "🌰", 520 | "peanuts": "🥜", 521 | "honey_pot": "🍯", 522 | "croissant": "🥐", 523 | "bread": "🍞", 524 | "baguette_bread": "🥖", 525 | "cheese": "🧀", 526 | "egg": "🥚", 527 | "fried_egg": "🍳", 528 | "bacon": "🥓", 529 | "pancakes": "🥞", 530 | "fried_shrimp": "🍤", 531 | "poultry_leg": "🍗", 532 | "meat_on_bone": "🍖", 533 | "pizza": "🍕", 534 | "hotdog": "🌭", 535 | "hamburger": "🍔", 536 | "fries": "🍟", 537 | "stuffed_flatbread": "🥙", 538 | "taco": "🌮", 539 | "burrito": "🌯", 540 | "green_salad": "🥗", 541 | "shallow_pan_of_food": "🥘", 542 | "spaghetti": "🍝", 543 | "ramen": "🍜", 544 | "stew": "🍲", 545 | "fish_cake": "🍥", 546 | "sushi": "🍣", 547 | "bento": "🍱", 548 | "curry": "🍛", 549 | "rice": "🍚", 550 | "rice_ball": "🍙", 551 | "rice_cracker": "🍘", 552 | "oden": "🍢", 553 | "dango": "🍡", 554 | "shaved_ice": "🍧", 555 | "ice_cream": "🍨", 556 | "icecream": "🍦", 557 | "cake": "🍰", 558 | "birthday": "🎂", 559 | "custard": "🍮", 560 | "lollipop": "🍭", 561 | "candy": "🍬", 562 | "chocolate_bar": "🍫", 563 | "popcorn": "🍿", 564 | "doughnut": "🍩", 565 | "cookie": "🍪", 566 | "milk_glass": "🥛", 567 | "baby_bottle": "🍼", 568 | "coffee": "☕️", 569 | "tea": "🍵", 570 | "sake": "🍶", 571 | "beer": "🍺", 572 | "beers": "🍻", 573 | "clinking_glasses": "🥂", 574 | "wine_glass": "🍷", 575 | "tumbler_glass": "🥃", 576 | "cocktail": "🍸", 577 | "tropical_drink": "🍹", 578 | "champagne": "🍾", 579 | "spoon": "🥄", 580 | "fork_and_knife": "🍴", 581 | "plate_with_cutlery": "🍽", 582 | "soccer": "⚽️", 583 | "basketball": "🏀", 584 | "football": "🏈", 585 | "baseball": "⚾️", 586 | "tennis": "🎾", 587 | "volleyball": "🏐", 588 | "rugby_football": "🏉", 589 | "8ball": "🎱", 590 | "ping_pong": "🏓", 591 | "badminton": "🏸", 592 | "goal_net": "🥅", 593 | "ice_hockey": "🏒", 594 | "field_hockey": "🏑", 595 | "cricket": "🏏", 596 | "golf": "⛳️", 597 | "bow_and_arrow": "🏹", 598 | "fishing_pole_and_fish": "🎣", 599 | "boxing_glove": "🥊", 600 | "martial_arts_uniform": "🥋", 601 | "ice_skate": "⛸", 602 | "ski": "🎿", 603 | "skier": "⛷", 604 | "snowboarder": "🏂", 605 | "weight_lifting_woman": "🏋️‍♀️", 606 | "weight_lifting_man": "🏋", 607 | "person_fencing": "🤺", 608 | "women_wrestling": "🤼‍♀", 609 | "men_wrestling": "🤼‍♂", 610 | "woman_cartwheeling": "🤸‍♀", 611 | "man_cartwheeling": "🤸‍♂", 612 | "basketball_woman": "⛹️‍♀️", 613 | "basketball_man": "⛹", 614 | "woman_playing_handball": "🤾‍♀", 615 | "man_playing_handball": "🤾‍♂", 616 | "golfing_woman": "🏌️‍♀️", 617 | "golfing_man": "🏌", 618 | "surfing_woman": "🏄‍♀", 619 | "surfing_man": "🏄", 620 | "surfer": "🏄", 621 | "swimming_woman": "🏊‍♀", 622 | "swimming_man": "🏊", 623 | "swimmer": "🏊", 624 | "woman_playing_water_polo": "🤽‍♀", 625 | "man_playing_water_polo": "🤽‍♂", 626 | "rowing_woman": "🚣‍♀", 627 | "rowing_man": "🚣", 628 | "rowboat": "🚣", 629 | "horse_racing": "🏇", 630 | "biking_woman": "🚴‍♀", 631 | "biking_man": "🚴", 632 | "bicyclist": "🚴", 633 | "mountain_biking_woman": "🚵‍♀", 634 | "mountain_biking_man": "🚵", 635 | "mountain_bicyclist": "🚵", 636 | "running_shirt_with_sash": "🎽", 637 | "medal_sports": "🏅", 638 | "medal_military": "🎖", 639 | "1st_place_medal": "🥇", 640 | "2nd_place_medal": "🥈", 641 | "3rd_place_medal": "🥉", 642 | "trophy": "🏆", 643 | "rosette": "🏵", 644 | "reminder_ribbon": "🎗", 645 | "ticket": "🎫", 646 | "tickets": "🎟", 647 | "circus_tent": "🎪", 648 | "woman_juggling": "🤹‍♀", 649 | "man_juggling": "🤹‍♂", 650 | "performing_arts": "🎭", 651 | "art": "🎨", 652 | "clapper": "🎬", 653 | "microphone": "🎤", 654 | "headphones": "🎧", 655 | "musical_score": "🎼", 656 | "musical_keyboard": "🎹", 657 | "drum": "🥁", 658 | "saxophone": "🎷", 659 | "trumpet": "🎺", 660 | "guitar": "🎸", 661 | "violin": "🎻", 662 | "game_die": "🎲", 663 | "dart": "🎯", 664 | "bowling": "🎳", 665 | "video_game": "🎮", 666 | "slot_machine": "🎰", 667 | "car": "🚗", 668 | "red_car": "🚗", 669 | "taxi": "🚕", 670 | "blue_car": "🚙", 671 | "bus": "🚌", 672 | "trolleybus": "🚎", 673 | "racing_car": "🏎", 674 | "police_car": "🚓", 675 | "ambulance": "🚑", 676 | "fire_engine": "🚒", 677 | "minibus": "🚐", 678 | "truck": "🚚", 679 | "articulated_lorry": "🚛", 680 | "tractor": "🚜", 681 | "kick_scooter": "🛴", 682 | "bike": "🚲", 683 | "motor_scooter": "🛵", 684 | "motorcycle": "🏍", 685 | "rotating_light": "🚨", 686 | "oncoming_police_car": "🚔", 687 | "oncoming_bus": "🚍", 688 | "oncoming_automobile": "🚘", 689 | "oncoming_taxi": "🚖", 690 | "aerial_tramway": "🚡", 691 | "mountain_cableway": "🚠", 692 | "suspension_railway": "🚟", 693 | "railway_car": "🚃", 694 | "train": "🚋", 695 | "mountain_railway": "🚞", 696 | "monorail": "🚝", 697 | "bullettrain_side": "🚄", 698 | "bullettrain_front": "🚅", 699 | "light_rail": "🚈", 700 | "steam_locomotive": "🚂", 701 | "train2": "🚆", 702 | "metro": "🚇", 703 | "tram": "🚊", 704 | "station": "🚉", 705 | "helicopter": "🚁", 706 | "small_airplane": "🛩", 707 | "airplane": "✈️", 708 | "flight_departure": "🛫", 709 | "flight_arrival": "🛬", 710 | "rocket": "🚀", 711 | "artificial_satellite": "🛰", 712 | "seat": "💺", 713 | "canoe": "🛶", 714 | "boat": "⛵️", 715 | "sailboat": "⛵️", 716 | "motor_boat": "🛥", 717 | "speedboat": "🚤", 718 | "passenger_ship": "🛳", 719 | "ferry": "⛴", 720 | "ship": "🚢", 721 | "anchor": "⚓️", 722 | "construction": "🚧", 723 | "fuelpump": "⛽️", 724 | "busstop": "🚏", 725 | "vertical_traffic_light": "🚦", 726 | "traffic_light": "🚥", 727 | "world_map": "🗺", 728 | "moyai": "🗿", 729 | "statue_of_liberty": "🗽", 730 | "fountain": "⛲️", 731 | "tokyo_tower": "🗼", 732 | "european_castle": "🏰", 733 | "japanese_castle": "🏯", 734 | "stadium": "🏟", 735 | "ferris_wheel": "🎡", 736 | "roller_coaster": "🎢", 737 | "carousel_horse": "🎠", 738 | "parasol_on_ground": "⛱", 739 | "beach_umbrella": "🏖", 740 | "desert_island": "🏝", 741 | "mountain": "⛰", 742 | "mountain_snow": "🏔", 743 | "mount_fuji": "🗻", 744 | "volcano": "🌋", 745 | "desert": "🏜", 746 | "camping": "🏕", 747 | "tent": "⛺️", 748 | "railway_track": "🛤", 749 | "motorway": "🛣", 750 | "building_construction": "🏗", 751 | "factory": "🏭", 752 | "house": "🏠", 753 | "house_with_garden": "🏡", 754 | "houses": "🏘", 755 | "derelict_house": "🏚", 756 | "office": "🏢", 757 | "department_store": "🏬", 758 | "post_office": "🏣", 759 | "european_post_office": "🏤", 760 | "hospital": "🏥", 761 | "bank": "🏦", 762 | "hotel": "🏨", 763 | "convenience_store": "🏪", 764 | "school": "🏫", 765 | "love_hotel": "🏩", 766 | "wedding": "💒", 767 | "classical_building": "🏛", 768 | "church": "⛪️", 769 | "mosque": "🕌", 770 | "synagogue": "🕍", 771 | "kaaba": "🕋", 772 | "shinto_shrine": "⛩", 773 | "japan": "🗾", 774 | "rice_scene": "🎑", 775 | "national_park": "🏞", 776 | "sunrise": "🌅", 777 | "sunrise_over_mountains": "🌄", 778 | "stars": "🌠", 779 | "sparkler": "🎇", 780 | "fireworks": "🎆", 781 | "city_sunrise": "🌇", 782 | "city_sunset": "🌆", 783 | "cityscape": "🏙", 784 | "night_with_stars": "🌃", 785 | "milky_way": "🌌", 786 | "bridge_at_night": "🌉", 787 | "foggy": "🌁", 788 | "watch": "⌚️", 789 | "iphone": "📱", 790 | "calling": "📲", 791 | "computer": "💻", 792 | "keyboard": "⌨️", 793 | "desktop_computer": "🖥", 794 | "printer": "🖨", 795 | "computer_mouse": "🖱", 796 | "trackball": "🖲", 797 | "joystick": "🕹", 798 | "clamp": "🗜", 799 | "minidisc": "💽", 800 | "floppy_disk": "💾", 801 | "cd": "💿", 802 | "dvd": "📀", 803 | "vhs": "📼", 804 | "camera": "📷", 805 | "camera_flash": "📸", 806 | "video_camera": "📹", 807 | "movie_camera": "🎥", 808 | "film_projector": "📽", 809 | "film_strip": "🎞", 810 | "telephone_receiver": "📞", 811 | "phone": "☎️", 812 | "telephone": "☎️", 813 | "pager": "📟", 814 | "fax": "📠", 815 | "tv": "📺", 816 | "radio": "📻", 817 | "studio_microphone": "🎙", 818 | "level_slider": "🎚", 819 | "control_knobs": "🎛", 820 | "stopwatch": "⏱", 821 | "timer_clock": "⏲", 822 | "alarm_clock": "⏰", 823 | "mantelpiece_clock": "🕰", 824 | "hourglass": "⌛️", 825 | "hourglass_flowing_sand": "⏳", 826 | "satellite": "📡", 827 | "battery": "🔋", 828 | "electric_plug": "🔌", 829 | "bulb": "💡", 830 | "flashlight": "🔦", 831 | "candle": "🕯", 832 | "wastebasket": "🗑", 833 | "oil_drum": "🛢", 834 | "money_with_wings": "💸", 835 | "dollar": "💵", 836 | "yen": "💴", 837 | "euro": "💶", 838 | "pound": "💷", 839 | "moneybag": "💰", 840 | "credit_card": "💳", 841 | "gem": "💎", 842 | "balance_scale": "⚖️", 843 | "wrench": "🔧", 844 | "hammer": "🔨", 845 | "hammer_and_pick": "⚒", 846 | "hammer_and_wrench": "🛠", 847 | "pick": "⛏", 848 | "nut_and_bolt": "🔩", 849 | "gear": "⚙️", 850 | "chains": "⛓", 851 | "gun": "🔫", 852 | "bomb": "💣", 853 | "hocho": "🔪", 854 | "knife": "🔪", 855 | "dagger": "🗡", 856 | "crossed_swords": "⚔️", 857 | "shield": "🛡", 858 | "smoking": "🚬", 859 | "coffin": "⚰️", 860 | "funeral_urn": "⚱️", 861 | "amphora": "🏺", 862 | "crystal_ball": "🔮", 863 | "prayer_beads": "📿", 864 | "barber": "💈", 865 | "alembic": "⚗️", 866 | "telescope": "🔭", 867 | "microscope": "🔬", 868 | "hole": "🕳", 869 | "pill": "💊", 870 | "syringe": "💉", 871 | "thermometer": "🌡", 872 | "toilet": "🚽", 873 | "potable_water": "🚰", 874 | "shower": "🚿", 875 | "bathtub": "🛁", 876 | "bath": "🛀", 877 | "bellhop_bell": "🛎", 878 | "key": "🔑", 879 | "old_key": "🗝", 880 | "door": "🚪", 881 | "couch_and_lamp": "🛋", 882 | "bed": "🛏", 883 | "sleeping_bed": "🛌", 884 | "framed_picture": "🖼", 885 | "shopping": "🛍", 886 | "shopping_cart": "🛒", 887 | "gift": "🎁", 888 | "balloon": "🎈", 889 | "flags": "🎏", 890 | "ribbon": "🎀", 891 | "confetti_ball": "🎊", 892 | "tada": "🎉", 893 | "dolls": "🎎", 894 | "izakaya_lantern": "🏮", 895 | "lantern": "🏮", 896 | "wind_chime": "🎐", 897 | "email": "✉️", 898 | "envelope": "✉️", 899 | "envelope_with_arrow": "📩", 900 | "incoming_envelope": "📨", 901 | "e-mail": "📧", 902 | "love_letter": "💌", 903 | "inbox_tray": "📥", 904 | "outbox_tray": "📤", 905 | "package": "📦", 906 | "label": "🏷", 907 | "mailbox_closed": "📪", 908 | "mailbox": "📫", 909 | "mailbox_with_mail": "📬", 910 | "mailbox_with_no_mail": "📭", 911 | "postbox": "📮", 912 | "postal_horn": "📯", 913 | "scroll": "📜", 914 | "page_with_curl": "📃", 915 | "page_facing_up": "📄", 916 | "bookmark_tabs": "📑", 917 | "bar_chart": "📊", 918 | "chart_with_upwards_trend": "📈", 919 | "chart_with_downwards_trend": "📉", 920 | "spiral_notepad": "🗒", 921 | "spiral_calendar": "🗓", 922 | "calendar": "📆", 923 | "date": "📅", 924 | "card_index": "📇", 925 | "card_file_box": "🗃", 926 | "ballot_box": "🗳", 927 | "file_cabinet": "🗄", 928 | "clipboard": "📋", 929 | "file_folder": "📁", 930 | "open_file_folder": "📂", 931 | "card_index_dividers": "🗂", 932 | "newspaper_roll": "🗞", 933 | "newspaper": "📰", 934 | "notebook": "📓", 935 | "notebook_with_decorative_cover": "📔", 936 | "ledger": "📒", 937 | "closed_book": "📕", 938 | "green_book": "📗", 939 | "blue_book": "📘", 940 | "orange_book": "📙", 941 | "books": "📚", 942 | "book": "📖", 943 | "open_book": "📖", 944 | "bookmark": "🔖", 945 | "link": "🔗", 946 | "paperclip": "📎", 947 | "paperclips": "🖇", 948 | "triangular_ruler": "📐", 949 | "straight_ruler": "📏", 950 | "pushpin": "📌", 951 | "round_pushpin": "📍", 952 | "scissors": "✂️", 953 | "pen": "🖊", 954 | "fountain_pen": "🖋", 955 | "black_nib": "✒️", 956 | "paintbrush": "🖌", 957 | "crayon": "🖍", 958 | "memo": "📝", 959 | "pencil": "📝", 960 | "pencil2": "✏️", 961 | "mag": "🔍", 962 | "mag_right": "🔎", 963 | "lock_with_ink_pen": "🔏", 964 | "closed_lock_with_key": "🔐", 965 | "lock": "🔒", 966 | "unlock": "🔓", 967 | "heart": "❤️", 968 | "yellow_heart": "💛", 969 | "green_heart": "💚", 970 | "blue_heart": "💙", 971 | "purple_heart": "💜", 972 | "black_heart": "🖤", 973 | "broken_heart": "💔", 974 | "heavy_heart_exclamation": "❣️", 975 | "two_hearts": "💕", 976 | "revolving_hearts": "💞", 977 | "heartbeat": "💓", 978 | "heartpulse": "💗", 979 | "sparkling_heart": "💖", 980 | "cupid": "💘", 981 | "gift_heart": "💝", 982 | "heart_decoration": "💟", 983 | "peace_symbol": "☮️", 984 | "latin_cross": "✝️", 985 | "star_and_crescent": "☪️", 986 | "om": "🕉", 987 | "wheel_of_dharma": "☸️", 988 | "star_of_david": "✡️", 989 | "six_pointed_star": "🔯", 990 | "menorah": "🕎", 991 | "yin_yang": "☯️", 992 | "orthodox_cross": "☦️", 993 | "place_of_worship": "🛐", 994 | "ophiuchus": "⛎", 995 | "aries": "♈️", 996 | "taurus": "♉️", 997 | "gemini": "♊️", 998 | "cancer": "♋️", 999 | "leo": "♌️", 1000 | "virgo": "♍️", 1001 | "libra": "♎️", 1002 | "scorpius": "♏️", 1003 | "sagittarius": "♐️", 1004 | "capricorn": "♑️", 1005 | "aquarius": "♒️", 1006 | "pisces": "♓️", 1007 | "id": "🆔", 1008 | "atom_symbol": "⚛️", 1009 | "accept": "🉑", 1010 | "radioactive": "☢️", 1011 | "biohazard": "☣️", 1012 | "mobile_phone_off": "📴", 1013 | "vibration_mode": "📳", 1014 | "eight_pointed_black_star": "✴️", 1015 | "vs": "🆚", 1016 | "white_flower": "💮", 1017 | "ideograph_advantage": "🉐", 1018 | "secret": "㊙️", 1019 | "congratulations": "㊗️", 1020 | "u6e80": "🈵", 1021 | "a": "🅰️", 1022 | "b": "🅱️", 1023 | "ab": "🆎", 1024 | "cl": "🆑", 1025 | "o2": "🅾️", 1026 | "sos": "🆘", 1027 | "x": "❌", 1028 | "o": "⭕️", 1029 | "stop_sign": "🛑", 1030 | "no_entry": "⛔️", 1031 | "name_badge": "📛", 1032 | "no_entry_sign": "🚫", 1033 | "anger": "💢", 1034 | "hotsprings": "♨️", 1035 | "no_pedestrians": "🚷", 1036 | "do_not_litter": "🚯", 1037 | "no_bicycles": "🚳", 1038 | "non-potable_water": "🚱", 1039 | "underage": "🔞", 1040 | "no_mobile_phones": "📵", 1041 | "no_smoking": "🚭", 1042 | "exclamation": "❗️", 1043 | "heavy_exclamation_mark": "❗️", 1044 | "grey_exclamation": "❕", 1045 | "question": "❓", 1046 | "grey_question": "❔", 1047 | "bangbang": "‼️", 1048 | "interrobang": "⁉️", 1049 | "low_brightness": "🔅", 1050 | "high_brightness": "🔆", 1051 | "part_alternation_mark": "〽️", 1052 | "warning": "⚠️", 1053 | "children_crossing": "🚸", 1054 | "trident": "🔱", 1055 | "fleur_de_lis": "⚜️", 1056 | "beginner": "🔰", 1057 | "recycle": "♻️", 1058 | "white_check_mark": "✅", 1059 | "chart": "💹", 1060 | "sparkle": "❇️", 1061 | "eight_spoked_asterisk": "✳️", 1062 | "negative_squared_cross_mark": "❎", 1063 | "globe_with_meridians": "🌐", 1064 | "diamond_shape_with_a_dot_inside": "💠", 1065 | "m": "Ⓜ️", 1066 | "cyclone": "🌀", 1067 | "zzz": "💤", 1068 | "atm": "🏧", 1069 | "wc": "🚾", 1070 | "wheelchair": "♿️", 1071 | "parking": "🅿️", 1072 | "sa": "🈂️", 1073 | "passport_control": "🛂", 1074 | "customs": "🛃", 1075 | "baggage_claim": "🛄", 1076 | "left_luggage": "🛅", 1077 | "mens": "🚹", 1078 | "womens": "🚺", 1079 | "baby_symbol": "🚼", 1080 | "restroom": "🚻", 1081 | "put_litter_in_its_place": "🚮", 1082 | "cinema": "🎦", 1083 | "signal_strength": "📶", 1084 | "koko": "🈁", 1085 | "symbols": "🔣", 1086 | "information_source": "ℹ️", 1087 | "abc": "🔤", 1088 | "abcd": "🔡", 1089 | "capital_abcd": "🔠", 1090 | "ng": "🆖", 1091 | "ok": "🆗", 1092 | "up": "🆙", 1093 | "cool": "🆒", 1094 | "new": "🆕", 1095 | "free": "🆓", 1096 | "zero": "0️⃣", 1097 | "one": "1️⃣", 1098 | "two": "2️⃣", 1099 | "three": "3️⃣", 1100 | "four": "4️⃣", 1101 | "five": "5️⃣", 1102 | "six": "6️⃣", 1103 | "seven": "7️⃣", 1104 | "eight": "8️⃣", 1105 | "nine": "9️⃣", 1106 | "keycap_ten": "🔟", 1107 | "hash": "#️⃣", 1108 | "asterisk": "*️⃣", 1109 | "arrow_forward": "▶️", 1110 | "pause_button": "⏸", 1111 | "play_or_pause_button": "⏯", 1112 | "stop_button": "⏹", 1113 | "record_button": "⏺", 1114 | "next_track_button": "⏭", 1115 | "previous_track_button": "⏮", 1116 | "fast_forward": "⏩", 1117 | "rewind": "⏪", 1118 | "arrow_double_up": "⏫", 1119 | "arrow_double_down": "⏬", 1120 | "arrow_backward": "◀️", 1121 | "arrow_up_small": "🔼", 1122 | "arrow_down_small": "🔽", 1123 | "arrow_right": "➡️", 1124 | "arrow_left": "⬅️", 1125 | "arrow_up": "⬆️", 1126 | "arrow_down": "⬇️", 1127 | "arrow_upper_right": "↗️", 1128 | "arrow_lower_right": "↘️", 1129 | "arrow_lower_left": "↙️", 1130 | "arrow_upper_left": "↖️", 1131 | "arrow_up_down": "↕️", 1132 | "left_right_arrow": "↔️", 1133 | "arrow_right_hook": "↪️", 1134 | "leftwards_arrow_with_hook": "↩️", 1135 | "arrow_heading_up": "⤴️", 1136 | "arrow_heading_down": "⤵️", 1137 | "twisted_rightwards_arrows": "🔀", 1138 | "repeat": "🔁", 1139 | "repeat_one": "🔂", 1140 | "arrows_counterclockwise": "🔄", 1141 | "arrows_clockwise": "🔃", 1142 | "musical_note": "🎵", 1143 | "notes": "🎶", 1144 | "heavy_plus_sign": "➕", 1145 | "heavy_minus_sign": "➖", 1146 | "heavy_division_sign": "➗", 1147 | "heavy_multiplication_x": "✖️", 1148 | "heavy_dollar_sign": "💲", 1149 | "currency_exchange": "💱", 1150 | "tm": "™️", 1151 | "copyright": "©️", 1152 | "registered": "®️", 1153 | "wavy_dash": "〰️", 1154 | "curly_loop": "➰", 1155 | "loop": "➿", 1156 | "end": "🔚", 1157 | "back": "🔙", 1158 | "on": "🔛", 1159 | "top": "🔝", 1160 | "soon": "🔜", 1161 | "heavy_check_mark": "✔️", 1162 | "ballot_box_with_check": "☑️", 1163 | "radio_button": "🔘", 1164 | "white_circle": "⚪️", 1165 | "black_circle": "⚫️", 1166 | "red_circle": "🔴", 1167 | "large_blue_circle": "🔵", 1168 | "small_red_triangle": "🔺", 1169 | "small_red_triangle_down": "🔻", 1170 | "small_orange_diamond": "🔸", 1171 | "small_blue_diamond": "🔹", 1172 | "large_orange_diamond": "🔶", 1173 | "large_blue_diamond": "🔷", 1174 | "white_square_button": "🔳", 1175 | "black_square_button": "🔲", 1176 | "black_small_square": "▪️", 1177 | "white_small_square": "▫️", 1178 | "black_medium_small_square": "◾️", 1179 | "white_medium_small_square": "◽️", 1180 | "black_medium_square": "◼️", 1181 | "white_medium_square": "◻️", 1182 | "black_large_square": "⬛️", 1183 | "white_large_square": "⬜️", 1184 | "speaker": "🔈", 1185 | "mute": "🔇", 1186 | "sound": "🔉", 1187 | "loud_sound": "🔊", 1188 | "bell": "🔔", 1189 | "no_bell": "🔕", 1190 | "mega": "📣", 1191 | "loudspeaker": "📢", 1192 | "eye_speech_bubble": "👁‍🗨", 1193 | "speech_balloon": "💬", 1194 | "thought_balloon": "💭", 1195 | "right_anger_bubble": "🗯", 1196 | "spades": "♠️", 1197 | "clubs": "♣️", 1198 | "hearts": "♥️", 1199 | "diamonds": "♦️", 1200 | "black_joker": "🃏", 1201 | "flower_playing_cards": "🎴", 1202 | "mahjong": "🀄️", 1203 | "clock1": "🕐", 1204 | "clock2": "🕑", 1205 | "clock3": "🕒", 1206 | "clock4": "🕓", 1207 | "clock5": "🕔", 1208 | "clock6": "🕕", 1209 | "clock7": "🕖", 1210 | "clock8": "🕗", 1211 | "clock9": "🕘", 1212 | "clock10": "🕙", 1213 | "clock11": "🕚", 1214 | "clock12": "🕛", 1215 | "clock130": "🕜", 1216 | "clock230": "🕝", 1217 | "clock330": "🕞", 1218 | "clock430": "🕟", 1219 | "clock530": "🕠", 1220 | "clock630": "🕡", 1221 | "clock730": "🕢", 1222 | "clock830": "🕣", 1223 | "clock930": "🕤", 1224 | "clock1030": "🕥", 1225 | "clock1130": "🕦", 1226 | "clock1230": "🕧", 1227 | "white_flag": "🏳️", 1228 | "black_flag": "🏴", 1229 | "checkered_flag": "🏁", 1230 | "triangular_flag_on_post": "🚩", 1231 | "rainbow_flag": "🏳️‍🌈", 1232 | "afghanistan": "🇦🇫", 1233 | "aland_islands": "🇦🇽", 1234 | "albania": "🇦🇱", 1235 | "algeria": "🇩🇿", 1236 | "american_samoa": "🇦🇸", 1237 | "andorra": "🇦🇩", 1238 | "angola": "🇦🇴", 1239 | "anguilla": "🇦🇮", 1240 | "antarctica": "🇦🇶", 1241 | "antigua_barbuda": "🇦🇬", 1242 | "argentina": "🇦🇷", 1243 | "armenia": "🇦🇲", 1244 | "aruba": "🇦🇼", 1245 | "australia": "🇦🇺", 1246 | "austria": "🇦🇹", 1247 | "azerbaijan": "🇦🇿", 1248 | "bahamas": "🇧🇸", 1249 | "bahrain": "🇧🇭", 1250 | "bangladesh": "🇧🇩", 1251 | "barbados": "🇧🇧", 1252 | "belarus": "🇧🇾", 1253 | "belgium": "🇧🇪", 1254 | "belize": "🇧🇿", 1255 | "benin": "🇧🇯", 1256 | "bermuda": "🇧🇲", 1257 | "bhutan": "🇧🇹", 1258 | "bolivia": "🇧🇴", 1259 | "caribbean_netherlands": "🇧🇶", 1260 | "bosnia_herzegovina": "🇧🇦", 1261 | "botswana": "🇧🇼", 1262 | "brazil": "🇧🇷", 1263 | "british_indian_ocean_territory": "🇮🇴", 1264 | "british_virgin_islands": "🇻🇬", 1265 | "brunei": "🇧🇳", 1266 | "bulgaria": "🇧🇬", 1267 | "burkina_faso": "🇧🇫", 1268 | "burundi": "🇧🇮", 1269 | "cape_verde": "🇨🇻", 1270 | "cambodia": "🇰🇭", 1271 | "cameroon": "🇨🇲", 1272 | "canada": "🇨🇦", 1273 | "canary_islands": "🇮🇨", 1274 | "cayman_islands": "🇰🇾", 1275 | "central_african_republic": "🇨🇫", 1276 | "chad": "🇹🇩", 1277 | "chile": "🇨🇱", 1278 | "cn": "🇨🇳", 1279 | "christmas_island": "🇨🇽", 1280 | "cocos_islands": "🇨🇨", 1281 | "colombia": "🇨🇴", 1282 | "comoros": "🇰🇲", 1283 | "congo_brazzaville": "🇨🇬", 1284 | "congo_kinshasa": "🇨🇩", 1285 | "cook_islands": "🇨🇰", 1286 | "costa_rica": "🇨🇷", 1287 | "cote_divoire": "🇨🇮", 1288 | "croatia": "🇭🇷", 1289 | "cuba": "🇨🇺", 1290 | "curacao": "🇨🇼", 1291 | "cyprus": "🇨🇾", 1292 | "czech_republic": "🇨🇿", 1293 | "denmark": "🇩🇰", 1294 | "djibouti": "🇩🇯", 1295 | "dominica": "🇩🇲", 1296 | "dominican_republic": "🇩🇴", 1297 | "ecuador": "🇪🇨", 1298 | "egypt": "🇪🇬", 1299 | "el_salvador": "🇸🇻", 1300 | "equatorial_guinea": "🇬🇶", 1301 | "eritrea": "🇪🇷", 1302 | "estonia": "🇪🇪", 1303 | "ethiopia": "🇪🇹", 1304 | "eu": "🇪🇺", 1305 | "european_union": "🇪🇺", 1306 | "falkland_islands": "🇫🇰", 1307 | "faroe_islands": "🇫🇴", 1308 | "fiji": "🇫🇯", 1309 | "finland": "🇫🇮", 1310 | "fr": "🇫🇷", 1311 | "french_guiana": "🇬🇫", 1312 | "french_polynesia": "🇵🇫", 1313 | "french_southern_territories": "🇹🇫", 1314 | "gabon": "🇬🇦", 1315 | "gambia": "🇬🇲", 1316 | "georgia": "🇬🇪", 1317 | "de": "🇩🇪", 1318 | "ghana": "🇬🇭", 1319 | "gibraltar": "🇬🇮", 1320 | "greece": "🇬🇷", 1321 | "greenland": "🇬🇱", 1322 | "grenada": "🇬🇩", 1323 | "guadeloupe": "🇬🇵", 1324 | "guam": "🇬🇺", 1325 | "guatemala": "🇬🇹", 1326 | "guernsey": "🇬🇬", 1327 | "guinea": "🇬🇳", 1328 | "guinea_bissau": "🇬🇼", 1329 | "guyana": "🇬🇾", 1330 | "haiti": "🇭🇹", 1331 | "honduras": "🇭🇳", 1332 | "hong_kong": "🇭🇰", 1333 | "hungary": "🇭🇺", 1334 | "iceland": "🇮🇸", 1335 | "india": "🇮🇳", 1336 | "indonesia": "🇮🇩", 1337 | "iran": "🇮🇷", 1338 | "iraq": "🇮🇶", 1339 | "ireland": "🇮🇪", 1340 | "isle_of_man": "🇮🇲", 1341 | "israel": "🇮🇱", 1342 | "it": "🇮🇹", 1343 | "jamaica": "🇯🇲", 1344 | "jp": "🇯🇵", 1345 | "crossed_flags": "🎌", 1346 | "jersey": "🇯🇪", 1347 | "jordan": "🇯🇴", 1348 | "kazakhstan": "🇰🇿", 1349 | "kenya": "🇰🇪", 1350 | "kiribati": "🇰🇮", 1351 | "kosovo": "🇽🇰", 1352 | "kuwait": "🇰🇼", 1353 | "kyrgyzstan": "🇰🇬", 1354 | "laos": "🇱🇦", 1355 | "latvia": "🇱🇻", 1356 | "lebanon": "🇱🇧", 1357 | "lesotho": "🇱🇸", 1358 | "liberia": "🇱🇷", 1359 | "libya": "🇱🇾", 1360 | "liechtenstein": "🇱🇮", 1361 | "lithuania": "🇱🇹", 1362 | "luxembourg": "🇱🇺", 1363 | "macau": "🇲🇴", 1364 | "macedonia": "🇲🇰", 1365 | "madagascar": "🇲🇬", 1366 | "malawi": "🇲🇼", 1367 | "malaysia": "🇲🇾", 1368 | "maldives": "🇲🇻", 1369 | "mali": "🇲🇱", 1370 | "malta": "🇲🇹", 1371 | "marshall_islands": "🇲🇭", 1372 | "martinique": "🇲🇶", 1373 | "mauritania": "🇲🇷", 1374 | "mauritius": "🇲🇺", 1375 | "mayotte": "🇾🇹", 1376 | "mexico": "🇲🇽", 1377 | "micronesia": "🇫🇲", 1378 | "moldova": "🇲🇩", 1379 | "monaco": "🇲🇨", 1380 | "mongolia": "🇲🇳", 1381 | "montenegro": "🇲🇪", 1382 | "montserrat": "🇲🇸", 1383 | "morocco": "🇲🇦", 1384 | "mozambique": "🇲🇿", 1385 | "myanmar": "🇲🇲", 1386 | "namibia": "🇳🇦", 1387 | "nauru": "🇳🇷", 1388 | "nepal": "🇳🇵", 1389 | "netherlands": "🇳🇱", 1390 | "new_caledonia": "🇳🇨", 1391 | "new_zealand": "🇳🇿", 1392 | "nicaragua": "🇳🇮", 1393 | "niger": "🇳🇪", 1394 | "nigeria": "🇳🇬", 1395 | "niue": "🇳🇺", 1396 | "norfolk_island": "🇳🇫", 1397 | "northern_mariana_islands": "🇲🇵", 1398 | "north_korea": "🇰🇵", 1399 | "norway": "🇳🇴", 1400 | "oman": "🇴🇲", 1401 | "pakistan": "🇵🇰", 1402 | "palau": "🇵🇼", 1403 | "palestinian_territories": "🇵🇸", 1404 | "panama": "🇵🇦", 1405 | "papua_new_guinea": "🇵🇬", 1406 | "paraguay": "🇵🇾", 1407 | "peru": "🇵🇪", 1408 | "philippines": "🇵🇭", 1409 | "pitcairn_islands": "🇵🇳", 1410 | "poland": "🇵🇱", 1411 | "portugal": "🇵🇹", 1412 | "puerto_rico": "🇵🇷", 1413 | "qatar": "🇶🇦", 1414 | "reunion": "🇷🇪", 1415 | "romania": "🇷🇴", 1416 | "ru": "🇷🇺", 1417 | "rwanda": "🇷🇼", 1418 | "st_barthelemy": "🇧🇱", 1419 | "st_helena": "🇸🇭", 1420 | "st_kitts_nevis": "🇰🇳", 1421 | "st_lucia": "🇱🇨", 1422 | "st_pierre_miquelon": "🇵🇲", 1423 | "st_vincent_grenadines": "🇻🇨", 1424 | "samoa": "🇼🇸", 1425 | "san_marino": "🇸🇲", 1426 | "sao_tome_principe": "🇸🇹", 1427 | "saudi_arabia": "🇸🇦", 1428 | "senegal": "🇸🇳", 1429 | "serbia": "🇷🇸", 1430 | "seychelles": "🇸🇨", 1431 | "sierra_leone": "🇸🇱", 1432 | "singapore": "🇸🇬", 1433 | "sint_maarten": "🇸🇽", 1434 | "slovakia": "🇸🇰", 1435 | "slovenia": "🇸🇮", 1436 | "solomon_islands": "🇸🇧", 1437 | "somalia": "🇸🇴", 1438 | "south_africa": "🇿🇦", 1439 | "south_georgia_south_sandwich_islands": "🇬🇸", 1440 | "kr": "🇰🇷", 1441 | "south_sudan": "🇸🇸", 1442 | "es": "🇪🇸", 1443 | "sri_lanka": "🇱🇰", 1444 | "sudan": "🇸🇩", 1445 | "suriname": "🇸🇷", 1446 | "swaziland": "🇸🇿", 1447 | "sweden": "🇸🇪", 1448 | "switzerland": "🇨🇭", 1449 | "syria": "🇸🇾", 1450 | "taiwan": "🇹🇼", 1451 | "tajikistan": "🇹🇯", 1452 | "tanzania": "🇹🇿", 1453 | "thailand": "🇹🇭", 1454 | "timor_leste": "🇹🇱", 1455 | "togo": "🇹🇬", 1456 | "tokelau": "🇹🇰", 1457 | "tonga": "🇹🇴", 1458 | "trinidad_tobago": "🇹🇹", 1459 | "tunisia": "🇹🇳", 1460 | "tr": "🇹🇷", 1461 | "turkmenistan": "🇹🇲", 1462 | "turks_caicos_islands": "🇹🇨", 1463 | "tuvalu": "🇹🇻", 1464 | "uganda": "🇺🇬", 1465 | "ukraine": "🇺🇦", 1466 | "united_arab_emirates": "🇦🇪", 1467 | "gb": "🇬🇧", 1468 | "uk": "🇬🇧", 1469 | "us": "🇺🇸", 1470 | "us_virgin_islands": "🇻🇮", 1471 | "uruguay": "🇺🇾", 1472 | "uzbekistan": "🇺🇿", 1473 | "vanuatu": "🇻🇺", 1474 | "vatican_city": "🇻🇦", 1475 | "venezuela": "🇻🇪", 1476 | "vietnam": "🇻🇳", 1477 | "wallis_futuna": "🇼🇫", 1478 | "western_sahara": "🇪🇭", 1479 | "yemen": "🇾🇪", 1480 | "zambia": "🇿🇲", 1481 | "zimbabwe": "🇿🇼" 1482 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import store from '../vuex/store' 4 | import * as OfflinePluginRuntime from 'offline-plugin/runtime'; 5 | 6 | if (process.env.NODE_ENV === 'production') { 7 | OfflinePluginRuntime.install({ 8 | onUpdateReady () { 9 | OfflinePluginRuntime.applyUpdate() 10 | }, 11 | onUpdated () { 12 | window.location.reload() 13 | } 14 | }) 15 | } 16 | 17 | new Vue({ 18 | el: '#app', 19 | store, 20 | render: h => h(App) 21 | }) 22 | -------------------------------------------------------------------------------- /src/markdownConf.js: -------------------------------------------------------------------------------- 1 | const hljs = require('highlight.js') 2 | const twemoji = require('twemoji') 3 | const md = require('markdown-it')({ 4 | highlight: function (str, lang) { 5 | if (lang && hljs.getLanguage(lang)) { 6 | try { 7 | return hljs.highlight(lang, str).value; 8 | } catch (__) {} 9 | } 10 | return ''; 11 | }}); 12 | md.use(require('markdown-it-checkbox')); 13 | md.use(require('markdown-it-emoji')); 14 | md.renderer.rules.emoji = function(token, idx) { 15 | return twemoji.parse(token[idx].content) 16 | } 17 | 18 | export default md; -------------------------------------------------------------------------------- /src/utils/insertContent.js: -------------------------------------------------------------------------------- 1 | export default function(insertDes) { 2 | let inputer = document.querySelector('#inputer') 3 | let startPosition = inputer.selectionStart 4 | let endPosition = inputer.selectionEnd 5 | let oldContent = inputer.value 6 | 7 | inputer.focus() 8 | 9 | if(startPosition === endPosition){ 10 | const newContent = oldContent.substring(0, startPosition) + insertDes.content + oldContent.substring(endPosition, oldContent.length) 11 | 12 | inputer.value = newContent 13 | 14 | inputer.setSelectionRange(startPosition + insertDes.startSymbolLen, startPosition + insertDes.content.length - insertDes.endSymbolLen) 15 | } else { 16 | const newContent = oldContent.substring(0, startPosition) + insertDes.updateStart + oldContent.substring(startPosition, endPosition) + insertDes.updateEnd + oldContent.substring(endPosition, oldContent.length) 17 | 18 | inputer.value = newContent 19 | 20 | const len = endPosition + insertDes.updateEnd.length + insertDes.updateStart.length 21 | inputer.setSelectionRange(len,len) 22 | } 23 | } -------------------------------------------------------------------------------- /static/markdown.less: -------------------------------------------------------------------------------- 1 | @font-family: Microsoft Yahei, "PingHei", "Helvetica Neue", "Helvetica", "STHeitiSC-Light", "Arial", sans-serif; 2 | table{ 3 | border-right:1px solid #ccc; 4 | border-bottom:1px solid #ccc; 5 | margin: 10px; 6 | td, 7 | th { 8 | padding: 5px 10px; 9 | border-left:1px solid #ccc; 10 | border-top:1px solid #ccc; 11 | } 12 | } 13 | 14 | code { 15 | padding: 2px 4px; 16 | font-size: 90%; 17 | font-family: monospace; 18 | color: #c7254e; 19 | background-color: #f9f2f4; 20 | border-radius: 4px; 21 | } 22 | 23 | pre { 24 | display: block; 25 | padding: 9.5px; 26 | margin: 0 0 10px; 27 | font-size: 13px; 28 | font-family: inherit; 29 | line-height: 1.42857143; 30 | color: #333; 31 | word-break: break-all; 32 | word-wrap: break-word; 33 | background-color: #f5f5f5; 34 | border: 1px solid #ccc; 35 | border-radius: 4px; 36 | code { 37 | padding: 0; 38 | font-size: inherit; 39 | color: inherit; 40 | white-space: pre-wrap; 41 | background-color: transparent; 42 | border-radius: 0; 43 | } 44 | } 45 | 46 | blockquote { 47 | padding: 10px 20px; 48 | margin: 0 0 20px; 49 | font-size: 17.5px; 50 | border-left: 5px solid #ccc; 51 | p { 52 | margin: 0; 53 | } 54 | } 55 | 56 | a { 57 | color: #009688; 58 | } 59 | 60 | hr { 61 | margin-top: 20px; 62 | margin-bottom: 20px; 63 | border: 0; 64 | border-top: 1px solid #ccc; 65 | } -------------------------------------------------------------------------------- /vuex/readme.js: -------------------------------------------------------------------------------- 1 | const text = '## Welcome to SilkDown' + 2 | '\n'+ 3 | '\n'+ 4 | '> :lollipop::lollipop::lollipop: **SilkDown is a beautiful and powerful markdown editor** ' + 5 | '\n'+ 6 | '\n'+ 7 | '![](http://oiwfsj4xe.bkt.clouddn.com/logo_silkdown.jpg)' + 8 | '\n'+ 9 | '\n'+ 10 | '![](http://oiwfsj4xe.bkt.clouddn.com/slogan.png) ' + 11 | '\n'+ 12 | '\n'+ 13 | '\n'+ 14 | '\n'+ 15 | '## Features ' + 16 | '\n'+ 17 | '\n'+ 18 | '- Real-time HTML preview ' + 19 | '\n'+ 20 | '\n'+ 21 | '- Markdown Extra/GitHub Flavored Markdown support ' + 22 | '\n'+ 23 | '\n'+ 24 | '- Todo lists support ' + 25 | '\n'+ 26 | '\n'+ 27 | '- Unicode Emoji support :kissing_heart: :dart: ' + 28 | '\n'+ 29 | '\n'+ 30 | '- Smart layout ' + 31 | '\n'+ 32 | '\n'+ 33 | '- Offline editing ' + 34 | '\n'+ 35 | '\n'+ 36 | '- Save HTML file support ' + 37 | '\n'+ 38 | '\n'+ 39 | '- Save markdown file support ' + 40 | '\n'+ 41 | '\n'+ 42 | '- Theme day/night support ' + 43 | '\n'+ 44 | '- Fullscreen preview/edit support' + 45 | '\n'+ 46 | '\n'+ 47 | '## ToDos ' + 48 | '\n'+ 49 | '\n'+ 50 | '- [ ] Google Drive support ' + 51 | '\n'+ 52 | '\n'+ 53 | '- [ ] qiniu cloud Support ' + 54 | '\n'+ 55 | '\n'+ 56 | '## Preview' + 57 | '\n'+ 58 | '\n'+ 59 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot1.png)' + 60 | '\n'+ 61 | '\n'+ 62 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot2.png)' + 63 | '\n'+ 64 | '\n'+ 65 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot3.png)' + 66 | '\n'+ 67 | '\n'+ 68 | '## Run and Build' + 69 | '\n'+ 70 | '\n'+ 71 | '```shell' + 72 | '\n'+ 73 | '\n'+ 74 | 'git clone https://github.com/huruji/SilkDown.git' + 75 | '\n'+ 76 | '\n'+ 77 | 'cd SilkDown & yarn' + 78 | '\n'+ 79 | '\n'+ 80 | 'yarn run dev' + 81 | '\n'+ 82 | '\n'+ 83 | '// or' + 84 | '\n'+ 85 | '\n'+ 86 | 'yarn run build' + 87 | '\n'+ 88 | '\n'+ 89 | '```' + 90 | '\n'+ 91 | '\n'+ 92 | '## How to contribute' + 93 | '\n'+ 94 | '\n'+ 95 | 'you can open [issues](https://github.com/huruji/SilkDown/issues/new) or make [pull requests](https://github.com/huruji/SilkDown/pulls), just enjoy!' + 96 | '\n'+ 97 | '\n'+ 98 | '## Contact ' + 99 | '\n'+ 100 | '\n'+ 101 | '- **:e-mail: E-mail**: huruji3@foxmail.com ' + 102 | '\n'+ 103 | '\n'+ 104 | '- **wechat**' + 105 | '\n'+ 106 | '\n'+ 107 | '![](http://oiwfsj4xe.bkt.clouddn.com/wechat.png)' + 108 | '\n'+ 109 | '\n'+ 110 | '## Thanks' + 111 | '\n'+ 112 | '\n'+ 113 | "This project is based on [markcook](https://github.com/jrainlau/markcook),thanks for [jrainlau](https://github.com/jrainlau)'s work." + 114 | '\n'+ 115 | '\n'+ 116 | '## License' + 117 | '\n'+ 118 | '\n'+ 119 | 'MIT'+ 120 | '\n'; 121 | ; 122 | 123 | 124 | export default text -------------------------------------------------------------------------------- /vuex/readme_zh.js: -------------------------------------------------------------------------------- 1 | const text = '## 欢迎来到SilkDown' + 2 | '\n'+ 3 | '\n'+ 4 | '> :lollipop::lollipop::lollipop: **SilkDown 是一款界面优美、功能强大的 markdown 编辑器** ' + 5 | '\n'+ 6 | '\n'+ 7 | '![](http://oiwfsj4xe.bkt.clouddn.com/logo_silkdown.jpg)' + 8 | '\n'+ 9 | '\n'+ 10 | '![](http://oiwfsj4xe.bkt.clouddn.com/slogan.png) ' + 11 | '\n'+ 12 | '\n'+ 13 | '\n'+ 14 | '\n'+ 15 | '## 特性 ' + 16 | '\n'+ 17 | '\n'+ 18 | '- 实时预览 ' + 19 | '\n'+ 20 | '\n'+ 21 | '- 支持 Gtihub markdown 特性 ' + 22 | '\n'+ 23 | '\n'+ 24 | '- 支持 todo lists ' + 25 | '\n'+ 26 | '\n'+ 27 | '- 支持 unicode 表情:kissing_heart: :dart: ' + 28 | '\n'+ 29 | '\n'+ 30 | '- 优美的布局 ' + 31 | '\n'+ 32 | '\n'+ 33 | '- 离线编辑 ' + 34 | '\n'+ 35 | '\n'+ 36 | '- 支持保存为 HTML 文件 ' + 37 | '\n'+ 38 | '\n'+ 39 | '- 支持保存为 markdown 文件 ' + 40 | '\n'+ 41 | '\n'+ 42 | '- 支持白天/夜间两种主题 ' + 43 | '\n'+ 44 | '\n'+ 45 | '- 支持全屏阅览/编辑 ' + 46 | '\n'+ 47 | '\n'+ 48 | '## ToDos ' + 49 | '\n'+ 50 | '\n'+ 51 | '- [ ] 支持 Google Drive ' + 52 | '\n'+ 53 | '\n'+ 54 | '- [ ] 支持七牛云 ' + 55 | '\n'+ 56 | '\n'+ 57 | '## 效果预览' + 58 | '\n'+ 59 | '\n'+ 60 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot1.png)' + 61 | '\n'+ 62 | '\n'+ 63 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot2.png)' + 64 | '\n'+ 65 | '\n'+ 66 | '![](http://oiwfsj4xe.bkt.clouddn.com/shoot3.png)' + 67 | '\n'+ 68 | '\n'+ 69 | '## Run and Build' + 70 | '\n'+ 71 | '\n'+ 72 | '```shell' + 73 | '\n'+ 74 | '\n'+ 75 | 'git clone https://github.com/huruji/SilkDown.git' + 76 | '\n'+ 77 | '\n'+ 78 | 'cd SilkDown & yarn' + 79 | '\n'+ 80 | '\n'+ 81 | 'yarn run dev' + 82 | '\n'+ 83 | '\n'+ 84 | '// or' + 85 | '\n'+ 86 | '\n'+ 87 | 'yarn run build' + 88 | '\n'+ 89 | '\n'+ 90 | '```' + 91 | '\n'+ 92 | '\n'+ 93 | '## How to contribute' + 94 | '\n'+ 95 | '\n'+ 96 | '欢迎你提出[issues](https://github.com/huruji/SilkDown/issues/new) 或者直接提[pull requests](https://github.com/huruji/SilkDown/pulls)。' + 97 | '\n'+ 98 | '\n'+ 99 | '## 联系我 ' + 100 | '\n'+ 101 | '\n'+ 102 | '- **:e-mail: E-mail**: huruji3@foxmail.com ' + 103 | '\n'+ 104 | '\n'+ 105 | '- **微信**' + 106 | '\n'+ 107 | '\n'+ 108 | '![](http://oiwfsj4xe.bkt.clouddn.com/wechat.png)' + 109 | '\n'+ 110 | '\n'+ 111 | '## Thanks' + 112 | '\n'+ 113 | '\n'+ 114 | "这个项目是基于项目[markcook](https://github.com/jrainlau/markcook)开发的,感谢[jrainlau](https://github.com/jrainlau)所做的工作。" + 115 | '\n'+ 116 | '\n'+ 117 | '## License' + 118 | '\n'+ 119 | '\n'+ 120 | 'MIT' 121 | +'\n'; 122 | 123 | export default text -------------------------------------------------------------------------------- /vuex/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import twemoji from 'twemoji' 4 | import md from './../src/markdownConf.js' 5 | import readme from './readme.js' 6 | import readmeZh from './readme_zh.js' 7 | 8 | Vue.use(Vuex) 9 | 10 | const createID = () => { 11 | let t = '' 12 | for(let i = 0; i < 15; i++) { 13 | t += Math.floor(Math.random() * 10) 14 | } 15 | return t 16 | } 17 | 18 | const saveID = (state) => { 19 | let idArr = [] 20 | for (let i = 0, len = state.articleList.length; i < len; i++) { 21 | idArr.push(state.articleList[i].id) 22 | localStorage.setItem('idArr', idArr.join(',')) 23 | } 24 | } 25 | 26 | export default new Vuex.Store({ 27 | state: { 28 | showMenu: true, 29 | fullscreen: false, 30 | preview: false, 31 | articleList: [ 32 | { 33 | id: createID(), 34 | content: 'Untitled\n---\n', 35 | current: true 36 | } 37 | ], 38 | theme: null, 39 | firstView: localStorage.getItem('first') !== null ? false : true 40 | }, 41 | mutations: { 42 | CHANGE_THEME(state){ 43 | if(state.theme === 'theme-day') { 44 | state.theme = 'theme-night' 45 | } else { 46 | state.theme = 'theme-day' 47 | } 48 | localStorage.setItem('theme', state.theme); 49 | }, 50 | INITILIZE(state){ 51 | state.theme = localStorage.getItem('theme') ? localStorage.getItem('theme') : 'theme-night'; 52 | localStorage.setItem('theme', state.theme); 53 | if(state.firstView && state.articleList.length === 1) { 54 | let language = window.navigator.browserLanguage ? window.navigator.browserLanguage: window.navigator.language; 55 | let text = ""; 56 | if(~language.indexOf('zh')){ 57 | text = readmeZh; 58 | } else { 59 | text = readme; 60 | } 61 | for (let i = 0, len = state.articleList.length; i < len; i++) { 62 | if (state.articleList[i].current) { 63 | state.articleList[i].content = text 64 | } 65 | } 66 | 67 | localStorage.setItem('first', false); 68 | state.firstView = false; 69 | } 70 | 71 | }, 72 | SHOW_MENU (state) { 73 | state.showMenu = !state.showMenu 74 | }, 75 | TEXT_INPUT (state, txt) { 76 | for (let i = 0, len = state.articleList.length; i < len; i++) { 77 | if (state.articleList[i].current) { 78 | state.articleList[i].content = txt 79 | } 80 | } 81 | }, 82 | SAVE_TO_CACHE (state) { 83 | localStorage.setItem('articleList', JSON.stringify(state.articleList)) 84 | // for (let i = 0, len = state.articleList.length; i < len; i++) { 85 | // if (state.articleList[i].current) { 86 | // localStorage.setItem(state.articleList[i].id, state.articleList[i].content) 87 | // saveID(state) 88 | // } 89 | // } 90 | }, 91 | READ_FROM_CACHE (state) { 92 | for (let i = 0, len = state.articleList.length; i < len; i++) { 93 | if (state.articleList[i].current) { 94 | state.articleList[i].content = localStorage.getItem(state.articleList[i].id) 95 | } 96 | } 97 | }, 98 | SELECT_THIS (state, index) { 99 | for (let i = 0, len = state.articleList.length; i < len; i++) { 100 | state.articleList[i].current = false 101 | } 102 | state.articleList[index].current = true 103 | }, 104 | NEW_ARTICLE (state) { 105 | for (let i = 0, len = state.articleList.length; i < len; i++) { 106 | state.articleList[i].current = false 107 | } 108 | 109 | let newOne = { 110 | id: createID(), 111 | content: 'Untitled\n---', 112 | current: true 113 | } 114 | 115 | state.articleList.push(newOne) 116 | }, 117 | DELETE_THIS (state, index) { 118 | if (state.articleList.length > 1) { 119 | 120 | state.articleList.splice(index, 1) 121 | 122 | localStorage.setItem('articleList', JSON.stringify(state.articleList)) 123 | 124 | if(!state.articleList.some(e => e.current)){ 125 | state.articleList[0].current = true 126 | } 127 | } 128 | }, 129 | READ_LIST_FROM_LOCAL (state) { 130 | if(localStorage.getItem('articleList')) { 131 | state.articleList = null; 132 | let articles = []; 133 | articles = articles.concat(JSON.parse(localStorage.getItem('articleList'))); 134 | state.articleList = articles; 135 | } 136 | }, 137 | FULLSCREEN(state) { 138 | state.fullscreen = !state.fullscreen; 139 | if(state.fullscreen && state.preview) { 140 | state.preview = !state.preview 141 | } 142 | }, 143 | PREVIEW(state){ 144 | state.preview = !state.preview; 145 | if(state.fullscreen && state.preview) { 146 | state.fullscreen = !state.fullscreen; 147 | } 148 | } 149 | }, 150 | actions: { 151 | showMenu ({ commit }) { 152 | commit('SHOW_MENU') 153 | }, 154 | textInput ({ commit }, txt) { 155 | commit('TEXT_INPUT', txt) 156 | }, 157 | selectThis ({ commit }, index) { 158 | commit('SELECT_THIS', index) 159 | }, 160 | newArticle ({ commit }) { 161 | commit('NEW_ARTICLE') 162 | commit('SAVE_TO_CACHE') 163 | }, 164 | deleteThis ({ commit }, index) { 165 | commit('DELETE_THIS', index) 166 | }, 167 | saveToCache ({ commit }) { 168 | commit('SAVE_TO_CACHE') 169 | }, 170 | readFromCache ({ commit }) { 171 | commit('READ_FROM_CACHE') 172 | }, 173 | loadCache ({ commit }) { 174 | commit('READ_LIST_FROM_LOCAL') 175 | } 176 | }, 177 | getters: { 178 | articleRaw: state => { 179 | let content = '' 180 | for (let i = 0, len = state.articleList.length; i < len; i++) { 181 | if (state.articleList[i].current) { 182 | content = state.articleList[i].content 183 | } 184 | } 185 | return content 186 | }, 187 | articleMd: (state, getters) => { 188 | return md.render(getters.articleRaw) 189 | }, 190 | articleList: state => { 191 | return state.articleList 192 | }, 193 | articleLineRaw: (state, getters) => { 194 | return getters.articleRaw.split('\n') 195 | } 196 | } 197 | }) -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const offlinePlugin = require('offline-plugin') 4 | const cleanWebpackPlugin = require('clean-webpack-plugin') 5 | const htmlWebpackPlugin = require('html-webpack-plugin') 6 | const copyWebpackPlugin = require('copy-webpack-plugin') 7 | 8 | module.exports = { 9 | entry: './src/main.js', 10 | output: { 11 | path: path.resolve(__dirname, './docs'), 12 | filename: 'build.js' 13 | }, 14 | module: { 15 | rules: [ 16 | { 17 | test: /\.vue$/, 18 | loader: 'vue-loader' 19 | }, 20 | { 21 | test: /\.js$/, 22 | loader: 'babel-loader', 23 | exclude: /node_modules/ 24 | }, 25 | { 26 | test: /\.(png|jpg|gif|svg)$/, 27 | loader: 'file-loader', 28 | options: { 29 | name: '[name].[ext]?[hash]' 30 | } 31 | } 32 | ] 33 | }, 34 | resolve: { 35 | alias: { 36 | 'vue$': 'vue/dist/vue.esm.js' 37 | } 38 | }, 39 | devServer: { 40 | historyApiFallback: true, 41 | noInfo: true 42 | }, 43 | performance: { 44 | hints: false 45 | }, 46 | devtool: '#eval-source-map' 47 | } 48 | 49 | if (process.env.NODE_ENV === 'production') { 50 | module.exports.devtool = '#source-map' 51 | module.exports.output = { 52 | path: path.resolve(__dirname, './docs'), 53 | filename: '[name].[hash].js' 54 | } 55 | module.exports.plugins = (module.exports.plugins || []).concat([ 56 | new webpack.DefinePlugin({ 57 | 'process.env': { 58 | NODE_ENV: '"production"' 59 | } 60 | }), 61 | new webpack.optimize.UglifyJsPlugin({ 62 | sourceMap: true, 63 | compress: { 64 | warnings: false 65 | } 66 | }), 67 | new webpack.LoaderOptionsPlugin({ 68 | minimize: true 69 | }), 70 | new htmlWebpackPlugin({ 71 | filename: 'index.html', 72 | template: 'index.tpl', 73 | inject: true, 74 | minify: { 75 | // removeComments: true, 76 | // collapseWhitespace: true, 77 | // removeAttributeQuotes: true 78 | }, 79 | chunks: ['main'], 80 | chunksSortMode: 'dependency' 81 | }), 82 | new cleanWebpackPlugin(['docs'], { 83 | root: path.resolve('./') 84 | }), 85 | new copyWebpackPlugin([ 86 | { from: './img/favicon.ico', to: 'favicon.ico'} 87 | ]), 88 | new offlinePlugin({ 89 | Caches: { 90 | main: [ 91 | 'index.html', 92 | '**.js' 93 | ], 94 | additional: [':externals:'] 95 | }, 96 | externals: [ 97 | 'https://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css', 98 | 'https://cdn.bootcss.com/highlight.js/9.7.0/styles/atom-one-dark.min.css' 99 | ], 100 | ServiceWorker: { 101 | events: true 102 | }, 103 | AppCache: null 104 | }) 105 | ]) 106 | } 107 | --------------------------------------------------------------------------------