絵文字ピッカーの Unicode 12.0 対応など (#5441)
* Twemoji 12.1 * 絵文字ライブラリを持つように * Fix chess_pawn emoji * Add Unicode 12.0 emojis * Add transgender flag/symbol emoji * Add some japanese emoji keywords * format emojilist.json * fix emojilist order * Add missing flags
This commit is contained in:
parent
9f5a763c69
commit
60d2558ed6
|
@ -54,6 +54,7 @@ gulp.task('build:copy:fonts', () =>
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
|
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
|
'./src/emojilist.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
'./src/**/assets/**/*',
|
'./src/**/assets/**/*',
|
||||||
'!./src/client/app/**/assets/**/*'
|
'!./src/client/app/**/assets/**/*'
|
||||||
|
|
|
@ -123,7 +123,6 @@
|
||||||
"deep-equal": "1.1.0",
|
"deep-equal": "1.1.0",
|
||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"emojilib": "2.4.0",
|
|
||||||
"eslint": "6.1.0",
|
"eslint": "6.1.0",
|
||||||
"eslint-plugin-vue": "5.2.3",
|
"eslint-plugin-vue": "5.2.3",
|
||||||
"eventemitter3": "4.0.0",
|
"eventemitter3": "4.0.0",
|
||||||
|
|
|
@ -28,9 +28,9 @@
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
import { emojilist } from '../../../../../misc/emojilist';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
|
||||||
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
|
@ -41,9 +41,7 @@ type EmojiDef = {
|
||||||
isCustomEmoji?: boolean;
|
isCustomEmoji?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
const lib = emojilist.filter(x => x.category !== 'flags');
|
||||||
return x[1].category != 'flags';
|
|
||||||
});
|
|
||||||
|
|
||||||
const char2file = (char: string) => {
|
const char2file = (char: string) => {
|
||||||
let codes = Array.from(char).map(x => x.codePointAt(0).toString(16));
|
let codes = Array.from(char).map(x => x.codePointAt(0).toString(16));
|
||||||
|
@ -52,21 +50,21 @@ const char2file = (char: string) => {
|
||||||
return codes.join('-');
|
return codes.join('-');
|
||||||
};
|
};
|
||||||
|
|
||||||
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
const emjdb: EmojiDef[] = lib.map(x => ({
|
||||||
emoji: x[1].char,
|
emoji: x.char,
|
||||||
name: x[0],
|
name: x.name,
|
||||||
aliasOf: null,
|
aliasOf: null,
|
||||||
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
for (const x of lib as any) {
|
for (const x of lib) {
|
||||||
if (x[1].keywords) {
|
if (x.keywords) {
|
||||||
for (const k of x[1].keywords) {
|
for (const k of x.keywords) {
|
||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x.char,
|
||||||
name: k,
|
name: k,
|
||||||
aliasOf: x[0],
|
aliasOf: x.name,
|
||||||
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +83,7 @@ export default Vue.extend({
|
||||||
hashtags: [],
|
hashtags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojilib,
|
emojilist,
|
||||||
emojiDb: [] as EmojiDef[]
|
emojiDb: [] as EmojiDef[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
:title="category.text"
|
:title="category.text"
|
||||||
@click="go(category)"
|
@click="go(category)"
|
||||||
:class="{ active: category.isActive }"
|
:class="{ active: category.isActive }"
|
||||||
|
:key="category.text"
|
||||||
>
|
>
|
||||||
<fa :icon="category.icon" fixed-width/>
|
<fa :icon="category.icon" fixed-width/>
|
||||||
</button>
|
</button>
|
||||||
|
@ -12,18 +13,19 @@
|
||||||
<div class="emojis">
|
<div class="emojis">
|
||||||
<header><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
|
<header><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
|
||||||
<div v-if="categories.find(x => x.isActive).name">
|
<div v-if="categories.find(x => x.isActive).name">
|
||||||
<button v-for="emoji in Object.entries(lib).filter(([k, v]) => v.category === categories.find(x => x.isActive).name)"
|
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
|
||||||
:title="emoji[0]"
|
:title="emoji.name"
|
||||||
@click="chosen(emoji[1].char)"
|
@click="chosen(emoji.char)"
|
||||||
:key="emoji[0]"
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<mk-emoji :emoji="emoji[1].char"/>
|
<mk-emoji :emoji="emoji.char"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<button v-for="emoji in customEmojis"
|
<button v-for="emoji in customEmojis"
|
||||||
:title="emoji.name"
|
:title="emoji.name"
|
||||||
@click="chosen(`:${emoji.name}:`)"
|
@click="chosen(`:${emoji.name}:`)"
|
||||||
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<img :src="emoji.url" :alt="emoji.name"/>
|
<img :src="emoji.url" :alt="emoji.name"/>
|
||||||
</button>
|
</button>
|
||||||
|
@ -35,7 +37,7 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import { lib } from 'emojilib';
|
import { emojilist } from '../../../../../misc/emojilist';
|
||||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
|
@ -44,7 +46,7 @@ export default Vue.extend({
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
lib,
|
emojilist,
|
||||||
customEmojis: [],
|
customEmojis: [],
|
||||||
categories: [{
|
categories: [{
|
||||||
text: this.$t('custom-emoji'),
|
text: this.$t('custom-emoji'),
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
// スクリプトサイズがデカい
|
|
||||||
//import { lib } from 'emojilib';
|
|
||||||
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
||||||
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
|
@ -92,7 +90,7 @@ export default Vue.extend({
|
||||||
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
||||||
codes = codes.filter(x => x && x.length);
|
codes = codes.filter(x => x && x.length);
|
||||||
|
|
||||||
this.url = `${twemojiBase}/2/svg/${codes.join('-')}.svg`;
|
this.url = `${twemojiSvgBase}/${codes.join('-')}.svg`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,7 @@
|
||||||
|
// initial converted from https://github.com/muan/emojilib/commit/242fe68be86ed6536843b83f7e32f376468b38fb
|
||||||
|
export const emojilist = require('../emojilist.json') as {
|
||||||
|
name: string;
|
||||||
|
keywords: string[];
|
||||||
|
char: string;
|
||||||
|
category: 'people' | 'animals_and_nature' | 'food_and_drink' | 'activity' | 'travel_and_places' | 'objects' | 'symbols' | 'flags';
|
||||||
|
}[];
|
|
@ -1,4 +1 @@
|
||||||
export const twemojiBase = 'https://cdn.jsdelivr.net/npm/twemoji@12.0.1';
|
export const twemojiSvgBase = 'https://twemoji.maxcdn.com/v/latest/svg';
|
||||||
// https://cdn.jsdelivr.net/npm/twemoji@12.0.1
|
|
||||||
// https://cdnjs.cloudflare.com/ajax/libs/twemoji/12.0.1
|
|
||||||
// https://twemoji.maxcdn.com
|
|
||||||
|
|
|
@ -3712,11 +3712,6 @@ emoji-regex@^7.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
|
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
|
||||||
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
|
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
|
||||||
|
|
||||||
emojilib@2.4.0:
|
|
||||||
version "2.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e"
|
|
||||||
integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==
|
|
||||||
|
|
||||||
emojis-list@^2.0.0:
|
emojis-list@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
||||||
|
|
Loading…
Reference in New Issue