├── .gitignore ├── .node-version ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── assets ├── demo.gif ├── title.png └── ui.png ├── bin └── markn ├── circle.yml ├── example ├── emoji-activity.md ├── emoji-celebration.md ├── emoji-flags.md ├── emoji-food-and-drink.md ├── emoji-nature.md ├── emoji-objects-and-symbols.md ├── emoji-people.md ├── emoji-travel-and-places.md ├── highlight.md ├── huge.js ├── huge.md └── index.md ├── gulpfile.babel.js ├── package.json └── src ├── common └── file.js ├── icon ├── icon.svg ├── markn.icns └── markn.ico ├── main ├── events.js ├── main.js ├── mediator.js ├── menu.js ├── storage.js ├── util.js └── window.js ├── renderer ├── actions │ ├── app.js │ ├── history.js │ ├── markdown.js │ ├── menu.js │ ├── scroll.js │ └── search.js ├── dispatcher.js ├── index.js ├── stores │ ├── file.js │ ├── history.js │ ├── scroll.js │ ├── search.js │ └── window.js └── views │ ├── body.js │ ├── head.js │ ├── markdown.js │ ├── nav.js │ ├── rail.js │ ├── root.js │ └── search.js └── static ├── emoji.styl ├── index.jade └── index.styl /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Domain 30 | .DS_Store 31 | .idea 32 | app 33 | tmp 34 | build 35 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | iojs-v2.3.1 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Environment 4 | 5 | ```bash 6 | npm install 7 | ``` 8 | 9 | ## Debugging 10 | 11 | ```bash 12 | npm run debug 13 | ``` 14 | 15 | ## Release to github releases (Only Owner or Collaborator) 16 | 17 | requires github oauth `TOKEN`. 18 | 19 | 1. Install wine with `brew install wine`. 20 | 2. Then: 21 | 22 | - major release: `TOKEN=xxxxxxxxxxxx gulp publish -r major` 23 | - minor release: `TOKEN=xxxxxxxxxxxx gulp publish -r minor` 24 | - patch release: `TOKEN=xxxxxxxxxxxx gulp publish -r patch` or just `token=xxxxxxxxxxxx gulp publish` 25 | 26 | ## Publish to npm (Only Owner) 27 | 28 | ```bash 29 | npm run publish 30 | ``` 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Daisuke Mino 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ![Markn](assets/title.png) 2 | 3 | Lightweight markdown viewer. 4 | 5 | ## Features 6 | 7 | - Only viewer. 8 | - You may use any editor you like. 9 | - Live reload. 10 | - Re-render only changed elements. 11 | - Possible to preview huge markdown while editing. 12 | - Scroll position won't be changed while editing. 13 | - Search text. 14 | - With regular expression. 15 | - Load local images. 16 | - Open a link to markdown in this application. 17 | 18 | ## Screenshot 19 | 20 | ![Demo](assets/demo.gif) 21 | 22 | ## Installation 23 | 24 | 1. Download zipped file from [latest release](https://github.com/minodisk/markn/releases/latest) and unzip it. 25 | 1. Double click Markn/Markn.app/Markn.exe. 26 | 27 | ## Components 28 | 29 | Consists of awesome modules. 30 | 31 | - [atom/electron](https://github.com/atom/electron)-based application. 32 | - Render HTML with [facebook/react](https://github.com/facebook/react). 33 | - Generate react elements from markdown AST with [mizchi/md2react](https://github.com/mizchi/md2react). 34 | - Generate markdown AST from markdown with [wooorm/mdast](https://github.com/wooorm/mdast). 35 | - Watch file with [paulmillr/chokidar](https://github.com/paulmillr/chokidar). 36 | - Style with [sindresorhus/github-markdown-css](https://github.com/sindresorhus/github-markdown-css). 37 | - Render some icons in [FortAwesome/Font-Awesome](https://github.com/FortAwesome/Font-Awesome). 38 | - Render emoji with [Ranks/emojione](https://github.com/Ranks/emojione). 39 | - Highlight code with [isagalaev/highlight.js](https://github.com/isagalaev/highlight.js) 40 | -------------------------------------------------------------------------------- /assets/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minodisk/markn/8e21951e10fd933953790289fd1cace24dcd04d9/assets/demo.gif -------------------------------------------------------------------------------- /assets/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minodisk/markn/8e21951e10fd933953790289fd1cace24dcd04d9/assets/title.png -------------------------------------------------------------------------------- /assets/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minodisk/markn/8e21951e10fd933953790289fd1cace24dcd04d9/assets/ui.png -------------------------------------------------------------------------------- /bin/markn: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var path = require('path'); 4 | var argv = require('yargs') 5 | .usage('Usage: markn [path]') 6 | .example('markn', 'Run Markn') 7 | .example('markn foo.md', 'Open the markdown file with Markn') 8 | .help('h') 9 | .alias('h', 'help') 10 | .argv; 11 | 12 | var spawn = require('child_process').spawn; 13 | 14 | var platform = process.platform; 15 | var arch = process.arch; 16 | var app = path.join(__dirname, '../build/Markn-' + platform + '-' + arch + '/'); 17 | 18 | var cmd, args; 19 | 20 | switch (platform) { 21 | case 'darwin': 22 | app += 'Markn.app/Contents/MacOS/Electron'; 23 | cmd = app 24 | args = argv._ 25 | break; 26 | case 'linux': 27 | app += 'Markn'; 28 | cmd = app; 29 | args = argv._; 30 | break; 31 | case 'win32': 32 | app += 'Markn.exe'; 33 | cmd = app; 34 | args = argv._; 35 | break; 36 | default: 37 | console.error('Unsupported platform:', platform); 38 | process.exit(1); 39 | break; 40 | } 41 | 42 | console.log('spawn:', cmd, args); 43 | var Markn = spawn(cmd, args); 44 | Markn.stdout.on('data', function (data) { 45 | console.log(data.toString('utf8')); 46 | }); 47 | Markn.stderr.on('data', function (data) { 48 | console.error(data.toString('utf8')); 49 | }); 50 | Markn.on('close', function (code) { 51 | console.log('closed:', code); 52 | }); 53 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | post: 3 | - npm run build 4 | -------------------------------------------------------------------------------- /example/emoji-activity.md: -------------------------------------------------------------------------------- 1 | # Emoji: Activity 2 | 3 | - `runner`: :runner: 4 | - `walking`: :walking: 5 | - `dancer`: :dancer: 6 | - `weight_lifter`: :weight_lifter: 7 | - `lifter`: :lifter: 8 | - `golfer`: :golfer: 9 | - `rowboat`: :rowboat: 10 | - `swimmer`: :swimmer: 11 | - `surfer`: :surfer: 12 | - `bath`: :bath: 13 | - `snowboarder`: :snowboarder: 14 | - `ski`: :ski: 15 | - `snowman`: :snowman: 16 | - `bicyclist`: :bicyclist: 17 | - `mountain_bicyclist`: :mountain_bicyclist: 18 | - `racing_motorcycle`: :racing_motorcycle: 19 | - `motorcycle`: :motorcycle: 20 | - `racing_car`: :racing_car: 21 | - `race_car`: :race_car: 22 | - `horse_racing`: :horse_racing: 23 | - `tent`: :tent: 24 | - `fishing_pole_and_fish`: :fishing_pole_and_fish: 25 | - `soccer`: :soccer: 26 | - `basketball`: :basketball: 27 | - `football`: :football: 28 | - `baseball`: :baseball: 29 | - `tennis`: :tennis: 30 | - `rugby_football`: :rugby_football: 31 | - `golf`: :golf: 32 | - `trophy`: :trophy: 33 | - `sports_medal`: :sports_medal: 34 | - `medal`: :medal: 35 | - `running_shirt_with_sash`: :running_shirt_with_sash: 36 | - `checkered_flag`: :checkered_flag: 37 | - `musical_keyboard`: :musical_keyboard: 38 | - `guitar`: :guitar: 39 | - `violin`: :violin: 40 | - `saxophone`: :saxophone: 41 | - `trumpet`: :trumpet: 42 | - `musical_note`: :musical_note: 43 | - `notes`: :notes: 44 | - `musical_score`: :musical_score: 45 | - `headphones`: :headphones: 46 | - `microphone`: :microphone: 47 | - `performing_arts`: :performing_arts: 48 | - `ticket`: :ticket: 49 | - `tophat`: :tophat: 50 | - `circus_tent`: :circus_tent: 51 | - `clapper`: :clapper: 52 | - `film_frames`: :film_frames: 53 | - `admission_tickets`: :admission_tickets: 54 | - `tickets`: :tickets: 55 | - `art`: :art: 56 | - `dart`: :dart: 57 | - `8ball`: :8ball: 58 | - `bowling`: :bowling: 59 | - `slot_machine`: :slot_machine: 60 | - `game_die`: :game_die: 61 | - `video_game`: :video_game: 62 | - `flower_playing_cards`: :flower_playing_cards: 63 | - `black_joker`: :black_joker: 64 | - `mahjong`: :mahjong: 65 | - `carousel_horse`: :carousel_horse: 66 | - `ferris_wheel`: :ferris_wheel: 67 | - `roller_coaster`: :roller_coaster: 68 | -------------------------------------------------------------------------------- /example/emoji-celebration.md: -------------------------------------------------------------------------------- 1 | # Emoji: Celebration 2 | 3 | - `ribbon`: :ribbon: 4 | - `gift`: :gift: 5 | - `birthday`: :birthday: 6 | - `jack_o_lantern`: :jack_o_lantern: 7 | - `christmas_tree`: :christmas_tree: 8 | - `tanabata_tree`: :tanabata_tree: 9 | - `bamboo`: :bamboo: 10 | - `rice_scene`: :rice_scene: 11 | - `fireworks`: :fireworks: 12 | - `sparkler`: :sparkler: 13 | - `tada`: :tada: 14 | - `confetti_ball`: :confetti_ball: 15 | - `balloon`: :balloon: 16 | - `dizzy`: :dizzy: 17 | - `sparkles`: :sparkles: 18 | - `boom`: :boom: 19 | - `mortar_board`: :mortar_board: 20 | - `crown`: :crown: 21 | - `reminder_ribbon`: :reminder_ribbon: 22 | - `military_medal`: :military_medal: 23 | - `dolls`: :dolls: 24 | - `flags`: :flags: 25 | - `wind_chime`: :wind_chime: 26 | - `crossed_flags`: :crossed_flags: 27 | - `izakaya_lantern`: :izakaya_lantern: 28 | - `ring`: :ring: 29 | - `bouquet_of_flowers`: :bouquet_of_flowers: 30 | - `bouquet2`: :bouquet2: 31 | - `heart`: :heart: 32 | - `broken_heart`: :broken_heart: 33 | - `love_letter`: :love_letter: 34 | - `two_hearts`: :two_hearts: 35 | - `revolving_hearts`: :revolving_hearts: 36 | - `heartbeat`: :heartbeat: 37 | - `heartpulse`: :heartpulse: 38 | - `sparkling_heart`: :sparkling_heart: 39 | - `cupid`: :cupid: 40 | - `gift_heart`: :gift_heart: 41 | - `heart_with_tip_on_the_left`: :heart_with_tip_on_the_left: 42 | - `heart_tip`: :heart_tip: 43 | - `heart_decoration`: :heart_decoration: 44 | - `purple_heart`: :purple_heart: 45 | - `yellow_heart`: :yellow_heart: 46 | - `green_heart`: :green_heart: 47 | - `blue_heart`: :blue_heart: 48 | -------------------------------------------------------------------------------- /example/emoji-flags.md: -------------------------------------------------------------------------------- 1 | # Emoji: Flags 2 | 3 | - `au`: :au: 4 | - `flag_au`: :flag_au: 5 | - `at`: :at: 6 | - `flag_at`: :flag_at: 7 | - `be`: :be: 8 | - `flag_be`: :flag_be: 9 | - `br`: :br: 10 | - `flag_br`: :flag_br: 11 | - `ca`: :ca: 12 | - `flag_ca`: :flag_ca: 13 | - `chile`: :chile: 14 | - `flag_cl`: :flag_cl: 15 | - `cn`: :cn: 16 | - `flag_cn`: :flag_cn: 17 | - `co`: :co: 18 | - `flag_co`: :flag_co: 19 | - `dk`: :dk: 20 | - `flag_dk`: :flag_dk: 21 | - `fi`: :fi: 22 | - `flag_fi`: :flag_fi: 23 | - `fr`: :fr: 24 | - `flag_fr`: :flag_fr: 25 | - `de`: :de: 26 | - `flag_de`: :flag_de: 27 | - `hk`: :hk: 28 | - `flag_hk`: :flag_hk: 29 | - `in`: :in: 30 | - `flag_in`: :flag_in: 31 | - `indonesia`: :indonesia: 32 | - `flag_id`: :flag_id: 33 | - `ie`: :ie: 34 | - `flag_ie`: :flag_ie: 35 | - `il`: :il: 36 | - `flag_il`: :flag_il: 37 | - `it`: :it: 38 | - `flag_it`: :flag_it: 39 | - `jp`: :jp: 40 | - `flag_jp`: :flag_jp: 41 | - `kr`: :kr: 42 | - `flag_kr`: :flag_kr: 43 | - `mo`: :mo: 44 | - `flag_mo`: :flag_mo: 45 | - `my`: :my: 46 | - `flag_my`: :flag_my: 47 | - `mx`: :mx: 48 | - `flag_mx`: :flag_mx: 49 | - `nl`: :nl: 50 | - `flag_nl`: :flag_nl: 51 | - `nz`: :nz: 52 | - `flag_nz`: :flag_nz: 53 | - `no`: :no: 54 | - `flag_no`: :flag_no: 55 | - `ph`: :ph: 56 | - `flag_ph`: :flag_ph: 57 | - `pl`: :pl: 58 | - `flag_pl`: :flag_pl: 59 | - `pt`: :pt: 60 | - `flag_pt`: :flag_pt: 61 | - `pr`: :pr: 62 | - `flag_pr`: :flag_pr: 63 | - `ru`: :ru: 64 | - `flag_ru`: :flag_ru: 65 | - `saudi`: :saudi: 66 | - `saudiarabia`: :saudiarabia: 67 | - `flag_sa`: :flag_sa: 68 | - `sg`: :sg: 69 | - `flag_sg`: :flag_sg: 70 | - `za`: :za: 71 | - `flag_za`: :flag_za: 72 | - `es`: :es: 73 | - `flag_es`: :flag_es: 74 | - `se`: :se: 75 | - `flag_se`: :flag_se: 76 | - `ch`: :ch: 77 | - `flag_ch`: :flag_ch: 78 | - `tr`: :tr: 79 | - `flag_tr`: :flag_tr: 80 | - `gb`: :gb: 81 | - `flag_gb`: :flag_gb: 82 | - `us`: :us: 83 | - `flag_us`: :flag_us: 84 | - `ae`: :ae: 85 | - `flag_ae`: :flag_ae: 86 | - `vn`: :vn: 87 | - `flag_vn`: :flag_vn: 88 | - `af`: :af: 89 | - `flag_af`: :flag_af: 90 | - `al`: :al: 91 | - `flag_al`: :flag_al: 92 | - `dz`: :dz: 93 | - `flag_dz`: :flag_dz: 94 | - `ad`: :ad: 95 | - `flag_ad`: :flag_ad: 96 | - `ao`: :ao: 97 | - `flag_ao`: :flag_ao: 98 | - `ai`: :ai: 99 | - `flag_ai`: :flag_ai: 100 | - `ag`: :ag: 101 | - `flag_ag`: :flag_ag: 102 | - `ar`: :ar: 103 | - `flag_ar`: :flag_ar: 104 | - `am`: :am: 105 | - `flag_am`: :flag_am: 106 | - `aw`: :aw: 107 | - `flag_aw`: :flag_aw: 108 | - `ac`: :ac: 109 | - `flag_ac`: :flag_ac: 110 | - `az`: :az: 111 | - `flag_az`: :flag_az: 112 | - `bs`: :bs: 113 | - `flag_bs`: :flag_bs: 114 | - `bh`: :bh: 115 | - `flag_bh`: :flag_bh: 116 | - `bd`: :bd: 117 | - `flag_bd`: :flag_bd: 118 | - `bb`: :bb: 119 | - `flag_bb`: :flag_bb: 120 | - `by`: :by: 121 | - `flag_by`: :flag_by: 122 | - `bz`: :bz: 123 | - `flag_bz`: :flag_bz: 124 | - `bj`: :bj: 125 | - `flag_bj`: :flag_bj: 126 | - `bm`: :bm: 127 | - `flag_bm`: :flag_bm: 128 | - `bt`: :bt: 129 | - `flag_bt`: :flag_bt: 130 | - `bo`: :bo: 131 | - `flag_bo`: :flag_bo: 132 | - `ba`: :ba: 133 | - `flag_ba`: :flag_ba: 134 | - `bw`: :bw: 135 | - `flag_bw`: :flag_bw: 136 | - `bn`: :bn: 137 | - `flag_bn`: :flag_bn: 138 | - `bg`: :bg: 139 | - `flag_bg`: :flag_bg: 140 | - `bf`: :bf: 141 | - `flag_bf`: :flag_bf: 142 | - `bi`: :bi: 143 | - `flag_bi`: :flag_bi: 144 | - `kh`: :kh: 145 | - `flag_kh`: :flag_kh: 146 | - `cm`: :cm: 147 | - `flag_cm`: :flag_cm: 148 | - `cv`: :cv: 149 | - `flag_cv`: :flag_cv: 150 | - `ky`: :ky: 151 | - `flag_ky`: :flag_ky: 152 | - `cf`: :cf: 153 | - `flag_cf`: :flag_cf: 154 | - `km`: :km: 155 | - `flag_km`: :flag_km: 156 | - `congo`: :congo: 157 | - `flag_cd`: :flag_cd: 158 | - `cg`: :cg: 159 | - `flag_cg`: :flag_cg: 160 | - `td`: :td: 161 | - `flag_td`: :flag_td: 162 | - `cr`: :cr: 163 | - `flag_cr`: :flag_cr: 164 | - `ci`: :ci: 165 | - `flag_ci`: :flag_ci: 166 | - `hr`: :hr: 167 | - `flag_hr`: :flag_hr: 168 | - `cu`: :cu: 169 | - `flag_cu`: :flag_cu: 170 | - `cy`: :cy: 171 | - `flag_cy`: :flag_cy: 172 | - `cz`: :cz: 173 | - `flag_cz`: :flag_cz: 174 | - `dj`: :dj: 175 | - `flag_dj`: :flag_dj: 176 | - `dm`: :dm: 177 | - `flag_dm`: :flag_dm: 178 | - `do`: :do: 179 | - `flag_do`: :flag_do: 180 | - `tl`: :tl: 181 | - `flag_tl`: :flag_tl: 182 | - `ec`: :ec: 183 | - `flag_ec`: :flag_ec: 184 | - `eg`: :eg: 185 | - `flag_eg`: :flag_eg: 186 | - `sv`: :sv: 187 | - `flag_sv`: :flag_sv: 188 | - `gq`: :gq: 189 | - `flag_gq`: :flag_gq: 190 | - `er`: :er: 191 | - `flag_er`: :flag_er: 192 | - `ee`: :ee: 193 | - `flag_ee`: :flag_ee: 194 | - `et`: :et: 195 | - `flag_et`: :flag_et: 196 | - `fk`: :fk: 197 | - `flag_fk`: :flag_fk: 198 | - `fo`: :fo: 199 | - `flag_fo`: :flag_fo: 200 | - `fj`: :fj: 201 | - `flag_fj`: :flag_fj: 202 | - `pf`: :pf: 203 | - `flag_pf`: :flag_pf: 204 | - `ga`: :ga: 205 | - `flag_ga`: :flag_ga: 206 | - `gm`: :gm: 207 | - `flag_gm`: :flag_gm: 208 | - `ge`: :ge: 209 | - `flag_ge`: :flag_ge: 210 | - `gh`: :gh: 211 | - `flag_gh`: :flag_gh: 212 | - `gi`: :gi: 213 | - `flag_gi`: :flag_gi: 214 | - `gr`: :gr: 215 | - `flag_gr`: :flag_gr: 216 | - `gl`: :gl: 217 | - `flag_gl`: :flag_gl: 218 | - `gd`: :gd: 219 | - `flag_gd`: :flag_gd: 220 | - `gu`: :gu: 221 | - `flag_gu`: :flag_gu: 222 | - `gt`: :gt: 223 | - `flag_gt`: :flag_gt: 224 | - `gn`: :gn: 225 | - `flag_gn`: :flag_gn: 226 | - `gw`: :gw: 227 | - `flag_gw`: :flag_gw: 228 | - `gy`: :gy: 229 | - `flag_gy`: :flag_gy: 230 | - `ht`: :ht: 231 | - `flag_ht`: :flag_ht: 232 | - `hn`: :hn: 233 | - `flag_hn`: :flag_hn: 234 | - `hu`: :hu: 235 | - `flag_hu`: :flag_hu: 236 | - `is`: :is: 237 | - `flag_is`: :flag_is: 238 | - `ir`: :ir: 239 | - `flag_ir`: :flag_ir: 240 | - `iq`: :iq: 241 | - `flag_iq`: :flag_iq: 242 | - `jm`: :jm: 243 | - `flag_jm`: :flag_jm: 244 | - `je`: :je: 245 | - `flag_je`: :flag_je: 246 | - `jo`: :jo: 247 | - `flag_jo`: :flag_jo: 248 | - `kz`: :kz: 249 | - `flag_kz`: :flag_kz: 250 | - `ke`: :ke: 251 | - `flag_ke`: :flag_ke: 252 | - `ki`: :ki: 253 | - `flag_ki`: :flag_ki: 254 | - `xk`: :xk: 255 | - `flag_xk`: :flag_xk: 256 | - `kw`: :kw: 257 | - `flag_kw`: :flag_kw: 258 | - `kg`: :kg: 259 | - `flag_kg`: :flag_kg: 260 | - `la`: :la: 261 | - `flag_la`: :flag_la: 262 | - `lv`: :lv: 263 | - `flag_lv`: :flag_lv: 264 | - `lb`: :lb: 265 | - `flag_lb`: :flag_lb: 266 | - `ls`: :ls: 267 | - `flag_ls`: :flag_ls: 268 | - `lr`: :lr: 269 | - `flag_lr`: :flag_lr: 270 | - `ly`: :ly: 271 | - `flag_ly`: :flag_ly: 272 | - `li`: :li: 273 | - `flag_li`: :flag_li: 274 | - `lt`: :lt: 275 | - `flag_lt`: :flag_lt: 276 | - `lu`: :lu: 277 | - `flag_lu`: :flag_lu: 278 | - `mk`: :mk: 279 | - `flag_mk`: :flag_mk: 280 | - `mg`: :mg: 281 | - `flag_mg`: :flag_mg: 282 | - `mw`: :mw: 283 | - `flag_mw`: :flag_mw: 284 | - `mv`: :mv: 285 | - `flag_mv`: :flag_mv: 286 | - `ml`: :ml: 287 | - `flag_ml`: :flag_ml: 288 | - `mt`: :mt: 289 | - `flag_mt`: :flag_mt: 290 | - `mh`: :mh: 291 | - `flag_mh`: :flag_mh: 292 | - `mr`: :mr: 293 | - `flag_mr`: :flag_mr: 294 | - `mu`: :mu: 295 | - `flag_mu`: :flag_mu: 296 | - `fm`: :fm: 297 | - `flag_fm`: :flag_fm: 298 | - `md`: :md: 299 | - `flag_md`: :flag_md: 300 | - `mc`: :mc: 301 | - `flag_mc`: :flag_mc: 302 | - `mn`: :mn: 303 | - `flag_mn`: :flag_mn: 304 | - `me`: :me: 305 | - `flag_me`: :flag_me: 306 | - `ms`: :ms: 307 | - `flag_ms`: :flag_ms: 308 | - `ma`: :ma: 309 | - `flag_ma`: :flag_ma: 310 | - `mz`: :mz: 311 | - `flag_mz`: :flag_mz: 312 | - `mm`: :mm: 313 | - `flag_mm`: :flag_mm: 314 | - `na`: :na: 315 | - `flag_na`: :flag_na: 316 | - `nr`: :nr: 317 | - `flag_nr`: :flag_nr: 318 | - `np`: :np: 319 | - `flag_np`: :flag_np: 320 | - `nc`: :nc: 321 | - `flag_nc`: :flag_nc: 322 | - `ni`: :ni: 323 | - `flag_ni`: :flag_ni: 324 | - `ne`: :ne: 325 | - `flag_ne`: :flag_ne: 326 | - `nigeria`: :nigeria: 327 | - `flag_ng`: :flag_ng: 328 | - `nu`: :nu: 329 | - `flag_nu`: :flag_nu: 330 | - `kp`: :kp: 331 | - `flag_kp`: :flag_kp: 332 | - `om`: :om: 333 | - `flag_om`: :flag_om: 334 | - `pk`: :pk: 335 | - `flag_pk`: :flag_pk: 336 | - `pw`: :pw: 337 | - `flag_pw`: :flag_pw: 338 | - `ps`: :ps: 339 | - `flag_ps`: :flag_ps: 340 | - `pa`: :pa: 341 | - `flag_pa`: :flag_pa: 342 | - `pg`: :pg: 343 | - `flag_pg`: :flag_pg: 344 | - `py`: :py: 345 | - `flag_py`: :flag_py: 346 | - `pe`: :pe: 347 | - `flag_pe`: :flag_pe: 348 | - `qa`: :qa: 349 | - `flag_qa`: :flag_qa: 350 | - `ro`: :ro: 351 | - `flag_ro`: :flag_ro: 352 | - `rw`: :rw: 353 | - `flag_rw`: :flag_rw: 354 | - `sh`: :sh: 355 | - `flag_sh`: :flag_sh: 356 | - `kn`: :kn: 357 | - `flag_kn`: :flag_kn: 358 | - `lc`: :lc: 359 | - `flag_lc`: :flag_lc: 360 | - `vc`: :vc: 361 | - `flag_vc`: :flag_vc: 362 | - `ws`: :ws: 363 | - `flag_ws`: :flag_ws: 364 | - `sm`: :sm: 365 | - `flag_sm`: :flag_sm: 366 | - `st`: :st: 367 | - `flag_st`: :flag_st: 368 | - `sn`: :sn: 369 | - `flag_sn`: :flag_sn: 370 | - `rs`: :rs: 371 | - `flag_rs`: :flag_rs: 372 | - `sc`: :sc: 373 | - `flag_sc`: :flag_sc: 374 | - `sl`: :sl: 375 | - `flag_sl`: :flag_sl: 376 | - `sk`: :sk: 377 | - `flag_sk`: :flag_sk: 378 | - `si`: :si: 379 | - `flag_si`: :flag_si: 380 | - `sb`: :sb: 381 | - `flag_sb`: :flag_sb: 382 | - `so`: :so: 383 | - `flag_so`: :flag_so: 384 | - `lk`: :lk: 385 | - `flag_lk`: :flag_lk: 386 | - `sd`: :sd: 387 | - `flag_sd`: :flag_sd: 388 | - `sr`: :sr: 389 | - `flag_sr`: :flag_sr: 390 | - `sz`: :sz: 391 | - `flag_sz`: :flag_sz: 392 | - `sy`: :sy: 393 | - `flag_sy`: :flag_sy: 394 | - `tw`: :tw: 395 | - `flag_tw`: :flag_tw: 396 | - `tj`: :tj: 397 | - `flag_tj`: :flag_tj: 398 | - `tz`: :tz: 399 | - `flag_tz`: :flag_tz: 400 | - `th`: :th: 401 | - `flag_th`: :flag_th: 402 | - `tg`: :tg: 403 | - `flag_tg`: :flag_tg: 404 | - `to`: :to: 405 | - `flag_to`: :flag_to: 406 | - `tt`: :tt: 407 | - `flag_tt`: :flag_tt: 408 | - `tn`: :tn: 409 | - `flag_tn`: :flag_tn: 410 | - `turkmenistan`: :turkmenistan: 411 | - `flag_tm`: :flag_tm: 412 | - `tuvalu`: :tuvalu: 413 | - `flag_tv`: :flag_tv: 414 | - `vi`: :vi: 415 | - `flag_vi`: :flag_vi: 416 | - `ug`: :ug: 417 | - `flag_ug`: :flag_ug: 418 | - `ua`: :ua: 419 | - `flag_ua`: :flag_ua: 420 | - `uy`: :uy: 421 | - `flag_uy`: :flag_uy: 422 | - `uz`: :uz: 423 | - `flag_uz`: :flag_uz: 424 | - `vu`: :vu: 425 | - `flag_vu`: :flag_vu: 426 | - `va`: :va: 427 | - `flag_va`: :flag_va: 428 | - `ve`: :ve: 429 | - `flag_ve`: :flag_ve: 430 | - `wf`: :wf: 431 | - `flag_wf`: :flag_wf: 432 | - `eh`: :eh: 433 | - `flag_eh`: :flag_eh: 434 | - `ye`: :ye: 435 | - `flag_ye`: :flag_ye: 436 | - `zm`: :zm: 437 | - `flag_zm`: :flag_zm: 438 | - `zw`: :zw: 439 | - `flag_zw`: :flag_zw: 440 | -------------------------------------------------------------------------------- /example/emoji-food-and-drink.md: -------------------------------------------------------------------------------- 1 | # Emoji: Food and drink 2 | 3 | - `tomato`: :tomato: 4 | - `eggplant`: :eggplant: 5 | - `corn`: :corn: 6 | - `sweet_potato`: :sweet_potato: 7 | - `hot_pepper`: :hot_pepper: 8 | - `grapes`: :grapes: 9 | - `melon`: :melon: 10 | - `watermelon`: :watermelon: 11 | - `tangerine`: :tangerine: 12 | - `lemon`: :lemon: 13 | - `banana`: :banana: 14 | - `pineapple`: :pineapple: 15 | - `apple`: :apple: 16 | - `green_apple`: :green_apple: 17 | - `pear`: :pear: 18 | - `peach`: :peach: 19 | - `cherries`: :cherries: 20 | - `strawberry`: :strawberry: 21 | - `hamburger`: :hamburger: 22 | - `pizza`: :pizza: 23 | - `meat_on_bone`: :meat_on_bone: 24 | - `poultry_leg`: :poultry_leg: 25 | - `rice_cracker`: :rice_cracker: 26 | - `rice_ball`: :rice_ball: 27 | - `rice`: :rice: 28 | - `curry`: :curry: 29 | - `ramen`: :ramen: 30 | - `spaghetti`: :spaghetti: 31 | - `bread`: :bread: 32 | - `fries`: :fries: 33 | - `dango`: :dango: 34 | - `oden`: :oden: 35 | - `sushi`: :sushi: 36 | - `fried_shrimp`: :fried_shrimp: 37 | - `fish_cake`: :fish_cake: 38 | - `icecream`: :icecream: 39 | - `shaved_ice`: :shaved_ice: 40 | - `ice_cream`: :ice_cream: 41 | - `doughnut`: :doughnut: 42 | - `cookie`: :cookie: 43 | - `chocolate_bar`: :chocolate_bar: 44 | - `candy`: :candy: 45 | - `lollipop`: :lollipop: 46 | - `custard`: :custard: 47 | - `honey_pot`: :honey_pot: 48 | - `cake`: :cake: 49 | - `bento`: :bento: 50 | - `stew`: :stew: 51 | - `egg`: :egg: 52 | - `fork_and_knife`: :fork_and_knife: 53 | - `tea`: :tea: 54 | - `coffee`: :coffee: 55 | - `sake`: :sake: 56 | - `wine_glass`: :wine_glass: 57 | - `cocktail`: :cocktail: 58 | - `tropical_drink`: :tropical_drink: 59 | - `beer`: :beer: 60 | - `beers`: :beers: 61 | - `baby_bottle`: :baby_bottle: 62 | -------------------------------------------------------------------------------- /example/emoji-nature.md: -------------------------------------------------------------------------------- 1 | # Emoji: Nature 2 | 3 | - `seedling`: :seedling: 4 | - `evergreen_tree`: :evergreen_tree: 5 | - `deciduous_tree`: :deciduous_tree: 6 | - `palm_tree`: :palm_tree: 7 | - `cactus`: :cactus: 8 | - `tulip`: :tulip: 9 | - `cherry_blossom`: :cherry_blossom: 10 | - `rose`: :rose: 11 | - `hibiscus`: :hibiscus: 12 | - `sunflower`: :sunflower: 13 | - `blossom`: :blossom: 14 | - `bouquet`: :bouquet: 15 | - `ear_of_rice`: :ear_of_rice: 16 | - `herb`: :herb: 17 | - `four_leaf_clover`: :four_leaf_clover: 18 | - `maple_leaf`: :maple_leaf: 19 | - `fallen_leaf`: :fallen_leaf: 20 | - `leaves`: :leaves: 21 | - `mushroom`: :mushroom: 22 | - `chestnut`: :chestnut: 23 | - `rat`: :rat: 24 | - `mouse2`: :mouse2: 25 | - `mouse`: :mouse: 26 | - `hamster`: :hamster: 27 | - `ox`: :ox: 28 | - `water_buffalo`: :water_buffalo: 29 | - `cow2`: :cow2: 30 | - `cow`: :cow: 31 | - `tiger2`: :tiger2: 32 | - `leopard`: :leopard: 33 | - `tiger`: :tiger: 34 | - `chipmunk`: :chipmunk: 35 | - `rabbit2`: :rabbit2: 36 | - `rabbit`: :rabbit: 37 | - `cat2`: :cat2: 38 | - `cat`: :cat: 39 | - `racehorse`: :racehorse: 40 | - `horse`: :horse: 41 | - `ram`: :ram: 42 | - `sheep`: :sheep: 43 | - `goat`: :goat: 44 | - `rooster`: :rooster: 45 | - `chicken`: :chicken: 46 | - `baby_chick`: :baby_chick: 47 | - `hatching_chick`: :hatching_chick: 48 | - `hatched_chick`: :hatched_chick: 49 | - `bird`: :bird: 50 | - `penguin`: :penguin: 51 | - `elephant`: :elephant: 52 | - `dromedary_camel`: :dromedary_camel: 53 | - `camel`: :camel: 54 | - `boar`: :boar: 55 | - `pig2`: :pig2: 56 | - `pig`: :pig: 57 | - `pig_nose`: :pig_nose: 58 | - `dog2`: :dog2: 59 | - `poodle`: :poodle: 60 | - `dog`: :dog: 61 | - `wolf`: :wolf: 62 | - `bear`: :bear: 63 | - `koala`: :koala: 64 | - `panda_face`: :panda_face: 65 | - `monkey_face`: :monkey_face: 66 | - `see_no_evil`: :see_no_evil: 67 | - `hear_no_evil`: :hear_no_evil: 68 | - `speak_no_evil`: :speak_no_evil: 69 | - `monkey`: :monkey: 70 | - `dragon`: :dragon: 71 | - `dragon_face`: :dragon_face: 72 | - `crocodile`: :crocodile: 73 | - `snake`: :snake: 74 | - `turtle`: :turtle: 75 | - `frog`: :frog: 76 | - `whale2`: :whale2: 77 | - `whale`: :whale: 78 | - `dolphin`: :dolphin: 79 | - `octopus`: :octopus: 80 | - `fish`: :fish: 81 | - `tropical_fish`: :tropical_fish: 82 | - `blowfish`: :blowfish: 83 | - `shell`: :shell: 84 | - `snail`: :snail: 85 | - `bug`: :bug: 86 | - `ant`: :ant: 87 | - `bee`: :bee: 88 | - `beetle`: :beetle: 89 | - `spider`: :spider: 90 | - `spider_web`: :spider_web: 91 | - `feet`: :feet: 92 | - `zap`: :zap: 93 | - `flame`: :flame: 94 | - `fire`: :fire: 95 | - `crescent_moon`: :crescent_moon: 96 | - `sunny`: :sunny: 97 | - `partly_sunny`: :partly_sunny: 98 | - `cloud`: :cloud: 99 | - `cloud_with_rain`: :cloud_with_rain: 100 | - `cloud_rain`: :cloud_rain: 101 | - `cloud_with_snow`: :cloud_with_snow: 102 | - `cloud_snow`: :cloud_snow: 103 | - `cloud_with_lightning`: :cloud_with_lightning: 104 | - `cloud_lightning`: :cloud_lightning: 105 | - `cloud_with_tornado`: :cloud_with_tornado: 106 | - `cloud_tornado`: :cloud_tornado: 107 | - `droplet`: :droplet: 108 | - `sweat_drops`: :sweat_drops: 109 | - `umbrella`: :umbrella: 110 | - `fog`: :fog: 111 | - `dash`: :dash: 112 | - `snowflake`: :snowflake: 113 | - `star2`: :star2: 114 | - `star`: :star: 115 | - `stars`: :stars: 116 | - `sunrise_over_mountains`: :sunrise_over_mountains: 117 | - `sunrise`: :sunrise: 118 | - `rainbow`: :rainbow: 119 | - `ocean`: :ocean: 120 | - `volcano`: :volcano: 121 | - `milky_way`: :milky_way: 122 | - `mount_fuji`: :mount_fuji: 123 | - `japan`: :japan: 124 | - `globe_with_meridians`: :globe_with_meridians: 125 | - `earth_africa`: :earth_africa: 126 | - `earth_americas`: :earth_americas: 127 | - `earth_asia`: :earth_asia: 128 | - `new_moon`: :new_moon: 129 | - `waxing_crescent_moon`: :waxing_crescent_moon: 130 | - `first_quarter_moon`: :first_quarter_moon: 131 | - `waxing_gibbous_moon`: :waxing_gibbous_moon: 132 | - `full_moon`: :full_moon: 133 | - `waning_gibbous_moon`: :waning_gibbous_moon: 134 | - `last_quarter_moon`: :last_quarter_moon: 135 | - `waning_crescent_moon`: :waning_crescent_moon: 136 | - `new_moon_with_face`: :new_moon_with_face: 137 | - `full_moon_with_face`: :full_moon_with_face: 138 | - `first_quarter_moon_with_face`: :first_quarter_moon_with_face: 139 | - `last_quarter_moon_with_face`: :last_quarter_moon_with_face: 140 | - `sun_with_face`: :sun_with_face: 141 | - `wind_blowing_face`: :wind_blowing_face: 142 | -------------------------------------------------------------------------------- /example/emoji-objects-and-symbols.md: -------------------------------------------------------------------------------- 1 | # Emoji: Objects and symbols 2 | 3 | - `watch`: :watch: 4 | - `iphone`: :iphone: 5 | - `calling`: :calling: 6 | - `computer`: :computer: 7 | - `desktop_computer`: :desktop_computer: 8 | - `desktop`: :desktop: 9 | - `old_personal_computer`: :old_personal_computer: 10 | - `computer_old`: :computer_old: 11 | - `wired_keyboard`: :wired_keyboard: 12 | - `keyboard`: :keyboard: 13 | - `one_button_mouse`: :one_button_mouse: 14 | - `mouse-one`: :mouse-one: 15 | - `trackball`: :trackball: 16 | - `keyboard_and_mouse`: :keyboard_and_mouse: 17 | - `keyboard_mouse`: :keyboard_mouse: 18 | - `three_networked_computers`: :three_networked_computers: 19 | - `network`: :network: 20 | - `printer`: :printer: 21 | - `desktop_window`: :desktop_window: 22 | - `pocket_calculator`: :pocket_calculator: 23 | - `calculator`: :calculator: 24 | - `alarm_clock`: :alarm_clock: 25 | - `mantlepiece_clock`: :mantlepiece_clock: 26 | - `clock`: :clock: 27 | - `hourglass_flowing_sand`: :hourglass_flowing_sand: 28 | - `hourglass`: :hourglass: 29 | - `camera`: :camera: 30 | - `camera_with_flash`: :camera_with_flash: 31 | - `video_camera`: :video_camera: 32 | - `movie_camera`: :movie_camera: 33 | - `film_projector`: :film_projector: 34 | - `projector`: :projector: 35 | - `tv`: :tv: 36 | - `musical_keyboard_with_jacks`: :musical_keyboard_with_jacks: 37 | - `keyboard_with_jacks`: :keyboard_with_jacks: 38 | - `studio_microphone`: :studio_microphone: 39 | - `microphone2`: :microphone2: 40 | - `level_slider`: :level_slider: 41 | - `control_knobs`: :control_knobs: 42 | - `radio`: :radio: 43 | - `portable_stereo`: :portable_stereo: 44 | - `stereo`: :stereo: 45 | - `pager`: :pager: 46 | - `joystick`: :joystick: 47 | - `telephone_receiver`: :telephone_receiver: 48 | - `left_hand_telephone_receiver`: :left_hand_telephone_receiver: 49 | - `left_receiver`: :left_receiver: 50 | - `telephone`: :telephone: 51 | - `white_touchtone_telephone`: :white_touchtone_telephone: 52 | - `telephone_white`: :telephone_white: 53 | - `black_touchtone_telephone`: :black_touchtone_telephone: 54 | - `telephone_black`: :telephone_black: 55 | - `clamshell_mobile_phone`: :clamshell_mobile_phone: 56 | - `flip_phone`: :flip_phone: 57 | - `fax`: :fax: 58 | - `minidisc`: :minidisc: 59 | - `floppy_disk`: :floppy_disk: 60 | - `black_hard_shell_floppy_disk`: :black_hard_shell_floppy_disk: 61 | - `floppy_black`: :floppy_black: 62 | - `white_hard_shell_floppy_disk`: :white_hard_shell_floppy_disk: 63 | - `floppy_white`: :floppy_white: 64 | - `tape_cartridge`: :tape_cartridge: 65 | - `cartridge`: :cartridge: 66 | - `hard_disk`: :hard_disk: 67 | - `cd`: :cd: 68 | - `dvd`: :dvd: 69 | - `optical_disc_icon`: :optical_disc_icon: 70 | - `optical_disk`: :optical_disk: 71 | - `vhs`: :vhs: 72 | - `battery`: :battery: 73 | - `electric_plug`: :electric_plug: 74 | - `bulb`: :bulb: 75 | - `flashlight`: :flashlight: 76 | - `candle`: :candle: 77 | - `satellite`: :satellite: 78 | - `satellite_orbital`: :satellite_orbital: 79 | - `credit_card`: :credit_card: 80 | - `money_with_wings`: :money_with_wings: 81 | - `moneybag`: :moneybag: 82 | - `gem`: :gem: 83 | - `closed_umbrella`: :closed_umbrella: 84 | - `pouch`: :pouch: 85 | - `purse`: :purse: 86 | - `handbag`: :handbag: 87 | - `briefcase`: :briefcase: 88 | - `school_satchel`: :school_satchel: 89 | - `lipstick`: :lipstick: 90 | - `eyeglasses`: :eyeglasses: 91 | - `dark_sunglasses`: :dark_sunglasses: 92 | - `womans_hat`: :womans_hat: 93 | - `sandal`: :sandal: 94 | - `high_heel`: :high_heel: 95 | - `boot`: :boot: 96 | - `mans_shoe`: :mans_shoe: 97 | - `athletic_shoe`: :athletic_shoe: 98 | - `bikini`: :bikini: 99 | - `dress`: :dress: 100 | - `kimono`: :kimono: 101 | - `womans_clothes`: :womans_clothes: 102 | - `shirt`: :shirt: 103 | - `necktie`: :necktie: 104 | - `jeans`: :jeans: 105 | - `door`: :door: 106 | - `shower`: :shower: 107 | - `bathtub`: :bathtub: 108 | - `toilet`: :toilet: 109 | - `barber`: :barber: 110 | - `syringe`: :syringe: 111 | - `pill`: :pill: 112 | - `microscope`: :microscope: 113 | - `telescope`: :telescope: 114 | - `crystal_ball`: :crystal_ball: 115 | - `wrench`: :wrench: 116 | - `knife`: :knife: 117 | - `dagger_knife`: :dagger_knife: 118 | - `dagger`: :dagger: 119 | - `nut_and_bolt`: :nut_and_bolt: 120 | - `hammer`: :hammer: 121 | - `hammer_and_wrench`: :hammer_and_wrench: 122 | - `tools`: :tools: 123 | - `oil_drum`: :oil_drum: 124 | - `oil`: :oil: 125 | - `bomb`: :bomb: 126 | - `smoking`: :smoking: 127 | - `black_skull_and_crossbones`: :black_skull_and_crossbones: 128 | - `crossbones`: :crossbones: 129 | - `gun`: :gun: 130 | - `bookmark`: :bookmark: 131 | - `newspaper`: :newspaper: 132 | - `rolled_up_newspaper`: :rolled_up_newspaper: 133 | - `newspaper2`: :newspaper2: 134 | - `thermometer`: :thermometer: 135 | - `label`: :label: 136 | - `key`: :key: 137 | - `old_key`: :old_key: 138 | - `key2`: :key2: 139 | - `envelope`: :envelope: 140 | - `back_of_envelope`: :back_of_envelope: 141 | - `envelope_back`: :envelope_back: 142 | - `stamped_envelope`: :stamped_envelope: 143 | - `envelope_stamped`: :envelope_stamped: 144 | - `flying_envelope`: :flying_envelope: 145 | - `envelope_flying`: :envelope_flying: 146 | - `pen_over_stamped_envelope`: :pen_over_stamped_envelope: 147 | - `envelope_stamped_pen`: :envelope_stamped_pen: 148 | - `envelope_with_arrow`: :envelope_with_arrow: 149 | - `incoming_envelope`: :incoming_envelope: 150 | - `email`: :email: 151 | - `e-mail`: :e-mail: 152 | - `inbox_tray`: :inbox_tray: 153 | - `outbox_tray`: :outbox_tray: 154 | - `package`: :package: 155 | - `postal_horn`: :postal_horn: 156 | - `postbox`: :postbox: 157 | - `mailbox_closed`: :mailbox_closed: 158 | - `mailbox`: :mailbox: 159 | - `mailbox_with_no_mail`: :mailbox_with_no_mail: 160 | - `mailbox_with_mail`: :mailbox_with_mail: 161 | - `document`: :document: 162 | - `document_with_text`: :document_with_text: 163 | - `document_text`: :document_text: 164 | - `page`: :page: 165 | - `page_facing_up`: :page_facing_up: 166 | - `page_with_curl`: :page_with_curl: 167 | - `pages`: :pages: 168 | - `bookmark_tabs`: :bookmark_tabs: 169 | - `wastebasket`: :wastebasket: 170 | - `empty_note_page`: :empty_note_page: 171 | - `note_empty`: :note_empty: 172 | - `empty_note_pad`: :empty_note_pad: 173 | - `notepad_empty`: :notepad_empty: 174 | - `note_page`: :note_page: 175 | - `note`: :note: 176 | - `note_pad`: :note_pad: 177 | - `notepad`: :notepad: 178 | - `spiral_note_pad`: :spiral_note_pad: 179 | - `notepad-spiral`: :notepad-spiral: 180 | - `chart_with_upwards_trend`: :chart_with_upwards_trend: 181 | - `chart_with_downwards_trend`: :chart_with_downwards_trend: 182 | - `bar_chart`: :bar_chart: 183 | - `stock_chart`: :stock_chart: 184 | - `date`: :date: 185 | - `calendar`: :calendar: 186 | - `spiral_calendar_pad`: :spiral_calendar_pad: 187 | - `calendar_spiral`: :calendar_spiral: 188 | - `ballot_box_with_ballot`: :ballot_box_with_ballot: 189 | - `ballot_box`: :ballot_box: 190 | - `low_brightness`: :low_brightness: 191 | - `high_brightness`: :high_brightness: 192 | - `compression`: :compression: 193 | - `frame_with_an_x`: :frame_with_an_x: 194 | - `frame_x`: :frame_x: 195 | - `frame_with_picture`: :frame_with_picture: 196 | - `frame_photo`: :frame_photo: 197 | - `frame_with_tiles`: :frame_with_tiles: 198 | - `frame_tiles`: :frame_tiles: 199 | - `scroll`: :scroll: 200 | - `clipboard`: :clipboard: 201 | - `book2`: :book2: 202 | - `book`: :book: 203 | - `notebook`: :notebook: 204 | - `notebook_with_decorative_cover`: :notebook_with_decorative_cover: 205 | - `ledger`: :ledger: 206 | - `closed_book`: :closed_book: 207 | - `green_book`: :green_book: 208 | - `blue_book`: :blue_book: 209 | - `orange_book`: :orange_book: 210 | - `books`: :books: 211 | - `card_index`: :card_index: 212 | - `card_index_dividers`: :card_index_dividers: 213 | - `dividers`: :dividers: 214 | - `card_file_box`: :card_file_box: 215 | - `card_box`: :card_box: 216 | - `link`: :link: 217 | - `paperclip`: :paperclip: 218 | - `linked_paperclips`: :linked_paperclips: 219 | - `paperclips`: :paperclips: 220 | - `pushpin`: :pushpin: 221 | - `pushpin_black`: :pushpin_black: 222 | - `scissors`: :scissors: 223 | - `triangular_ruler`: :triangular_ruler: 224 | - `round_pushpin`: :round_pushpin: 225 | - `straight_ruler`: :straight_ruler: 226 | - `triangular_flag_on_post`: :triangular_flag_on_post: 227 | - `white_pennant`: :white_pennant: 228 | - `pennant_white`: :pennant_white: 229 | - `black_pennant`: :black_pennant: 230 | - `pennant_black`: :pennant_black: 231 | - `waving_white_flag`: :waving_white_flag: 232 | - `flag_white`: :flag_white: 233 | - `waving_black_flag`: :waving_black_flag: 234 | - `flag_black`: :flag_black: 235 | - `hole`: :hole: 236 | - `folder`: :folder: 237 | - `open_folder`: :open_folder: 238 | - `folder_open`: :folder_open: 239 | - `file_folder`: :file_folder: 240 | - `open_file_folder`: :open_file_folder: 241 | - `file_cabinet`: :file_cabinet: 242 | - `black_nib`: :black_nib: 243 | - `pencil2`: :pencil2: 244 | - `lower_left_pencil`: :lower_left_pencil: 245 | - `pencil3`: :pencil3: 246 | - `lower_left_ballpoint_pen`: :lower_left_ballpoint_pen: 247 | - `pen_ballpoint`: :pen_ballpoint: 248 | - `lower_left_fountain_pen`: :lower_left_fountain_pen: 249 | - `pen_fountain`: :pen_fountain: 250 | - `lower_left_paintbrush`: :lower_left_paintbrush: 251 | - `paintbrush`: :paintbrush: 252 | - `lower_left_crayon`: :lower_left_crayon: 253 | - `crayon`: :crayon: 254 | - `pencil`: :pencil: 255 | - `lock_with_ink_pen`: :lock_with_ink_pen: 256 | - `closed_lock_with_key`: :closed_lock_with_key: 257 | - `lock`: :lock: 258 | - `unlock`: :unlock: 259 | - `mega`: :mega: 260 | - `loudspeaker`: :loudspeaker: 261 | - `speaker`: :speaker: 262 | - `sound`: :sound: 263 | - `loud_sound`: :loud_sound: 264 | - `mute`: :mute: 265 | - `right_speaker`: :right_speaker: 266 | - `right_speaker_with_one_sound_wave`: :right_speaker_with_one_sound_wave: 267 | - `right_speaker_one`: :right_speaker_one: 268 | - `right_speaker_with_three_sound_waves`: :right_speaker_with_three_sound_waves: 269 | - `right_speaker_three`: :right_speaker_three: 270 | - `bullhorn`: :bullhorn: 271 | - `bullhorn_with_sound_waves`: :bullhorn_with_sound_waves: 272 | - `bullhorn_waves`: :bullhorn_waves: 273 | - `zzz`: :zzz: 274 | - `bell`: :bell: 275 | - `no_bell`: :no_bell: 276 | - `ringing_bell`: :ringing_bell: 277 | - `ascending_notes`: :ascending_notes: 278 | - `descending_notes`: :descending_notes: 279 | - `white_latin_cross`: :white_latin_cross: 280 | - `cross_white`: :cross_white: 281 | - `heavy_latin_cross`: :heavy_latin_cross: 282 | - `cross_heavy`: :cross_heavy: 283 | - `celtic_cross`: :celtic_cross: 284 | - `om_symbol`: :om_symbol: 285 | - `dove_of_peace`: :dove_of_peace: 286 | - `dove`: :dove: 287 | - `thought_balloon`: :thought_balloon: 288 | - `speech_balloon`: :speech_balloon: 289 | - `left_speech_bubble`: :left_speech_bubble: 290 | - `speech_left`: :speech_left: 291 | - `right_speech_bubble`: :right_speech_bubble: 292 | - `speech_right`: :speech_right: 293 | - `two_speech_bubbles`: :two_speech_bubbles: 294 | - `speech_two`: :speech_two: 295 | - `three_speech_bubbles`: :three_speech_bubbles: 296 | - `speech_three`: :speech_three: 297 | - `left_thought_bubble`: :left_thought_bubble: 298 | - `thought_left`: :thought_left: 299 | - `right_thought_bubble`: :right_thought_bubble: 300 | - `thought_right`: :thought_right: 301 | - `left_anger_bubble`: :left_anger_bubble: 302 | - `anger_left`: :anger_left: 303 | - `right_anger_bubble`: :right_anger_bubble: 304 | - `anger_right`: :anger_right: 305 | - `mood_bubble`: :mood_bubble: 306 | - `lightning_mood_bubble`: :lightning_mood_bubble: 307 | - `mood_bubble_lightning`: :mood_bubble_lightning: 308 | - `children_crossing`: :children_crossing: 309 | - `shield`: :shield: 310 | - `mag`: :mag: 311 | - `mag_right`: :mag_right: 312 | - `speaking_head_in_silhouette`: :speaking_head_in_silhouette: 313 | - `speaking_head`: :speaking_head: 314 | - `sleeping_accommodation`: :sleeping_accommodation: 315 | - `prohibited_sign`: :prohibited_sign: 316 | - `prohibited`: :prohibited: 317 | - `no_entry_sign`: :no_entry_sign: 318 | - `no_entry`: :no_entry: 319 | - `name_badge`: :name_badge: 320 | - `no_pedestrians`: :no_pedestrians: 321 | - `do_not_litter`: :do_not_litter: 322 | - `no_bicycles`: :no_bicycles: 323 | - `non-potable_water`: :non-potable_water: 324 | - `no_mobile_phones`: :no_mobile_phones: 325 | - `underage`: :underage: 326 | - `no_piracy`: :no_piracy: 327 | - `piracy`: :piracy: 328 | - `accept`: :accept: 329 | - `ideograph_advantage`: :ideograph_advantage: 330 | - `white_flower`: :white_flower: 331 | - `secret`: :secret: 332 | - `congratulations`: :congratulations: 333 | - `u5408`: :u5408: 334 | - `u6e80`: :u6e80: 335 | - `u7981`: :u7981: 336 | - `u6709`: :u6709: 337 | - `u7121`: :u7121: 338 | - `u7533`: :u7533: 339 | - `u55b6`: :u55b6: 340 | - `u6708`: :u6708: 341 | - `u5272`: :u5272: 342 | - `u7a7a`: :u7a7a: 343 | - `sa`: :sa: 344 | - `koko`: :koko: 345 | - `u6307`: :u6307: 346 | - `chart`: :chart: 347 | - `sparkle`: :sparkle: 348 | - `eight_spoked_asterisk`: :eight_spoked_asterisk: 349 | - `negative_squared_cross_mark`: :negative_squared_cross_mark: 350 | - `white_check_mark`: :white_check_mark: 351 | - `eight_pointed_black_star`: :eight_pointed_black_star: 352 | - `vibration_mode`: :vibration_mode: 353 | - `mobile_phone_off`: :mobile_phone_off: 354 | - `vs`: :vs: 355 | - `a`: :a: 356 | - `b`: :b: 357 | - `ab`: :ab: 358 | - `cl`: :cl: 359 | - `o2`: :o2: 360 | - `sos`: :sos: 361 | - `id`: :id: 362 | - `parking`: :parking: 363 | - `wc`: :wc: 364 | - `cool`: :cool: 365 | - `free`: :free: 366 | - `new`: :new: 367 | - `ng`: :ng: 368 | - `ok`: :ok: 369 | - `up`: :up: 370 | - `atm`: :atm: 371 | - `aries`: :aries: 372 | - `taurus`: :taurus: 373 | - `gemini`: :gemini: 374 | - `cancer`: :cancer: 375 | - `leo`: :leo: 376 | - `virgo`: :virgo: 377 | - `libra`: :libra: 378 | - `scorpius`: :scorpius: 379 | - `sagittarius`: :sagittarius: 380 | - `capricorn`: :capricorn: 381 | - `aquarius`: :aquarius: 382 | - `pisces`: :pisces: 383 | - `restroom`: :restroom: 384 | - `mens`: :mens: 385 | - `womens`: :womens: 386 | - `boys_symbol`: :boys_symbol: 387 | - `girls_symbol`: :girls_symbol: 388 | - `baby_symbol`: :baby_symbol: 389 | - `wheelchair`: :wheelchair: 390 | - `potable_water`: :potable_water: 391 | - `no_smoking`: :no_smoking: 392 | - `put_litter_in_its_place`: :put_litter_in_its_place: 393 | - `arrow_forward`: :arrow_forward: 394 | - `arrow_backward`: :arrow_backward: 395 | - `arrow_up_small`: :arrow_up_small: 396 | - `arrow_down_small`: :arrow_down_small: 397 | - `fast_forward`: :fast_forward: 398 | - `rewind`: :rewind: 399 | - `arrow_double_up`: :arrow_double_up: 400 | - `arrow_double_down`: :arrow_double_down: 401 | - `arrow_right`: :arrow_right: 402 | - `arrow_left`: :arrow_left: 403 | - `arrow_up`: :arrow_up: 404 | - `arrow_down`: :arrow_down: 405 | - `arrow_upper_right`: :arrow_upper_right: 406 | - `arrow_lower_right`: :arrow_lower_right: 407 | - `arrow_lower_left`: :arrow_lower_left: 408 | - `arrow_upper_left`: :arrow_upper_left: 409 | - `arrow_up_down`: :arrow_up_down: 410 | - `left_right_arrow`: :left_right_arrow: 411 | - `arrows_counterclockwise`: :arrows_counterclockwise: 412 | - `arrow_right_hook`: :arrow_right_hook: 413 | - `leftwards_arrow_with_hook`: :leftwards_arrow_with_hook: 414 | - `arrow_heading_up`: :arrow_heading_up: 415 | - `arrow_heading_down`: :arrow_heading_down: 416 | - `twisted_rightwards_arrows`: :twisted_rightwards_arrows: 417 | - `repeat`: :repeat: 418 | - `repeat_one`: :repeat_one: 419 | - `hash`: :hash: 420 | - `zero`: :zero: 421 | - `one`: :one: 422 | - `two`: :two: 423 | - `three`: :three: 424 | - `four`: :four: 425 | - `five`: :five: 426 | - `six`: :six: 427 | - `seven`: :seven: 428 | - `eight`: :eight: 429 | - `nine`: :nine: 430 | - `keycap_ten`: :keycap_ten: 431 | - `1234`: :1234: 432 | - `abc`: :abc: 433 | - `abcd`: :abcd: 434 | - `capital_abcd`: :capital_abcd: 435 | - `information_source`: :information_source: 436 | - `signal_strength`: :signal_strength: 437 | - `cinema`: :cinema: 438 | - `symbols`: :symbols: 439 | - `heavy_plus_sign`: :heavy_plus_sign: 440 | - `heavy_minus_sign`: :heavy_minus_sign: 441 | - `wavy_dash`: :wavy_dash: 442 | - `heavy_division_sign`: :heavy_division_sign: 443 | - `heavy_multiplication_x`: :heavy_multiplication_x: 444 | - `heavy_check_mark`: :heavy_check_mark: 445 | - `cancellation_x`: :cancellation_x: 446 | - `arrows_clockwise`: :arrows_clockwise: 447 | - `clockwise_right_and_left_semicircle_arrows`: :clockwise_right_and_left_semicircle_arrows: 448 | - `clockwise_arrows`: :clockwise_arrows: 449 | - `tm`: :tm: 450 | - `copyright`: :copyright: 451 | - `registered`: :registered: 452 | - `currency_exchange`: :currency_exchange: 453 | - `heavy_dollar_sign`: :heavy_dollar_sign: 454 | - `curly_loop`: :curly_loop: 455 | - `loop`: :loop: 456 | - `part_alternation_mark`: :part_alternation_mark: 457 | - `exclamation`: :exclamation: 458 | - `question`: :question: 459 | - `grey_exclamation`: :grey_exclamation: 460 | - `grey_question`: :grey_question: 461 | - `bangbang`: :bangbang: 462 | - `interrobang`: :interrobang: 463 | - `triangle_with_rounded_corners`: :triangle_with_rounded_corners: 464 | - `triangle_round`: :triangle_round: 465 | - `x`: :x: 466 | - `o`: :o: 467 | - `100`: :100: 468 | - `end`: :end: 469 | - `back`: :back: 470 | - `on`: :on: 471 | - `top`: :top: 472 | - `soon`: :soon: 473 | - `cyclone`: :cyclone: 474 | - `m`: :m: 475 | - `circled_information_source`: :circled_information_source: 476 | - `info`: :info: 477 | - `ophiuchus`: :ophiuchus: 478 | - `six_pointed_star`: :six_pointed_star: 479 | - `beginner`: :beginner: 480 | - `lightning_mood`: :lightning_mood: 481 | - `mood_lightning`: :mood_lightning: 482 | - `trident`: :trident: 483 | - `warning`: :warning: 484 | - `hotsprings`: :hotsprings: 485 | - `rosette`: :rosette: 486 | - `rosette_black`: :rosette_black: 487 | - `recycle`: :recycle: 488 | - `anger`: :anger: 489 | - `diamond_shape_with_a_dot_inside`: :diamond_shape_with_a_dot_inside: 490 | - `spades`: :spades: 491 | - `clubs`: :clubs: 492 | - `hearts`: :hearts: 493 | - `diamonds`: :diamonds: 494 | - `ballot_box_with_check`: :ballot_box_with_check: 495 | - `light_mark`: :light_mark: 496 | - `light_check_mark`: :light_check_mark: 497 | - `ballot_box_with_bold_check`: :ballot_box_with_bold_check: 498 | - `ballot_box_check`: :ballot_box_check: 499 | - `ballot_script_x`: :ballot_script_x: 500 | - `ballot_x`: :ballot_x: 501 | - `ballot_box_with_script_x`: :ballot_box_with_script_x: 502 | - `ballot_box_x`: :ballot_box_x: 503 | - `white_circle`: :white_circle: 504 | - `black_circle`: :black_circle: 505 | - `radio_button`: :radio_button: 506 | - `red_circle`: :red_circle: 507 | - `large_blue_circle`: :large_blue_circle: 508 | - `small_red_triangle`: :small_red_triangle: 509 | - `small_red_triangle_down`: :small_red_triangle_down: 510 | - `small_orange_diamond`: :small_orange_diamond: 511 | - `small_blue_diamond`: :small_blue_diamond: 512 | - `large_orange_diamond`: :large_orange_diamond: 513 | - `large_blue_diamond`: :large_blue_diamond: 514 | - `black_small_square`: :black_small_square: 515 | - `white_small_square`: :white_small_square: 516 | - `black_large_square`: :black_large_square: 517 | - `white_large_square`: :white_large_square: 518 | - `black_medium_square`: :black_medium_square: 519 | - `white_medium_square`: :white_medium_square: 520 | - `black_medium_small_square`: :black_medium_small_square: 521 | - `white_medium_small_square`: :white_medium_small_square: 522 | - `black_square_button`: :black_square_button: 523 | - `white_square_button`: :white_square_button: 524 | - `clock1`: :clock1: 525 | - `clock2`: :clock2: 526 | - `clock3`: :clock3: 527 | - `clock4`: :clock4: 528 | - `clock5`: :clock5: 529 | - `clock6`: :clock6: 530 | - `clock7`: :clock7: 531 | - `clock8`: :clock8: 532 | - `clock9`: :clock9: 533 | - `clock10`: :clock10: 534 | - `clock11`: :clock11: 535 | - `clock12`: :clock12: 536 | - `clock130`: :clock130: 537 | - `clock230`: :clock230: 538 | - `clock330`: :clock330: 539 | - `clock430`: :clock430: 540 | - `clock530`: :clock530: 541 | - `clock630`: :clock630: 542 | - `clock730`: :clock730: 543 | - `clock830`: :clock830: 544 | - `clock930`: :clock930: 545 | - `clock1030`: :clock1030: 546 | - `clock1130`: :clock1130: 547 | - `clock1230`: :clock1230: 548 | -------------------------------------------------------------------------------- /example/emoji-people.md: -------------------------------------------------------------------------------- 1 | # Emoji: People 2 | 3 | - `grinning`: :grinning: 4 | - `grin`: :grin: 5 | - `joy`: :joy: 6 | - `smiley`: :smiley: 7 | - `smile`: :smile: 8 | - `sweat_smile`: :sweat_smile: 9 | - `satisfied`: :satisfied: 10 | - `laughing`: :laughing: 11 | - `innocent`: :innocent: 12 | - `smiling_imp`: :smiling_imp: 13 | - `imp`: :imp: 14 | - `wink`: :wink: 15 | - `blush`: :blush: 16 | - `relaxed`: :relaxed: 17 | - `yum`: :yum: 18 | - `relieved`: :relieved: 19 | - `heart_eyes`: :heart_eyes: 20 | - `sunglasses`: :sunglasses: 21 | - `smirk`: :smirk: 22 | - `neutral_face`: :neutral_face: 23 | - `expressionless`: :expressionless: 24 | - `unamused`: :unamused: 25 | - `sweat`: :sweat: 26 | - `pensive`: :pensive: 27 | - `confused`: :confused: 28 | - `confounded`: :confounded: 29 | - `kissing`: :kissing: 30 | - `kissing_heart`: :kissing_heart: 31 | - `kissing_smiling_eyes`: :kissing_smiling_eyes: 32 | - `kissing_closed_eyes`: :kissing_closed_eyes: 33 | - `stuck_out_tongue`: :stuck_out_tongue: 34 | - `stuck_out_tongue_winking_eye`: :stuck_out_tongue_winking_eye: 35 | - `stuck_out_tongue_closed_eyes`: :stuck_out_tongue_closed_eyes: 36 | - `disappointed`: :disappointed: 37 | - `worried`: :worried: 38 | - `angry`: :angry: 39 | - `rage`: :rage: 40 | - `cry`: :cry: 41 | - `persevere`: :persevere: 42 | - `triumph`: :triumph: 43 | - `disappointed_relieved`: :disappointed_relieved: 44 | - `frowning`: :frowning: 45 | - `anguished`: :anguished: 46 | - `fearful`: :fearful: 47 | - `weary`: :weary: 48 | - `sleepy`: :sleepy: 49 | - `tired_face`: :tired_face: 50 | - `grimacing`: :grimacing: 51 | - `sob`: :sob: 52 | - `open_mouth`: :open_mouth: 53 | - `hushed`: :hushed: 54 | - `cold_sweat`: :cold_sweat: 55 | - `scream`: :scream: 56 | - `astonished`: :astonished: 57 | - `flushed`: :flushed: 58 | - `sleeping`: :sleeping: 59 | - `dizzy_face`: :dizzy_face: 60 | - `no_mouth`: :no_mouth: 61 | - `mask`: :mask: 62 | - `slightly_frowning_face`: :slightly_frowning_face: 63 | - `slight_frown`: :slight_frown: 64 | - `slightly_smiling_face`: :slightly_smiling_face: 65 | - `slight_smile`: :slight_smile: 66 | - `smile_cat`: :smile_cat: 67 | - `joy_cat`: :joy_cat: 68 | - `smiley_cat`: :smiley_cat: 69 | - `heart_eyes_cat`: :heart_eyes_cat: 70 | - `smirk_cat`: :smirk_cat: 71 | - `kissing_cat`: :kissing_cat: 72 | - `pouting_cat`: :pouting_cat: 73 | - `crying_cat_face`: :crying_cat_face: 74 | - `scream_cat`: :scream_cat: 75 | - `footprints`: :footprints: 76 | - `bust_in_silhouette`: :bust_in_silhouette: 77 | - `busts_in_silhouette`: :busts_in_silhouette: 78 | - `man_in_business_suit_levitating`: :man_in_business_suit_levitating: 79 | - `levitate`: :levitate: 80 | - `sleuth_or_spy`: :sleuth_or_spy: 81 | - `spy`: :spy: 82 | - `baby`: :baby: 83 | - `boy`: :boy: 84 | - `girl`: :girl: 85 | - `man`: :man: 86 | - `woman`: :woman: 87 | - `family`: :family: 88 | - `family_mwg`: :family_mwg: 89 | - `family_mwgb`: :family_mwgb: 90 | - `family_mwbb`: :family_mwbb: 91 | - `family_mwgg`: :family_mwgg: 92 | - `family_wwb`: :family_wwb: 93 | - `family_wwg`: :family_wwg: 94 | - `family_wwgb`: :family_wwgb: 95 | - `family_wwbb`: :family_wwbb: 96 | - `family_wwgg`: :family_wwgg: 97 | - `family_mmb`: :family_mmb: 98 | - `family_mmg`: :family_mmg: 99 | - `family_mmgb`: :family_mmgb: 100 | - `family_mmbb`: :family_mmbb: 101 | - `family_mmgg`: :family_mmgg: 102 | - `couple`: :couple: 103 | - `two_men_holding_hands`: :two_men_holding_hands: 104 | - `two_women_holding_hands`: :two_women_holding_hands: 105 | - `dancers`: :dancers: 106 | - `bride_with_veil`: :bride_with_veil: 107 | - `person_with_blond_hair`: :person_with_blond_hair: 108 | - `man_with_gua_pi_mao`: :man_with_gua_pi_mao: 109 | - `man_with_turban`: :man_with_turban: 110 | - `older_man`: :older_man: 111 | - `grandma`: :grandma: 112 | - `older_woman`: :older_woman: 113 | - `cop`: :cop: 114 | - `construction_worker`: :construction_worker: 115 | - `princess`: :princess: 116 | - `guardsman`: :guardsman: 117 | - `angel`: :angel: 118 | - `santa`: :santa: 119 | - `ghost`: :ghost: 120 | - `japanese_ogre`: :japanese_ogre: 121 | - `japanese_goblin`: :japanese_goblin: 122 | - `poo`: :poo: 123 | - `hankey`: :hankey: 124 | - `shit`: :shit: 125 | - `poop`: :poop: 126 | - `skeleton`: :skeleton: 127 | - `skull`: :skull: 128 | - `alien`: :alien: 129 | - `space_invader`: :space_invader: 130 | - `bow`: :bow: 131 | - `information_desk_person`: :information_desk_person: 132 | - `no_good`: :no_good: 133 | - `ok_woman`: :ok_woman: 134 | - `raising_hand`: :raising_hand: 135 | - `person_with_pouting_face`: :person_with_pouting_face: 136 | - `person_frowning`: :person_frowning: 137 | - `massage`: :massage: 138 | - `haircut`: :haircut: 139 | - `couple_with_heart`: :couple_with_heart: 140 | - `couple_with_heart_ww`: :couple_with_heart_ww: 141 | - `couple_ww`: :couple_ww: 142 | - `couple_with_heart_mm`: :couple_with_heart_mm: 143 | - `couple_mm`: :couple_mm: 144 | - `couplekiss`: :couplekiss: 145 | - `couplekiss_ww`: :couplekiss_ww: 146 | - `kiss_ww`: :kiss_ww: 147 | - `couplekiss_mm`: :couplekiss_mm: 148 | - `kiss_mm`: :kiss_mm: 149 | - `raised_hands`: :raised_hands: 150 | - `clap`: :clap: 151 | - `ear`: :ear: 152 | - `eye`: :eye: 153 | - `eyes`: :eyes: 154 | - `nose`: :nose: 155 | - `lips`: :lips: 156 | - `lips2`: :lips2: 157 | - `kiss`: :kiss: 158 | - `tongue`: :tongue: 159 | - `nail_care`: :nail_care: 160 | - `wave`: :wave: 161 | - `+1`: :+1: 162 | - `thumbsup`: :thumbsup: 163 | - `-1`: :-1: 164 | - `thumbsdown`: :thumbsdown: 165 | - `point_up`: :point_up: 166 | - `point_up_2`: :point_up_2: 167 | - `point_down`: :point_down: 168 | - `point_left`: :point_left: 169 | - `point_right`: :point_right: 170 | - `ok_hand`: :ok_hand: 171 | - `v`: :v: 172 | - `punch`: :punch: 173 | - `fist`: :fist: 174 | - `raised_hand`: :raised_hand: 175 | - `muscle`: :muscle: 176 | - `open_hands`: :open_hands: 177 | - `left_writing_hand`: :left_writing_hand: 178 | - `writing_hand`: :writing_hand: 179 | - `turned_ok_hand_sign`: :turned_ok_hand_sign: 180 | - `turned_ok_hand`: :turned_ok_hand: 181 | - `raised_hand_with_fingers_splayed`: :raised_hand_with_fingers_splayed: 182 | - `hand_splayed`: :hand_splayed: 183 | - `reversed_raised_hand_with_fingers_splayed`: :reversed_raised_hand_with_fingers_splayed: 184 | - `hand_splayed_reverse`: :hand_splayed_reverse: 185 | - `reversed_thumbs_up_sign`: :reversed_thumbs_up_sign: 186 | - `thumbs_up_reverse`: :thumbs_up_reverse: 187 | - `reversed_thumbs_down_sign`: :reversed_thumbs_down_sign: 188 | - `thumbs_down_reverse`: :thumbs_down_reverse: 189 | - `reversed_victory_hand`: :reversed_victory_hand: 190 | - `hand_victory`: :hand_victory: 191 | - `reversed_hand_with_middle_finger_extended`: :reversed_hand_with_middle_finger_extended: 192 | - `middle_finger`: :middle_finger: 193 | - `raised_hand_with_part_between_middle_and_ring_fingers`: :raised_hand_with_part_between_middle_and_ring_fingers: 194 | - `vulcan`: :vulcan: 195 | - `white_down_pointing_left_hand_index`: :white_down_pointing_left_hand_index: 196 | - `finger_pointing_down`: :finger_pointing_down: 197 | - `sideways_white_left_pointing_index`: :sideways_white_left_pointing_index: 198 | - `finger_pointing_left`: :finger_pointing_left: 199 | - `sideways_white_right_pointing_index`: :sideways_white_right_pointing_index: 200 | - `finger_pointing_right`: :finger_pointing_right: 201 | - `sideways_white_up_pointing_index`: :sideways_white_up_pointing_index: 202 | - `finger_pointing_up`: :finger_pointing_up: 203 | - `sideways_white_down_pointing_index`: :sideways_white_down_pointing_index: 204 | - `finger_pointing_down2`: :finger_pointing_down2: 205 | - `pray`: :pray: 206 | -------------------------------------------------------------------------------- /example/emoji-travel-and-places.md: -------------------------------------------------------------------------------- 1 | # Emoji: Travel and places 2 | 3 | - `railway_car`: :railway_car: 4 | - `mountain_railway`: :mountain_railway: 5 | - `steam_locomotive`: :steam_locomotive: 6 | - `diesel_locomotive`: :diesel_locomotive: 7 | - `train_diesel`: :train_diesel: 8 | - `train`: :train: 9 | - `monorail`: :monorail: 10 | - `bullettrain_side`: :bullettrain_side: 11 | - `bullettrain_front`: :bullettrain_front: 12 | - `train2`: :train2: 13 | - `metro`: :metro: 14 | - `light_rail`: :light_rail: 15 | - `station`: :station: 16 | - `tram`: :tram: 17 | - `railroad_track`: :railroad_track: 18 | - `railway_track`: :railway_track: 19 | - `bus`: :bus: 20 | - `oncoming_bus`: :oncoming_bus: 21 | - `trolleybus`: :trolleybus: 22 | - `minibus`: :minibus: 23 | - `ambulance`: :ambulance: 24 | - `fire_engine`: :fire_engine: 25 | - `oncoming_fire_engine`: :oncoming_fire_engine: 26 | - `fire_engine_oncoming`: :fire_engine_oncoming: 27 | - `police_car`: :police_car: 28 | - `oncoming_police_car`: :oncoming_police_car: 29 | - `rotating_light`: :rotating_light: 30 | - `taxi`: :taxi: 31 | - `oncoming_taxi`: :oncoming_taxi: 32 | - `red_car`: :red_car: 33 | - `oncoming_automobile`: :oncoming_automobile: 34 | - `blue_car`: :blue_car: 35 | - `truck`: :truck: 36 | - `articulated_lorry`: :articulated_lorry: 37 | - `tractor`: :tractor: 38 | - `bike`: :bike: 39 | - `motorway`: :motorway: 40 | - `busstop`: :busstop: 41 | - `fuelpump`: :fuelpump: 42 | - `construction`: :construction: 43 | - `vertical_traffic_light`: :vertical_traffic_light: 44 | - `traffic_light`: :traffic_light: 45 | - `rocket`: :rocket: 46 | - `helicopter`: :helicopter: 47 | - `airplane`: :airplane: 48 | - `up_pointing_airplane`: :up_pointing_airplane: 49 | - `airplane_up`: :airplane_up: 50 | - `up_pointing_small_airplane`: :up_pointing_small_airplane: 51 | - `airplane_small_up`: :airplane_small_up: 52 | - `up_pointing_military_airplane`: :up_pointing_military_airplane: 53 | - `jet_up`: :jet_up: 54 | - `northeast_pointing_airplane`: :northeast_pointing_airplane: 55 | - `airplane_northeast`: :airplane_northeast: 56 | - `small_airplane`: :small_airplane: 57 | - `airplane_small`: :airplane_small: 58 | - `airplane_departure`: :airplane_departure: 59 | - `airplane_arriving`: :airplane_arriving: 60 | - `seat`: :seat: 61 | - `anchor`: :anchor: 62 | - `ship`: :ship: 63 | - `passenger_ship`: :passenger_ship: 64 | - `cruise_ship`: :cruise_ship: 65 | - `motorboat`: :motorboat: 66 | - `speedboat`: :speedboat: 67 | - `sailboat`: :sailboat: 68 | - `aerial_tramway`: :aerial_tramway: 69 | - `mountain_cableway`: :mountain_cableway: 70 | - `suspension_railway`: :suspension_railway: 71 | - `passport_control`: :passport_control: 72 | - `customs`: :customs: 73 | - `baggage_claim`: :baggage_claim: 74 | - `left_luggage`: :left_luggage: 75 | - `yen`: :yen: 76 | - `euro`: :euro: 77 | - `pound`: :pound: 78 | - `dollar`: :dollar: 79 | - `bellhop_bell`: :bellhop_bell: 80 | - `bellhop`: :bellhop: 81 | - `bed`: :bed: 82 | - `couch_and_lamp`: :couch_and_lamp: 83 | - `couch`: :couch: 84 | - `fork_and_knife_with_plate`: :fork_and_knife_with_plate: 85 | - `fork_knife_plate`: :fork_knife_plate: 86 | - `shopping_bags`: :shopping_bags: 87 | - `shopping_bags`: :shopping_bags: 88 | - `statue_of_liberty`: :statue_of_liberty: 89 | - `moyai`: :moyai: 90 | - `foggy`: :foggy: 91 | - `tokyo_tower`: :tokyo_tower: 92 | - `fountain`: :fountain: 93 | - `european_castle`: :european_castle: 94 | - `japanese_castle`: :japanese_castle: 95 | - `classical_building`: :classical_building: 96 | - `stadium`: :stadium: 97 | - `snow_capped_mountain`: :snow_capped_mountain: 98 | - `mountain_snow`: :mountain_snow: 99 | - `camping`: :camping: 100 | - `beach_with_umbrella`: :beach_with_umbrella: 101 | - `beach`: :beach: 102 | - `desert`: :desert: 103 | - `desert_island`: :desert_island: 104 | - `island`: :island: 105 | - `national_park`: :national_park: 106 | - `park`: :park: 107 | - `cityscape`: :cityscape: 108 | - `cityscape`: :cityscape: 109 | - `city_sunrise`: :city_sunrise: 110 | - `city_sunset`: :city_sunset: 111 | - `city_dusk`: :city_dusk: 112 | - `night_with_stars`: :night_with_stars: 113 | - `bridge_at_night`: :bridge_at_night: 114 | - `house`: :house: 115 | - `house_buildings`: :house_buildings: 116 | - `homes`: :homes: 117 | - `house_with_garden`: :house_with_garden: 118 | - `derelict_house_building`: :derelict_house_building: 119 | - `house-abandoned`: :house-abandoned: 120 | - `building_construction`: :building_construction: 121 | - `contruction_site`: :contruction_site: 122 | - `office`: :office: 123 | - `department_store`: :department_store: 124 | - `factory`: :factory: 125 | - `post_office`: :post_office: 126 | - `european_post_office`: :european_post_office: 127 | - `hospital`: :hospital: 128 | - `bank`: :bank: 129 | - `hotel`: :hotel: 130 | - `love_hotel`: :love_hotel: 131 | - `wedding`: :wedding: 132 | - `church`: :church: 133 | - `convenience_store`: :convenience_store: 134 | - `school`: :school: 135 | - `world_map`: :world_map: 136 | - `map`: :map: 137 | -------------------------------------------------------------------------------- /example/highlight.md: -------------------------------------------------------------------------------- 1 | # Highlight 2 | 3 | This example is borrowed from https://highlightjs.org/static/demo/ 4 | 5 | ```js 6 | import {x, y} as p from 'point'; 7 | const ANSWER = 42; 8 | 9 | class Car extends Vehicle { 10 | constructor(speed, cost) { 11 | super(speed); 12 | 13 | var c = Symbol('cost'); 14 | this[c] = cost; 15 | 16 | this.intro = `This is a car runs at 17 | ${speed}.`; 18 | } 19 | } 20 | 21 | for (let num of [1, 2, 3]) { 22 | console.log(num + 0b111110111); 23 | } 24 | 25 | function $initHighlight(block, flags) { 26 | try { 27 | if (block.className.search(/\bno\-highlight\b/) != -1) 28 | return processBlock(block.function, true, 0x0F) + ' class=""'; 29 | } catch (e) { 30 | /* handle exception */ 31 | var e4x = 32 |
Example 33 |

