├── .eslintignore ├── packs ├── fontawesome │ ├── .gitignore │ ├── .npmignore │ ├── public │ │ └── style.less │ ├── plugin.json │ ├── README.md │ ├── package.json │ ├── LICENSE │ ├── emoji.js │ └── fontawesome │ │ └── README.md ├── cubicopp │ ├── preview.png │ ├── plugin.json │ ├── emoji │ │ ├── LICENSE │ │ ├── confused.svg │ │ ├── joking.svg │ │ ├── big_mouth.svg │ │ ├── expressionless.svg │ │ ├── surprised.svg │ │ ├── sad.svg │ │ ├── warning.svg │ │ ├── upset.svg │ │ ├── tongue_out.svg │ │ ├── angry.svg │ │ ├── kiss_big.svg │ │ ├── cheeky.svg │ │ ├── kiss.svg │ │ ├── happy.svg │ │ ├── sunglasses.svg │ │ ├── crying.svg │ │ └── laughing.svg │ ├── library.js │ ├── package.json │ ├── README.md │ ├── LICENSE │ └── emoji.json ├── vital │ ├── emoji │ │ ├── rage1.png │ │ ├── rage2.png │ │ ├── rage3.png │ │ ├── rage4.png │ │ ├── finnadie.png │ │ ├── godmode.png │ │ ├── octocat.png │ │ ├── squirrel.png │ │ ├── suspect.png │ │ ├── feelsgood.png │ │ ├── goberserk.png │ │ ├── hurtrealbad.png │ │ ├── trollface.png │ │ └── LICENSE │ ├── plugin.json │ ├── README.md │ ├── package.json │ ├── LICENSE │ └── emoji.js ├── .eslintrc.js ├── one │ ├── plugin.json │ ├── README.md │ ├── LICENSE │ ├── package.json │ └── emoji.js ├── android │ ├── plugin.json │ ├── package.json │ ├── LICENSE │ ├── README.md │ └── emoji.js └── apple │ ├── plugin.json │ ├── package.json │ ├── LICENSE │ ├── README.md │ └── emoji.js ├── public ├── templates │ ├── admin │ │ └── plugins │ │ │ └── emoji.tpl │ └── partials │ │ └── emoji-dialog.tpl ├── language │ ├── he │ │ ├── admin │ │ │ ├── menu.json │ │ │ └── plugins │ │ │ │ └── emoji.json │ │ └── emoji.json │ ├── en-US │ │ ├── admin │ │ │ ├── menu.json │ │ │ └── plugins │ │ │ │ └── emoji.json │ │ └── emoji.json │ ├── zh-CN │ │ ├── admin │ │ │ ├── menu.json │ │ │ └── plugins │ │ │ │ └── emoji.json │ │ └── emoji.json │ ├── hu │ │ ├── admin │ │ │ ├── menu.json │ │ │ └── plugins │ │ │ │ └── emoji.json │ │ └── emoji.json │ ├── ru │ │ ├── admin │ │ │ └── plugins │ │ │ │ └── emoji.json │ │ └── emoji.json │ └── pl │ │ └── admin │ │ └── plugins │ │ └── emoji.json ├── .eslintrc.js ├── tsconfig.json ├── emoji-setup.js ├── lib │ ├── fuzzysearch.js │ ├── types.d.ts │ ├── leven.js │ └── emoji.ts └── style.scss ├── acp ├── admin.scss ├── .eslintrc.js ├── tsconfig.json ├── src │ ├── Translate.svelte │ ├── admin.ts │ ├── modules.d.ts │ ├── Customize.svelte │ ├── EmojiList.svelte │ ├── ItemList.svelte │ └── Settings.svelte └── rollup.config.mjs ├── lib ├── base-url.ts ├── pubsub.ts ├── tests.ts ├── customizations.ts ├── settings.ts ├── css-builders.ts ├── index.ts ├── controllers.ts └── types.d.ts ├── tsconfig.json ├── LICENSE ├── .gitignore ├── .npmignore ├── plugin.json ├── .eslintrc.js ├── package.json └── README.md /.eslintignore: -------------------------------------------------------------------------------- 1 | build -------------------------------------------------------------------------------- /packs/fontawesome/.gitignore: -------------------------------------------------------------------------------- 1 | public/language -------------------------------------------------------------------------------- /packs/fontawesome/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /public/templates/admin/plugins/emoji.tpl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /acp/admin.scss: -------------------------------------------------------------------------------- 1 | @import "../build/acp/admin"; 2 | -------------------------------------------------------------------------------- /public/language/he/admin/menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins/emoji": "Emoji" 3 | } 4 | -------------------------------------------------------------------------------- /public/language/en-US/admin/menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins/emoji": "Emoji" 3 | } 4 | -------------------------------------------------------------------------------- /public/language/zh-CN/admin/menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins/emoji": "Emoji" 3 | } 4 | -------------------------------------------------------------------------------- /public/language/hu/admin/menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins/emoji": "Hangulatjelek" 3 | } 4 | -------------------------------------------------------------------------------- /packs/cubicopp/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/cubicopp/preview.png -------------------------------------------------------------------------------- /packs/vital/emoji/rage1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/rage1.png -------------------------------------------------------------------------------- /packs/vital/emoji/rage2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/rage2.png -------------------------------------------------------------------------------- /packs/vital/emoji/rage3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/rage3.png -------------------------------------------------------------------------------- /packs/vital/emoji/rage4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/rage4.png -------------------------------------------------------------------------------- /packs/vital/emoji/finnadie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/finnadie.png -------------------------------------------------------------------------------- /packs/vital/emoji/godmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/godmode.png -------------------------------------------------------------------------------- /packs/vital/emoji/octocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/octocat.png -------------------------------------------------------------------------------- /packs/vital/emoji/squirrel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/squirrel.png -------------------------------------------------------------------------------- /packs/vital/emoji/suspect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/suspect.png -------------------------------------------------------------------------------- /packs/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | '@typescript-eslint/no-var-requires': ['off'], 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /packs/vital/emoji/feelsgood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/feelsgood.png -------------------------------------------------------------------------------- /packs/vital/emoji/goberserk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/goberserk.png -------------------------------------------------------------------------------- /packs/vital/emoji/hurtrealbad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/hurtrealbad.png -------------------------------------------------------------------------------- /packs/vital/emoji/trollface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NodeBB/nodebb-plugin-emoji/HEAD/packs/vital/emoji/trollface.png -------------------------------------------------------------------------------- /packs/one/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "emoji.js", 3 | "hooks": [ 4 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /packs/android/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "emoji.js", 3 | "hooks": [ 4 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /packs/apple/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "emoji.js", 3 | "hooks": [ 4 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /packs/cubicopp/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "library.js", 3 | "hooks": [ 4 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 5 | ] 6 | } -------------------------------------------------------------------------------- /packs/vital/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "emoji.js", 3 | "hooks": [ 4 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/LICENSE: -------------------------------------------------------------------------------- 1 | All images have been downloaded from http://publicdomainvectors.org/ and are stated "Public domain". 2 | 3 | Many thanks to the author! 4 | -------------------------------------------------------------------------------- /packs/fontawesome/public/style.less: -------------------------------------------------------------------------------- 1 | .emoji.emoji-fontawesome { 2 | width: auto; 3 | } 4 | 5 | .dropdown-menu .emoji-fontawesome { 6 | width: 1.28571429em; 7 | } 8 | -------------------------------------------------------------------------------- /acp/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | 'svelte/valid-compile': 'off', 4 | 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /packs/cubicopp/library.js: -------------------------------------------------------------------------------- 1 | const emoji = require('./emoji.json'); 2 | 3 | exports.defineEmoji = (data, callback) => { 4 | emoji.path = __dirname; 5 | data.packs.push(emoji); 6 | callback(null, data); 7 | }; 8 | -------------------------------------------------------------------------------- /packs/fontawesome/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": "emoji.js", 3 | "languages": "public/language", 4 | "defaultLang": "en-US", 5 | "less": [ 6 | "public/style.less" 7 | ], 8 | "hooks": [ 9 | { "hook": "filter:emoji.packs", "method": "defineEmoji" } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /public/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | jquery: true, 5 | amd: true, 6 | }, 7 | globals: { 8 | socket: true, 9 | utils: true, 10 | app: true, 11 | config: true, 12 | Textcomplete: true, 13 | ajaxify: true, 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /acp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | 4 | "include": ["src/**/*", "../lib/types.d.ts"], 5 | "exclude": ["node_modules/*", "__sapper__/*", "public/*"], 6 | 7 | "compilerOptions": { 8 | "paths": { 9 | "emoji": ["../public/lib/emoji"] 10 | } 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /acp/src/Translate.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#await translator.translate(src) then translated} 10 | 11 | {@html translated} 12 | {/await} 13 | -------------------------------------------------------------------------------- /lib/base-url.ts: -------------------------------------------------------------------------------- 1 | const nconf = require.main?.require('nconf'); 2 | 3 | export function getBaseUrl(): string { 4 | const relative_path = nconf.get('relative_path') || ''; 5 | const assetBaseUrl = nconf.get('asset_base_url') || `${relative_path}/assets`; 6 | 7 | return assetBaseUrl.startsWith('http') ? 8 | assetBaseUrl : 9 | nconf.get('base_url') + assetBaseUrl; 10 | } 11 | -------------------------------------------------------------------------------- /packs/vital/emoji/LICENSE: -------------------------------------------------------------------------------- 1 | Images contained within the 'emoji' directory are subject to their respective copyrights below. 2 | 3 | octocat, squirrel 4 | Copyright (c) 2012 GitHub Inc. All rights reserved. 5 | 6 | feelsgood, finnadie, goberserk, godmode, hurtrealbad, rage 1, rage 2, rage 3, rage 4, suspect 7 | Copyright (c) 2012 id Software. All rights reserved. 8 | 9 | trollface 10 | Copyright (c) 2012 whynne@deviantart. All rights reserved. -------------------------------------------------------------------------------- /packs/fontawesome/README.md: -------------------------------------------------------------------------------- 1 | # Font Awesome Emoji for NodeBB 2 | 3 | This emoji pack allows you to use the Font Awesome icons already included with NodeBB as emoji on your forum. 4 | 5 | ## Installation 6 | 7 | This pack requires `nodebb-plugin-emoji` version 2. For best results, install and activate both plugins through your Admin Control Panel in NodeBB. 8 | 9 | For manual installation, `npm install nodebb-plugin-emoji nodebb-plugin-emoji-fontawesome`. -------------------------------------------------------------------------------- /public/language/zh-CN/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "设置", 3 | "settings.parseAscii": "替换常见的ASCII字符,例如 :), -_- 等", 4 | "settings.parseNative": "用表情包提供的 Emoji 替换本地 Unicode Emoji 字符", 5 | "settings.customFirst": "将自定义 Emoji 放在对话框的首位", 6 | "settings.parseTitles": "解析主题磁贴中的 Emoji", 7 | "build": "构建 Emoji 资产", 8 | "build_description": "从所有表情包中编译必要的元数据和静态资产。
安装并激活表情包后,重启 NodeBB,构建表情包资产,然后重建和重启 NodeBB。" 9 | } 10 | -------------------------------------------------------------------------------- /acp/src/admin.ts: -------------------------------------------------------------------------------- 1 | import jQuery from 'jquery'; 2 | import ajaxify from 'ajaxify'; 3 | 4 | import Settings from './Settings.svelte'; 5 | 6 | jQuery(window).on('action:ajaxify.end', () => { 7 | if (ajaxify.data.template['admin/plugins/emoji']) { 8 | // eslint-disable-next-line no-new 9 | new Settings({ 10 | target: document.getElementById('content') as HTMLElement, 11 | props: { 12 | settings: ajaxify.data.settings, 13 | }, 14 | }); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "lib/**/*.ts" 4 | ], 5 | "compilerOptions": { 6 | "types": [], 7 | "outDir": "build/lib", 8 | "lib": ["es2019"], 9 | "target": "es2019", 10 | "module": "node16", 11 | "moduleResolution": "node16", 12 | "esModuleInterop": true, 13 | "noImplicitAny": true, 14 | "alwaysStrict": true, 15 | "strictNullChecks": true, 16 | "sourceMap": true, 17 | "skipLibCheck": true 18 | }, 19 | "typeAcquisition": { 20 | "enable": false 21 | } 22 | } -------------------------------------------------------------------------------- /public/language/ru/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "Настройки", 3 | "settings.parseAscii": "Заменять общие символы ASCII, такие как :), -_-, и так далее.", 4 | "settings.parseNative": "Замените нативные символы смайликов в юникоде на смайлики, предоставляемые наборами смайликов", 5 | "settings.customFirst": "Поместите свой собственный смайлик первым в диалоге", 6 | "build": "Сборка эмодзи", 7 | "build_description": "Компиляция необходимых метаданных и статических ресурсов из всех пакетов Emoji." 8 | } 9 | -------------------------------------------------------------------------------- /public/language/he/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "הגדרות", 3 | "settings.parseAscii": "החלף תווי ASCII נפוצים כמו :), -_-, וכו'", 4 | "settings.parseNative": "החלף את דמויות האימוג'י המקוריות של Unicode באמוג'י שמסופקים על ידי חבילות האימוג'י", 5 | "settings.customFirst": "הצב את האימוג'י המותאמים אישית ראשונים בתיבת הדו-שיח", 6 | "settings.parseTitles": "נתח אמוג'י באריחי נושאים", 7 | "build": "בנה נכסי אימוג'י", 8 | "build_description": "אסוף את המטא נתונים והנכסים הסטטיים הדרושים מכל חבילות האימוג'י.
לאחר התקנה והפעלה של חבילת אימוג'י, הפעל מחדש את NodeBB, בנה נכסי Emoji ולאחר מכן בנה מחדש והפעל מחדש את NodeBB." 9 | } -------------------------------------------------------------------------------- /packs/vital/README.md: -------------------------------------------------------------------------------- 1 | # Vital Emoji for NodeBB 2 | 3 | This emoji pack concentrates commonly used, non-standard emoji from Github and elsewhere for use in NodeBB. 4 | 5 | The emoji images are unlicensed, use at your own risk. 6 | 7 | ## Emoji List 8 | 9 | - octocat (Github) 10 | - squirrel / shipit (Github) 11 | - trollface (whynne) 12 | - Various DOOM Marine emoji (rage, godmode, berserk, etc) 13 | 14 | ## Installation 15 | 16 | This pack requires `nodebb-plugin-emoji` version 2. For best results, install and activate both plugins through your Admin Control Panel in NodeBB. 17 | 18 | For manual installation, `npm install nodebb-plugin-emoji nodebb-plugin-emoji-vital`. -------------------------------------------------------------------------------- /public/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "lib/**/*.ts", 4 | "../lib/types.d.ts" 5 | ], 6 | "compilerOptions": { 7 | "outDir": "../build/public/lib", 8 | "lib": ["es5", "dom", "es2015.promise", "es2015.iterable"], 9 | "target": "es5", 10 | "module": "amd", 11 | "noImplicitAny": true, 12 | "sourceMap": true, 13 | "types": [ 14 | "jquery", 15 | "bootstrap" 16 | ], 17 | 18 | "moduleResolution": "node", 19 | "baseUrl": ".", 20 | "paths": { 21 | "emoji-dialog": ["lib/emoji-dialog"], 22 | "emoji": ["lib/emoji"] 23 | } 24 | }, 25 | "typeAcquisition": { 26 | "enable": false 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/language/en-US/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "Settings", 3 | "settings.parseAscii": "Replace common ASCII characters like :), -_-, etc", 4 | "settings.parseNative": "Replace native unicode emoji characters with emoji provided by emoji packs", 5 | "settings.customFirst": "Place your custom emoji first in the dialog", 6 | "settings.parseTitles": "Parse emojis in topic tiles", 7 | "build": "Build Emoji Assets", 8 | "build_description": "Compile the necessary metadata and static assets from all emoji packs.
After installing and activating an emoji pack, restart NodeBB, Build Emoji Assets, then Restart and Rebuild NodeBB." 9 | } 10 | -------------------------------------------------------------------------------- /public/language/pl/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "Ustawienia", 3 | "settings.parseAscii": "Zamieniaj dobrze znane buźki ASCII jak :), -_-, itp.", 4 | "settings.parseNative": "Zamieniaj emoji w formie unicode na emoji z paczki emoji", 5 | "settings.customFirst": "Własne emoji wyświetlaj jako pierwsze", 6 | "settings.parseTitles": "Uwzględnij emoji w tytułach wątków", 7 | "build": "Przygotuj zestaw emoji", 8 | "build_description": "Ruszy kompilacja niezbędnych metadanych i plików statych, które dadzą paczkę emoji.
Po instalacji i aktywacji paczki z emoji pamiętaj zrobić restart NodeBB a po kompilacji elementów ponownie skorzystaj z opcji przebudowy i restartu NodeBB." 9 | } -------------------------------------------------------------------------------- /public/language/hu/admin/plugins/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": "Beállítások", 3 | "settings.parseAscii": "ASCII karaktersorozatok, mint :), -_-, stb helyettesítése", 4 | "settings.parseNative": "Natív unicode hangulatjelek helyettesítése hangulatjel csomagok által biztosított hangulatjelekre", 5 | "settings.customFirst": "Az egyedi hangulatjelek kerüljenek a választóban legelőre", 6 | "build": "Hangulatjelek újraépítése", 7 | "build_description": "A szükséges meta információk és statikus asset-ek fordítása az összes hangulatjel csomagból.
Egy hangulatjel csomag telepítése és aktiválása után indítsd újra a NodeBB-t, építsd újra a hangulatjeleket, majd építsd újra és indítsd újra a NodeBB-t." 8 | } 9 | -------------------------------------------------------------------------------- /public/emoji-setup.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | require(['emoji'], function (emoji) { 4 | $(window).on('composer:autocomplete:init chat:autocomplete:init', function (e, data) { 5 | emoji.init(); 6 | data.strategies.push(emoji.strategy); 7 | }); 8 | 9 | $(window).on('action:chat.loaded', (ev, container) => { 10 | const containerEl = $(container); 11 | const textarea = containerEl.find('[component="chat/input"]')[0]; 12 | const addEmojiBtn = containerEl.find('[data-action="emoji"]'); 13 | 14 | addEmojiBtn.on('click', (ev) => { 15 | require([ 16 | 'emoji-dialog' 17 | ], function (emojiDialog) { 18 | emojiDialog.toggleForInsert(textarea, 0, 0, ev); 19 | }); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packs/vital/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-vital", 3 | "version": "4.1.1", 4 | "description": "Vital non-standard unlicensed emoji", 5 | "main": "emoji.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/vital", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 13 | }, 14 | "keywords": [ 15 | "nodebb", 16 | "plugin", 17 | "emoji", 18 | "vital", 19 | "extended" 20 | ], 21 | "nbbpm": { 22 | "name": "Emoji One", 23 | "compatibility": "^3.0.0" 24 | }, 25 | "peerDependencies": { 26 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 27 | }, 28 | "author": "Peter Jaszkowiak", 29 | "license": "MIT" 30 | } 31 | -------------------------------------------------------------------------------- /lib/pubsub.ts: -------------------------------------------------------------------------------- 1 | import * as os from 'os'; 2 | 3 | import buildAssets from './build'; 4 | 5 | const nconf = require.main?.require('nconf'); 6 | const winston = require.main?.require('winston'); 7 | const pubsub = require.main?.require('./src/pubsub'); 8 | 9 | const primary = nconf.get('isPrimary') === 'true' || nconf.get('isPrimary') === true; 10 | const hostname = os.hostname(); 11 | const port = nconf.get('port'); 12 | const id = `${hostname}:${port}`; 13 | 14 | if (primary) { 15 | pubsub.on('emoji:build', (data: { id: string }) => { 16 | if (data.id !== id) { 17 | buildAssets().catch((err) => { 18 | if (err) { 19 | winston.error(err); 20 | } 21 | }); 22 | } 23 | }); 24 | } 25 | 26 | export async function build(): Promise { 27 | if (pubsub.pubClient) { 28 | pubsub.publish('emoji:build', { 29 | id, 30 | }); 31 | } 32 | 33 | if (primary) { 34 | await buildAssets(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/language/zh-CN/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "composer.title": "Emoji", 3 | "meta-load-failed": "加载emoji元数据失败", 4 | "modal.title": "可用表情符号", 5 | "modal.legal": "法律信息", 6 | "modal.legal.header": "显示的表情符号属于不同的 Emoji 集
一个表情符号属于哪一组,可在 class HTML 属性中说明 (class=\"emoji-[pack ID]\").", 7 | "modal.legal.set.header": "%1 Emoji 集 ID: %2", 8 | "modal.legal.set.attribution": "署名", 9 | "modal.legal.set.license": "许可证", 10 | 11 | "categories.symbols": "标志", 12 | "categories.objects": "物体", 13 | "categories.nature": "自然", 14 | "categories.people": "人物", 15 | "categories.food": "食物", 16 | "categories.travel": "旅行", 17 | "categories.activity": "运动", 18 | "categories.flags": "旗帜", 19 | "categories.regional": "区域", 20 | "categories.modifier": "修饰", 21 | "categories.other": "其他", 22 | "categories.custom": "定制", 23 | "search.results": "搜索结果", 24 | "search.placeholder": "搜索" 25 | } 26 | -------------------------------------------------------------------------------- /packs/fontawesome/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-fontawesome", 3 | "version": "4.1.1", 4 | "description": "Use the included fontawesome icons as emoji", 5 | "main": "emoji.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "prepare": "mkdir -p public/language/en-US && node -e \"require('./emoji.js').buildLanguageFile()\"" 9 | }, 10 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/fontawesome", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 14 | }, 15 | "keywords": [ 16 | "nodebb", 17 | "plugin", 18 | "emoji", 19 | "font", 20 | "awesome", 21 | "extended" 22 | ], 23 | "nbbpm": { 24 | "compatibility": "^3.0.0" 25 | }, 26 | "peerDependencies": { 27 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 28 | }, 29 | "author": "Peter Jaszkowiak", 30 | "license": "MIT", 31 | "dependencies": { 32 | "yaml": "^1.0.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /packs/cubicopp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-cubicopp", 3 | "version": "4.1.1", 4 | "description": "The cubicopp emoji-set for NodeBB (requires nodebb-plugin-emoji)", 5 | "main": "emoji.json", 6 | "author": "Ole Reglitzki (https://github.com/frissdiegurke)", 7 | "contributors": [ 8 | "Ole Reglitzki (https://github.com/frissdiegurke)", 9 | "Peter Jaszkowiak (https://github.com/pitaj)" 10 | ], 11 | "license": "MIT", 12 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/cubicopp", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 16 | }, 17 | "nbbpm": { 18 | "name": "Emoji Cubicopp", 19 | "compatibility": "^3.0.0" 20 | }, 21 | "keywords": [ 22 | "nodebb", 23 | "emoji", 24 | "extended", 25 | "cubicopp" 26 | ], 27 | "peerDependencies": { 28 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /packs/android/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-android", 3 | "version": "4.1.1", 4 | "description": "The Android blob emoji-set for NodeBB (requires nodebb-plugin-emoji)", 5 | "main": "emoji.js", 6 | "author": "Peter Jaszkowiak (https://github.com/pitaj)", 7 | "contributors": [ 8 | "Peter Jaszkowiak (https://github.com/pitaj)" 9 | ], 10 | "license": "MIT", 11 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/android", 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 15 | }, 16 | "nbbpm": { 17 | "name": "Emoji Android", 18 | "compatibility": "^3.0.0" 19 | }, 20 | "keywords": [ 21 | "nodebb", 22 | "plugin", 23 | "emoji", 24 | "android", 25 | "google" 26 | ], 27 | "peerDependencies": { 28 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 29 | }, 30 | "dependencies": { 31 | "emoji-datasource-google": "^3.0.0", 32 | "lodash.frompairs": "^4.0.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/language/he/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "composer.title": "אימוג'י", 3 | "meta-load-failed": "טעינת מטא נתונים של אמוג'י נכשלה", 4 | "modal.title": "אימוטיקונים זמינים", 5 | "modal.legal": "מידע משפטי", 6 | "modal.legal.header": "האימוג'ים המוצגים שייכים לערכות אימוג'י שונות.
לאיזו ערכה שייך אמוג'י מצוין בתכונת ה-HTML class שלו (class=\"emoji-[pack ID]\").", 7 | "modal.legal.set.header": "%1 ערכת אמוג'י ID: %2", 8 | "modal.legal.set.attribution": "ייחוס", 9 | "modal.legal.set.license": "רישיון", 10 | 11 | "categories.symbols": "סמלים", 12 | "categories.objects": "חפצים", 13 | "categories.nature": "טבע", 14 | "categories.people": "אנשים", 15 | "categories.food": "אוכל", 16 | "categories.travel": "נסיעה", 17 | "categories.activity": "פעילות", 18 | "categories.flags": "דגלים", 19 | "categories.regional": "Regional", 20 | "categories.modifier": "Modifier", 21 | "categories.other": "אחר", 22 | "categories.custom": "מותאם אישית", 23 | "search.results": "תוצאות חיפוש", 24 | "search.placeholder": "חיפוש" 25 | } 26 | -------------------------------------------------------------------------------- /packs/one/README.md: -------------------------------------------------------------------------------- 1 | # [NodeBB](https://nodebb.org/) Plugin: **Emoji One** *\* 2 | 3 | [![License](https://img.shields.io/npm/l/nodebb-plugin-emoji-one.svg)](LICENSE) 4 | [![Version](https://img.shields.io/npm/v/nodebb-plugin-emoji-one.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-one) 5 | [![Downloads](https://img.shields.io/npm/dm/nodebb-plugin-emoji-one.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-one) 6 | [![Dependency Status](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-one.svg)](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-one) 7 | 8 | The one emoji-set for NodeBB. 9 | 10 | ![preview](https://d1j8pt39hxlh3d.cloudfront.net/sections/thumbnails/thumb-3.0c_1.png) 11 | 12 | ## Installation 13 | 14 | Install and activate `nodebb-plugin-emoji` and `nodebb-plugin-emoji-one` via the admin control panel of your NodeBB instance. 15 | 16 | ### Manual installation 17 | 18 | The manual installation via [NPM](https://www.npmjs.com/) may result in version-conflicts with NodeBB. 19 | 20 | npm install nodebb-plugin-emoji@2 nodebb-plugin-emoji-one@2 21 | -------------------------------------------------------------------------------- /packs/cubicopp/README.md: -------------------------------------------------------------------------------- 1 | # [NodeBB](https://nodebb.org/) Plugin: **Emoji Cubicopp** *\* 2 | 3 | [![License](https://img.shields.io/npm/l/nodebb-plugin-emoji-cubicopp.svg)](LICENSE) 4 | [![Version](https://img.shields.io/npm/v/nodebb-plugin-emoji-cubicopp.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-cubicopp) 5 | [![Downloads](https://img.shields.io/npm/dm/nodebb-plugin-emoji-cubicopp.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-cubicopp) 6 | [![Dependency Status](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-cubicopp.svg)](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-cubicopp) 7 | 8 | A static cubicopp images emoji-set for NodeBB. 9 | 10 | ![preview](preview.png) 11 | 12 | ## Installation 13 | 14 | Install and activate `nodebb-plugin-emoji` and `nodebb-plugin-emoji-cubicopp` via the admin control panel of your NodeBB instance. 15 | 16 | ### Manual installation 17 | 18 | The manual installation via [NPM](https://www.npmjs.com/) may result in version-conflicts with NodeBB. 19 | 20 | npm install nodebb-plugin-emoji nodebb-plugin-emoji-cubicopp 21 | -------------------------------------------------------------------------------- /packs/vital/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Peter Jaszkowiak 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. -------------------------------------------------------------------------------- /packs/apple/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-apple", 3 | "version": "4.1.1", 4 | "description": "The apple emoji-set for NodeBB (requires nodebb-plugin-emoji)", 5 | "main": "emoji.js", 6 | "author": "Ole Reglitzki (https://github.com/frissdiegurke)", 7 | "contributors": [ 8 | "Ole Reglitzki (https://github.com/frissdiegurke)", 9 | "Peter Jaszkowiak (https://github.com/pitaj)" 10 | ], 11 | "license": "MIT", 12 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/apple", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 16 | }, 17 | "nbbpm": { 18 | "name": "Emoji Apple", 19 | "compatibility": "^3.0.0" 20 | }, 21 | "keywords": [ 22 | "nodebb", 23 | "plugin", 24 | "emoji", 25 | "apple" 26 | ], 27 | "peerDependencies": { 28 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 29 | }, 30 | "dependencies": { 31 | "emoji-datasource-apple": "^3.0.0", 32 | "lodash.frompairs": "^4.0.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /packs/fontawesome/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Peter Jaszkowiak 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 NodeBB 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. -------------------------------------------------------------------------------- /packs/apple/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Ole Reglitzki 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. -------------------------------------------------------------------------------- /packs/cubicopp/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Ole Reglitzki 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. -------------------------------------------------------------------------------- /packs/one/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Ole Reglitzki 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 | -------------------------------------------------------------------------------- /packs/android/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Peter Jaszkowiak 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. -------------------------------------------------------------------------------- /packs/apple/README.md: -------------------------------------------------------------------------------- 1 | # [NodeBB](https://nodebb.org/) Plugin: **Emoji Apple** *\* 2 | 3 | [![License](https://img.shields.io/npm/l/nodebb-plugin-emoji-apple.svg)](LICENSE) 4 | [![Version](https://img.shields.io/npm/v/nodebb-plugin-emoji-apple.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-apple) 5 | [![Downloads](https://img.shields.io/npm/dm/nodebb-plugin-emoji-apple.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-apple) 6 | [![Dependency Status](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-apple.svg)](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-apple) 7 | 8 | The Apple emoji-set for NodeBB. Apple Color Emoji license terms are unknown. Use at own risk. 9 | 10 | Preview the set at: http://www.emoji-cheat-sheet.com/ 11 | 12 | ## Installation 13 | 14 | Install and activate `nodebb-plugin-emoji` and `nodebb-plugin-emoji-apple` via the admin control panel of your NodeBB instance. 15 | 16 | ### Manual installation 17 | 18 | The manual installation via [NPM](https://www.npmjs.com/) may result in version-conflicts with NodeBB. 19 | 20 | npm install nodebb-plugin-emoji@2 nodebb-plugin-emoji-apple@2 21 | -------------------------------------------------------------------------------- /public/language/en-US/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "composer.title": "Emoji", 3 | "meta-load-failed": "Failed to load emoji metadata", 4 | "modal.title": "Available Emoticons", 5 | "modal.legal": "Legal Information", 6 | "modal.legal.header": "The emojis displayed belong to different emoji sets.
Which set an emoji belongs to is stated within the class HTML attribute (class=\"emoji-[pack ID]\").", 7 | "modal.legal.set.header": "%1 Emoji Set ID: %2", 8 | "modal.legal.set.attribution": "Attribution", 9 | "modal.legal.set.license": "License", 10 | 11 | "categories.symbols": "Symbols", 12 | "categories.objects": "Objects", 13 | "categories.nature": "Nature", 14 | "categories.people": "People", 15 | "categories.food": "Food", 16 | "categories.travel": "Travel", 17 | "categories.activity": "Activity", 18 | "categories.flags": "Flags", 19 | "categories.regional": "Regional", 20 | "categories.modifier": "Modifier", 21 | "categories.other": "Other", 22 | "categories.custom": "Custom", 23 | "search.results": "Search Results", 24 | "search.placeholder": "Search" 25 | } 26 | -------------------------------------------------------------------------------- /lib/tests.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | // ensure all packs have the correct peer dependency, repository url, and homepage url 4 | 5 | import assert from 'assert'; 6 | import { readdirSync, statSync } from 'fs'; 7 | import { join } from 'path'; 8 | import { satisfies } from 'semver'; 9 | 10 | const packsDir = join(__dirname, '../../packs'); 11 | const packs = readdirSync(packsDir).filter(dir => statSync(join(packsDir, dir)).isDirectory()); 12 | 13 | const manifest = require('../../package.json'); 14 | 15 | packs.forEach((pack) => { 16 | const packManifest = require(`../../packs/${pack}/package.json`); 17 | 18 | assert.strictEqual(packManifest.repository.url, manifest.repository.url, `pack "${packManifest.name}: invalid repository url "${packManifest.repository.url}"`); 19 | assert(packManifest.homepage.startsWith(`${manifest.homepage}/tree/master/packs/`), `pack "${packManifest.name}: invalid homepage "${packManifest.homepage}"`); 20 | const range = packManifest.peerDependencies['nodebb-plugin-emoji']; 21 | assert(satisfies(manifest.version, range), `pack "${packManifest.name}": peer dependency range "${range}" not satisfied by version "${manifest.version}"`); 22 | }); 23 | -------------------------------------------------------------------------------- /public/language/ru/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "composer.title": "Emoji", 3 | "meta-load-failed": "Ошибка загрузки данных emoji", 4 | "modal.title": "Доступные смайлики", 5 | "modal.legal": "Легальная информация", 6 | "modal.legal.header": "Отображаемые смайлики относятся к разным наборам смайликов.
К какому набору относится эмодзи, указано в атрибуте HTML класса (class=\"emoji-[pack ID]\").", 7 | "modal.legal.set.header": "%1 Набор эмодзи ID: %2", 8 | "modal.legal.set.attribution": "Атрибуция", 9 | "modal.legal.set.license": "Лицензия", 10 | 11 | "categories.symbols": "Символы", 12 | "categories.objects": "Объекты", 13 | "categories.nature": "Природа", 14 | "categories.people": "Люди", 15 | "categories.food": "Еда", 16 | "categories.travel": "Путешествие", 17 | "categories.activity": "Активность", 18 | "categories.flags": "Флаги", 19 | "categories.regional": "Региональные", 20 | "categories.modifier": "Модификатор", 21 | "categories.other": "Другие", 22 | "categories.custom": "Кастом", 23 | "search.results": "Результаты поиска", 24 | "search.placeholder": "Поиск" 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | 61 | # Custom ignores 62 | build 63 | .vscode 64 | tmp -------------------------------------------------------------------------------- /packs/one/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-emoji-one", 3 | "version": "4.1.1", 4 | "description": "The emoji-one set for NodeBB (requires nodebb-plugin-emoji)", 5 | "main": "emoji.js", 6 | "author": "Ole Reglitzki (https://github.com/frissdiegurke)", 7 | "contributors": [ 8 | "Ole Reglitzki (https://github.com/frissdiegurke)", 9 | "Peter Jaszkowiak (https://github.com/pitaj)" 10 | ], 11 | "license": "MIT", 12 | "homepage": "https://github.com/NodeBB/nodebb-plugin-emoji/tree/master/packs/one", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/NodeBB/nodebb-plugin-emoji.git" 16 | }, 17 | "nbbpm": { 18 | "name": "Emoji One", 19 | "compatibility": "^3.0.0" 20 | }, 21 | "peerDependencies": { 22 | "nodebb-plugin-emoji": "^5.0.0 || ^6.0.1" 23 | }, 24 | "keywords": [ 25 | "nodebb", 26 | "emoji-one", 27 | "emojione", 28 | "extended", 29 | "emoji", 30 | "one" 31 | ], 32 | "dependencies": { 33 | "download": "^6.2.3", 34 | "emojione": "^3.1.2", 35 | "lodash.frompairs": "^4.0.1", 36 | "semver": "^5.4.1" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | 61 | # Custom ignores 62 | .git 63 | .gitignore 64 | .vscode 65 | tmp 66 | packs 67 | -------------------------------------------------------------------------------- /public/language/hu/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "composer.title": "Hangulatjelek", 3 | "meta-load-failed": "Hangulatjel meta információk betoltése sikertelen", 4 | "modal.title": "Elérhető hangulatjelek", 5 | "modal.legal": "Jogi információk", 6 | "modal.legal.header": "A megjelenített hangulatjelek különböző hangulatjel csomagokhoz tartoznak.
Hogy az adott hangulatjel melyik csomaghoz tartozik, azt a HTML class attribútum jelöli (class=\"emoji-[pack ID]\").", 7 | "modal.legal.set.header": "%1 Hangulatjel csomag azonosító: %2", 8 | "modal.legal.set.attribution": "Tulajdonjog", 9 | "modal.legal.set.license": "Szerződés", 10 | 11 | "categories.symbols": "Szimbólumok", 12 | "categories.objects": "Objektumok", 13 | "categories.nature": "Természet", 14 | "categories.people": "Emberek", 15 | "categories.food": "Étel", 16 | "categories.travel": "Utazás", 17 | "categories.activity": "Aktivitás", 18 | "categories.flags": "Zászlók", 19 | "categories.regional": "Regionális", 20 | "categories.modifier": "Preferált bőrszín", 21 | "categories.other": "Egyéb", 22 | "categories.custom": "Egyedi", 23 | "search.results": "Keresési eredmények", 24 | "search.placeholder": "Keresés" 25 | } 26 | -------------------------------------------------------------------------------- /packs/android/README.md: -------------------------------------------------------------------------------- 1 | # [NodeBB](https://nodebb.org/) Plugin: **Emoji Android** *\* 2 | 3 | [![License](https://img.shields.io/npm/l/nodebb-plugin-emoji-android.svg)](LICENSE) 4 | [![Version](https://img.shields.io/npm/v/nodebb-plugin-emoji-android.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-android) 5 | [![Downloads](https://img.shields.io/npm/dm/nodebb-plugin-emoji-android.svg)](https://www.npmjs.com/package/nodebb-plugin-emoji-android) 6 | [![Dependency Status](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-android.svg)](https://david-dm.org/NodeBB-Community/nodebb-plugin-emoji-android) 7 | 8 | The legacy "blob"-style emoji pack for NodeBB. 9 | 10 | [![Android blob emoji preview](https://github.com/iamcal/emoji-data/raw/eb2246bb9263cba4e04e1497d635925ef59bd143/sheet_google_64.png)](https://github.com/iamcal/emoji-data/blob/eb2246bb9263cba4e04e1497d635925ef59bd143/sheet_google_64.png) 11 | 12 | ## Installation 13 | 14 | Install and activate `nodebb-plugin-emoji` and `nodebb-plugin-emoji-android` via the admin control panel of your NodeBB instance. 15 | 16 | ### Manual installation 17 | 18 | The manual installation via [NPM](https://www.npmjs.com/) may result in version-conflicts with NodeBB. 19 | 20 | npm install nodebb-plugin-emoji@2 nodebb-plugin-emoji-android@2 21 | -------------------------------------------------------------------------------- /packs/apple/emoji.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fromPairs = require('lodash.frompairs'); 3 | const emoji = require('emoji-datasource-apple/emoji'); 4 | 5 | function defineEmoji(data, callback) { 6 | const pairs = emoji.filter(e => e.has_img_apple).map((e) => { 7 | const name = e.short_name; 8 | const aliases = e.short_names.slice(1); 9 | const ascii = (e.texts || []).map(x => x.replace(//g, '>')); 10 | const character = e.unified 11 | .split('-') 12 | .map(code => String.fromCodePoint(parseInt(code, 16))) 13 | .join(''); 14 | let category = e.category.toLowerCase(); 15 | if (category === 'skin tones') { category = 'modifier'; } else if (category === 'foods') { category = 'food'; } else if (category === 'places') { category = 'travel'; } 16 | 17 | return [name, { 18 | aliases, 19 | ascii, 20 | character, 21 | categories: [category], 22 | keywords: e.keywords, 23 | image: e.image, 24 | }]; 25 | }); 26 | 27 | const dictionary = fromPairs(pairs); 28 | 29 | data.packs.push({ 30 | name: 'Apple', 31 | id: 'apple', 32 | path: __dirname, 33 | attribution: 'From iamcal/emoji-data on Github', 34 | license: 'Copyright © Apple Inc. License terms unknown. Use at own risk.', 35 | mode: 'images', 36 | images: { 37 | directory: path.join(path.dirname(require.resolve('emoji-datasource-apple')), 'img/apple/64'), 38 | }, 39 | dictionary, 40 | }); 41 | 42 | callback(null, data); 43 | } 44 | 45 | module.exports.defineEmoji = defineEmoji; 46 | -------------------------------------------------------------------------------- /packs/android/emoji.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fromPairs = require('lodash.frompairs'); 3 | const emoji = require('emoji-datasource-google/emoji'); 4 | 5 | function defineEmoji(data, callback) { 6 | const pairs = emoji.filter(e => e.has_img_google).map((e) => { 7 | const name = e.short_name; 8 | const aliases = e.short_names.slice(1); 9 | const ascii = (e.texts || []).map(x => x.replace(//g, '>')); 10 | const character = e.unified 11 | .split('-') 12 | .map(code => String.fromCodePoint(parseInt(code, 16))) 13 | .join(''); 14 | let category = e.category.toLowerCase(); 15 | if (category === 'skin tones') { category = 'modifier'; } else if (category === 'foods') { category = 'food'; } else if (category === 'places') { category = 'travel'; } 16 | 17 | return [name, { 18 | aliases, 19 | ascii, 20 | character, 21 | categories: [category], 22 | keywords: e.keywords, 23 | image: e.image, 24 | }]; 25 | }); 26 | 27 | const dictionary = fromPairs(pairs); 28 | 29 | data.packs.push({ 30 | name: 'Android', 31 | id: 'android', 32 | path: __dirname, 33 | attribution: 'From iamcal/emoji-data on Github', 34 | license: 'Apache License, Version 2.0', 35 | mode: 'images', 36 | images: { 37 | directory: path.join(path.dirname(require.resolve('emoji-datasource-google')), 'img/google/64'), 38 | }, 39 | dictionary, 40 | }); 41 | 42 | callback(null, data); 43 | } 44 | 45 | module.exports.defineEmoji = defineEmoji; 46 | -------------------------------------------------------------------------------- /acp/src/modules.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | /* eslint-disable @typescript-eslint/no-explicit-any */ 4 | 5 | interface JQuery { 6 | ajaxSubmit: any; 7 | draggable: any; 8 | modal: any; 9 | } 10 | 11 | module 'ajaxify' { 12 | const ajaxify: { 13 | data: any; 14 | }; 15 | export default ajaxify; 16 | } 17 | 18 | module '@textcomplete/core' { 19 | export const Textcomplete: any; 20 | } 21 | 22 | module '@textcomplete/textarea' { 23 | export const TextareaEditor: any; 24 | } 25 | 26 | module 'config' { 27 | const config: { 28 | relative_path: string; 29 | assetBaseUrl: string; 30 | 'cache-buster': string; 31 | emojiCustomFirst: boolean; 32 | csrf_token: string; 33 | }; 34 | export default config; 35 | } 36 | 37 | declare module 'alerts' { 38 | export function success(message?: string): void; 39 | export function error(message?: string): void; 40 | export function error(err?: Error): void; 41 | } 42 | 43 | declare module 'api' { 44 | const api: { 45 | get(route: string, payload: NonNullable): Promise; 46 | head(route: string, payload: NonNullable): Promise; 47 | post(route: string, payload: NonNullable): Promise; 48 | put(route: string, payload: NonNullable): Promise; 49 | del(route: string, payload: NonNullable): Promise; 50 | }; 51 | export default api; 52 | } 53 | 54 | declare module 'translator' { 55 | export class Translator { 56 | public static create(lang?: string): Translator; 57 | 58 | public translate(input: string): Promise; 59 | } 60 | } 61 | 62 | declare module 'utils' { 63 | const utils: { 64 | generateUUID(): string; 65 | }; 66 | export default utils; 67 | } 68 | -------------------------------------------------------------------------------- /lib/customizations.ts: -------------------------------------------------------------------------------- 1 | const db = require.main?.require('./src/database'); 2 | 3 | const emojisKey = 'emoji:customizations:emojis'; 4 | const adjunctsKey = 'emoji:customizations:adjuncts'; 5 | 6 | interface SortedResult { 7 | value: string; 8 | score: number; 9 | } 10 | export async function getAll(): Promise { 11 | const [emojis, adjuncts]: [SortedResult[], SortedResult[]] = await Promise.all([ 12 | db.getSortedSetRangeWithScores(emojisKey, 0, -1), 13 | db.getSortedSetRangeWithScores(adjunctsKey, 0, -1), 14 | ]); 15 | return { 16 | emojis: Object.fromEntries(emojis.map(({ value, score }) => [score, JSON.parse(value)])), 17 | adjuncts: Object.fromEntries(adjuncts.map(({ value, score }) => [score, JSON.parse(value)])), 18 | }; 19 | } 20 | 21 | export async function add({ type, item }: { type: string, item: unknown }): Promise { 22 | const key = type === 'emoji' ? emojisKey : adjunctsKey; 23 | // get maximum score from set 24 | const [result] = await db.getSortedSetRevRangeWithScores(key, 0, 1); 25 | const lastId = (result && result.score) || 1; 26 | const id = lastId + 1; 27 | await db.sortedSetAdd(key, id, JSON.stringify(item)); 28 | return id; 29 | } 30 | 31 | export async function edit({ type, id, item }: { 32 | type: string, 33 | id: number, 34 | item: unknown, 35 | }): Promise { 36 | const key = type === 'emoji' ? emojisKey : adjunctsKey; 37 | await db.sortedSetsRemoveRangeByScore([key], id, id); 38 | await db.sortedSetAdd(key, id, JSON.stringify(item)); 39 | } 40 | 41 | export async function remove({ type, id }: { type: string, id: number }): Promise { 42 | const key = type === 'emoji' ? emojisKey : adjunctsKey; 43 | await db.sortedSetsRemoveRangeByScore([key], id, id); 44 | } 45 | -------------------------------------------------------------------------------- /public/lib/fuzzysearch.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | define('fuzzysearch', function () { 3 | /* 4 | The MIT License (MIT) 5 | 6 | Copyright © 2015 Nicolas Bevacqua 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of 9 | this software and associated documentation files (the "Software"), to deal in 10 | the Software without restriction, including without limitation the rights to 11 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 12 | the Software, and to permit persons to whom the Software is furnished to do so, 13 | subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 20 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 21 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 22 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | 26 | 'use strict'; 27 | 28 | function fuzzysearch(needle, haystack) { 29 | var hlen = haystack.length; 30 | var nlen = needle.length; 31 | if (nlen > hlen) { 32 | return false; 33 | } 34 | if (nlen === hlen) { 35 | return needle === haystack; 36 | } 37 | outer: for (var i = 0, j = 0; i < nlen; i++) { 38 | var nch = needle.charCodeAt(i); 39 | while (j < hlen) { 40 | if (haystack.charCodeAt(j++) === nch) { 41 | continue outer; 42 | } 43 | } 44 | return false; 45 | } 46 | return true; 47 | } 48 | 49 | return fuzzysearch; 50 | }); -------------------------------------------------------------------------------- /public/lib/types.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | 3 | declare type Callback = (result: T) => void; 4 | 5 | declare const config: { 6 | relative_path: string; 7 | assetBaseUrl: string; 8 | 'cache-buster': string; 9 | emojiCustomFirst: boolean; 10 | csrf_token: string; 11 | }; 12 | declare const app: { 13 | require(module: string):any 14 | }; 15 | declare const ajaxify: { 16 | data: any; 17 | }; 18 | declare const utils: { 19 | generateUUID(): string; 20 | isTouchDevice(): boolean; 21 | }; 22 | 23 | interface String { 24 | startsWith(str: string): boolean; 25 | } 26 | 27 | interface JQuery { 28 | ajaxSubmit: any; 29 | draggable: any; 30 | } 31 | 32 | declare module 'translator' { 33 | export class Translator { 34 | public static create(lang?: string): Translator; 35 | 36 | public translate(input: string): Promise; 37 | } 38 | export function translate(input: string, callback: Callback): void; 39 | } 40 | declare module 'benchpress' { 41 | export function render(template: string, data: any): Promise; 42 | } 43 | declare module 'composer/controls' { 44 | export function insertIntoTextarea(textarea: HTMLTextAreaElement, text: string): void; 45 | export function updateTextareaSelection( 46 | textarea: HTMLTextAreaElement, start: number, end: number 47 | ): void; 48 | } 49 | declare module 'composer/formatting' { 50 | export function addButtonDispatch(name: string, callback: any): void; 51 | } 52 | declare module 'scrollStop' { 53 | export function apply(element: Element): void; 54 | } 55 | declare module 'fuzzysearch' { 56 | const fuzzysearch: (needle: string, haystack: string) => boolean; 57 | export = fuzzysearch; 58 | } 59 | declare module 'leven' { 60 | const leven: (a: string, b: string) => number; 61 | export = leven; 62 | } 63 | -------------------------------------------------------------------------------- /plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "library": ".", 3 | "scss": [ 4 | "public/style.scss" 5 | ], 6 | "acpScss": [ 7 | "acp/admin.scss" 8 | ], 9 | "modules": { 10 | "emoji.js": "build/public/lib/emoji.js", 11 | "emoji-dialog.js": "build/public/lib/emoji-dialog.js", 12 | "leven.js": "public/lib/leven.js", 13 | "fuzzysearch.js": "public/lib/fuzzysearch.js", 14 | "../admin/plugins/emoji.js": "build/acp/admin.js" 15 | }, 16 | "staticDirs": { 17 | "emoji": "build/emoji" 18 | }, 19 | "scripts": [ 20 | "public/emoji-setup.js" 21 | ], 22 | "acpScripts": [ 23 | "public/emoji-setup.js" 24 | ], 25 | "languages": "public/language", 26 | "defaultLang": "en-US", 27 | "templates": "public/templates", 28 | "hooks": [ 29 | { "hook": "static:app.load", "method": "init" }, 30 | { "hook": "filter:admin.header.build", "method": "adminMenu" }, 31 | { "hook": "filter:composer.formatting", "method": "composerFormatting", "priority": 19 }, 32 | { "hook": "filter:parse.raw", "method": "parse.raw", "priority": 9 }, 33 | { "hook": "filter:parse.post", "method": "parse.post", "priority": 9 }, 34 | { "hook": "filter:activitypub.mocks.note", "method": "parse.activitypubNote" }, 35 | { "hook": "filter:topic.get", "method": "parse.topic" }, 36 | { "hook": "filter:topics.get", "method": "parse.topics" }, 37 | { "hook": "filter:post.getPostSummaryByPids", "method": "parse.postSummaries" }, 38 | { "hook": "filter:user.notifications.getNotifications", "method": "parse.notifications" }, 39 | { "hook": "filter:email.prepare", "method": "parse.email" }, 40 | { "hook": "filter:middleware.renderHeader", "method": "parse.header" }, 41 | { "hook": "filter:meta.getLinkTags", "method": "addStylesheet" }, 42 | { "hook": "filter:config.get", "method": "configGet" }, 43 | { "hook": "filter:messaging.loadRoom", "method": "filterMessagingLoadRoom" } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /acp/src/Customize.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /lib/settings.ts: -------------------------------------------------------------------------------- 1 | const settings: { 2 | get(key: string): Promise<{ [key: string]: unknown } | null>; 3 | set(key: string, value: unknown): Promise; 4 | getOne(key: string, field: string): Promise; 5 | setOne(key: string, field: string, value: unknown): Promise; 6 | } = require.main?.require('./src/meta').settings; 7 | 8 | const defaults: Settings = { 9 | parseNative: true, 10 | parseAscii: true, 11 | customFirst: false, 12 | parseTitles: false, 13 | }; 14 | 15 | function fromStore< 16 | K extends keyof Settings 17 | >(key: K, x: unknown): Settings[K] { 18 | if (typeof x === typeof defaults[key]) { 19 | return x as Settings[K]; 20 | } 21 | if (typeof x === 'string') { 22 | try { 23 | return JSON.parse(x) ?? defaults[key]; 24 | } catch { 25 | return defaults[key]; 26 | } 27 | } 28 | return defaults[key]; 29 | } 30 | 31 | export async function get(): Promise { 32 | const data = await settings.get('emoji'); 33 | 34 | return { 35 | parseNative: fromStore('parseNative', data?.parseNative), 36 | parseAscii: fromStore('parseAscii', data?.parseAscii), 37 | customFirst: fromStore('customFirst', data?.customFirst), 38 | parseTitles: fromStore('parseTitles', data?.parseTitles), 39 | }; 40 | } 41 | export async function set(data: Settings): Promise { 42 | await settings.set('emoji', { 43 | parseNative: JSON.stringify(data.parseNative), 44 | parseAscii: JSON.stringify(data.parseAscii), 45 | customFirst: JSON.stringify(data.customFirst), 46 | parseTitles: JSON.stringify(data.parseTitles), 47 | }); 48 | } 49 | export async function getOne(field: K): Promise { 50 | const val = await settings.getOne('emoji', field); 51 | return fromStore(field, val); 52 | } 53 | export async function setOne< 54 | K extends keyof Settings 55 | >(field: K, value: Settings[K]): Promise { 56 | await settings.setOne('emoji', field, JSON.stringify(value)); 57 | } 58 | -------------------------------------------------------------------------------- /acp/src/EmojiList.svelte: -------------------------------------------------------------------------------- 1 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | {#each emojiList as item (item.id)} 62 | 63 | {/each} 64 | 65 | 66 | 67 | 68 |
NameImageAliasesASCII patterns
69 | -------------------------------------------------------------------------------- /acp/src/ItemList.svelte: -------------------------------------------------------------------------------- 1 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | {#each list as item (item.id)} 63 | 64 | {/each} 65 | 66 | 67 | 68 | 69 |
NameImageAliasesASCII patterns
70 | -------------------------------------------------------------------------------- /acp/rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import commonjs from '@rollup/plugin-commonjs'; 3 | import resolve from '@rollup/plugin-node-resolve'; 4 | import livereload from 'rollup-plugin-livereload'; 5 | import sveltePreprocess from 'svelte-preprocess'; 6 | import typescript from '@rollup/plugin-typescript'; 7 | import css from 'rollup-plugin-css-only'; 8 | import virtual from '@rollup/plugin-virtual'; 9 | 10 | const production = !process.env.ROLLUP_WATCH; 11 | 12 | export default { 13 | input: 'src/admin.ts', 14 | external: ['translator', 'jquery', 'api', 'emoji', 'alerts'], 15 | output: { 16 | sourcemap: !production, 17 | format: 'amd', 18 | file: '../build/acp/admin.js', 19 | }, 20 | plugins: [ 21 | virtual({ 22 | ajaxify: 'export default ajaxify', 23 | app: 'export default app', 24 | config: 'export default config', 25 | utils: 'export default utils', 26 | }), 27 | svelte({ 28 | preprocess: sveltePreprocess({ sourceMap: !production }), 29 | compilerOptions: { 30 | // enable run-time checks when not in production 31 | dev: !production, 32 | }, 33 | }), 34 | // we'll extract any component CSS out into 35 | // a separate file - better for performance 36 | css({ output: 'admin.css' }), 37 | 38 | // If you have external dependencies installed from 39 | // npm, you'll most likely need these plugins. In 40 | // some cases you'll need additional configuration - 41 | // consult the documentation for details: 42 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 43 | resolve({ 44 | browser: true, 45 | dedupe: ['svelte'], 46 | }), 47 | commonjs(), 48 | typescript({ 49 | sourceMap: !production, 50 | inlineSources: !production, 51 | }), 52 | 53 | // Watch the `src` directory and refresh the 54 | // browser on changes when not in production 55 | !production && livereload(), 56 | ], 57 | watch: { 58 | clearScreen: false, 59 | }, 60 | }; 61 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'airbnb-base', 4 | 'plugin:@typescript-eslint/recommended', 5 | 'plugin:svelte/recommended', 6 | ], 7 | parser: '@typescript-eslint/parser', 8 | parserOptions: { 9 | extraFileExtensions: ['.svelte'], // This is a required setting in `@typescript-eslint/parser` v4.24.0 10 | }, 11 | plugins: [ 12 | '@typescript-eslint', 13 | ], 14 | overrides: [ 15 | { 16 | files: ['*.svelte'], 17 | parser: 'svelte-eslint-parser', 18 | // Parse the ` 48 | 49 | 50 |
51 | 52 |
56 |
57 |

Emoji

58 |
59 |
60 | 65 | 70 |
71 |
72 | 73 |
74 |
75 |
76 |
77 |
78 | 84 | 87 |
88 |
89 | 90 |
91 |
92 | 98 | 101 |
102 |
103 | 104 |
105 |
106 | 112 | 115 |
116 |
117 | 118 |
119 |
120 | 126 | 129 |
130 |
131 |
132 | 133 | 148 |
149 |
150 |
151 | 152 | {#if customizationsData} 153 | {#await customizationsData then customizations} 154 | 155 | {/await} 156 | {/if} 157 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/tongue_out.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | image/svg+xml 35 | 36 | 37 | 38 | 39 | Openclipart 40 | 41 | 42 | Cubikopp smilies 43 | 2009-12-31T01:40:45 44 | Awesome Smilies by SK (formerly needcoffee). 45 | http://openclipart.org/detail/28773/cubikopp-smilies-by-qubodup-28773 46 | 47 | 48 | qubodup 49 | 50 | 51 | 52 | 53 | 15px 54 | angry 55 | clip art 56 | clipart 57 | confused 58 | cute 59 | evil 60 | externalsource 61 | fun 62 | funny 63 | happy 64 | image 65 | kiss 66 | kissing 67 | media 68 | pixel art 69 | png 70 | public domain 71 | question 72 | rectangle 73 | sad 74 | small 75 | smilies 76 | svg 77 | sweet 78 | throw up 79 | unchecked 80 | weirded out 81 | yellow 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/angry.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | image/svg+xml 36 | 37 | 38 | 39 | 40 | Openclipart 41 | 42 | 43 | Cubikopp smilies 44 | 2009-12-31T01:40:45 45 | Awesome Smilies by SK (formerly needcoffee). 46 | http://openclipart.org/detail/28757/cubikopp-smilies-by-qubodup 47 | 48 | 49 | qubodup 50 | 51 | 52 | 53 | 54 | 15px 55 | angry 56 | clip art 57 | clipart 58 | confused 59 | cute 60 | evil 61 | externalsource 62 | fun 63 | funny 64 | happy 65 | image 66 | kiss 67 | kissing 68 | media 69 | pixel art 70 | png 71 | public domain 72 | question 73 | rectangle 74 | sad 75 | small 76 | smilies 77 | svg 78 | sweet 79 | throw up 80 | unchecked 81 | weirded out 82 | yellow 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/kiss_big.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | image/svg+xml 38 | 39 | 40 | 41 | 42 | Openclipart 43 | 44 | 45 | Cubikopp smilies 46 | 2009-12-31T01:40:45 47 | Awesome Smilies by SK (formerly needcoffee). 48 | http://openclipart.org/detail/28769/cubikopp-smilies-by-qubodup-28769 49 | 50 | 51 | qubodup 52 | 53 | 54 | 55 | 56 | 15px 57 | angry 58 | clip art 59 | clipart 60 | confused 61 | cute 62 | evil 63 | externalsource 64 | fun 65 | funny 66 | happy 67 | image 68 | kiss 69 | kissing 70 | media 71 | pixel art 72 | png 73 | public domain 74 | question 75 | rectangle 76 | sad 77 | small 78 | smilies 79 | svg 80 | sweet 81 | throw up 82 | unchecked 83 | weirded out 84 | yellow 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/cheeky.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | image/svg+xml 40 | 41 | 42 | 43 | 44 | Openclipart 45 | 46 | 47 | Cubikopp smilies 48 | 2009-12-31T01:40:45 49 | Awesome Smilies by SK (formerly needcoffee). 50 | http://openclipart.org/detail/28774/cubikopp-smilies-by-qubodup-28774 51 | 52 | 53 | qubodup 54 | 55 | 56 | 57 | 58 | 15px 59 | angry 60 | clip art 61 | clipart 62 | confused 63 | cute 64 | evil 65 | externalsource 66 | fun 67 | funny 68 | happy 69 | image 70 | kiss 71 | kissing 72 | media 73 | pixel art 74 | png 75 | public domain 76 | question 77 | rectangle 78 | sad 79 | small 80 | smilies 81 | svg 82 | sweet 83 | throw up 84 | unchecked 85 | weirded out 86 | yellow 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /lib/types.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Schema for defining an emoji 3 | */ 4 | interface Emoji { 5 | /** alternative names for this emoji */ 6 | aliases?: string[]; 7 | /** keywords to match when searching for emoji */ 8 | keywords?: string[]; 9 | /** common ascii representations for this emoji */ 10 | ascii?: string[]; 11 | /** 12 | * **`images` mode** image file name [`grinning-face.png`] 13 | */ 14 | image?: string; 15 | /** 16 | * **`sprite` mode** CSS `background-position` 17 | */ 18 | backgroundPosition?: string; 19 | /** unicode text character */ 20 | character: string; 21 | /** 22 | * categories this emoji fits in (default: `['other']`) 23 | * 24 | * known categories: 25 | * `'people'`, 26 | * `'nature'`, 27 | * `'food'`, 28 | * `'activity'`, 29 | * `'travel'`, 30 | * `'objects'`, 31 | * `'symbols'`, 32 | * `'flags'`, 33 | * `'regional'`, 34 | * `'modifier'`, 35 | * `'other'` 36 | * 37 | * if adding other categories, add translations for them like 38 | * `"categories.people": "People"` under `emoji.json` 39 | */ 40 | categories?: string[]; 41 | } 42 | 43 | type EmojiDefinition = { 44 | /** 45 | * human-friendly name of this emoji pack 46 | */ 47 | name: string; 48 | 49 | /** 50 | * The ID of this emoji pack. 51 | * Used in the CSS classname, etc 52 | */ 53 | id: string; 54 | 55 | /** 56 | * The absolute base path of the emoji pack. Other paths are relative to this one 57 | * Usually `__dirname` works well for this 58 | */ 59 | path: string; 60 | 61 | /** 62 | * Legal attribution for using these emoji, if applicable 63 | */ 64 | attribution?: string; 65 | 66 | /** 67 | * License for these emoji 68 | */ 69 | license?: string; 70 | 71 | /** 72 | * A map of emoji names to `Emoji` 73 | */ 74 | dictionary: { 75 | [name: string]: Emoji; 76 | }; 77 | } & ({ 78 | /** 79 | * The mode of this emoji pack. 80 | * `images` for individual image files. 81 | * `sprite` for a single image sprite file. 82 | * `font` for an emoji font. 83 | */ 84 | mode: 'images'; 85 | 86 | /** 87 | * **`images` mode** options 88 | */ 89 | images: { 90 | /** Path to the directory where the image files are located */ 91 | directory: string; 92 | }; 93 | } | { 94 | /** 95 | * The mode of this emoji pack. 96 | * `images` for individual image files. 97 | * `sprite` for a single image sprite file. 98 | * `font` for an emoji font. 99 | */ 100 | mode: 'sprite'; 101 | 102 | /** 103 | * **`sprite` mode** options 104 | */ 105 | sprite: { 106 | /** Path to the sprite image file */ 107 | file: string; 108 | /** CSS `background-size` */ 109 | backgroundSize: string; 110 | }; 111 | } | { 112 | /** 113 | * The mode of this emoji pack. 114 | * `images` for individual image files. 115 | * `sprite` for a single image sprite file. 116 | * `font` for an emoji font. 117 | */ 118 | mode: 'font'; 119 | 120 | /** 121 | * **`font` mode** options 122 | */ 123 | font: { 124 | /** Path to the emoji font `.eot` file (for old IE support) */ 125 | eot?: string; 126 | /** Path to the emoji font `.ttf` file */ 127 | ttf?: string; 128 | /** Path to the emoji font `.woff` file */ 129 | woff?: string; 130 | /** Path to the emoji font `.woff2` file */ 131 | woff2?: string; 132 | /** Path to the emoji font `.svg` file 133 | * (for Apple support, end this with the `#fontname` convention) */ 134 | svg?: string; 135 | 136 | /** CSS `font-family` name */ 137 | family: string; 138 | }; 139 | }); 140 | 141 | declare type NodeBack = (err?: Error, ...args: T[]) => void; 142 | 143 | interface StoredEmoji { 144 | name: string; 145 | character?: string; 146 | image: string; 147 | pack: string; 148 | aliases: string[]; 149 | keywords: string[]; 150 | } 151 | 152 | declare namespace MetaData { 153 | /** table of all emoji */ 154 | interface Table { 155 | [name: string]: StoredEmoji; 156 | } 157 | 158 | /** map of all aliases to the base name */ 159 | interface Aliases { 160 | [alias: string]: string; 161 | } 162 | 163 | /** map of ascii to base names */ 164 | interface Ascii { 165 | [str: string]: string; 166 | } 167 | 168 | /** list of emoji names in each category */ 169 | interface Categories { 170 | [category: string]: string[]; 171 | } 172 | 173 | /** map of characters to emoji names */ 174 | interface Characters { 175 | [character: string]: string; 176 | } 177 | 178 | /** storing pack information for dialog */ 179 | type Packs = { 180 | name: string; 181 | id: string; 182 | attribution: string; 183 | license: string; 184 | }[]; 185 | } 186 | 187 | declare namespace NodeJS { 188 | export interface Global { 189 | env: 'development' | 'production'; 190 | } 191 | } 192 | 193 | interface CustomEmoji { 194 | /** name of custom emoji */ 195 | name: string; 196 | /** custom image for emoji */ 197 | image: string; 198 | aliases: string[]; 199 | ascii: string[]; 200 | } 201 | 202 | interface CustomAdjunct { 203 | /** Name of original emoji */ 204 | name: string; 205 | /** Additional aliases for the emoji */ 206 | aliases: string[]; 207 | /** Additional ascii patterns for this emoji */ 208 | ascii: string[]; 209 | } 210 | 211 | interface Customizations { 212 | emojis: { 213 | [id: number]: CustomEmoji 214 | }; 215 | adjuncts: { 216 | [id: number]: CustomAdjunct 217 | } 218 | } 219 | 220 | interface Settings { 221 | parseNative: boolean; 222 | parseAscii: boolean; 223 | customFirst: boolean; 224 | parseTitles: boolean; 225 | } 226 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/kiss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | image/svg+xml 43 | 44 | 45 | 46 | 47 | Openclipart 48 | 49 | 50 | Cubikopp smilies 51 | 2009-12-31T01:40:45 52 | Awesome Smilies by SK (formerly needcoffee). 53 | http://openclipart.org/detail/28765/cubikopp-smilies-by-qubodup-28765 54 | 55 | 56 | qubodup 57 | 58 | 59 | 60 | 61 | 15px 62 | angry 63 | clip art 64 | clipart 65 | confused 66 | cute 67 | evil 68 | externalsource 69 | fun 70 | funny 71 | happy 72 | image 73 | kiss 74 | kissing 75 | media 76 | pixel art 77 | png 78 | public domain 79 | question 80 | rectangle 81 | sad 82 | small 83 | smilies 84 | svg 85 | sweet 86 | throw up 87 | unchecked 88 | weirded out 89 | yellow 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /packs/fontawesome/fontawesome/README.md: -------------------------------------------------------------------------------- 1 | # [Font Awesome v4.7.0](http://fontawesome.io) [![Changelog #226](https://img.shields.io/badge/changelog-%23226-9E978E.svg)](https://changelog.com/podcast/226) 2 | ### The iconic font and CSS framework 3 | 4 | Font Awesome is a full suite of 675 pictographic icons for easy scalable vector graphics on websites, 5 | created and maintained by [Dave Gandy](https://twitter.com/davegandy). 6 | Stay up to date with the latest release and announcements on Twitter: 7 | [@fontawesome](https://twitter.com/fontawesome). 8 | 9 | Get started at http://fontawesome.io! 10 | 11 | ## License 12 | - The Font Awesome font is licensed under the SIL OFL 1.1: 13 | - http://scripts.sil.org/OFL 14 | - Font Awesome CSS, LESS, and Sass files are licensed under the MIT License: 15 | - https://opensource.org/licenses/mit-license.html 16 | - The Font Awesome documentation is licensed under the CC BY 3.0 License: 17 | - https://creativecommons.org/licenses/by/3.0/ 18 | - Attribution is no longer required as of Font Awesome 3.0, but much appreciated: 19 | - `Font Awesome by Dave Gandy - http://fontawesome.io` 20 | - Full details: http://fontawesome.io/license/ 21 | 22 | ## Changelog 23 | - [v4.7.0 GitHub pull request](https://github.com/FortAwesome/Font-Awesome/pull/10012) 24 | - [v4.6.3 GitHub pull request](https://github.com/FortAwesome/Font-Awesome/pull/9189) 25 | - [v4.6.2 GitHub pull request](https://github.com/FortAwesome/Font-Awesome/pull/9117) 26 | - [v4.6.1 GitHub pull request](https://github.com/FortAwesome/Font-Awesome/pull/8962) 27 | - [v4.6.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.6.0+is%3Aclosed) 28 | - [v4.5.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.5.0+is%3Aclosed) 29 | - [v4.4.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.4.0+is%3Aclosed) 30 | - [v4.3.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.3.0+is%3Aclosed) 31 | - [v4.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=12&page=1&state=closed) 32 | - [v4.1.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=6&page=1&state=closed) 33 | - [v4.0.3 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=9&page=1&state=closed) 34 | - [v4.0.2 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=8&page=1&state=closed) 35 | - [v4.0.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=7&page=1&state=closed) 36 | - [v4.0.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=2&page=1&state=closed) 37 | - [v3.2.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=5&page=1&state=closed) 38 | - [v3.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=3&page=1&state=closed) 39 | - [v3.1.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=4&page=1&state=closed) 40 | - v3.1.0 - Added 54 icons, icon stacking styles, flipping and rotating icons, removed Sass support 41 | - v3.0.2 - much improved rendering and alignment in IE7 42 | - v3.0.1 - much improved rendering in webkit, various bug fixes 43 | - v3.0.0 - all icons redesigned from scratch, optimized for Bootstrap's 14px default 44 | 45 | ## Contributing 46 | 47 | Please read through our [contributing guidelines](https://github.com/FortAwesome/Font-Awesome/blob/master/CONTRIBUTING.md). 48 | Included are directions for opening issues, coding standards, and notes on development. 49 | 50 | ## Versioning 51 | 52 | Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered 53 | with the following format: 54 | 55 | `..` 56 | 57 | And constructed with the following guidelines: 58 | 59 | * Breaking backward compatibility bumps the major (and resets the minor and patch) 60 | * New additions, including new icons, without breaking backward compatibility bumps the minor (and resets the patch) 61 | * Bug fixes, changes to brand logos, and misc changes bumps the patch 62 | 63 | For more information on SemVer, please visit http://semver.org. 64 | 65 | ## Author 66 | - Email: dave@fontawesome.io 67 | - Twitter: http://twitter.com/davegandy 68 | - GitHub: https://github.com/davegandy 69 | 70 | ## Component 71 | To include as a [component](https://github.com/componentjs/component), just run 72 | 73 | $ component install FortAwesome/Font-Awesome 74 | 75 | Or add 76 | 77 | "FortAwesome/Font-Awesome": "*" 78 | 79 | to the `dependencies` in your `component.json`. 80 | 81 | ## Hacking on Font Awesome 82 | 83 | **Before you can build the project**, you must first have the following installed: 84 | 85 | - [Ruby](https://www.ruby-lang.org/en/) 86 | - Ruby Development Headers 87 | - **Ubuntu:** `sudo apt-get install ruby-dev` *(Only if you're __NOT__ using `rbenv` or `rvm`)* 88 | - **Windows:** [DevKit](http://rubyinstaller.org/) 89 | - [Bundler](http://bundler.io/) (Run `gem install bundler` to install). 90 | - [Node Package Manager (AKA NPM)](https://docs.npmjs.com/getting-started/installing-node) 91 | - [Less](http://lesscss.org/) (Run `npm install -g less` to install). 92 | - [Less Plugin: Clean CSS](https://github.com/less/less-plugin-clean-css) (Run `npm install -g less-plugin-clean-css` to install). 93 | 94 | From the root of the repository, install the tools used to develop. 95 | 96 | $ bundle install 97 | $ npm install 98 | 99 | Build the project and documentation: 100 | 101 | $ bundle exec jekyll build 102 | 103 | Or serve it on a local server on http://localhost:7998/Font-Awesome/: 104 | 105 | $ bundle exec jekyll -w serve 106 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/happy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | image/svg+xml 44 | 45 | 46 | 47 | 48 | Openclipart 49 | 50 | 51 | Cubikopp smilies 52 | 2009-12-31T01:40:45 53 | Awesome Smilies by SK (formerly needcoffee). 54 | http://openclipart.org/detail/28770/cubikopp-smilies-by-qubodup-28770 55 | 56 | 57 | qubodup 58 | 59 | 60 | 61 | 62 | 15px 63 | angry 64 | clip art 65 | clipart 66 | confused 67 | cute 68 | evil 69 | externalsource 70 | fun 71 | funny 72 | happy 73 | image 74 | kiss 75 | kissing 76 | media 77 | pixel art 78 | png 79 | public domain 80 | question 81 | rectangle 82 | sad 83 | small 84 | smilies 85 | svg 86 | sweet 87 | throw up 88 | unchecked 89 | weirded out 90 | yellow 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/sunglasses.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | image/svg+xml 44 | 45 | 46 | 47 | 48 | Openclipart 49 | 50 | 51 | Cubikopp smilies 52 | 2009-12-31T01:40:45 53 | Awesome Smilies by SK (formerly needcoffee). 54 | http://openclipart.org/detail/28761/cubikopp-smilies-by-qubodup-28761 55 | 56 | 57 | qubodup 58 | 59 | 60 | 61 | 62 | 15px 63 | angry 64 | clip art 65 | clipart 66 | confused 67 | cute 68 | evil 69 | externalsource 70 | fun 71 | funny 72 | happy 73 | image 74 | kiss 75 | kissing 76 | media 77 | pixel art 78 | png 79 | public domain 80 | question 81 | rectangle 82 | sad 83 | small 84 | smilies 85 | svg 86 | sweet 87 | throw up 88 | unchecked 89 | weirded out 90 | yellow 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/crying.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | image/svg+xml 39 | 40 | 41 | 42 | 43 | Openclipart 44 | 45 | 46 | Cubikopp smilies 47 | 2009-12-31T01:40:45 48 | Awesome Smilies by SK (formerly needcoffee). 49 | http://openclipart.org/detail/28762/cubikopp-smilies-by-qubodup-28762 50 | 51 | 52 | qubodup 53 | 54 | 55 | 56 | 57 | 15px 58 | angry 59 | clip art 60 | clipart 61 | confused 62 | cute 63 | evil 64 | externalsource 65 | fun 66 | funny 67 | happy 68 | image 69 | kiss 70 | kissing 71 | media 72 | pixel art 73 | png 74 | public domain 75 | question 76 | rectangle 77 | sad 78 | small 79 | smilies 80 | svg 81 | sweet 82 | throw up 83 | unchecked 84 | weirded out 85 | yellow 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /packs/cubicopp/emoji/laughing.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | image/svg+xml 48 | 49 | 50 | 51 | 52 | Openclipart 53 | 54 | 55 | Cubikopp smilies 56 | 2009-12-31T01:40:45 57 | Awesome Smilies by SK (formerly needcoffee). 58 | http://openclipart.org/detail/28758/cubikopp-smilies-by-qubodup-28758 59 | 60 | 61 | qubodup 62 | 63 | 64 | 65 | 66 | 15px 67 | angry 68 | clip art 69 | clipart 70 | confused 71 | cute 72 | evil 73 | externalsource 74 | fun 75 | funny 76 | happy 77 | image 78 | kiss 79 | kissing 80 | media 81 | pixel art 82 | png 83 | public domain 84 | question 85 | rectangle 86 | sad 87 | small 88 | smilies 89 | svg 90 | sweet 91 | throw up 92 | unchecked 93 | weirded out 94 | yellow 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | --------------------------------------------------------------------------------