Twemojiで合字に対応 (#3140)

* Twemojiで合字に対応

* split emoji regex
This commit is contained in:
MeiMei 2018-11-06 14:09:40 +09:00 committed by syuilo
parent d3ff3a7d54
commit 3b6ab327c1
4 changed files with 16 additions and 5 deletions

View file

@ -41,11 +41,17 @@ const lib = Object.entries(emojilib.lib).filter((x: any) => {
return x[1].category != 'flags'; return x[1].category != 'flags';
}); });
const char2file = (char: string) => {
let codes = [...char].map(x => x.codePointAt(0).toString(16));
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
return codes.join('-');
};
const emjdb: EmojiDef[] = lib.map((x: any) => ({ const emjdb: EmojiDef[] = lib.map((x: any) => ({
emoji: x[1].char, emoji: x[1].char,
name: x[0], name: x[0],
aliasOf: null, aliasOf: null,
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg` url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
})); }));
lib.forEach((x: any) => { lib.forEach((x: any) => {
@ -55,7 +61,7 @@ lib.forEach((x: any) => {
emoji: x[1].char, emoji: x[1].char,
name: k, name: k,
aliasOf: x[0], aliasOf: x[0],
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg` url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
}); });
}); });
} }

View file

@ -60,7 +60,10 @@ export default Vue.extend({
} }
if (this.char) { if (this.char) {
this.url = `https://twemoji.maxcdn.com/2/svg/${this.char.codePointAt(0).toString(16)}.svg`; let codes = [...this.char].map(x => x.codePointAt(0).toString(16));
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
this.url = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
} }
} }
}); });

File diff suppressed because one or more lines are too long

View file

@ -2,6 +2,8 @@
* Emoji * Emoji
*/ */
import { emojiRegex } from "./emoji.regex";
export type TextElementEmoji = { export type TextElementEmoji = {
type: 'emoji'; type: 'emoji';
content: string; content: string;
@ -9,8 +11,6 @@ export type TextElementEmoji = {
name?: string; name?: string;
}; };
const emojiRegex = /^[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}]/ug;
export default function(text: string) { export default function(text: string) {
const name = text.match(/^:([a-zA-Z0-9+_-]+):/); const name = text.match(/^:([a-zA-Z0-9+_-]+):/);
if (name) { if (name) {