1234

; 34 | } 35 | for (var i = 0 / 2; i < classes.length; i++) { // "0 / 2" should not be parsed as regexp 36 | if (checkCondition(classes[i]) === undefined) 37 | return /\d+[\s/]/g; 38 | } 39 | console.log(Array.every(classes, Boolean)); 40 | } 41 | 42 | export $initHighlight; 43 | ``` 44 | -------------------------------------------------------------------------------- /example/huge.js: -------------------------------------------------------------------------------- 1 | import {writeFile} from 'fs' 2 | import {join} from 'path' 3 | 4 | let rows = []; 5 | for (let i = 0; i < 10000; i++) { 6 | rows[i] = `- rows at **${i+1}**`; 7 | } 8 | let md = rows.join('\n'); 9 | writeFile(join(__dirname, 'huge.md'), md); 10 | -------------------------------------------------------------------------------- /example/index.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | ## Emoji 4 | 5 | - [Activity](emoji-activity.md) 6 | - [Celebration](emoji-celebration.md) 7 | - [Flags](emoji-flags.md) 8 | - [Food and drink](emoji-food-and-drink.md) 9 | - [Nature](emoji-nature.md) 10 | - [Objects and symbols](emoji-objects-and-symbols.md) 11 | - [People](emoji-people.md) 12 | - [Travel and places](emoji-travel-and-places.md) 13 | 14 | ## Highlight 15 | 16 | - [Highlight](highlight.md) 17 | 18 | ## Others 19 | 20 | - [Huge](huge.md) 21 | -------------------------------------------------------------------------------- /gulpfile.babel.js: -------------------------------------------------------------------------------- 1 | import gulp from 'gulp' 2 | import gutil from 'gulp-util' 3 | import plumber from 'gulp-plumber' 4 | import jade from 'gulp-jade' 5 | import stylus from 'gulp-stylus' 6 | import webpack from 'webpack' 7 | import {join, dirname, basename, extname, resolve} from 'path' 8 | import {readFileSync, writeFileSync} from 'fs' 9 | import mkdirp from 'mkdirp' 10 | import packager from 'electron-packager' 11 | import GitHub from 'github' 12 | import cp from 'child_process' 13 | import yargs from 'yargs' 14 | import semver from 'semver' 15 | import livereload from 'gulp-livereload' 16 | 17 | const APP_DIR = 'app' 18 | const TEMP_DIR = 'tmp' 19 | const BUILD_DIR = 'build' 20 | const ICON_DIR = 'src/icon' 21 | 22 | let pkg = JSON.parse(readFileSync('package.json')) 23 | let url = pkg.repository.url 24 | let owner = basename(dirname(url)) 25 | let repo = basename(pkg.repository.url, extname(url)) 26 | let isWatch = false 27 | 28 | async function spawn (cmd, args, opts = {}) { 29 | return new Promise((resolve, reject) => { 30 | let p = cp.spawn(cmd, args, opts) 31 | p.stderr.on('data', (data) => console.error(data.toString('utf8'))) 32 | p.stdout.on('data', (data) => console.log(data.toString('utf8'))) 33 | p.on('error', reject) 34 | p.on('close', resolve) 35 | }) 36 | } 37 | 38 | async function mkdir (dir) { 39 | return new Promise((resolve, reject) => { 40 | mkdirp(dir, (err) => { 41 | if (err) { 42 | reject(err) 43 | return 44 | } 45 | resolve() 46 | }) 47 | }) 48 | } 49 | 50 | async function icon (platform = 'all') { 51 | let src = resolve(`${ICON_DIR}/icon.svg`) 52 | 53 | if (['all', 'darwin'].indexOf(platform) !== -1) { 54 | let macSizes = [] 55 | let sizes = [16, 32, 128, 256, 512] 56 | sizes.forEach(el => macSizes.push(el, el)) 57 | await mkdir(`${TEMP_DIR}/mac.iconset`) 58 | await Promise.all([macSizes.map((size, i) => { 59 | let ratio = 1 60 | let postfix = '' 61 | if (i % 2) { 62 | ratio = 2 63 | postfix = '@2x' 64 | } 65 | let dest = resolve(`${TEMP_DIR}/mac.iconset/icon_${size}x${size}${postfix}.png`) 66 | return spawn('inkscape', ['-z', '-e', dest, '-d', 72, '-y', 0, '-w', size * ratio, '-h', size * ratio, src]) 67 | })]) 68 | await spawn('iconutil', ['-c', 'icns', '-o', `${ICON_DIR}/markn.icns`, `${TEMP_DIR}/mac.iconset`]) 69 | } 70 | if (['all', 'win32'].indexOf(platform) !== -1) { 71 | let winSizes = [16, 32, 48, 96, 256] 72 | await mkdir(`${TEMP_DIR}/win.iconset`) 73 | await Promise.all(winSizes.map((size) => { 74 | let dest = resolve(`${TEMP_DIR}/win.iconset/icon_${size}x${size}.png`) 75 | return spawn('inkscape', ['-z', '-e', dest, '-d', 72, '-y', 0, '-w', size, '-h', size, src]) 76 | })) 77 | await spawn('convert', [`${TEMP_DIR}/win.iconset/icon_*.png`, `${ICON_DIR}/markn.ico`]) 78 | } 79 | } 80 | 81 | async function pack (platform = 'all', arch = 'all') { 82 | return new Promise((resolve, reject) => { 83 | console.log('pack:', platform, arch) 84 | packager({ 85 | platform, 86 | arch, 87 | dir: APP_DIR, 88 | out: BUILD_DIR, 89 | name: 'Markn', 90 | version: '0.30.4', 91 | icon: `${ICON_DIR}/markn`, 92 | overwrite: true, 93 | asar: true 94 | }, (err, dirs) => { 95 | if (err) return reject(err) 96 | resolve(dirs) 97 | }) 98 | }) 99 | } 100 | 101 | gulp.task('default', () => { 102 | livereload.listen({ 103 | basePath: APP_DIR, 104 | start: true 105 | }) 106 | isWatch = true 107 | gulp.start('watch') 108 | return gulp.start('debug') 109 | }) 110 | 111 | gulp.task('debug', ['compile'], (cb) => { 112 | (async () => { 113 | try { 114 | await spawn('./node_modules/electron-prebuilt/cli.js', [APP_DIR]) 115 | cb() 116 | } catch (err) { 117 | cb(err) 118 | } 119 | })() 120 | }) 121 | 122 | gulp.task('package', ['compile'], (cb) => { 123 | (async () => { 124 | try { 125 | await icon() 126 | await pack() 127 | cb() 128 | } catch (err) { 129 | cb(err) 130 | } 131 | })() 132 | }) 133 | 134 | gulp.task('install', ['compile'], (cb) => { 135 | (async () => { 136 | try { 137 | let {platform, arch} = process 138 | await pack(platform, arch) 139 | cb() 140 | } catch (err) { 141 | cb(err) 142 | } 143 | })() 144 | }) 145 | 146 | gulp.task('icon', (cb) => { 147 | (async () => { 148 | try { 149 | await icon() 150 | cb() 151 | } catch (err) { 152 | cb(err) 153 | } 154 | })() 155 | }) 156 | 157 | gulp.task('compile', ['copy', 'jade', 'stylus', 'webpack']) 158 | 159 | gulp.task('copy', () => { 160 | return gulp.src([ 161 | 'package.json', 162 | 'README.md', 163 | 'assets/**/*', 164 | 'node_modules/chokidar/**/*', 165 | 'node_modules/github-markdown-css/**/*', 166 | 'node_modules/font-awesome/**/*', 167 | 'node_modules/highlight.js/**/*', 168 | 'node_modules/emojione/**/*' 169 | ], { 170 | base: '.' 171 | }) 172 | .pipe(gulp.dest(APP_DIR)) 173 | // .pipe(filter(['**/*.css'])) 174 | // .pipe(livereload()) 175 | }) 176 | 177 | gulp.task('jade', () => { 178 | return gulp 179 | .src('src/static/*.jade') 180 | .pipe(plumber()) 181 | .pipe(jade()) 182 | .pipe(gulp.dest(APP_DIR)) 183 | .pipe(livereload()) 184 | }) 185 | 186 | gulp.task('stylus', () => { 187 | return gulp 188 | .src('src/static/*.styl') 189 | .pipe(plumber()) 190 | .pipe(stylus()) 191 | .pipe(gulp.dest(join(APP_DIR, 'styles'))) 192 | .pipe(livereload()) 193 | }) 194 | 195 | gulp.task('watch', () => { 196 | gulp.watch('src/static/*.jade', ['jade']) 197 | gulp.watch('src/static/*.styl', ['stylus']) 198 | gulp.watch('package.json', ['copy']) 199 | gulp.watch('README.md', ['copy']) 200 | gulp.watch('assets/**/*', ['copy']) 201 | }) 202 | 203 | gulp.task('webpack', (cb) => { 204 | webpack({ 205 | watch: isWatch, 206 | entry: { 207 | main: './src/main/main.js', 208 | renderer: './src/renderer/index.js' 209 | }, 210 | output: { 211 | path: join(APP_DIR, 'scripts'), 212 | filename: '[name].js' 213 | }, 214 | module: { 215 | loaders: [ 216 | { 217 | test: /\.js$/, 218 | loader: 'babel', 219 | exclude: /(node_modules|bower_components)/, 220 | query: { 221 | optional: ['runtime'], 222 | stage: 0 223 | } 224 | }, { 225 | test: /\.coffee$/, 226 | loader: 'coffee' 227 | }, { 228 | // test: /\.jade$/, 229 | // loader: 'jade' 230 | // }, { 231 | test: /\.css$/, 232 | loaders: ['style', 'raw'] 233 | }, { 234 | test: /\.styl$/, 235 | loaders: ['style', 'raw', 'stylus'] 236 | }, { 237 | test: /\.json/, 238 | loader: 'json' 239 | } 240 | ] 241 | }, 242 | resolve: { 243 | extensions: ['', '.js', '.coffee'] 244 | }, 245 | externals: [ 246 | (() => { 247 | let IGNORE 248 | IGNORE = [ 249 | // Node 250 | 'fs', 251 | 'path', 252 | // Electron 253 | 'crash-reporter', 254 | 'app', 255 | 'menu', 256 | 'menu-item', 257 | 'browser-window', 258 | 'dialog', 259 | 'shell', 260 | 'ipc', 261 | 'remote', 262 | // NPM 263 | 'chokidar', 264 | 'emojione' 265 | ] 266 | return (context, request, callback) => { 267 | if (IGNORE.indexOf(request) >= 0) { 268 | return callback(null, `require('${request}')`) 269 | } 270 | return callback() 271 | } 272 | })() 273 | ], 274 | stats: { 275 | colors: true 276 | }, 277 | node: { 278 | console: false, 279 | global: false, 280 | process: false, 281 | Buffer: false, 282 | __filename: false, 283 | __dirname: false, 284 | setImmediate: false 285 | } 286 | }, (err, stats) => { 287 | if (err) { 288 | throw new gutil.PluginError('webpack', err) 289 | } 290 | gutil.log('[webpack]', stats.toString({ 291 | chunkModules: false 292 | })) 293 | if (isWatch) { 294 | livereload.reload(`${APP_DIR}/renderer.js`) 295 | } 296 | if (cb) { 297 | cb() 298 | cb = null 299 | } 300 | }) 301 | }) 302 | 303 | gulp.task('release', ['compile'], (cb) => { 304 | (async () => { 305 | try { 306 | let github = new GitHub({ 307 | version: '3.0.0', 308 | debug: true 309 | }) 310 | github.authenticate({ 311 | type: 'oauth', 312 | token: process.env.TOKEN 313 | }) 314 | 315 | await mkdir(APP_DIR) 316 | await (async () => { 317 | 318 | let releases = ['major', 'minor', 'patch'] 319 | let release = yargs.argv.r 320 | if (releases.indexOf(release) < 0) { 321 | release = 'patch' 322 | } 323 | let version = semver.inc(pkg.version, release) 324 | pkg.version = version 325 | 326 | console.log('bump the version of package.json:', pkg.version) 327 | 328 | let json = JSON.stringify(pkg, null, 2) 329 | let dests = [ 330 | 'package.json', 331 | `${APP_DIR}/package.json` 332 | ] 333 | dests.forEach((p) => { 334 | return writeFileSync(p, json) 335 | }) 336 | })() 337 | 338 | console.log('git commit package.json') 339 | await spawn('git', ['commit', '-m', `Bump version to v${pkg.version}`, 'package.json']) 340 | 341 | console.log('git push') 342 | await spawn('git', ['push']) 343 | 344 | await icon() 345 | let dirs = await pack() 346 | 347 | dirs = dirs.map((dir) => { 348 | console.log(dir) 349 | let name = basename(dir) 350 | return {dir, name} 351 | }) 352 | 353 | await Promise.all(dirs.map(({name}) => { 354 | console.log('zip:', name) 355 | return spawn('zip', [`${TEMP_DIR}/${name}.zip`, '-r', `${BUILD_DIR}/${name}`]) 356 | })) 357 | 358 | let id = await (async () => { 359 | console.log('create new release') 360 | return new Promise((resolve, reject) => { 361 | github.releases.createRelease({ 362 | owner: owner, 363 | repo: repo, 364 | tag_name: `v${pkg.version}` 365 | }, (err, res) => { 366 | if (err) return reject(err) 367 | console.log(JSON.stringify(res, null, 2)) 368 | resolve(res.id) 369 | }) 370 | }) 371 | })() 372 | 373 | console.log('complete to create new release:', id) 374 | 375 | await Promise.all(dirs.map(({name}) => { 376 | return new Promise((release, reject) => { 377 | github.releases.uploadAsset({ 378 | owner: owner, 379 | repo: repo, 380 | id: id, 381 | name: `${name}.zip`, 382 | filePath: join(TEMP_DIR, `${name}.zip`) 383 | }, (err, res) => { 384 | if (err) return reject(err) 385 | console.log(JSON.stringify(res, null, 2)) 386 | resolve() 387 | }) 388 | }) 389 | })) 390 | console.log('complete to upload') 391 | 392 | console.log('done') 393 | cb() 394 | } catch (err) { 395 | console.error(err) 396 | cb(err) 397 | } 398 | })() 399 | }) 400 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markn", 3 | "appName": "Markn", 4 | "version": "0.2.1", 5 | "description": "Lightweight markdown viewer", 6 | "main": "scripts/main.js", 7 | "bin": { 8 | "markn": "./bin/markn" 9 | }, 10 | "scripts": { 11 | "test": "exit 0;", 12 | "debug": "./node_modules/gulp/bin/gulp.js", 13 | "release": "./node_modules/gulp/bin/gulp.js release", 14 | "prepublish": "./node_modules/gulp/bin/gulp.js package" 15 | }, 16 | "files": [ 17 | "bin", 18 | "build", 19 | "LICENSE", 20 | "README.md", 21 | "package.json" 22 | ], 23 | "repository": { 24 | "type": "git", 25 | "url": "git+https://github.com/minodisk/markn.git" 26 | }, 27 | "keywords": [ 28 | "electron", 29 | "md2react", 30 | "markdown", 31 | "viewer" 32 | ], 33 | "author": { 34 | "name": "minodisk", 35 | "email": "daisuke.mino@gmail.com" 36 | }, 37 | "license": "MIT", 38 | "bugs": { 39 | "url": "https://github.com/minodisk/markn/issues" 40 | }, 41 | "homepage": "https://github.com/minodisk/markn#readme", 42 | "devDependencies": { 43 | "asar": "^0.8.0", 44 | "babel": "^5.8.20", 45 | "babel-core": "^5.8.3", 46 | "babel-loader": "^5.3.2", 47 | "babel-runtime": "^5.8.25", 48 | "chokidar": "^1.0.3", 49 | "classnames": "^2.1.3", 50 | "coffee-loader": "^0.7.2", 51 | "coffee-script": "^1.9.3", 52 | "css-loader": "^0.15.1", 53 | "electron-packager": "^5.0.0", 54 | "electron-prebuilt": "^0.30.4", 55 | "emojione": "^1.5.0", 56 | "font-awesome": "^4.3.0", 57 | "github": "^0.2.4", 58 | "github-markdown-css": "^2.0.9", 59 | "gulp": "^3.9.0", 60 | "gulp-filter": "^3.0.0", 61 | "gulp-if": "^1.2.5", 62 | "gulp-jade": "^1.1.0", 63 | "gulp-livereload": "^3.8.0", 64 | "gulp-plumber": "^1.0.1", 65 | "gulp-stylus": "^2.0.6", 66 | "gulp-util": "^3.0.6", 67 | "highlight.js": "^8.7.0", 68 | "imports-loader": "^0.6.4", 69 | "json-loader": "^0.5.2", 70 | "lodash": "^3.10.1", 71 | "md2react": "git://github.com/minodisk/md2react.git#markn", 72 | "mdast": "^0.28.0", 73 | "mkdirp": "^0.5.1", 74 | "raw-loader": "^0.5.1", 75 | "react": "^0.13.3", 76 | "react-highlight": "^0.5.0", 77 | "request": "^2.60.0", 78 | "semver": "^4.3.6", 79 | "style-loader": "^0.12.3", 80 | "stylus-loader": "^1.2.1", 81 | "url-loader": "^0.5.6", 82 | "webpack": "^1.10.1", 83 | "yargs": "^3.17.1" 84 | } 85 | } -------------------------------------------------------------------------------- /src/common/file.js: -------------------------------------------------------------------------------- 1 | import {readFile} from 'fs' 2 | 3 | export default class File { 4 | constructor (path) { 5 | this.path = path 6 | this.content = '' 7 | } 8 | 9 | async read () { 10 | return new Promise((resolve, reject) => { 11 | readFile(this.path, 'utf8', (err, content) => { 12 | if (err) return reject(err) 13 | this.content = content 14 | resolve() 15 | }) 16 | }) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/icon/markn.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minodisk/markn/8e21951e10fd933953790289fd1cace24dcd04d9/src/icon/markn.icns -------------------------------------------------------------------------------- /src/icon/markn.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minodisk/markn/8e21951e10fd933953790289fd1cace24dcd04d9/src/icon/markn.ico -------------------------------------------------------------------------------- /src/main/events.js: -------------------------------------------------------------------------------- 1 | export default { 2 | OPEN_NEW_WINDOW: 'open-new-window', 3 | OPEN_FILE: 'open-file', 4 | OPEN_HELP: 'open-help', 5 | QUIT: 'quit', 6 | OPEN_ABOUT_DIALOG: 'open-about-dialog', 7 | TOGGLE_DEVTOOLS: 'toggle-devtools', 8 | RELOAD: 'reload', 9 | FIND: 'find', 10 | START_FILE: 'start-file' 11 | } 12 | -------------------------------------------------------------------------------- /src/main/main.js: -------------------------------------------------------------------------------- 1 | import reporter from 'crash-reporter' 2 | reporter.start() 3 | import {resolve, join} from 'path' 4 | import {statSync} from 'fs' 5 | import app from 'app' 6 | import dialog from 'dialog' 7 | import shell from 'shell' 8 | import mediator from './mediator' 9 | import events from './events' 10 | import Menu from './menu' 11 | import Window from './window' 12 | 13 | export default class Main { 14 | constructor () { 15 | this.VERSION = app.getVersion() 16 | this.onWindowClose = this.onWindowClose.bind(this) 17 | this.onOpenHelpRequested = this.onOpenHelpRequested.bind(this) 18 | this.onOpenAboutDialogRequested = this.onOpenAboutDialogRequested.bind(this) 19 | this.onQuitRequested = this.onQuitRequested.bind(this) 20 | this.onOpenNewWindowRequested = this.onOpenNewWindowRequested.bind(this) 21 | this.onQuit = this.onQuit.bind(this) 22 | this.onWindowAllClosed = this.onWindowAllClosed.bind(this) 23 | this.onReady = this.onReady.bind(this) 24 | 25 | app.on('ready', this.onReady) 26 | app.on('window-all-closed', this.onWindowAllClosed) 27 | app.on('quit', this.onQuit) 28 | mediator.on(events.OPEN_NEW_WINDOW, this.onOpenNewWindowRequested) 29 | mediator.on(events.QUIT, this.onQuitRequested) 30 | mediator.on(events.OPEN_ABOUT_DIALOG, this.onOpenAboutDialogRequested) 31 | mediator.on(events.OPEN_HELP, this.onOpenHelpRequested) 32 | } 33 | 34 | onReady () { 35 | let {argv} = process 36 | console.log('Markn argv:', argv) 37 | let filename = argv[1] 38 | if (filename) { 39 | filename = resolve(filename) 40 | console.log(`try to open ${filename}`) 41 | try { 42 | let stats = statSync(filename, 'r') 43 | if (!stats.isFile()) { 44 | filename = null 45 | } 46 | } catch (err) { 47 | console.error(err) 48 | filename = null 49 | } 50 | } 51 | 52 | this.menu = new Menu() 53 | this.openNewWindow(filename) 54 | } 55 | 56 | onWindowAllClosed () { 57 | if (process.platform !== 'darwin') { 58 | app.quit() 59 | } 60 | } 61 | 62 | onQuit () { 63 | console.log('onQuit') 64 | this.closeAllWindows() 65 | } 66 | 67 | onOpenNewWindowRequested () { 68 | this.openNewWindow() 69 | } 70 | 71 | onQuitRequested () { 72 | this.quit() 73 | } 74 | 75 | onOpenAboutDialogRequested () { 76 | this.openAboutDialog() 77 | } 78 | 79 | onOpenHelpRequested () { 80 | this.openHelp() 81 | } 82 | 83 | openNewWindow (filename) { 84 | if (!filename) { 85 | filename = join(__dirname, '../README.md') 86 | } 87 | console.log(`open ${filename}`) 88 | 89 | let window = new Window(filename) 90 | window.on('close', this.onWindowClose) 91 | } 92 | 93 | closeAllWindows () { 94 | Window.closeAllWindows() 95 | } 96 | 97 | onWindowClose (e) { 98 | let window = e.currentTarget 99 | window.removeAllListeners() 100 | } 101 | 102 | quit () { 103 | app.quit() 104 | } 105 | 106 | openAboutDialog () { 107 | dialog.showMessageBox({ 108 | type: 'info', 109 | buttons: ['ok'], 110 | title: 'About Markn', 111 | message: 'Markn', 112 | detail: 'Lightweight markdown viewer\nv' + this.VERSION 113 | }) 114 | } 115 | 116 | openHelp () { 117 | shell.openExternal('https://github.com/minodisk/markn/blob/v' + this.VERSION + '/README.md#readme') 118 | } 119 | } 120 | 121 | global.main = new Main() 122 | -------------------------------------------------------------------------------- /src/main/mediator.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | 3 | export default new EventEmitter() 4 | -------------------------------------------------------------------------------- /src/main/menu.js: -------------------------------------------------------------------------------- 1 | import Menu from 'menu' 2 | import mediator from './mediator' 3 | import events from './events' 4 | 5 | export default class MyMenu { 6 | static menu = Menu.buildFromTemplate(Menu.sendActionToFirstResponder != null ? [ 7 | { 8 | label: 'Markn', 9 | submenu: [ 10 | { 11 | label: 'About Markn', 12 | click: function () { 13 | mediator.emit(events.OPEN_ABOUT_DIALOG) 14 | } 15 | }, { 16 | type: 'separator' 17 | }, { 18 | label: 'Hide Electron', 19 | accelerator: 'CommandOrControl+H', 20 | selector: 'hide:' 21 | }, { 22 | label: 'Hide Others', 23 | accelerator: 'CommandOrControl+Shift+H', 24 | selector: 'hideOtherApplications:' 25 | }, { 26 | label: 'Show All', 27 | selector: 'unhideAllApplications:' 28 | }, { 29 | type: 'separator' 30 | }, { 31 | label: 'Quit', 32 | accelerator: 'CommandOrControl+Q', 33 | selector: 'terminate:' 34 | } 35 | ] 36 | }, { 37 | label: 'File', 38 | submenu: [ 39 | { 40 | label: 'New Window', 41 | accelerator: 'CommandOrControl+N', 42 | click: function () { 43 | mediator.emit(events.OPEN_NEW_WINDOW) 44 | } 45 | }, { 46 | label: 'Open File', 47 | accelerator: 'CommandOrControl+O', 48 | click: function () { 49 | mediator.emit(events.OPEN_FILE) 50 | } 51 | }, { 52 | type: 'separator' 53 | }, { 54 | label: 'Recently opened files', 55 | submenu: [] 56 | } 57 | ] 58 | }, { 59 | label: 'Edit', 60 | submenu: [ 61 | { 62 | label: 'Cut', 63 | accelerator: 'CommandOrControl+X', 64 | selector: 'cut:' 65 | }, { 66 | label: 'Copy', 67 | accelerator: 'CommandOrControl+C', 68 | selector: 'copy:' 69 | }, { 70 | label: 'Paste', 71 | accelerator: 'CommandOrControl+V', 72 | selector: 'paste:' 73 | }, { 74 | label: 'Select All', 75 | accelerator: 'CommandOrControl+A', 76 | selector: 'selectAll:' 77 | }, { 78 | type: 'separator' 79 | }, { 80 | label: 'Find', 81 | accelerator: 'CommandOrControl+F', 82 | click: function () { 83 | mediator.emit(events.FIND) 84 | } 85 | } 86 | ] 87 | }, { 88 | label: 'View', 89 | submenu: [ 90 | { 91 | label: 'Reload', 92 | accelerator: 'CommandOrControl+R', 93 | click: function () { 94 | mediator.emit(events.RELOAD) 95 | } 96 | }, { 97 | label: 'Toggle DevTools', 98 | accelerator: 'Alt+CommandOrControl+I', 99 | click: function () { 100 | mediator.emit(events.TOGGLE_DEVTOOLS) 101 | } 102 | } 103 | ] 104 | }, { 105 | label: 'Window', 106 | submenu: [ 107 | { 108 | label: 'Minimize', 109 | accelerator: 'CommandOrControl+M', 110 | selector: 'performMiniaturize:' 111 | }, { 112 | label: 'Close', 113 | accelerator: 'CommandOrControl+W', 114 | selector: 'performClose:' 115 | }, { 116 | type: 'separator' 117 | }, { 118 | label: 'Bring All to Front', 119 | selector: 'arrangeInFront:' 120 | } 121 | ] 122 | }, { 123 | label: 'Help', 124 | submenu: [ 125 | { 126 | label: 'Markn Help', 127 | click: function () { 128 | mediator.emit(events.OPEN_HELP) 129 | } 130 | } 131 | ] 132 | } 133 | ] : [ 134 | { 135 | label: 'File', 136 | submenu: [ 137 | { 138 | label: 'New Window', 139 | accelerator: 'CommandOrControl+N', 140 | click: function () { 141 | mediator.emit(events.OPEN_NEW_WINDOW) 142 | } 143 | }, { 144 | label: 'Open File', 145 | accelerator: 'CommandOrControl+O', 146 | click: function () { 147 | mediator.emit(events.OPEN_FILE) 148 | } 149 | }, { 150 | type: 'separator' 151 | }, { 152 | label: 'Recently opened files', 153 | submenu: [] 154 | }, { 155 | type: 'separator' 156 | }, { 157 | label: 'Exit', 158 | accelerator: 'CommandOrControl+Q', 159 | click: function () { 160 | mediator.emit(events.QUIT) 161 | } 162 | } 163 | ] 164 | }, { 165 | label: 'Edit', 166 | submenu: [ 167 | { 168 | label: 'Find', 169 | accelerator: 'CommandOrControl+F', 170 | click: function () { 171 | mediator.emit(events.FIND) 172 | } 173 | } 174 | ] 175 | }, { 176 | label: 'View', 177 | submenu: [ 178 | { 179 | label: 'Reload', 180 | accelerator: 'CommandOrControl+R', 181 | click: function () { 182 | mediator.emit(events.RELOAD) 183 | } 184 | }, { 185 | label: 'Toggle DevTools', 186 | accelerator: 'Alt+CommandOrControl+I', 187 | click: function () { 188 | mediator.emit(events.TOGGLE_DEVTOOLS) 189 | } 190 | } 191 | ] 192 | }, { 193 | label: 'Help', 194 | submenu: [ 195 | { 196 | label: 'About Markn', 197 | click: function () { 198 | mediator.emit(events.OPEN_ABOUT_DIALOG) 199 | } 200 | } 201 | ] 202 | } 203 | ]) 204 | 205 | constructor () { 206 | Menu.setApplicationMenu(MyMenu.menu) 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /src/main/storage.js: -------------------------------------------------------------------------------- 1 | import app from 'app' 2 | import {join} from 'path' 3 | import {readFile, writeFile} from 'fs' 4 | 5 | export default class Storage { 6 | constructor () { 7 | this.dataDir = app.getPath('userData') 8 | } 9 | 10 | get (key, cb) { 11 | readFile(this.path(key), 'utf8', (err, data) => { 12 | if (err != null) { 13 | cb(err) 14 | return 15 | } 16 | cb(null, JSON.parse(data)) 17 | }) 18 | } 19 | 20 | set (key, val, cb) { 21 | writeFile(this.path(key), JSON.stringify(val), (err) => { 22 | cb(err) 23 | }) 24 | } 25 | 26 | path (key) { 27 | return join(this.dataDir, key) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/util.js: -------------------------------------------------------------------------------- 1 | export default { 2 | bindTarget: function (cb) { 3 | return function (e) { 4 | e.currentTarget = this 5 | return cb(e) 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/window.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import {join, extname, normalize} from 'path' 3 | import {watch} from 'chokidar' 4 | import BrowserWindow from 'browser-window' 5 | import {showOpenDialog} from 'dialog' 6 | import shell from 'shell' 7 | import mediator from './mediator' 8 | import events from './events' 9 | import Storage from './storage' 10 | import ipc from 'ipc' 11 | import File from '../common/file' 12 | 13 | const URL = 'file://' + join(__dirname, '..', 'index.html') 14 | const EXTENSIONS = [ 15 | '.markdown', 16 | '.mdown', 17 | '.mkdn', 18 | '.md', 19 | '.mkd', 20 | '.mdwn', 21 | '.mdtxt', 22 | '.mdtext', 23 | '.text' 24 | ] 25 | 26 | export default class Window extends EventEmitter { 27 | 28 | static add (window) { 29 | if (!this.windows) this.windows = [] 30 | this.windows.push(window) 31 | } 32 | 33 | static remove (window) { 34 | this.windows.splice(this.windows.indexOf(window), 1) 35 | } 36 | 37 | static closeAllWindows () { 38 | this.windows.forEach((window) => window.close()) 39 | } 40 | 41 | constructor (path) { 42 | super() 43 | 44 | Window.add(this) 45 | 46 | this.onFileChanged = this.onFileChanged.bind(this) 47 | this.onFileReloading = this.onFileReloading.bind(this) 48 | this.onFindRequested = this.onFindRequested.bind(this) 49 | this.onToggleDevToolsRequested = this.onToggleDevToolsRequested.bind(this) 50 | this.onOpenFileRequested = this.onOpenFileRequested.bind(this) 51 | this.onClose = this.onClose.bind(this) 52 | this.onResized = this.onResized.bind(this) 53 | this.onMoved = this.onMoved.bind(this) 54 | this.onContentsWillNavigate = this.onContentsWillNavigate.bind(this) 55 | 56 | this.storage = new Storage() 57 | this.storage.get('bounds', (err, bounds) => { 58 | if (err) { 59 | bounds = { 60 | width: 800, 61 | height: 600 62 | } 63 | } 64 | this.browserWindow = new BrowserWindow(bounds) 65 | this.browserWindow.webContents.on('did-finish-load', async () => { 66 | await this.start(path) 67 | this.render() 68 | }) 69 | this.browserWindow.webContents.on('will-navigate', this.onContentsWillNavigate) 70 | this.browserWindow.on('focus', this.onFocus.bind(this)) 71 | this.browserWindow.on('blur', this.onBlur.bind(this)) 72 | this.browserWindow.on('move', this.onMoved) 73 | this.browserWindow.on('resize', this.onResized) 74 | this.browserWindow.on('close', this.onClose) 75 | this.browserWindow.loadUrl(URL) 76 | this.setTitle() 77 | 78 | mediator.on(events.OPEN_FILE, this.onOpenFileRequested) 79 | mediator.on(events.TOGGLE_DEVTOOLS, this.onToggleDevToolsRequested) 80 | mediator.on(events.FIND, this.onFindRequested) 81 | mediator.on(events.RELOAD, this.onFileReloading) 82 | ipc.on('file-reloading', this.onFileReloading) 83 | ipc.on('file-changing', this.onFileChanging.bind(this)) 84 | ipc.on('history-backwarding', this.onHistoryBackwarding.bind(this)) 85 | ipc.on('history-forwarding', this.onHistoryForwarding.bind(this)) 86 | }) 87 | } 88 | 89 | destruct () { 90 | this.browserWindow.webContents.removeAllListeners() 91 | this.browserWindow.removeAllListeners() 92 | mediator.removeListener(events.OPEN_FILE, this.onOpenFileRequested) 93 | mediator.removeListener(events.TOGGLE_DEVTOOLS, this.onToggleDevToolsRequested) 94 | mediator.removeListener(events.FIND, this.onFindRequested) 95 | mediator.removeListener(events.RELOAD, this.onFileReloading) 96 | } 97 | 98 | async setTitle () { 99 | let f = new File('package.json') 100 | await f.read() 101 | let p = JSON.parse(f.content) 102 | this.browserWindow.setTitle(`${p.appName} v${p.version}`) 103 | } 104 | 105 | close () { 106 | this.browserWindow.close() 107 | } 108 | 109 | async onContentsWillNavigate (e, url) { 110 | // Renderer file: Reload. 111 | if (url === URL) { 112 | return 113 | } 114 | 115 | // Prevent navigation in this application. 116 | e.preventDefault() 117 | 118 | // Markdown file: Render it. 119 | if (EXTENSIONS.indexOf(extname(url).toLowerCase()) !== -1) { 120 | url = url.replace(/^file:\/+/, '/') 121 | await this.start(url) 122 | this.render() 123 | return 124 | } 125 | 126 | // Others: Open external application. 127 | shell.openExternal(url) 128 | } 129 | 130 | async onFileChanging (_, path) { 131 | await this.start(path) 132 | this.render() 133 | } 134 | 135 | async onHistoryBackwarding (_, path) { 136 | await this.start(path) 137 | this.browserWindow.webContents.send('history-backwarded', this.file) 138 | } 139 | 140 | async onHistoryForwarding (_, path) { 141 | await this.start(path) 142 | this.browserWindow.webContents.send('history-forwarded', this.file) 143 | } 144 | 145 | onFocus () { 146 | this.browserWindow.webContents.send('focus') 147 | } 148 | 149 | onBlur () { 150 | this.browserWindow.webContents.send('blur') 151 | } 152 | 153 | onMoved () { 154 | this.registerBounds() 155 | } 156 | 157 | onResized () { 158 | this.registerBounds() 159 | this.browserWindow.webContents.send('resize', this.browserWindow.getSize()) 160 | } 161 | 162 | onClose () { 163 | this.destruct() 164 | this.emit('close', { 165 | currentTarget: this 166 | }) 167 | Window.remove(this) 168 | } 169 | 170 | onOpenFileRequested () { 171 | if (!this.browserWindow.isFocused()) { 172 | return 173 | } 174 | showOpenDialog({ 175 | properties: ['openFile'] 176 | }, async (filenames) => { 177 | if (!filenames || !filenames[0]) { 178 | return 179 | } 180 | await this.start(filenames[0]) 181 | this.render() 182 | }) 183 | } 184 | 185 | onToggleDevToolsRequested () { 186 | if (!this.browserWindow.isFocused()) { 187 | return 188 | } 189 | this.browserWindow.toggleDevTools() 190 | } 191 | 192 | onFindRequested () { 193 | if (!this.browserWindow.isFocused()) { 194 | return 195 | } 196 | this.browserWindow.webContents.send('openFind') 197 | } 198 | 199 | async onFileReloading () { 200 | if (!(this.browserWindow.isFocused() && this.file)) { 201 | return 202 | } 203 | 204 | await this.file.read() 205 | this.render() 206 | } 207 | 208 | registerBounds () { 209 | this.storage.set('bounds', this.browserWindow.getBounds(), (err) => { 210 | if (err != null) { 211 | throw err 212 | } 213 | }) 214 | } 215 | 216 | async onFileChanged (path) { 217 | await this.file.read() 218 | this.updateFile() 219 | } 220 | 221 | async start (path) { 222 | path = normalize(path) 223 | 224 | if (this.watcher != null) { 225 | this.watcher.removeAllListeners() 226 | this.watcher.close() 227 | } 228 | 229 | // Watch only local file. 230 | if (!(/^https?:\/\//.test(path))) { 231 | this.watcher = watch(path) 232 | this.watcher.on('change', this.onFileChanged) 233 | } 234 | 235 | this.file = new File(path) 236 | await this.file.read() 237 | 238 | mediator.emit(events.START_FILE, path) 239 | } 240 | 241 | render () { 242 | this.browserWindow.webContents.send('file-changed', this.file) 243 | } 244 | 245 | updateFile () { 246 | this.browserWindow.webContents.send('file-updated', this.file) 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /src/renderer/actions/app.js: -------------------------------------------------------------------------------- 1 | import dispatcher from '../dispatcher' 2 | 3 | export default new class AppAction { 4 | ready () { 5 | dispatcher.emit('ready') 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/actions/history.js: -------------------------------------------------------------------------------- 1 | import ipc from 'ipc' 2 | import dispatcher from '../dispatcher' 3 | 4 | export default new class HistoryAction { 5 | backward () { 6 | dispatcher.emit('history-backwarding') 7 | } 8 | 9 | forward () { 10 | dispatcher.emit('history-forwarding') 11 | } 12 | 13 | reload () { 14 | ipc.send('file-reloading') 15 | } 16 | 17 | change (path) { 18 | ipc.send('file-changing', path) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/renderer/actions/markdown.js: -------------------------------------------------------------------------------- 1 | import dispatcher from '../dispatcher' 2 | 3 | export default new class MarkdownAction { 4 | updated (marks) { 5 | dispatcher.emit('updated') 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/actions/menu.js: -------------------------------------------------------------------------------- 1 | import dispatcher from '../dispatcher' 2 | 3 | export default new class MenuAction { 4 | toggle () { 5 | dispatcher.emit('toggle-menu') 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/actions/scroll.js: -------------------------------------------------------------------------------- 1 | import dispatcher from '../dispatcher' 2 | 3 | export default new class ScrollAction { 4 | scrolled (scrollTop) { 5 | dispatcher.emit('scrolled', scrollTop) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/actions/search.js: -------------------------------------------------------------------------------- 1 | import dispatcher from '../dispatcher' 2 | 3 | export default new class SearchAction { 4 | close () { 5 | dispatcher.emit('closeFind') 6 | } 7 | 8 | input (e) { 9 | dispatcher.emit('searching', e.currentTarget.value) 10 | } 11 | 12 | keydown (e) { 13 | if (e.key !== 'Enter') return 14 | dispatcher.emit('forwarding') 15 | } 16 | 17 | forward () { 18 | dispatcher.emit('forwarding') 19 | } 20 | 21 | backward () { 22 | dispatcher.emit('backwarding') 23 | } 24 | 25 | searched (marks) { 26 | dispatcher.emit('searched', marks) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/renderer/dispatcher.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | 3 | export default new EventEmitter() 4 | -------------------------------------------------------------------------------- /src/renderer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import RootComponent from './views/root' 3 | 4 | var $ = React.createElement 5 | 6 | export default class App { 7 | constructor () { 8 | React.render($(RootComponent, {}), document.body) 9 | } 10 | } 11 | 12 | window.app = new App() 13 | -------------------------------------------------------------------------------- /src/renderer/stores/file.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import ipc from 'ipc' 3 | 4 | export default new class FileStore extends EventEmitter { 5 | constructor () { 6 | super() 7 | ipc.on('file-changed', this.onFileChanged.bind(this)) 8 | ipc.on('file-updated', this.onFileUpdated.bind(this)) 9 | } 10 | 11 | onFileChanged (file) { 12 | this.emit('changed', file) 13 | } 14 | 15 | onFileUpdated (file) { 16 | this.emit('updated', file) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/renderer/stores/history.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import dispatcher from '../dispatcher' 3 | import ipc from 'ipc' 4 | 5 | export default new class HistoryStore extends EventEmitter { 6 | constructor () { 7 | super() 8 | this.pathes = [] 9 | this.index = -1 10 | 11 | ipc.on('file-changed', this.onFileChanged.bind(this)) 12 | ipc.on('history-backwarded', this.onHistoryBackwarded.bind(this)) 13 | ipc.on('history-forwarded', this.onHistoryForwarded.bind(this)) 14 | dispatcher.on('history-backwarding', this.backward.bind(this)) 15 | dispatcher.on('history-forwarding', this.forward.bind(this)) 16 | } 17 | 18 | onFileChanged (file) { 19 | if (file.path === this.pathes[this.pathes.length - 1]) { 20 | return 21 | } 22 | 23 | this.pathes.splice(this.index + 1) 24 | 25 | this.pathes.push(file.path) 26 | this.index = this.pathes.length - 1 27 | this.emitState() 28 | } 29 | 30 | emitState () { 31 | this.emit('state-change', { 32 | canBackward: this.canBackward(), 33 | canForward: this.canForward() 34 | }) 35 | } 36 | 37 | canBackward () { 38 | return this.index > 0 39 | } 40 | 41 | canForward () { 42 | return this.index < (this.pathes.length - 1) 43 | } 44 | 45 | backward () { 46 | if (!this.canBackward()) return 47 | let path = this.pathes[this.index - 1] 48 | console.log('backward:', path) 49 | // this.emit('backward', path) 50 | ipc.send('history-backwarding', path) 51 | } 52 | 53 | forward () { 54 | if (!this.canForward()) return 55 | let path = this.pathes[this.index + 1] 56 | console.log('forward:', path) 57 | // this.emit('forward', path) 58 | ipc.send('history-forwarding', path) 59 | } 60 | 61 | onHistoryBackwarded (file) { 62 | console.log('onHistoryBackwarded:', file.path) 63 | this.index-- 64 | this.emitState() 65 | this.emit('backwarded', file) 66 | } 67 | 68 | onHistoryForwarded (file) { 69 | console.log('onHistoryForwarded:', file.path) 70 | this.index++ 71 | this.emitState() 72 | this.emit('forwarded', file) 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/renderer/stores/scroll.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import dispatcher from '../dispatcher' 3 | 4 | export default new class ScrollStore extends EventEmitter { 5 | constructor () { 6 | super() 7 | 8 | dispatcher.on('searched', this.onSearched.bind(this)) 9 | dispatcher.on('scrolled', this.onScrolled.bind(this)) 10 | } 11 | 12 | onSearched (marks) { 13 | this.emit('searched', marks) 14 | } 15 | 16 | onScrolled (scrollTop) { 17 | this.emit('scrolled', scrollTop) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/renderer/stores/search.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import dispatcher from '../dispatcher' 3 | import ipc from 'ipc' 4 | 5 | export default new class SearchStore extends EventEmitter { 6 | constructor () { 7 | super() 8 | 9 | this.focusedIndex = 0 10 | this.marks = [] 11 | 12 | ipc.on('openFind', this.onOpenFind.bind(this)) 13 | dispatcher.on('closeFind', this.onCloseFind.bind(this)) 14 | dispatcher.on('searching', this.onSearching.bind(this)) 15 | dispatcher.on('searched', this.onSearched.bind(this)) 16 | dispatcher.on('forwarding', this.onForwarding.bind(this)) 17 | dispatcher.on('backwarding', this.onBackwarding.bind(this)) 18 | } 19 | 20 | onOpenFind () { 21 | this.emit('openFind') 22 | } 23 | 24 | onCloseFind () { 25 | this.emit('closeFind') 26 | } 27 | 28 | onSearching (word) { 29 | this.emit('searching', word) 30 | } 31 | 32 | onSearched (marks) { 33 | this.focusedIndex = 0 34 | this.marks = marks 35 | 36 | if (this.marks.length === 0) { 37 | this.emit('disabling') 38 | } else { 39 | this.emit('enabling') 40 | } 41 | 42 | this.onForwarding() 43 | } 44 | 45 | onForwarding () { 46 | this.moveIndication(1) 47 | } 48 | 49 | onBackwarding () { 50 | this.moveIndication(-1) 51 | } 52 | 53 | moveIndication (delta) { 54 | let len = this.marks.length 55 | let mark = this.marks[this.focusedIndex] 56 | this.emit('indicating', this.focusedIndex, len, mark) 57 | 58 | if (len === 0) { 59 | return 60 | } 61 | 62 | this.focusedIndex += delta 63 | if (this.focusedIndex >= len) { 64 | this.focusedIndex = 0 65 | } 66 | if (this.focusedIndex < 0) { 67 | this.focusedIndex = len - 1 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/renderer/stores/window.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import dispatcher from '../dispatcher' 3 | import ipc from 'ipc' 4 | 5 | export default new class WindowStore extends EventEmitter { 6 | constructor () { 7 | super() 8 | 9 | window.addEventListener('resize', this.onResized.bind(this)) 10 | 11 | ipc.on('focus', this.onFocus.bind(this)) 12 | ipc.on('blur', this.onBlur.bind(this)) 13 | ipc.on('resize', this.onResize.bind(this)) 14 | 15 | dispatcher.on('ready', this.onReady.bind(this)) 16 | } 17 | 18 | onFocus () { 19 | this.emit('focus') 20 | } 21 | 22 | onBlur () { 23 | this.emit('blur') 24 | } 25 | 26 | onReady () { 27 | this.onFocus() 28 | this.resize() 29 | } 30 | 31 | onResize (size) { 32 | this.resize() 33 | } 34 | 35 | onResized () { 36 | this.resize() 37 | } 38 | 39 | resize () { 40 | this.emit('resize', {x: window.innerWidth, y: window.innerHeight}) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/renderer/views/body.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Markdown from './markdown' 3 | import Rail from './rail' 4 | import windowStore from '../stores/window' 5 | import searchStore from '../stores/search' 6 | import fileStore from '../stores/file' 7 | import historyStore from '../stores/history' 8 | import scrollAction from '../actions/scroll' 9 | 10 | export default class BodyComponent extends React.Component { 11 | displayName = 'BodyComponent' 12 | 13 | constructor (props) { 14 | super(props) 15 | 16 | this.state = { 17 | } 18 | 19 | windowStore.on('resize', this.onWindowResized.bind(this)) 20 | searchStore.on('indicating', this.onIndicating.bind(this)) 21 | fileStore.on('changed', this.onFileChanged.bind(this)) 22 | historyStore.on('forwarded', this.onFileChanged.bind(this)) 23 | historyStore.on('backwarded', this.onFileChanged.bind(this)) 24 | } 25 | 26 | onWindowResized (size) { 27 | let body = React.findDOMNode(this.refs.body) 28 | body.style.height = `${size.y - 30}px` 29 | } 30 | 31 | onIndicating ({}, {}, mark) { 32 | if (!mark) return 33 | let rect = mark.getBoundingClientRect() 34 | let body = React.findDOMNode(this.refs.body) 35 | body.scrollTop += rect.top - window.innerHeight / 2 36 | } 37 | 38 | onFileChanged () { 39 | let body = React.findDOMNode(this.refs.body) 40 | body.scrollTop = 0 41 | } 42 | 43 | render () { 44 | return ( 45 |
46 |
47 | 48 | 49 |
50 |
51 | ) 52 | } 53 | 54 | onScroll (e) { 55 | let body = React.findDOMNode(this.refs.body) 56 | scrollAction.scrolled(body.scrollTop) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/renderer/views/head.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Nav from './nav' 3 | import Search from './search' 4 | 5 | export default class HeadComponent extends React.Component { 6 | displayName = 'HeadComponent' 7 | 8 | constructor (props) { 9 | super(props) 10 | } 11 | 12 | render () { 13 | return (
14 |
) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/renderer/views/markdown.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import classnames from 'classnames' 3 | import remote from 'remote' 4 | import fileStore from '../stores/file' 5 | import historyStore from '../stores/history' 6 | import searchStore from '../stores/search' 7 | import markdownAction from '../actions/markdown' 8 | import searchAction from '../actions/search' 9 | import Compiler from 'imports?React=react!../../../node_modules/md2react/src/index' 10 | // import Compiler from 'imports?React=react!md2react' 11 | import Highlight from 'react-highlight' 12 | 13 | let path = remote.require('path') 14 | let $ = React.createElement 15 | 16 | export default class MarkdownComponent extends React.Component { 17 | constructor (props) { 18 | super(props) 19 | this.state = { 20 | md: '', 21 | dirname: '', 22 | search: '', 23 | indication: -1 24 | } 25 | 26 | this.compiler = new MyCompiler({ 27 | gfm: true, 28 | breaks: true, 29 | tables: true, 30 | commonmark: true, 31 | footnotes: true 32 | }) 33 | 34 | fileStore.on('changed', this.onFileChanged.bind(this)) 35 | fileStore.on('updated', this.onFileUpdated.bind(this)) 36 | historyStore.on('forwarded', this.onHistoryChanged.bind(this)) 37 | historyStore.on('backwarded', this.onHistoryChanged.bind(this)) 38 | searchStore.on('searching', this.onSearching.bind(this)) 39 | searchStore.on('indicating', this.onIndicating.bind(this)) 40 | } 41 | 42 | onFileChanged (file) { 43 | console.log('onFileChanged:', file.path) 44 | this.isUpdating = true 45 | this.setState({ 46 | md: file.content, 47 | dirname: path.dirname(file.path) 48 | }) 49 | } 50 | 51 | onFileUpdated (file) { 52 | console.log('onFileUpdated:', file.path) 53 | this.isUpdating = true 54 | this.setState({ 55 | md: file.content, 56 | dirname: path.dirname(file.path) 57 | }) 58 | } 59 | 60 | onHistoryChanged (file) { 61 | console.log('onHistoryChanged:', file.path) 62 | this.isUpdating = true 63 | this.setState({ 64 | md: file.content, 65 | dirname: path.dirname(file.path) 66 | }) 67 | } 68 | 69 | onSearching (search) { 70 | this.isSearching = true 71 | this.setState({search}) 72 | } 73 | 74 | onIndicating (indication) { 75 | this.setState({indication}) 76 | } 77 | 78 | render () { 79 | return this.compiler.compile(this.state) 80 | } 81 | 82 | componentDidUpdate () { 83 | if (this.isUpdating) { 84 | this.isUpdating = false 85 | markdownAction.updated() 86 | } 87 | if (this.isSearching) { 88 | this.isSearching = false 89 | let marks = [] 90 | for (let i = 0; i < this.compiler.marksCount; i++) { 91 | let mark = React.findDOMNode(this.refs[`mark${i}`]) 92 | marks.push(mark) 93 | } 94 | searchAction.searched(marks) 95 | } 96 | } 97 | } 98 | 99 | function highlight (code, lang, key) { 100 | return {code} 101 | } 102 | 103 | class MyCompiler extends Compiler { 104 | constructor (opts) { 105 | opts.highlight = highlight 106 | super(opts) 107 | } 108 | 109 | compile ({md, dirname, search, indication}) { 110 | this.dirname = dirname 111 | if (search === '') { 112 | this.search = null 113 | } else { 114 | this.search = { 115 | text: search, 116 | regExp: new RegExp(`(${search})`, 'ig') 117 | } 118 | } 119 | this.indication = indication 120 | 121 | this.ids = {} 122 | this.marksCount = 0 123 | return super.compile(md) 124 | } 125 | 126 | root (node, defs, key, tableAlign) { 127 | return $('div', { 128 | key, 129 | className: 'markdown-body' 130 | }, this.toChildren(node, defs, key)) 131 | } 132 | 133 | text (node, defs, key, tableAlign) { 134 | if (node.value.indexOf(':') !== -1) { 135 | let chunks = node.value 136 | .split(/:([0-9a-z_+-]+):/g) 137 | .map((type, i) => { 138 | if (i % 2 === 0) { 139 | return {type} 140 | } 141 | if (type.charAt(0) === '+') { 142 | type = type.substr(1) 143 | } 144 | return 145 | }) 146 | return $('span', {}, chunks) 147 | } 148 | 149 | if (!this.search || node.value.indexOf(this.search.text) === -1) { 150 | return node.value 151 | } 152 | let words = node.value.split(this.search.regExp) 153 | words = words.map((word, i) => { 154 | if (i % 2 === 0) { 155 | return word 156 | } 157 | return $('mark', { 158 | className: this.marksCount === this.indication ? 'indicated' : '', 159 | ref: `mark${this.marksCount++}` 160 | }, word) 161 | }) 162 | return $('span', {}, words) 163 | } 164 | 165 | image ({src, title, alt}, defs, key, tableAlign) { 166 | if (!(/^https?:\/\//.test(src))) { 167 | src = path.resolve(this.dirname, src) 168 | } 169 | return $('img', { 170 | key, 171 | src: src, 172 | title: title, 173 | alt: alt 174 | }) 175 | } 176 | 177 | link (node, defs, key, tableAlign) { 178 | if (!(/^https?:\/\//.test(node.href))) { 179 | node.href = path.resolve(this.dirname, node.href) 180 | } 181 | return $('a', { 182 | key, 183 | href: node.href, 184 | title: node.title 185 | }, this.toChildren(node, defs, key)) 186 | } 187 | 188 | heading (node, defs, key, tableAlign) { 189 | let text = node.children 190 | .filter((child) => { return child.type === 'text' }) 191 | .map((child) => { return child.value }) 192 | .join('') 193 | let id = text 194 | .toLowerCase() 195 | .replace(/\s/g, '-') 196 | .replace(/[!<>#%@&='"`:;,\.\*\+\(\)\{\}\[\]\\\/\|\?\^\$]+/g, '') 197 | if (this.ids[id] == null) { 198 | this.ids[id] = 0 199 | } else { 200 | this.ids[id]++ 201 | id = `${id}-${this.ids[id]}` 202 | } 203 | return $((`h${node.depth.toString()}`), {key}, [ 204 | $('a', {key: `${key}-a`, id: id, className: 'anchor', href: `#${id}`}, [ 205 | $('span', {key: `${key}-a-span`, className: 'icon icon-link'}) 206 | ]), 207 | this.toChildren(node, defs, key) 208 | ]) 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /src/renderer/views/nav.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import fileStore from '../stores/file' 3 | import historyStore from '../stores/history' 4 | import historyAction from '../actions/history' 5 | import menuAction from '../actions/menu' 6 | 7 | export default class NavComponent extends React.Component { 8 | displayName = 'NavComponent' 9 | 10 | constructor (props) { 11 | super(props) 12 | this.state = { 13 | canBackward: false, 14 | canForward: false, 15 | path: '' 16 | } 17 | 18 | fileStore.on('changed', this.onFileChanged.bind(this)) 19 | historyStore.on('state-change', this.onHistoryStateChanged.bind(this)) 20 | historyStore.on('forwarded', this.onHistoryUpdated.bind(this)) 21 | historyStore.on('backwarded', this.onHistoryUpdated.bind(this)) 22 | } 23 | 24 | render () { 25 | return ( 26 |
27 |
33 | ) 34 | } 35 | 36 | onChange (e) { 37 | let input = e.currentTarget 38 | let path = input.value 39 | this.setState({path}) 40 | } 41 | 42 | onKeyDown (e) { 43 | switch (e.key) { 44 | case 'Enter': 45 | historyAction.change(this.state.path) 46 | break 47 | } 48 | } 49 | 50 | onFileChanged (file) { 51 | console.log('onFileChanged:', file.path) 52 | this.setState({path: file.path}) 53 | } 54 | 55 | onHistoryStateChanged (state) { 56 | this.setState(state) 57 | } 58 | 59 | onHistoryUpdated (file) { 60 | console.log('onHistoryUpdated:', file.path) 61 | this.setState({path: file.path}) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/renderer/views/rail.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import scrollStore from '../stores/scroll' 3 | 4 | export default class RailComponent extends React.Component { 5 | displayName = 'RailComponent' 6 | 7 | constructor (props) { 8 | super(props) 9 | this.state = { 10 | marks: [], 11 | scrollTop: 0 12 | } 13 | 14 | window.addEventListener('resize', this.onResized.bind(this), false) 15 | scrollStore.on('searched', this.onSearched.bind(this)) 16 | scrollStore.on('scrolled', this.onScrolled.bind(this)) 17 | } 18 | 19 | onResized () { 20 | this.forceUpdate() 21 | } 22 | 23 | onSearched (marks) { 24 | this.setState({marks}) 25 | } 26 | 27 | onScrolled (scrollTop) { 28 | this.setState({scrollTop}) 29 | } 30 | 31 | render () { 32 | return ( 33 |
{ 34 | this.state.marks.map((mark) => { 35 | let rect = mark.getBoundingClientRect() 36 | let style = {top: Math.round(this.state.scrollTop + rect.top + rect.height / 2 - 1.5)} 37 | return
38 | }) 39 | }
40 | ) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/renderer/views/root.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import classnames from 'classnames' 3 | import Head from './head' 4 | import Body from './body' 5 | import windowStore from '../stores/window' 6 | import appAction from '../actions/app' 7 | 8 | export default class RootComponent extends React.Component { 9 | displayName = 'RootComponent' 10 | 11 | constructor (props) { 12 | super(props) 13 | 14 | this.state = { 15 | isFocused: false 16 | } 17 | 18 | windowStore.on('focus', this.onWindowFocus.bind(this)) 19 | windowStore.on('blur', this.onWindowBlur.bind(this)) 20 | } 21 | 22 | onWindowFocus () { 23 | this.setState({ 24 | isFocused: true 25 | }) 26 | } 27 | 28 | onWindowBlur () { 29 | this.setState({ 30 | isFocused: false 31 | }) 32 | } 33 | 34 | render () { 35 | return ( 36 |
37 | 38 | 39 |
40 | ) 41 | } 42 | 43 | componentDidMount () { 44 | appAction.ready() 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/renderer/views/search.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import classnames from 'classnames' 3 | import searchStore from '../stores/search' 4 | import searchAction from '../actions/search' 5 | 6 | export default class SearchComponent extends React.Component { 7 | displayName = 'SearchComponent' 8 | 9 | constructor (props) { 10 | super(props) 11 | this.state = { 12 | current: 0, 13 | total: 0, 14 | isShown: false, 15 | disabled: false 16 | } 17 | 18 | this.store = searchStore 19 | this.store.on('openFind', this.show.bind(this)) 20 | this.store.on('closeFind', this.hide.bind(this)) 21 | this.store.on('disabling', this.onDisabling.bind(this)) 22 | this.store.on('enabling', this.onEnabling.bind(this)) 23 | this.store.on('indicating', this.onIndicating.bind(this)) 24 | } 25 | 26 | show () { 27 | this.setState({isShown: true}) 28 | let input = React.findDOMNode(this.refs.search) 29 | input.focus() 30 | input.select() 31 | } 32 | 33 | hide () { 34 | this.setState({isShown: false}) 35 | } 36 | 37 | onDisabling () { 38 | this.setState({disabled: true}) 39 | } 40 | 41 | onEnabling () { 42 | this.setState({disabled: false}) 43 | } 44 | 45 | onIndicating (current, total) { 46 | this.setState({current, total}) 47 | } 48 | 49 | render () { 50 | return ( 51 |
52 |
53 | 54 | {this.state.total === 0 ? '' : `${this.state.current + 1} / ${this.state.total}`} 55 |
56 |
60 | ) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/static/emoji.styl: -------------------------------------------------------------------------------- 1 | .emoji 2 | display inline-block 3 | height 1em 4 | width 1em 5 | margin 0 .05em 0 .1em 6 | vertical-align -0.2em 7 | background-repeat no-repeat 8 | background-position center center 9 | background-size 1em 1em 10 | 11 | map = { 12 | 'flag_zw': '1f1ff-1f1fc', 13 | 'zw': '1f1ff-1f1fc', 14 | 'flag_zm': '1f1ff-1f1f2', 15 | 'zm': '1f1ff-1f1f2', 16 | 'flag_ye': '1f1fe-1f1ea', 17 | 'ye': '1f1fe-1f1ea', 18 | 'flag_eh': '1f1ea-1f1ed', 19 | 'eh': '1f1ea-1f1ed', 20 | 'flag_wf': '1f1fc-1f1eb', 21 | 'wf': '1f1fc-1f1eb', 22 | 'flag_ve': '1f1fb-1f1ea', 23 | 've': '1f1fb-1f1ea', 24 | 'flag_va': '1f1fb-1f1e6', 25 | 'va': '1f1fb-1f1e6', 26 | 'flag_vu': '1f1fb-1f1fa', 27 | 'vu': '1f1fb-1f1fa', 28 | 'flag_uz': '1f1fa-1f1ff', 29 | 'uz': '1f1fa-1f1ff', 30 | 'flag_uy': '1f1fa-1f1fe', 31 | 'uy': '1f1fa-1f1fe', 32 | 'flag_ua': '1f1fa-1f1e6', 33 | 'ua': '1f1fa-1f1e6', 34 | 'flag_ug': '1f1fa-1f1ec', 35 | 'ug': '1f1fa-1f1ec', 36 | 'flag_vi': '1f1fb-1f1ee', 37 | 'vi': '1f1fb-1f1ee', 38 | 'flag_tv': '1f1f9-1f1fb', 39 | 'tuvalu': '1f1f9-1f1fb', 40 | 'flag_tm': '1f1f9-1f1f2', 41 | 'turkmenistan': '1f1f9-1f1f2', 42 | 'flag_tn': '1f1f9-1f1f3', 43 | 'tn': '1f1f9-1f1f3', 44 | 'flag_tt': '1f1f9-1f1f9', 45 | 'tt': '1f1f9-1f1f9', 46 | 'flag_to': '1f1f9-1f1f4', 47 | 'to': '1f1f9-1f1f4', 48 | 'flag_tg': '1f1f9-1f1ec', 49 | 'tg': '1f1f9-1f1ec', 50 | 'flag_th': '1f1f9-1f1ed', 51 | 'th': '1f1f9-1f1ed', 52 | 'flag_tz': '1f1f9-1f1ff', 53 | 'tz': '1f1f9-1f1ff', 54 | 'flag_tj': '1f1f9-1f1ef', 55 | 'tj': '1f1f9-1f1ef', 56 | 'flag_tw': '1f1f9-1f1fc', 57 | 'tw': '1f1f9-1f1fc', 58 | 'flag_sy': '1f1f8-1f1fe', 59 | 'sy': '1f1f8-1f1fe', 60 | 'flag_sz': '1f1f8-1f1ff', 61 | 'sz': '1f1f8-1f1ff', 62 | 'flag_sr': '1f1f8-1f1f7', 63 | 'sr': '1f1f8-1f1f7', 64 | 'flag_sd': '1f1f8-1f1e9', 65 | 'sd': '1f1f8-1f1e9', 66 | 'flag_lk': '1f1f1-1f1f0', 67 | 'lk': '1f1f1-1f1f0', 68 | 'flag_so': '1f1f8-1f1f4', 69 | 'so': '1f1f8-1f1f4', 70 | 'flag_sb': '1f1f8-1f1e7', 71 | 'sb': '1f1f8-1f1e7', 72 | 'flag_si': '1f1f8-1f1ee', 73 | 'si': '1f1f8-1f1ee', 74 | 'flag_sk': '1f1f8-1f1f0', 75 | 'sk': '1f1f8-1f1f0', 76 | 'flag_sl': '1f1f8-1f1f1', 77 | 'sl': '1f1f8-1f1f1', 78 | 'flag_sc': '1f1f8-1f1e8', 79 | 'sc': '1f1f8-1f1e8', 80 | 'flag_rs': '1f1f7-1f1f8', 81 | 'rs': '1f1f7-1f1f8', 82 | 'flag_sn': '1f1f8-1f1f3', 83 | 'sn': '1f1f8-1f1f3', 84 | 'flag_st': '1f1f8-1f1f9', 85 | 'st': '1f1f8-1f1f9', 86 | 'flag_sm': '1f1f8-1f1f2', 87 | 'sm': '1f1f8-1f1f2', 88 | 'flag_ws': '1f1fc-1f1f8', 89 | 'ws': '1f1fc-1f1f8', 90 | 'flag_vc': '1f1fb-1f1e8', 91 | 'vc': '1f1fb-1f1e8', 92 | 'flag_lc': '1f1f1-1f1e8', 93 | 'lc': '1f1f1-1f1e8', 94 | 'flag_kn': '1f1f0-1f1f3', 95 | 'kn': '1f1f0-1f1f3', 96 | 'flag_sh': '1f1f8-1f1ed', 97 | 'sh': '1f1f8-1f1ed', 98 | 'flag_rw': '1f1f7-1f1fc', 99 | 'rw': '1f1f7-1f1fc', 100 | 'flag_ro': '1f1f7-1f1f4', 101 | 'ro': '1f1f7-1f1f4', 102 | 'flag_qa': '1f1f6-1f1e6', 103 | 'qa': '1f1f6-1f1e6', 104 | 'flag_pe': '1f1f5-1f1ea', 105 | 'pe': '1f1f5-1f1ea', 106 | 'flag_py': '1f1f5-1f1fe', 107 | 'py': '1f1f5-1f1fe', 108 | 'flag_pg': '1f1f5-1f1ec', 109 | 'pg': '1f1f5-1f1ec', 110 | 'flag_pa': '1f1f5-1f1e6', 111 | 'pa': '1f1f5-1f1e6', 112 | 'flag_ps': '1f1f5-1f1f8', 113 | 'ps': '1f1f5-1f1f8', 114 | 'flag_pw': '1f1f5-1f1fc', 115 | 'pw': '1f1f5-1f1fc', 116 | 'flag_pk': '1f1f5-1f1f0', 117 | 'pk': '1f1f5-1f1f0', 118 | 'flag_om': '1f1f4-1f1f2', 119 | 'om': '1f1f4-1f1f2', 120 | 'flag_kp': '1f1f0-1f1f5', 121 | 'kp': '1f1f0-1f1f5', 122 | 'flag_nu': '1f1f3-1f1fa', 123 | 'nu': '1f1f3-1f1fa', 124 | 'flag_ng': '1f1f3-1f1ec', 125 | 'nigeria': '1f1f3-1f1ec', 126 | 'flag_ne': '1f1f3-1f1ea', 127 | 'ne': '1f1f3-1f1ea', 128 | 'flag_ni': '1f1f3-1f1ee', 129 | 'ni': '1f1f3-1f1ee', 130 | 'flag_nc': '1f1f3-1f1e8', 131 | 'nc': '1f1f3-1f1e8', 132 | 'flag_np': '1f1f3-1f1f5', 133 | 'np': '1f1f3-1f1f5', 134 | 'flag_nr': '1f1f3-1f1f7', 135 | 'nr': '1f1f3-1f1f7', 136 | 'flag_na': '1f1f3-1f1e6', 137 | 'na': '1f1f3-1f1e6', 138 | 'flag_mm': '1f1f2-1f1f2', 139 | 'mm': '1f1f2-1f1f2', 140 | 'flag_mz': '1f1f2-1f1ff', 141 | 'mz': '1f1f2-1f1ff', 142 | 'flag_ma': '1f1f2-1f1e6', 143 | 'ma': '1f1f2-1f1e6', 144 | 'flag_ms': '1f1f2-1f1f8', 145 | 'ms': '1f1f2-1f1f8', 146 | 'flag_me': '1f1f2-1f1ea', 147 | 'me': '1f1f2-1f1ea', 148 | 'flag_mn': '1f1f2-1f1f3', 149 | 'mn': '1f1f2-1f1f3', 150 | 'flag_mc': '1f1f2-1f1e8', 151 | 'mc': '1f1f2-1f1e8', 152 | 'flag_md': '1f1f2-1f1e9', 153 | 'md': '1f1f2-1f1e9', 154 | 'flag_fm': '1f1eb-1f1f2', 155 | 'fm': '1f1eb-1f1f2', 156 | 'flag_mu': '1f1f2-1f1fa', 157 | 'mu': '1f1f2-1f1fa', 158 | 'flag_mr': '1f1f2-1f1f7', 159 | 'mr': '1f1f2-1f1f7', 160 | 'flag_mh': '1f1f2-1f1ed', 161 | 'mh': '1f1f2-1f1ed', 162 | 'flag_mt': '1f1f2-1f1f9', 163 | 'mt': '1f1f2-1f1f9', 164 | 'flag_ml': '1f1f2-1f1f1', 165 | 'ml': '1f1f2-1f1f1', 166 | 'flag_mv': '1f1f2-1f1fb', 167 | 'mv': '1f1f2-1f1fb', 168 | 'flag_mw': '1f1f2-1f1fc', 169 | 'mw': '1f1f2-1f1fc', 170 | 'flag_mg': '1f1f2-1f1ec', 171 | 'mg': '1f1f2-1f1ec', 172 | 'flag_mk': '1f1f2-1f1f0', 173 | 'mk': '1f1f2-1f1f0', 174 | 'flag_lu': '1f1f1-1f1fa', 175 | 'lu': '1f1f1-1f1fa', 176 | 'flag_lt': '1f1f1-1f1f9', 177 | 'lt': '1f1f1-1f1f9', 178 | 'flag_li': '1f1f1-1f1ee', 179 | 'li': '1f1f1-1f1ee', 180 | 'flag_ly': '1f1f1-1f1fe', 181 | 'ly': '1f1f1-1f1fe', 182 | 'flag_lr': '1f1f1-1f1f7', 183 | 'lr': '1f1f1-1f1f7', 184 | 'flag_ls': '1f1f1-1f1f8', 185 | 'ls': '1f1f1-1f1f8', 186 | 'flag_lb': '1f1f1-1f1e7', 187 | 'lb': '1f1f1-1f1e7', 188 | 'flag_lv': '1f1f1-1f1fb', 189 | 'lv': '1f1f1-1f1fb', 190 | 'flag_la': '1f1f1-1f1e6', 191 | 'la': '1f1f1-1f1e6', 192 | 'flag_kg': '1f1f0-1f1ec', 193 | 'kg': '1f1f0-1f1ec', 194 | 'flag_kw': '1f1f0-1f1fc', 195 | 'kw': '1f1f0-1f1fc', 196 | 'flag_xk': '1f1fd-1f1f0', 197 | 'xk': '1f1fd-1f1f0', 198 | 'flag_ki': '1f1f0-1f1ee', 199 | 'ki': '1f1f0-1f1ee', 200 | 'flag_ke': '1f1f0-1f1ea', 201 | 'ke': '1f1f0-1f1ea', 202 | 'flag_kz': '1f1f0-1f1ff', 203 | 'kz': '1f1f0-1f1ff', 204 | 'flag_jo': '1f1ef-1f1f4', 205 | 'jo': '1f1ef-1f1f4', 206 | 'flag_je': '1f1ef-1f1ea', 207 | 'je': '1f1ef-1f1ea', 208 | 'flag_jm': '1f1ef-1f1f2', 209 | 'jm': '1f1ef-1f1f2', 210 | 'flag_iq': '1f1ee-1f1f6', 211 | 'iq': '1f1ee-1f1f6', 212 | 'flag_ir': '1f1ee-1f1f7', 213 | 'ir': '1f1ee-1f1f7', 214 | 'flag_is': '1f1ee-1f1f8', 215 | 'is': '1f1ee-1f1f8', 216 | 'flag_hu': '1f1ed-1f1fa', 217 | 'hu': '1f1ed-1f1fa', 218 | 'flag_hn': '1f1ed-1f1f3', 219 | 'hn': '1f1ed-1f1f3', 220 | 'flag_ht': '1f1ed-1f1f9', 221 | 'ht': '1f1ed-1f1f9', 222 | 'flag_gy': '1f1ec-1f1fe', 223 | 'gy': '1f1ec-1f1fe', 224 | 'flag_gw': '1f1ec-1f1fc', 225 | 'gw': '1f1ec-1f1fc', 226 | 'flag_gn': '1f1ec-1f1f3', 227 | 'gn': '1f1ec-1f1f3', 228 | 'flag_gt': '1f1ec-1f1f9', 229 | 'gt': '1f1ec-1f1f9', 230 | 'flag_gu': '1f1ec-1f1fa', 231 | 'gu': '1f1ec-1f1fa', 232 | 'flag_gd': '1f1ec-1f1e9', 233 | 'gd': '1f1ec-1f1e9', 234 | 'flag_gl': '1f1ec-1f1f1', 235 | 'gl': '1f1ec-1f1f1', 236 | 'flag_gr': '1f1ec-1f1f7', 237 | 'gr': '1f1ec-1f1f7', 238 | 'flag_gi': '1f1ec-1f1ee', 239 | 'gi': '1f1ec-1f1ee', 240 | 'flag_gh': '1f1ec-1f1ed', 241 | 'gh': '1f1ec-1f1ed', 242 | 'flag_ge': '1f1ec-1f1ea', 243 | 'ge': '1f1ec-1f1ea', 244 | 'flag_gm': '1f1ec-1f1f2', 245 | 'gm': '1f1ec-1f1f2', 246 | 'flag_ga': '1f1ec-1f1e6', 247 | 'ga': '1f1ec-1f1e6', 248 | 'flag_pf': '1f1f5-1f1eb', 249 | 'pf': '1f1f5-1f1eb', 250 | 'flag_fj': '1f1eb-1f1ef', 251 | 'fj': '1f1eb-1f1ef', 252 | 'flag_fo': '1f1eb-1f1f4', 253 | 'fo': '1f1eb-1f1f4', 254 | 'flag_fk': '1f1eb-1f1f0', 255 | 'fk': '1f1eb-1f1f0', 256 | 'flag_et': '1f1ea-1f1f9', 257 | 'et': '1f1ea-1f1f9', 258 | 'flag_ee': '1f1ea-1f1ea', 259 | 'ee': '1f1ea-1f1ea', 260 | 'flag_er': '1f1ea-1f1f7', 261 | 'er': '1f1ea-1f1f7', 262 | 'flag_gq': '1f1ec-1f1f6', 263 | 'gq': '1f1ec-1f1f6', 264 | 'flag_sv': '1f1f8-1f1fb', 265 | 'sv': '1f1f8-1f1fb', 266 | 'flag_eg': '1f1ea-1f1ec', 267 | 'eg': '1f1ea-1f1ec', 268 | 'flag_ec': '1f1ea-1f1e8', 269 | 'ec': '1f1ea-1f1e8', 270 | 'flag_tl': '1f1f9-1f1f1', 271 | 'tl': '1f1f9-1f1f1', 272 | 'flag_do': '1f1e9-1f1f4', 273 | 'do': '1f1e9-1f1f4', 274 | 'flag_dm': '1f1e9-1f1f2', 275 | 'dm': '1f1e9-1f1f2', 276 | 'flag_dj': '1f1e9-1f1ef', 277 | 'dj': '1f1e9-1f1ef', 278 | 'flag_cz': '1f1e8-1f1ff', 279 | 'cz': '1f1e8-1f1ff', 280 | 'flag_cy': '1f1e8-1f1fe', 281 | 'cy': '1f1e8-1f1fe', 282 | 'flag_cu': '1f1e8-1f1fa', 283 | 'cu': '1f1e8-1f1fa', 284 | 'flag_hr': '1f1ed-1f1f7', 285 | 'hr': '1f1ed-1f1f7', 286 | 'flag_ci': '1f1e8-1f1ee', 287 | 'ci': '1f1e8-1f1ee', 288 | 'flag_cr': '1f1e8-1f1f7', 289 | 'cr': '1f1e8-1f1f7', 290 | 'flag_td': '1f1f9-1f1e9', 291 | 'td': '1f1f9-1f1e9', 292 | 'flag_cg': '1f1e8-1f1ec', 293 | 'cg': '1f1e8-1f1ec', 294 | 'flag_cd': '1f1e8-1f1e9', 295 | 'congo': '1f1e8-1f1e9', 296 | 'flag_km': '1f1f0-1f1f2', 297 | 'km': '1f1f0-1f1f2', 298 | 'flag_cf': '1f1e8-1f1eb', 299 | 'cf': '1f1e8-1f1eb', 300 | 'flag_ky': '1f1f0-1f1fe', 301 | 'ky': '1f1f0-1f1fe', 302 | 'flag_cv': '1f1e8-1f1fb', 303 | 'cv': '1f1e8-1f1fb', 304 | 'flag_cm': '1f1e8-1f1f2', 305 | 'cm': '1f1e8-1f1f2', 306 | 'flag_kh': '1f1f0-1f1ed', 307 | 'kh': '1f1f0-1f1ed', 308 | 'flag_bi': '1f1e7-1f1ee', 309 | 'bi': '1f1e7-1f1ee', 310 | 'flag_bf': '1f1e7-1f1eb', 311 | 'bf': '1f1e7-1f1eb', 312 | 'flag_bg': '1f1e7-1f1ec', 313 | 'bg': '1f1e7-1f1ec', 314 | 'flag_bn': '1f1e7-1f1f3', 315 | 'bn': '1f1e7-1f1f3', 316 | 'flag_bw': '1f1e7-1f1fc', 317 | 'bw': '1f1e7-1f1fc', 318 | 'flag_ba': '1f1e7-1f1e6', 319 | 'ba': '1f1e7-1f1e6', 320 | 'flag_bo': '1f1e7-1f1f4', 321 | 'bo': '1f1e7-1f1f4', 322 | 'flag_bt': '1f1e7-1f1f9', 323 | 'bt': '1f1e7-1f1f9', 324 | 'flag_bm': '1f1e7-1f1f2', 325 | 'bm': '1f1e7-1f1f2', 326 | 'flag_bj': '1f1e7-1f1ef', 327 | 'bj': '1f1e7-1f1ef', 328 | 'flag_bz': '1f1e7-1f1ff', 329 | 'bz': '1f1e7-1f1ff', 330 | 'flag_by': '1f1e7-1f1fe', 331 | 'by': '1f1e7-1f1fe', 332 | 'flag_bb': '1f1e7-1f1e7', 333 | 'bb': '1f1e7-1f1e7', 334 | 'flag_bd': '1f1e7-1f1e9', 335 | 'bd': '1f1e7-1f1e9', 336 | 'flag_bh': '1f1e7-1f1ed', 337 | 'bh': '1f1e7-1f1ed', 338 | 'flag_bs': '1f1e7-1f1f8', 339 | 'bs': '1f1e7-1f1f8', 340 | 'flag_az': '1f1e6-1f1ff', 341 | 'az': '1f1e6-1f1ff', 342 | 'flag_ac': '1f1e6-1f1e8', 343 | 'ac': '1f1e6-1f1e8', 344 | 'flag_aw': '1f1e6-1f1fc', 345 | 'aw': '1f1e6-1f1fc', 346 | 'flag_am': '1f1e6-1f1f2', 347 | 'am': '1f1e6-1f1f2', 348 | 'flag_ar': '1f1e6-1f1f7', 349 | 'ar': '1f1e6-1f1f7', 350 | 'flag_ag': '1f1e6-1f1ec', 351 | 'ag': '1f1e6-1f1ec', 352 | 'flag_ai': '1f1e6-1f1ee', 353 | 'ai': '1f1e6-1f1ee', 354 | 'flag_ao': '1f1e6-1f1f4', 355 | 'ao': '1f1e6-1f1f4', 356 | 'flag_ad': '1f1e6-1f1e9', 357 | 'ad': '1f1e6-1f1e9', 358 | 'flag_dz': '1f1e9-1f1ff', 359 | 'dz': '1f1e9-1f1ff', 360 | 'flag_al': '1f1e6-1f1f1', 361 | 'al': '1f1e6-1f1f1', 362 | 'flag_af': '1f1e6-1f1eb', 363 | 'af': '1f1e6-1f1eb', 364 | 'flag_vn': '1f1fb-1f1f3', 365 | 'vn': '1f1fb-1f1f3', 366 | 'flag_ae': '1f1e6-1f1ea', 367 | 'ae': '1f1e6-1f1ea', 368 | 'flag_us': '1f1fa-1f1f8', 369 | 'us': '1f1fa-1f1f8', 370 | 'flag_gb': '1f1ec-1f1e7', 371 | 'gb': '1f1ec-1f1e7', 372 | 'flag_tr': '1f1f9-1f1f7', 373 | 'tr': '1f1f9-1f1f7', 374 | 'flag_ch': '1f1e8-1f1ed', 375 | 'ch': '1f1e8-1f1ed', 376 | 'flag_se': '1f1f8-1f1ea', 377 | 'se': '1f1f8-1f1ea', 378 | 'flag_es': '1f1ea-1f1f8', 379 | 'es': '1f1ea-1f1f8', 380 | 'flag_za': '1f1ff-1f1e6', 381 | 'za': '1f1ff-1f1e6', 382 | 'flag_sg': '1f1f8-1f1ec', 383 | 'sg': '1f1f8-1f1ec', 384 | 'flag_sa': '1f1f8-1f1e6', 385 | 'saudiarabia': '1f1f8-1f1e6', 386 | 'saudi': '1f1f8-1f1e6', 387 | 'flag_ru': '1f1f7-1f1fa', 388 | 'ru': '1f1f7-1f1fa', 389 | 'flag_pr': '1f1f5-1f1f7', 390 | 'pr': '1f1f5-1f1f7', 391 | 'flag_pt': '1f1f5-1f1f9', 392 | 'pt': '1f1f5-1f1f9', 393 | 'flag_pl': '1f1f5-1f1f1', 394 | 'pl': '1f1f5-1f1f1', 395 | 'flag_ph': '1f1f5-1f1ed', 396 | 'ph': '1f1f5-1f1ed', 397 | 'flag_no': '1f1f3-1f1f4', 398 | 'no': '1f1f3-1f1f4', 399 | 'flag_nz': '1f1f3-1f1ff', 400 | 'nz': '1f1f3-1f1ff', 401 | 'flag_nl': '1f1f3-1f1f1', 402 | 'nl': '1f1f3-1f1f1', 403 | 'flag_mx': '1f1f2-1f1fd', 404 | 'mx': '1f1f2-1f1fd', 405 | 'flag_my': '1f1f2-1f1fe', 406 | 'my': '1f1f2-1f1fe', 407 | 'flag_mo': '1f1f2-1f1f4', 408 | 'mo': '1f1f2-1f1f4', 409 | 'flag_kr': '1f1f0-1f1f7', 410 | 'kr': '1f1f0-1f1f7', 411 | 'flag_jp': '1f1ef-1f1f5', 412 | 'jp': '1f1ef-1f1f5', 413 | 'flag_it': '1f1ee-1f1f9', 414 | 'it': '1f1ee-1f1f9', 415 | 'flag_il': '1f1ee-1f1f1', 416 | 'il': '1f1ee-1f1f1', 417 | 'flag_ie': '1f1ee-1f1ea', 418 | 'ie': '1f1ee-1f1ea', 419 | 'flag_id': '1f1ee-1f1e9', 420 | 'indonesia': '1f1ee-1f1e9', 421 | 'flag_in': '1f1ee-1f1f3', 422 | 'in': '1f1ee-1f1f3', 423 | 'flag_hk': '1f1ed-1f1f0', 424 | 'hk': '1f1ed-1f1f0', 425 | 'flag_de': '1f1e9-1f1ea', 426 | 'de': '1f1e9-1f1ea', 427 | 'flag_fr': '1f1eb-1f1f7', 428 | 'fr': '1f1eb-1f1f7', 429 | 'flag_fi': '1f1eb-1f1ee', 430 | 'fi': '1f1eb-1f1ee', 431 | 'flag_dk': '1f1e9-1f1f0', 432 | 'dk': '1f1e9-1f1f0', 433 | 'flag_co': '1f1e8-1f1f4', 434 | 'co': '1f1e8-1f1f4', 435 | 'flag_cn': '1f1e8-1f1f3', 436 | 'cn': '1f1e8-1f1f3', 437 | 'flag_cl': '1f1e8-1f1f1', 438 | 'chile': '1f1e8-1f1f1', 439 | 'flag_ca': '1f1e8-1f1e6', 440 | 'ca': '1f1e8-1f1e6', 441 | 'flag_br': '1f1e7-1f1f7', 442 | 'br': '1f1e7-1f1f7', 443 | 'flag_be': '1f1e7-1f1ea', 444 | 'be': '1f1e7-1f1ea', 445 | 'flag_at': '1f1e6-1f1f9', 446 | 'at': '1f1e6-1f1f9', 447 | 'flag_au': '1f1e6-1f1fa', 448 | 'au': '1f1e6-1f1fa', 449 | 'map': '1f5fa', 450 | 'world_map': '1f5fa', 451 | 'school': '1f3eb', 452 | 'convenience_store': '1f3ea', 453 | 'church': '26ea', 454 | 'wedding': '1f492', 455 | 'love_hotel': '1f3e9', 456 | 'hotel': '1f3e8', 457 | 'bank': '1f3e6', 458 | 'hospital': '1f3e5', 459 | 'european_post_office': '1f3e4', 460 | 'post_office': '1f3e3', 461 | 'factory': '1f3ed', 462 | 'department_store': '1f3ec', 463 | 'office': '1f3e2', 464 | 'contruction_site': '1f3d7', 465 | 'building_construction': '1f3d7', 466 | 'house-abandoned': '1f3da', 467 | 'derelict_house_building': '1f3da', 468 | 'house_with_garden': '1f3e1', 469 | 'homes': '1f3d8', 470 | 'house_buildings': '1f3d8', 471 | 'house': '1f3e0', 472 | 'bridge_at_night': '1f309', 473 | 'night_with_stars': '1f303', 474 | 'city_dusk': '1f306', 475 | 'city_sunset': '1f307', 476 | 'city_sunrise': '1f307', 477 | 'cityscape': '1f3d9', 478 | 'cityscape': '1f3d9', 479 | 'park': '1f3de', 480 | 'national_park': '1f3de', 481 | 'island': '1f3dd', 482 | 'desert_island': '1f3dd', 483 | 'desert': '1f3dc', 484 | 'beach': '1f3d6', 485 | 'beach_with_umbrella': '1f3d6', 486 | 'camping': '1f3d5', 487 | 'mountain_snow': '1f3d4', 488 | 'snow_capped_mountain': '1f3d4', 489 | 'stadium': '1f3df', 490 | 'classical_building': '1f3db', 491 | 'japanese_castle': '1f3ef', 492 | 'european_castle': '1f3f0', 493 | 'fountain': '26f2', 494 | 'tokyo_tower': '1f5fc', 495 | 'foggy': '1f301', 496 | 'moyai': '1f5ff', 497 | 'statue_of_liberty': '1f5fd', 498 | 'shopping_bags': '1f6cd', 499 | 'shopping_bags': '1f6cd', 500 | 'fork_knife_plate': '1f37d', 501 | 'fork_and_knife_with_plate': '1f37d', 502 | 'couch': '1f6cb', 503 | 'couch_and_lamp': '1f6cb', 504 | 'bed': '1f6cf', 505 | 'bellhop': '1f6ce', 506 | 'bellhop_bell': '1f6ce', 507 | 'dollar': '1f4b5', 508 | 'pound': '1f4b7', 509 | 'euro': '1f4b6', 510 | 'yen': '1f4b4', 511 | 'left_luggage': '1f6c5', 512 | 'baggage_claim': '1f6c4', 513 | 'customs': '1f6c3', 514 | 'passport_control': '1f6c2', 515 | 'suspension_railway': '1f69f', 516 | 'mountain_cableway': '1f6a0', 517 | 'aerial_tramway': '1f6a1', 518 | 'sailboat': '26f5', 519 | 'speedboat': '1f6a4', 520 | 'motorboat': '1f6e5', 521 | 'cruise_ship': '1f6f3', 522 | 'passenger_ship': '1f6f3', 523 | 'ship': '1f6a2', 524 | 'anchor': '2693', 525 | 'seat': '1f4ba', 526 | 'airplane_arriving': '1f6ec', 527 | 'airplane_departure': '1f6eb', 528 | 'airplane_small': '1f6e9', 529 | 'small_airplane': '1f6e9', 530 | 'airplane_northeast': '1f6ea', 531 | 'northeast_pointing_airplane': '1f6ea', 532 | 'jet_up': '1f6e6', 533 | 'up_pointing_military_airplane': '1f6e6', 534 | 'airplane_small_up': '1f6e8', 535 | 'up_pointing_small_airplane': '1f6e8', 536 | 'airplane_up': '1f6e7', 537 | 'up_pointing_airplane': '1f6e7', 538 | 'airplane': '2708', 539 | 'helicopter': '1f681', 540 | 'rocket': '1f680', 541 | 'traffic_light': '1f6a5', 542 | 'vertical_traffic_light': '1f6a6', 543 | 'construction': '1f6a7', 544 | 'fuelpump': '26fd', 545 | 'busstop': '1f68f', 546 | 'motorway': '1f6e3', 547 | 'bike': '1f6b2', 548 | 'tractor': '1f69c', 549 | 'articulated_lorry': '1f69b', 550 | 'truck': '1f69a', 551 | 'blue_car': '1f699', 552 | 'oncoming_automobile': '1f698', 553 | 'red_car': '1f697', 554 | 'oncoming_taxi': '1f696', 555 | 'taxi': '1f695', 556 | 'rotating_light': '1f6a8', 557 | 'oncoming_police_car': '1f694', 558 | 'police_car': '1f693', 559 | 'fire_engine_oncoming': '1f6f1', 560 | 'oncoming_fire_engine': '1f6f1', 561 | 'fire_engine': '1f692', 562 | 'ambulance': '1f691', 563 | 'minibus': '1f690', 564 | 'trolleybus': '1f68e', 565 | 'oncoming_bus': '1f68d', 566 | 'bus': '1f68c', 567 | 'railway_track': '1f6e4', 568 | 'railroad_track': '1f6e4', 569 | 'tram': '1f68a', 570 | 'station': '1f689', 571 | 'light_rail': '1f688', 572 | 'metro': '1f687', 573 | 'train2': '1f686', 574 | 'bullettrain_front': '1f685', 575 | 'bullettrain_side': '1f684', 576 | 'monorail': '1f69d', 577 | 'train': '1f68b', 578 | 'train_diesel': '1f6f2', 579 | 'diesel_locomotive': '1f6f2', 580 | 'steam_locomotive': '1f682', 581 | 'mountain_railway': '1f69e', 582 | 'railway_car': '1f683', 583 | 'clock1230': '1f567', 584 | 'clock1130': '1f566', 585 | 'clock1030': '1f565', 586 | 'clock930': '1f564', 587 | 'clock830': '1f563', 588 | 'clock730': '1f562', 589 | 'clock630': '1f561', 590 | 'clock530': '1f560', 591 | 'clock430': '1f55f', 592 | 'clock330': '1f55e', 593 | 'clock230': '1f55d', 594 | 'clock130': '1f55c', 595 | 'clock12': '1f55b', 596 | 'clock11': '1f55a', 597 | 'clock10': '1f559', 598 | 'clock9': '1f558', 599 | 'clock8': '1f557', 600 | 'clock7': '1f556', 601 | 'clock6': '1f555', 602 | 'clock5': '1f554', 603 | 'clock4': '1f553', 604 | 'clock3': '1f552', 605 | 'clock2': '1f551', 606 | 'clock1': '1f550', 607 | 'white_square_button': '1f533', 608 | 'black_square_button': '1f532', 609 | 'white_medium_small_square': '25fd', 610 | 'black_medium_small_square': '25fe', 611 | 'white_medium_square': '25fb', 612 | 'black_medium_square': '25fc', 613 | 'white_large_square': '2b1c', 614 | 'black_large_square': '2b1b', 615 | 'white_small_square': '25ab', 616 | 'black_small_square': '25aa', 617 | 'large_blue_diamond': '1f537', 618 | 'large_orange_diamond': '1f536', 619 | 'small_blue_diamond': '1f539', 620 | 'small_orange_diamond': '1f538', 621 | 'small_red_triangle_down': '1f53b', 622 | 'small_red_triangle': '1f53a', 623 | 'large_blue_circle': '1f535', 624 | 'red_circle': '1f534', 625 | 'radio_button': '1f518', 626 | 'black_circle': '26ab', 627 | 'white_circle': '26aa', 628 | 'ballot_box_x': '1f5f5', 629 | 'ballot_box_with_script_x': '1f5f5', 630 | 'ballot_x': '1f5f4', 631 | 'ballot_script_x': '1f5f4', 632 | 'ballot_box_check': '1f5f9', 633 | 'ballot_box_with_bold_check': '1f5f9', 634 | 'light_check_mark': '1f5f8', 635 | 'light_mark': '1f5f8', 636 | 'ballot_box_with_check': '2611', 637 | 'diamonds': '2666', 638 | 'hearts': '2665', 639 | 'clubs': '2663', 640 | 'spades': '2660', 641 | 'diamond_shape_with_a_dot_inside': '1f4a0', 642 | 'anger': '1f4a2', 643 | 'recycle': '267b', 644 | 'rosette_black': '1f3f6', 645 | 'rosette': '1f3f5', 646 | 'hotsprings': '2668', 647 | 'warning': '26a0', 648 | 'trident': '1f531', 649 | 'mood_lightning': '1f5f2', 650 | 'lightning_mood': '1f5f2', 651 | 'beginner': '1f530', 652 | 'six_pointed_star': '1f52f', 653 | 'ophiuchus': '26ce', 654 | 'info': '1f6c8', 655 | 'circled_information_source': '1f6c8', 656 | 'm': '24c2', 657 | 'cyclone': '1f300', 658 | 'soon': '1f51c', 659 | 'top': '1f51d', 660 | 'on': '1f51b', 661 | 'back': '1f519', 662 | 'end': '1f51a', 663 | '100': '1f4af', 664 | 'o': '2b55', 665 | 'x': '274c', 666 | 'triangle_round': '1f6c6', 667 | 'triangle_with_rounded_corners': '1f6c6', 668 | 'interrobang': '2049', 669 | 'bangbang': '203c', 670 | 'grey_question': '2754', 671 | 'grey_exclamation': '2755', 672 | 'question': '2753', 673 | 'exclamation': '2757', 674 | 'part_alternation_mark': '303d', 675 | 'loop': '27bf', 676 | 'curly_loop': '27b0', 677 | 'heavy_dollar_sign': '1f4b2', 678 | 'currency_exchange': '1f4b1', 679 | 'registered': '00ae', 680 | 'copyright': '00a9', 681 | 'tm': '2122', 682 | 'clockwise_arrows': '1f5d8', 683 | 'clockwise_right_and_left_semicircle_arrows': '1f5d8', 684 | 'arrows_clockwise': '1f503', 685 | 'cancellation_x': '1f5d9', 686 | 'heavy_check_mark': '2714', 687 | 'heavy_multiplication_x': '2716', 688 | 'heavy_division_sign': '2797', 689 | 'wavy_dash': '3030', 690 | 'heavy_minus_sign': '2796', 691 | 'heavy_plus_sign': '2795', 692 | 'symbols': '1f523', 693 | 'cinema': '1f3a6', 694 | 'signal_strength': '1f4f6', 695 | 'information_source': '2139', 696 | 'capital_abcd': '1f520', 697 | 'abcd': '1f521', 698 | 'abc': '1f524', 699 | '1234': '1f522', 700 | 'keycap_ten': '1f51f', 701 | 'nine': '0039-20e3', 702 | 'eight': '0038-20e3', 703 | 'seven': '0037-20e3', 704 | 'six': '0036-20e3', 705 | 'five': '0035-20e3', 706 | 'four': '0034-20e3', 707 | 'three': '0033-20e3', 708 | 'two': '0032-20e3', 709 | 'one': '0031-20e3', 710 | 'zero': '0030-20e3', 711 | 'hash': '0023-20e3', 712 | 'repeat_one': '1f502', 713 | 'repeat': '1f501', 714 | 'twisted_rightwards_arrows': '1f500', 715 | 'arrow_heading_down': '2935', 716 | 'arrow_heading_up': '2934', 717 | 'leftwards_arrow_with_hook': '21a9', 718 | 'arrow_right_hook': '21aa', 719 | 'arrows_counterclockwise': '1f504', 720 | 'left_right_arrow': '2194', 721 | 'arrow_up_down': '2195', 722 | 'arrow_upper_left': '2196', 723 | 'arrow_lower_left': '2199', 724 | 'arrow_lower_right': '2198', 725 | 'arrow_upper_right': '2197', 726 | 'arrow_down': '2b07', 727 | 'arrow_up': '2b06', 728 | 'arrow_left': '2b05', 729 | 'arrow_right': '27a1', 730 | 'arrow_double_down': '23ec', 731 | 'arrow_double_up': '23eb', 732 | 'rewind': '23ea', 733 | 'fast_forward': '23e9', 734 | 'arrow_down_small': '1f53d', 735 | 'arrow_up_small': '1f53c', 736 | 'arrow_backward': '25c0', 737 | 'arrow_forward': '25b6', 738 | 'put_litter_in_its_place': '1f6ae', 739 | 'no_smoking': '1f6ad', 740 | 'potable_water': '1f6b0', 741 | 'wheelchair': '267f', 742 | 'baby_symbol': '1f6bc', 743 | 'girls_symbol': '1f6ca', 744 | 'boys_symbol': '1f6c9', 745 | 'womens': '1f6ba', 746 | 'mens': '1f6b9', 747 | 'restroom': '1f6bb', 748 | 'pisces': '2653', 749 | 'aquarius': '2652', 750 | 'capricorn': '2651', 751 | 'sagittarius': '2650', 752 | 'scorpius': '264f', 753 | 'libra': '264e', 754 | 'virgo': '264d', 755 | 'leo': '264c', 756 | 'cancer': '264b', 757 | 'gemini': '264a', 758 | 'taurus': '2649', 759 | 'aries': '2648', 760 | 'atm': '1f3e7', 761 | 'up': '1f199', 762 | 'ok': '1f197', 763 | 'ng': '1f196', 764 | 'new': '1f195', 765 | 'free': '1f193', 766 | 'cool': '1f192', 767 | 'wc': '1f6be', 768 | 'parking': '1f17f', 769 | 'id': '1f194', 770 | 'sos': '1f198', 771 | 'o2': '1f17e', 772 | 'cl': '1f191', 773 | 'ab': '1f18e', 774 | 'b': '1f171', 775 | 'a': '1f170', 776 | 'vs': '1f19a', 777 | 'mobile_phone_off': '1f4f4', 778 | 'vibration_mode': '1f4f3', 779 | 'eight_pointed_black_star': '2734', 780 | 'white_check_mark': '2705', 781 | 'negative_squared_cross_mark': '274e', 782 | 'eight_spoked_asterisk': '2733', 783 | 'sparkle': '2747', 784 | 'chart': '1f4b9', 785 | 'u6307': '1f22f', 786 | 'koko': '1f201', 787 | 'sa': '1f202', 788 | 'u7a7a': '1f233', 789 | 'u5272': '1f239', 790 | 'u6708': '1f237', 791 | 'u55b6': '1f23a', 792 | 'u7533': '1f238', 793 | 'u7121': '1f21a', 794 | 'u6709': '1f236', 795 | 'u7981': '1f232', 796 | 'u6e80': '1f235', 797 | 'u5408': '1f234', 798 | 'congratulations': '3297', 799 | 'secret': '3299', 800 | 'white_flower': '1f4ae', 801 | 'ideograph_advantage': '1f250', 802 | 'accept': '1f251', 803 | 'piracy': '1f572', 804 | 'no_piracy': '1f572', 805 | 'underage': '1f51e', 806 | 'no_mobile_phones': '1f4f5', 807 | 'non-potable_water': '1f6b1', 808 | 'no_bicycles': '1f6b3', 809 | 'do_not_litter': '1f6af', 810 | 'no_pedestrians': '1f6b7', 811 | 'name_badge': '1f4db', 812 | 'no_entry': '26d4', 813 | 'no_entry_sign': '1f6ab', 814 | 'prohibited': '1f6c7', 815 | 'prohibited_sign': '1f6c7', 816 | 'sleeping_accommodation': '1f6cc', 817 | 'speaking_head': '1f5e3', 818 | 'speaking_head_in_silhouette': '1f5e3', 819 | 'mag_right': '1f50e', 820 | 'mag': '1f50d', 821 | 'shield': '1f6e1', 822 | 'children_crossing': '1f6b8', 823 | 'mood_bubble_lightning': '1f5f1', 824 | 'lightning_mood_bubble': '1f5f1', 825 | 'mood_bubble': '1f5f0', 826 | 'anger_right': '1f5ef', 827 | 'right_anger_bubble': '1f5ef', 828 | 'anger_left': '1f5ee', 829 | 'left_anger_bubble': '1f5ee', 830 | 'thought_right': '1f5ed', 831 | 'right_thought_bubble': '1f5ed', 832 | 'thought_left': '1f5ec', 833 | 'left_thought_bubble': '1f5ec', 834 | 'speech_three': '1f5eb', 835 | 'three_speech_bubbles': '1f5eb', 836 | 'speech_two': '1f5ea', 837 | 'two_speech_bubbles': '1f5ea', 838 | 'speech_right': '1f5e9', 839 | 'right_speech_bubble': '1f5e9', 840 | 'speech_left': '1f5e8', 841 | 'left_speech_bubble': '1f5e8', 842 | 'speech_balloon': '1f4ac', 843 | 'thought_balloon': '1f4ad', 844 | 'dove': '1f54a', 845 | 'dove_of_peace': '1f54a', 846 | 'om_symbol': '1f549', 847 | 'celtic_cross': '1f548', 848 | 'cross_heavy': '1f547', 849 | 'heavy_latin_cross': '1f547', 850 | 'cross_white': '1f546', 851 | 'white_latin_cross': '1f546', 852 | 'descending_notes': '1f39d', 853 | 'ascending_notes': '1f39c', 854 | 'ringing_bell': '1f56d', 855 | 'no_bell': '1f515', 856 | 'bell': '1f514', 857 | 'zzz': '1f4a4', 858 | 'bullhorn_waves': '1f56c', 859 | 'bullhorn_with_sound_waves': '1f56c', 860 | 'bullhorn': '1f56b', 861 | 'right_speaker_three': '1f56a', 862 | 'right_speaker_with_three_sound_waves': '1f56a', 863 | 'right_speaker_one': '1f569', 864 | 'right_speaker_with_one_sound_wave': '1f569', 865 | 'right_speaker': '1f568', 866 | 'mute': '1f507', 867 | 'loud_sound': '1f50a', 868 | 'sound': '1f509', 869 | 'speaker': '1f508', 870 | 'loudspeaker': '1f4e2', 871 | 'mega': '1f4e3', 872 | 'unlock': '1f513', 873 | 'lock': '1f512', 874 | 'closed_lock_with_key': '1f510', 875 | 'lock_with_ink_pen': '1f50f', 876 | 'pencil': '1f4dd', 877 | 'crayon': '1f58d', 878 | 'lower_left_crayon': '1f58d', 879 | 'paintbrush': '1f58c', 880 | 'lower_left_paintbrush': '1f58c', 881 | 'pen_fountain': '1f58b', 882 | 'lower_left_fountain_pen': '1f58b', 883 | 'pen_ballpoint': '1f58a', 884 | 'lower_left_ballpoint_pen': '1f58a', 885 | 'pencil3': '1f589', 886 | 'lower_left_pencil': '1f589', 887 | 'pencil2': '270f', 888 | 'black_nib': '2712', 889 | 'file_cabinet': '1f5c4', 890 | 'open_file_folder': '1f4c2', 891 | 'file_folder': '1f4c1', 892 | 'folder_open': '1f5c1', 893 | 'open_folder': '1f5c1', 894 | 'folder': '1f5c0', 895 | 'hole': '1f573', 896 | 'flag_black': '1f3f4', 897 | 'waving_black_flag': '1f3f4', 898 | 'flag_white': '1f3f3', 899 | 'waving_white_flag': '1f3f3', 900 | 'pennant_black': '1f3f2', 901 | 'black_pennant': '1f3f2', 902 | 'pennant_white': '1f3f1', 903 | 'white_pennant': '1f3f1', 904 | 'triangular_flag_on_post': '1f6a9', 905 | 'straight_ruler': '1f4cf', 906 | 'round_pushpin': '1f4cd', 907 | 'triangular_ruler': '1f4d0', 908 | 'scissors': '2702', 909 | 'pushpin_black': '1f588', 910 | 'pushpin': '1f4cc', 911 | 'paperclips': '1f587', 912 | 'linked_paperclips': '1f587', 913 | 'paperclip': '1f4ce', 914 | 'link': '1f517', 915 | 'card_box': '1f5c3', 916 | 'card_file_box': '1f5c3', 917 | 'dividers': '1f5c2', 918 | 'card_index_dividers': '1f5c2', 919 | 'card_index': '1f4c7', 920 | 'books': '1f4da', 921 | 'orange_book': '1f4d9', 922 | 'blue_book': '1f4d8', 923 | 'green_book': '1f4d7', 924 | 'closed_book': '1f4d5', 925 | 'ledger': '1f4d2', 926 | 'notebook_with_decorative_cover': '1f4d4', 927 | 'notebook': '1f4d3', 928 | 'book': '1f4d6', 929 | 'book2': '1f56e', 930 | 'clipboard': '1f4cb', 931 | 'scroll': '1f4dc', 932 | 'frame_tiles': '1f5bd', 933 | 'frame_with_tiles': '1f5bd', 934 | 'frame_photo': '1f5bc', 935 | 'frame_with_picture': '1f5bc', 936 | 'frame_x': '1f5be', 937 | 'frame_with_an_x': '1f5be', 938 | 'compression': '1f5dc', 939 | 'high_brightness': '1f506', 940 | 'low_brightness': '1f505', 941 | 'ballot_box': '1f5f3', 942 | 'ballot_box_with_ballot': '1f5f3', 943 | 'calendar_spiral': '1f5d3', 944 | 'spiral_calendar_pad': '1f5d3', 945 | 'calendar': '1f4c6', 946 | 'date': '1f4c5', 947 | 'stock_chart': '1f5e0', 948 | 'bar_chart': '1f4ca', 949 | 'chart_with_downwards_trend': '1f4c9', 950 | 'chart_with_upwards_trend': '1f4c8', 951 | 'notepad-spiral': '1f5d2', 952 | 'spiral_note_pad': '1f5d2', 953 | 'notepad': '1f5ca', 954 | 'note_pad': '1f5ca', 955 | 'note': '1f5c9', 956 | 'note_page': '1f5c9', 957 | 'notepad_empty': '1f5c7', 958 | 'empty_note_pad': '1f5c7', 959 | 'note_empty': '1f5c6', 960 | 'empty_note_page': '1f5c6', 961 | 'wastebasket': '1f5d1', 962 | 'bookmark_tabs': '1f4d1', 963 | 'pages': '1f5d0', 964 | 'page_with_curl': '1f4c3', 965 | 'page_facing_up': '1f4c4', 966 | 'page': '1f5cf', 967 | 'document_text': '1f5b9', 968 | 'document_with_text': '1f5b9', 969 | 'document': '1f5ce', 970 | 'mailbox_with_mail': '1f4ec', 971 | 'mailbox_with_no_mail': '1f4ed', 972 | 'mailbox': '1f4eb', 973 | 'mailbox_closed': '1f4ea', 974 | 'postbox': '1f4ee', 975 | 'postal_horn': '1f4ef', 976 | 'package': '1f4e6', 977 | 'outbox_tray': '1f4e4', 978 | 'inbox_tray': '1f4e5', 979 | 'e-mail': '1f4e7', 980 | 'email': '1f4e7', 981 | 'incoming_envelope': '1f4e8', 982 | 'envelope_with_arrow': '1f4e9', 983 | 'envelope_stamped_pen': '1f586', 984 | 'pen_over_stamped_envelope': '1f586', 985 | 'envelope_flying': '1f585', 986 | 'flying_envelope': '1f585', 987 | 'envelope_stamped': '1f583', 988 | 'stamped_envelope': '1f583', 989 | 'envelope_back': '1f582', 990 | 'back_of_envelope': '1f582', 991 | 'envelope': '2709', 992 | 'key2': '1f5dd', 993 | 'old_key': '1f5dd', 994 | 'key': '1f511', 995 | 'label': '1f3f7', 996 | 'thermometer': '1f321', 997 | 'newspaper2': '1f5de', 998 | 'rolled_up_newspaper': '1f5de', 999 | 'newspaper': '1f4f0', 1000 | 'bookmark': '1f516', 1001 | 'gun': '1f52b', 1002 | 'crossbones': '1f571', 1003 | 'black_skull_and_crossbones': '1f571', 1004 | 'smoking': '1f6ac', 1005 | 'bomb': '1f4a3', 1006 | 'oil': '1f6e2', 1007 | 'oil_drum': '1f6e2', 1008 | 'tools': '1f6e0', 1009 | 'hammer_and_wrench': '1f6e0', 1010 | 'hammer': '1f528', 1011 | 'nut_and_bolt': '1f529', 1012 | 'dagger': '1f5e1', 1013 | 'dagger_knife': '1f5e1', 1014 | 'knife': '1f52a', 1015 | 'wrench': '1f527', 1016 | 'crystal_ball': '1f52e', 1017 | 'telescope': '1f52d', 1018 | 'microscope': '1f52c', 1019 | 'pill': '1f48a', 1020 | 'syringe': '1f489', 1021 | 'barber': '1f488', 1022 | 'toilet': '1f6bd', 1023 | 'bathtub': '1f6c1', 1024 | 'shower': '1f6bf', 1025 | 'door': '1f6aa', 1026 | 'jeans': '1f456', 1027 | 'necktie': '1f454', 1028 | 'shirt': '1f455', 1029 | 'womans_clothes': '1f45a', 1030 | 'kimono': '1f458', 1031 | 'dress': '1f457', 1032 | 'bikini': '1f459', 1033 | 'athletic_shoe': '1f45f', 1034 | 'mans_shoe': '1f45e', 1035 | 'boot': '1f462', 1036 | 'high_heel': '1f460', 1037 | 'sandal': '1f461', 1038 | 'womans_hat': '1f452', 1039 | 'dark_sunglasses': '1f576', 1040 | 'eyeglasses': '1f453', 1041 | 'lipstick': '1f484', 1042 | 'school_satchel': '1f392', 1043 | 'briefcase': '1f4bc', 1044 | 'handbag': '1f45c', 1045 | 'purse': '1f45b', 1046 | 'pouch': '1f45d', 1047 | 'closed_umbrella': '1f302', 1048 | 'gem': '1f48e', 1049 | 'moneybag': '1f4b0', 1050 | 'money_with_wings': '1f4b8', 1051 | 'credit_card': '1f4b3', 1052 | 'satellite_orbital': '1f6f0', 1053 | 'satellite': '1f4e1', 1054 | 'candle': '1f56f', 1055 | 'flashlight': '1f526', 1056 | 'bulb': '1f4a1', 1057 | 'electric_plug': '1f50c', 1058 | 'battery': '1f50b', 1059 | 'vhs': '1f4fc', 1060 | 'optical_disk': '1f5b8', 1061 | 'optical_disc_icon': '1f5b8', 1062 | 'dvd': '1f4c0', 1063 | 'cd': '1f4bf', 1064 | 'hard_disk': '1f5b4', 1065 | 'cartridge': '1f5ad', 1066 | 'tape_cartridge': '1f5ad', 1067 | 'floppy_white': '1f5ab', 1068 | 'white_hard_shell_floppy_disk': '1f5ab', 1069 | 'floppy_black': '1f5aa', 1070 | 'black_hard_shell_floppy_disk': '1f5aa', 1071 | 'floppy_disk': '1f4be', 1072 | 'minidisc': '1f4bd', 1073 | 'fax': '1f4e0', 1074 | 'flip_phone': '1f581', 1075 | 'clamshell_mobile_phone': '1f581', 1076 | 'telephone_black': '1f57f', 1077 | 'black_touchtone_telephone': '1f57f', 1078 | 'telephone_white': '1f57e', 1079 | 'white_touchtone_telephone': '1f57e', 1080 | 'telephone': '260e', 1081 | 'left_receiver': '1f57b', 1082 | 'left_hand_telephone_receiver': '1f57b', 1083 | 'telephone_receiver': '1f4de', 1084 | 'joystick': '1f579', 1085 | 'pager': '1f4df', 1086 | 'stereo': '1f4fe', 1087 | 'portable_stereo': '1f4fe', 1088 | 'radio': '1f4fb', 1089 | 'control_knobs': '1f39b', 1090 | 'level_slider': '1f39a', 1091 | 'microphone2': '1f399', 1092 | 'studio_microphone': '1f399', 1093 | 'keyboard_with_jacks': '1f398', 1094 | 'musical_keyboard_with_jacks': '1f398', 1095 | 'tv': '1f4fa', 1096 | 'projector': '1f4fd', 1097 | 'film_projector': '1f4fd', 1098 | 'movie_camera': '1f3a5', 1099 | 'video_camera': '1f4f9', 1100 | 'camera_with_flash': '1f4f8', 1101 | 'camera': '1f4f7', 1102 | 'hourglass': '231b', 1103 | 'hourglass_flowing_sand': '23f3', 1104 | 'clock': '1f570', 1105 | 'mantlepiece_clock': '1f570', 1106 | 'alarm_clock': '23f0', 1107 | 'calculator': '1f5a9', 1108 | 'pocket_calculator': '1f5a9', 1109 | 'desktop_window': '1f5d4', 1110 | 'printer': '1f5a8', 1111 | 'network': '1f5a7', 1112 | 'three_networked_computers': '1f5a7', 1113 | 'keyboard_mouse': '1f5a6', 1114 | 'keyboard_and_mouse': '1f5a6', 1115 | 'trackball': '1f5b2', 1116 | 'mouse-one': '1f5af', 1117 | 'one_button_mouse': '1f5af', 1118 | 'keyboard': '1f5ae', 1119 | 'wired_keyboard': '1f5ae', 1120 | 'computer_old': '1f5b3', 1121 | 'old_personal_computer': '1f5b3', 1122 | 'desktop': '1f5a5', 1123 | 'desktop_computer': '1f5a5', 1124 | 'computer': '1f4bb', 1125 | 'calling': '1f4f2', 1126 | 'iphone': '1f4f1', 1127 | 'watch': '231a', 1128 | 'baby_bottle': '1f37c', 1129 | 'beers': '1f37b', 1130 | 'beer': '1f37a', 1131 | 'tropical_drink': '1f379', 1132 | 'cocktail': '1f378', 1133 | 'wine_glass': '1f377', 1134 | 'sake': '1f376', 1135 | 'coffee': '2615', 1136 | 'tea': '1f375', 1137 | 'fork_and_knife': '1f374', 1138 | 'egg': '1f373', 1139 | 'stew': '1f372', 1140 | 'bento': '1f371', 1141 | 'cake': '1f370', 1142 | 'honey_pot': '1f36f', 1143 | 'custard': '1f36e', 1144 | 'lollipop': '1f36d', 1145 | 'candy': '1f36c', 1146 | 'chocolate_bar': '1f36b', 1147 | 'cookie': '1f36a', 1148 | 'doughnut': '1f369', 1149 | 'ice_cream': '1f368', 1150 | 'shaved_ice': '1f367', 1151 | 'icecream': '1f366', 1152 | 'fish_cake': '1f365', 1153 | 'fried_shrimp': '1f364', 1154 | 'sushi': '1f363', 1155 | 'oden': '1f362', 1156 | 'dango': '1f361', 1157 | 'fries': '1f35f', 1158 | 'bread': '1f35e', 1159 | 'spaghetti': '1f35d', 1160 | 'ramen': '1f35c', 1161 | 'curry': '1f35b', 1162 | 'rice': '1f35a', 1163 | 'rice_ball': '1f359', 1164 | 'rice_cracker': '1f358', 1165 | 'poultry_leg': '1f357', 1166 | 'meat_on_bone': '1f356', 1167 | 'pizza': '1f355', 1168 | 'hamburger': '1f354', 1169 | 'strawberry': '1f353', 1170 | 'cherries': '1f352', 1171 | 'peach': '1f351', 1172 | 'pear': '1f350', 1173 | 'green_apple': '1f34f', 1174 | 'apple': '1f34e', 1175 | 'pineapple': '1f34d', 1176 | 'banana': '1f34c', 1177 | 'lemon': '1f34b', 1178 | 'tangerine': '1f34a', 1179 | 'watermelon': '1f349', 1180 | 'melon': '1f348', 1181 | 'grapes': '1f347', 1182 | 'hot_pepper': '1f336', 1183 | 'sweet_potato': '1f360', 1184 | 'corn': '1f33d', 1185 | 'eggplant': '1f346', 1186 | 'tomato': '1f345', 1187 | 'roller_coaster': '1f3a2', 1188 | 'ferris_wheel': '1f3a1', 1189 | 'carousel_horse': '1f3a0', 1190 | 'mahjong': '1f004', 1191 | 'black_joker': '1f0cf', 1192 | 'flower_playing_cards': '1f3b4', 1193 | 'video_game': '1f3ae', 1194 | 'game_die': '1f3b2', 1195 | 'slot_machine': '1f3b0', 1196 | 'bowling': '1f3b3', 1197 | '8ball': '1f3b1', 1198 | 'dart': '1f3af', 1199 | 'art': '1f3a8', 1200 | 'tickets': '1f39f', 1201 | 'admission_tickets': '1f39f', 1202 | 'film_frames': '1f39e', 1203 | 'clapper': '1f3ac', 1204 | 'circus_tent': '1f3aa', 1205 | 'tophat': '1f3a9', 1206 | 'ticket': '1f3ab', 1207 | 'performing_arts': '1f3ad', 1208 | 'microphone': '1f3a4', 1209 | 'headphones': '1f3a7', 1210 | 'musical_score': '1f3bc', 1211 | 'notes': '1f3b6', 1212 | 'musical_note': '1f3b5', 1213 | 'trumpet': '1f3ba', 1214 | 'saxophone': '1f3b7', 1215 | 'violin': '1f3bb', 1216 | 'guitar': '1f3b8', 1217 | 'musical_keyboard': '1f3b9', 1218 | 'checkered_flag': '1f3c1', 1219 | 'running_shirt_with_sash': '1f3bd', 1220 | 'medal': '1f3c5', 1221 | 'sports_medal': '1f3c5', 1222 | 'trophy': '1f3c6', 1223 | 'golf': '26f3', 1224 | 'rugby_football': '1f3c9', 1225 | 'tennis': '1f3be', 1226 | 'baseball': '26be', 1227 | 'football': '1f3c8', 1228 | 'basketball': '1f3c0', 1229 | 'soccer': '26bd', 1230 | 'fishing_pole_and_fish': '1f3a3', 1231 | 'tent': '26fa', 1232 | 'horse_racing': '1f3c7', 1233 | 'race_car': '1f3ce', 1234 | 'racing_car': '1f3ce', 1235 | 'motorcycle': '1f3cd', 1236 | 'racing_motorcycle': '1f3cd', 1237 | 'mountain_bicyclist': '1f6b5', 1238 | 'bicyclist': '1f6b4', 1239 | 'snowman': '26c4', 1240 | 'ski': '1f3bf', 1241 | 'snowboarder': '1f3c2', 1242 | 'bath': '1f6c0', 1243 | 'surfer': '1f3c4', 1244 | 'swimmer': '1f3ca', 1245 | 'rowboat': '1f6a3', 1246 | 'golfer': '1f3cc', 1247 | 'lifter': '1f3cb', 1248 | 'weight_lifter': '1f3cb', 1249 | 'dancer': '1f483', 1250 | 'walking': '1f6b6', 1251 | 'runner': '1f3c3', 1252 | 'blue_heart': '1f499', 1253 | 'green_heart': '1f49a', 1254 | 'yellow_heart': '1f49b', 1255 | 'purple_heart': '1f49c', 1256 | 'heart_decoration': '1f49f', 1257 | 'heart_tip': '1f394', 1258 | 'heart_with_tip_on_the_left': '1f394', 1259 | 'gift_heart': '1f49d', 1260 | 'cupid': '1f498', 1261 | 'sparkling_heart': '1f496', 1262 | 'heartpulse': '1f497', 1263 | 'heartbeat': '1f493', 1264 | 'revolving_hearts': '1f49e', 1265 | 'two_hearts': '1f495', 1266 | 'love_letter': '1f48c', 1267 | 'broken_heart': '1f494', 1268 | 'heart': '2764', 1269 | 'bouquet2': '1f395', 1270 | 'bouquet_of_flowers': '1f395', 1271 | 'ring': '1f48d', 1272 | 'izakaya_lantern': '1f3ee', 1273 | 'crossed_flags': '1f38c', 1274 | 'wind_chime': '1f390', 1275 | 'flags': '1f38f', 1276 | 'dolls': '1f38e', 1277 | 'military_medal': '1f396', 1278 | 'reminder_ribbon': '1f397', 1279 | 'crown': '1f451', 1280 | 'mortar_board': '1f393', 1281 | 'boom': '1f4a5', 1282 | 'sparkles': '2728', 1283 | 'dizzy': '1f4ab', 1284 | 'balloon': '1f388', 1285 | 'confetti_ball': '1f38a', 1286 | 'tada': '1f389', 1287 | 'sparkler': '1f387', 1288 | 'fireworks': '1f386', 1289 | 'rice_scene': '1f391', 1290 | 'bamboo': '1f38d', 1291 | 'tanabata_tree': '1f38b', 1292 | 'christmas_tree': '1f384', 1293 | 'jack_o_lantern': '1f383', 1294 | 'birthday': '1f382', 1295 | 'gift': '1f381', 1296 | 'ribbon': '1f380', 1297 | 'wind_blowing_face': '1f32c', 1298 | 'sun_with_face': '1f31e', 1299 | 'last_quarter_moon_with_face': '1f31c', 1300 | 'first_quarter_moon_with_face': '1f31b', 1301 | 'full_moon_with_face': '1f31d', 1302 | 'new_moon_with_face': '1f31a', 1303 | 'waning_crescent_moon': '1f318', 1304 | 'last_quarter_moon': '1f317', 1305 | 'waning_gibbous_moon': '1f316', 1306 | 'full_moon': '1f315', 1307 | 'waxing_gibbous_moon': '1f314', 1308 | 'first_quarter_moon': '1f313', 1309 | 'waxing_crescent_moon': '1f312', 1310 | 'new_moon': '1f311', 1311 | 'earth_asia': '1f30f', 1312 | 'earth_americas': '1f30e', 1313 | 'earth_africa': '1f30d', 1314 | 'globe_with_meridians': '1f310', 1315 | 'japan': '1f5fe', 1316 | 'mount_fuji': '1f5fb', 1317 | 'milky_way': '1f30c', 1318 | 'volcano': '1f30b', 1319 | 'ocean': '1f30a', 1320 | 'rainbow': '1f308', 1321 | 'sunrise': '1f305', 1322 | 'sunrise_over_mountains': '1f304', 1323 | 'stars': '1f320', 1324 | 'star': '2b50', 1325 | 'star2': '1f31f', 1326 | 'snowflake': '2744', 1327 | 'dash': '1f4a8', 1328 | 'fog': '1f32b', 1329 | 'umbrella': '2614', 1330 | 'sweat_drops': '1f4a6', 1331 | 'droplet': '1f4a7', 1332 | 'cloud_tornado': '1f32a', 1333 | 'cloud_with_tornado': '1f32a', 1334 | 'cloud_lightning': '1f329', 1335 | 'cloud_with_lightning': '1f329', 1336 | 'cloud_snow': '1f328', 1337 | 'cloud_with_snow': '1f328', 1338 | 'cloud_rain': '1f327', 1339 | 'cloud_with_rain': '1f327', 1340 | 'cloud': '2601', 1341 | 'partly_sunny': '26c5', 1342 | 'sunny': '2600', 1343 | 'crescent_moon': '1f319', 1344 | 'fire': '1f525', 1345 | 'flame': '1f525', 1346 | 'zap': '26a1', 1347 | 'feet': '1f43e', 1348 | 'spider_web': '1f578', 1349 | 'spider': '1f577', 1350 | 'beetle': '1f41e', 1351 | 'bee': '1f41d', 1352 | 'ant': '1f41c', 1353 | 'bug': '1f41b', 1354 | 'snail': '1f40c', 1355 | 'shell': '1f41a', 1356 | 'blowfish': '1f421', 1357 | 'tropical_fish': '1f420', 1358 | 'fish': '1f41f', 1359 | 'octopus': '1f419', 1360 | 'dolphin': '1f42c', 1361 | 'whale': '1f433', 1362 | 'whale2': '1f40b', 1363 | 'frog': '1f438', 1364 | 'turtle': '1f422', 1365 | 'snake': '1f40d', 1366 | 'crocodile': '1f40a', 1367 | 'dragon_face': '1f432', 1368 | 'dragon': '1f409', 1369 | 'monkey': '1f412', 1370 | 'speak_no_evil': '1f64a', 1371 | 'hear_no_evil': '1f649', 1372 | 'see_no_evil': '1f648', 1373 | 'monkey_face': '1f435', 1374 | 'panda_face': '1f43c', 1375 | 'koala': '1f428', 1376 | 'bear': '1f43b', 1377 | 'wolf': '1f43a', 1378 | 'dog': '1f436', 1379 | 'poodle': '1f429', 1380 | 'dog2': '1f415', 1381 | 'pig_nose': '1f43d', 1382 | 'pig': '1f437', 1383 | 'pig2': '1f416', 1384 | 'boar': '1f417', 1385 | 'camel': '1f42b', 1386 | 'dromedary_camel': '1f42a', 1387 | 'elephant': '1f418', 1388 | 'penguin': '1f427', 1389 | 'bird': '1f426', 1390 | 'hatched_chick': '1f425', 1391 | 'hatching_chick': '1f423', 1392 | 'baby_chick': '1f424', 1393 | 'chicken': '1f414', 1394 | 'rooster': '1f413', 1395 | 'goat': '1f410', 1396 | 'sheep': '1f411', 1397 | 'ram': '1f40f', 1398 | 'horse': '1f434', 1399 | 'racehorse': '1f40e', 1400 | 'cat': '1f431', 1401 | 'cat2': '1f408', 1402 | 'rabbit': '1f430', 1403 | 'rabbit2': '1f407', 1404 | 'chipmunk': '1f43f', 1405 | 'tiger': '1f42f', 1406 | 'leopard': '1f406', 1407 | 'tiger2': '1f405', 1408 | 'cow': '1f42e', 1409 | 'cow2': '1f404', 1410 | 'water_buffalo': '1f403', 1411 | 'ox': '1f402', 1412 | 'hamster': '1f439', 1413 | 'mouse': '1f42d', 1414 | 'mouse2': '1f401', 1415 | 'rat': '1f400', 1416 | 'chestnut': '1f330', 1417 | 'mushroom': '1f344', 1418 | 'leaves': '1f343', 1419 | 'fallen_leaf': '1f342', 1420 | 'maple_leaf': '1f341', 1421 | 'four_leaf_clover': '1f340', 1422 | 'herb': '1f33f', 1423 | 'ear_of_rice': '1f33e', 1424 | 'bouquet': '1f490', 1425 | 'blossom': '1f33c', 1426 | 'sunflower': '1f33b', 1427 | 'hibiscus': '1f33a', 1428 | 'rose': '1f339', 1429 | 'cherry_blossom': '1f338', 1430 | 'tulip': '1f337', 1431 | 'cactus': '1f335', 1432 | 'palm_tree': '1f334', 1433 | 'deciduous_tree': '1f333', 1434 | 'evergreen_tree': '1f332', 1435 | 'seedling': '1f331', 1436 | 'pray': '1f64f', 1437 | 'finger_pointing_down2': '1f59f', 1438 | 'sideways_white_down_pointing_index': '1f59f', 1439 | 'finger_pointing_up': '1f59e', 1440 | 'sideways_white_up_pointing_index': '1f59e', 1441 | 'finger_pointing_right': '1f599', 1442 | 'sideways_white_right_pointing_index': '1f599', 1443 | 'finger_pointing_left': '1f598', 1444 | 'sideways_white_left_pointing_index': '1f598', 1445 | 'finger_pointing_down': '1f597', 1446 | 'white_down_pointing_left_hand_index': '1f597', 1447 | 'vulcan': '1f596', 1448 | 'raised_hand_with_part_between_middle_and_ring_fingers': '1f596', 1449 | 'middle_finger': '1f595', 1450 | 'reversed_hand_with_middle_finger_extended': '1f595', 1451 | 'hand_victory': '1f594', 1452 | 'reversed_victory_hand': '1f594', 1453 | 'thumbs_down_reverse': '1f593', 1454 | 'reversed_thumbs_down_sign': '1f593', 1455 | 'thumbs_up_reverse': '1f592', 1456 | 'reversed_thumbs_up_sign': '1f592', 1457 | 'hand_splayed_reverse': '1f591', 1458 | 'reversed_raised_hand_with_fingers_splayed': '1f591', 1459 | 'hand_splayed': '1f590', 1460 | 'raised_hand_with_fingers_splayed': '1f590', 1461 | 'turned_ok_hand': '1f58f', 1462 | 'turned_ok_hand_sign': '1f58f', 1463 | 'writing_hand': '1f58e', 1464 | 'left_writing_hand': '1f58e', 1465 | 'open_hands': '1f450', 1466 | 'muscle': '1f4aa', 1467 | 'raised_hand': '270b', 1468 | 'fist': '270a', 1469 | 'punch': '1f44a', 1470 | 'v': '270c', 1471 | 'ok_hand': '1f44c', 1472 | 'point_right': '1f449', 1473 | 'point_left': '1f448', 1474 | 'point_down': '1f447', 1475 | 'point_up_2': '1f446', 1476 | 'point_up': '261d', 1477 | 'thumbsdown': '1f44e', 1478 | '-1': '1f44e', 1479 | 'thumbsup': '1f44d', 1480 | '1': '1f44d', 1481 | 'wave': '1f44b', 1482 | 'nail_care': '1f485', 1483 | 'tongue': '1f445', 1484 | 'kiss': '1f48b', 1485 | 'lips2': '1f5e2', 1486 | 'lips': '1f444', 1487 | 'nose': '1f443', 1488 | 'eyes': '1f440', 1489 | 'eye': '1f441', 1490 | 'ear': '1f442', 1491 | 'clap': '1f44f', 1492 | 'raised_hands': '1f64c', 1493 | 'kiss_mm': '1f468-2764-1f48b-1f468', 1494 | 'couplekiss_mm': '1f468-2764-1f48b-1f468', 1495 | 'kiss_ww': '1f469-2764-1f48b-1f469', 1496 | 'couplekiss_ww': '1f469-2764-1f48b-1f469', 1497 | 'couplekiss': '1f48f', 1498 | 'couple_mm': '1f468-2764-1f468', 1499 | 'couple_with_heart_mm': '1f468-2764-1f468', 1500 | 'couple_ww': '1f469-2764-1f469', 1501 | 'couple_with_heart_ww': '1f469-2764-1f469', 1502 | 'couple_with_heart': '1f491', 1503 | 'haircut': '1f487', 1504 | 'massage': '1f486', 1505 | 'person_frowning': '1f64d', 1506 | 'person_with_pouting_face': '1f64e', 1507 | 'raising_hand': '1f64b', 1508 | 'ok_woman': '1f646', 1509 | 'no_good': '1f645', 1510 | 'information_desk_person': '1f481', 1511 | 'bow': '1f647', 1512 | 'space_invader': '1f47e', 1513 | 'alien': '1f47d', 1514 | 'skull': '1f480', 1515 | 'skeleton': '1f480', 1516 | 'poop': '1f4a9', 1517 | 'shit': '1f4a9', 1518 | 'hankey': '1f4a9', 1519 | 'poo': '1f4a9', 1520 | 'japanese_goblin': '1f47a', 1521 | 'japanese_ogre': '1f479', 1522 | 'ghost': '1f47b', 1523 | 'santa': '1f385', 1524 | 'angel': '1f47c', 1525 | 'guardsman': '1f482', 1526 | 'princess': '1f478', 1527 | 'construction_worker': '1f477', 1528 | 'cop': '1f46e', 1529 | 'older_woman': '1f475', 1530 | 'grandma': '1f475', 1531 | 'older_man': '1f474', 1532 | 'man_with_turban': '1f473', 1533 | 'man_with_gua_pi_mao': '1f472', 1534 | 'person_with_blond_hair': '1f471', 1535 | 'bride_with_veil': '1f470', 1536 | 'dancers': '1f46f', 1537 | 'two_women_holding_hands': '1f46d', 1538 | 'two_men_holding_hands': '1f46c', 1539 | 'couple': '1f46b', 1540 | 'family_mmgg': '1f468-1f468-1f467-1f467', 1541 | 'family_mmbb': '1f468-1f468-1f466-1f466', 1542 | 'family_mmgb': '1f468-1f468-1f467-1f466', 1543 | 'family_mmg': '1f468-1f468-1f467', 1544 | 'family_mmb': '1f468-1f468-1f466', 1545 | 'family_wwgg': '1f469-1f469-1f467-1f467', 1546 | 'family_wwbb': '1f469-1f469-1f466-1f466', 1547 | 'family_wwgb': '1f469-1f469-1f467-1f466', 1548 | 'family_wwg': '1f469-1f469-1f467', 1549 | 'family_wwb': '1f469-1f469-1f466', 1550 | 'family_mwgg': '1f468-1f469-1f467-1f467', 1551 | 'family_mwbb': '1f468-1f469-1f466-1f466', 1552 | 'family_mwgb': '1f468-1f469-1f467-1f466', 1553 | 'family_mwg': '1f468-1f469-1f467', 1554 | 'family': '1f46a', 1555 | 'woman': '1f469', 1556 | 'man': '1f468', 1557 | 'girl': '1f467', 1558 | 'boy': '1f466', 1559 | 'baby': '1f476', 1560 | 'spy': '1f575', 1561 | 'sleuth_or_spy': '1f575', 1562 | 'levitate': '1f574', 1563 | 'man_in_business_suit_levitating': '1f574', 1564 | 'busts_in_silhouette': '1f465', 1565 | 'bust_in_silhouette': '1f464', 1566 | 'footprints': '1f463', 1567 | 'scream_cat': '1f640', 1568 | 'crying_cat_face': '1f63f', 1569 | 'pouting_cat': '1f63e', 1570 | 'kissing_cat': '1f63d', 1571 | 'smirk_cat': '1f63c', 1572 | 'heart_eyes_cat': '1f63b', 1573 | 'smiley_cat': '1f63a', 1574 | 'joy_cat': '1f639', 1575 | 'smile_cat': '1f638', 1576 | 'slight_smile': '1f642', 1577 | 'slightly_smiling_face': '1f642', 1578 | 'slight_frown': '1f641', 1579 | 'slightly_frowning_face': '1f641', 1580 | 'mask': '1f637', 1581 | 'no_mouth': '1f636', 1582 | 'dizzy_face': '1f635', 1583 | 'sleeping': '1f634', 1584 | 'flushed': '1f633', 1585 | 'astonished': '1f632', 1586 | 'scream': '1f631', 1587 | 'cold_sweat': '1f630', 1588 | 'hushed': '1f62f', 1589 | 'open_mouth': '1f62e', 1590 | 'sob': '1f62d', 1591 | 'grimacing': '1f62c', 1592 | 'tired_face': '1f62b', 1593 | 'sleepy': '1f62a', 1594 | 'weary': '1f629', 1595 | 'fearful': '1f628', 1596 | 'anguished': '1f627', 1597 | 'frowning': '1f626', 1598 | 'disappointed_relieved': '1f625', 1599 | 'triumph': '1f624', 1600 | 'persevere': '1f623', 1601 | 'cry': '1f622', 1602 | 'rage': '1f621', 1603 | 'angry': '1f620', 1604 | 'worried': '1f61f', 1605 | 'disappointed': '1f61e', 1606 | 'stuck_out_tongue_closed_eyes': '1f61d', 1607 | 'stuck_out_tongue_winking_eye': '1f61c', 1608 | 'stuck_out_tongue': '1f61b', 1609 | 'kissing_closed_eyes': '1f61a', 1610 | 'kissing_smiling_eyes': '1f619', 1611 | 'kissing_heart': '1f618', 1612 | 'kissing': '1f617', 1613 | 'confounded': '1f616', 1614 | 'confused': '1f615', 1615 | 'pensive': '1f614', 1616 | 'sweat': '1f613', 1617 | 'unamused': '1f612', 1618 | 'expressionless': '1f611', 1619 | 'neutral_face': '1f610', 1620 | 'smirk': '1f60f', 1621 | 'sunglasses': '1f60e', 1622 | 'heart_eyes': '1f60d', 1623 | 'relieved': '1f60c', 1624 | 'yum': '1f60b', 1625 | 'relaxed': '263a', 1626 | 'blush': '1f60a', 1627 | 'wink': '1f609', 1628 | 'imp': '1f47f', 1629 | 'smiling_imp': '1f608', 1630 | 'innocent': '1f607', 1631 | 'laughing': '1f606', 1632 | 'satisfied': '1f606', 1633 | 'sweat_smile': '1f605', 1634 | 'smile': '1f604', 1635 | 'smiley': '1f603', 1636 | 'joy': '1f602', 1637 | 'grin': '1f601', 1638 | 'grinning': '1f600', 1639 | } 1640 | 1641 | for name, code in map 1642 | .emoji-{name} 1643 | background-image url('../node_modules/emojione/assets/svg/'+code+'.svg') 1644 | -------------------------------------------------------------------------------- /src/static/index.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | meta(charset='UTF-8') 5 | link(rel='stylesheet', href='styles/index.css') 6 | link(rel='stylesheet', href='styles/emoji.css') 7 | link(rel='stylesheet', href='node_modules/font-awesome/css/font-awesome.css') 8 | link(rel='stylesheet', href='node_modules/github-markdown-css/github-markdown.css') 9 | link(rel='stylesheet', href='node_modules/highlight.js/styles/github.css') 10 | body 11 | script(src='scripts/renderer.js') 12 | script(src='http://localhost:35729/livereload.js') 13 | -------------------------------------------------------------------------------- /src/static/index.styl: -------------------------------------------------------------------------------- 1 | nav-height = 34px 2 | 3 | html 4 | body 5 | font-family sans-serif 6 | overflow hidden 7 | height 100% 8 | 9 | input 10 | button 11 | textarea 12 | outline none 13 | font-family sans-serif 14 | 15 | body 16 | margin 0 17 | padding 0 18 | 19 | .root 20 | width 100% 21 | height 100% 22 | 23 | .head 24 | z-index 1 25 | position relative 26 | background-color #B2B2B2 27 | border-bottom 1px solid #B2B2B2 28 | 29 | .nav 30 | z-index 2 31 | position relative 32 | display -webkit-box 33 | box-sizing border-box 34 | 35 | padding 2px 3px 4px 36 | 37 | width 100% 38 | height nav-height 39 | background -webkit-gradient(linear, left top, left bottom, from(#F2F0F0), to(#E7E6E9)) 40 | 41 | .search-box 42 | position absolute 43 | top nav-height 44 | right 32px 45 | transform translateY(-31px) 46 | box-sizing border-box 47 | width 293px 48 | height 31px 49 | 50 | .nav 51 | .path 52 | display block 53 | -webkit-box-flex 1 54 | box-sizing border-box 55 | border-radius 4px 56 | border 1px solid #B2B2B2 57 | padding 0 8px 58 | line-height 26px 59 | font-size 10pt 60 | 61 | button 62 | width 29px 63 | height 29px 64 | border none 65 | background-color transparent 66 | background-size 29px*5 29px*4 67 | &.backward 68 | background-position-x -29px*0 69 | background-image url(../assets/ui.png) 70 | &.forward 71 | background-position-x -29px*1 72 | background-image url(../assets/ui.png) 73 | &.reload 74 | background-position-x -29px*2 75 | background-image url(../assets/ui.png) 76 | &.tools 77 | display none 78 | background-position-x -29px*4 79 | background-image url(../assets/ui.png) 80 | &:hover 81 | background-position-y -29px*1 82 | &:active 83 | background-position-y -29px*2 84 | &:disabled 85 | background-position-y -29px*3 86 | 87 | .search-box 88 | padding 4px 2px 4px 4px 89 | overflow hidden 90 | border 1px solid #B2B2B2 91 | border-top none 92 | border-radius 0 0 4px 4px 93 | background -webkit-gradient(linear, left top, left bottom, from(#E7E6E9), to(#E0E1E0)) 94 | transition transform 0.15s ease-out 95 | 96 | &.is-shown 97 | transform translateY(0) 98 | .search 99 | display inline-block 100 | float left 101 | position relative 102 | width 216px 103 | height 22px 104 | font-size 14px 105 | input 106 | display inline-block 107 | width 167px 108 | padding 0 43px 0 4px 109 | line-height 20px 110 | background-color #ffffff 111 | border 1px solid #bbbbbd 112 | border-radius 4px 0 0 4px 113 | &:focus 114 | padding 0 42px 0 3px 115 | line-height 18px 116 | border 2px solid #a8cbf7 117 | .indication 118 | position absolute 119 | right 7px 120 | top 4px 121 | font-family arial, sans-serif 122 | font-size 13px 123 | letter-spacing 0.8px 124 | color #c9c9c9 125 | font-size 0.85em 126 | line-height 1.4 127 | .controller 128 | float left 129 | button 130 | float left 131 | width 22px 132 | height 22px 133 | padding 0 134 | font-size 10px !important 135 | color #747474 136 | background none 137 | border none 138 | outline none 139 | &.button-up, &.button-down 140 | position relative 141 | color #000 142 | background -webkit-gradient(linear, left top, left bottom, from(#f2f2f2), to(#dad8d8)) 143 | &:before 144 | position absolute 145 | left 50% 146 | top 50% 147 | margin-top -6px 148 | margin-left -5px 149 | &:disabled 150 | color #747474 151 | background none 152 | &:active 153 | background #8a8a8a 154 | &.button-up 155 | border-top 1px solid #c8c9c9 156 | border-right 1px solid #f3f4f2 157 | border-bottom 1px solid #c8c9c9 158 | &:disabled 159 | border-right 1px solid #DADBDA 160 | &.button-down 161 | width 23px 162 | border-top 1px solid #c8c9c9 163 | border-right 1px solid #c8c9c9 164 | border-bottom 1px solid #c8c9c9 165 | border-radius 0 4px 4px 0 166 | &.button-close 167 | color #868686 168 | border none 169 | background none 170 | width 14px 171 | height 14px 172 | margin-left 5px 173 | margin-top 4px 174 | margin-right 5px 175 | &:before 176 | display inline-block 177 | width 12px 178 | height 12px 179 | border-radius 50% 180 | &:hover 181 | &:before 182 | color #fff 183 | border 1px solid #c35354 184 | background #db8282 185 | &:active 186 | &:before 187 | color #fff 188 | border 1px solid #c35354 189 | bg-color = #db8282; 190 | background darken(bg-color,20%) 191 | 192 | .is-focused 193 | .head 194 | background-color #7A7A7A 195 | border-color #7A7A7A 196 | .nav 197 | background -webkit-gradient(linear, left top, left bottom, from(#ECEAEC), to(#DDDDDC)) 198 | .search-box 199 | border-color #7A7A7A 200 | background -webkit-gradient(linear, left top, left bottom, from(#DDDDDC), to(#D3D2D2)) 201 | 202 | .body 203 | position relative 204 | width 100% 205 | height 100% 206 | overflow auto 207 | 208 | .content 209 | 210 | .rail 211 | position absolute 212 | top 0 213 | right 0 214 | height 100% 215 | .mark 216 | position absolute 217 | top 10px 218 | right 0 219 | box-sizing border-box 220 | width 16px 221 | height 3px 222 | background #E6D580 223 | border 1px solid #E6C500 224 | 225 | .markdown-body 226 | padding 30px 227 | li 228 | &.checked 229 | &:before 230 | content "\f046" 231 | &.unchecked 232 | &:before 233 | content "\f096" 234 | .icon 235 | font normal normal normal 16px/1 octicons-anchor 236 | display inline-block 237 | text-decoration none 238 | text-rendering auto 239 | -webkit-font-smoothing antialiased 240 | -moz-osx-font-smoothing grayscale 241 | -webkit-user-select none 242 | -moz-user-select none 243 | -ms-user-select none 244 | user-select none 245 | .icon-link 246 | &:before 247 | content '\f05c' 248 | 249 | li 250 | & > p 251 | margin-top 0 !important 252 | margin-bottom 0 !important 253 | 254 | .markdown-body li.checked, 255 | .markdown-body li.unchecked 256 | list-style-type none 257 | position relative 258 | 259 | .markdown-body li.checked:before, 260 | .markdown-body li.unchecked:before 261 | font-family FontAwesome 262 | position absolute 263 | left -1.3em 264 | 265 | .markdown-body h1 .icon-link, 266 | .markdown-body h2 .icon-link, 267 | .markdown-body h3 .icon-link, 268 | .markdown-body h4 .icon-link, 269 | .markdown-body h5 .icon-link, 270 | .markdown-body h6 .icon-link 271 | display none 272 | color #000 273 | vertical-align middle 274 | 275 | .markdown-body h1:hover .anchor .icon-link, 276 | .markdown-body h2:hover .anchor .icon-link, 277 | .markdown-body h3:hover .anchor .icon-link, 278 | .markdown-body h4:hover .anchor .icon-link, 279 | .markdown-body h5:hover .anchor .icon-link, 280 | .markdown-body h6:hover .anchor .icon-link 281 | display inline-block 282 | 283 | mark.indicated 284 | background-color orange 285 | --------------------------------------------------------------------------------