data(emoji): every emoji, with its CLDR names in English, Korean, and Japanese
emoji.src was a seed of thirty emoji. cldr2emoji now generates it from Unicode's emoji-test.txt (Emoji 17.0) and CLDR 48.2.0's annotations: the 1914 fully-qualified emoji without their skin-tone variants, each with its names and keywords in the three languages, so that a search finds what fcitx5's emoji picker finds. The data is under the Unicode License, added to LICENSES.
This commit is contained in:
27
map/README
27
map/README
@@ -38,6 +38,33 @@ are omitted. The import preserves the upstream license header and row order.
|
||||
The retained data is BSD 3-Clause licensed by Choe Hwanjin; the complete text
|
||||
is in `LICENSES/BSD-3-Clause-libhangul-hanja.txt`.
|
||||
|
||||
## Emoji and symbol data
|
||||
|
||||
`symbol.src` is hand-written: a symbol, a tab, and its ASCII aliases, kept
|
||||
so that a bare `1`-`9` picks the matching superscript or subscript from a
|
||||
`^` or `_` prefix search. `emoji.src` is generated: every fully-qualified
|
||||
emoji of Unicode's `emoji-test.txt` except the skin-tone variants, with
|
||||
its CLDR names and keywords in English, Korean, and Japanese. `mkemoji`
|
||||
folds the aliases and writes one row per alias to `emoji.dict`; the engine
|
||||
searches that dictionary by prefix, so the rows carry no prefixes.
|
||||
|
||||
The sources are Emoji 17.0 and CLDR 48.2.0. Regenerate them from the
|
||||
repository root with:
|
||||
|
||||
```sh
|
||||
curl -L https://www.unicode.org/Public/17.0.0/emoji/emoji-test.txt -o emoji-test.txt
|
||||
printf '%s %s\n' 1d8a944f88d7952f7ef7c5167fef3c67995bcae24543949710231b03a201acda emoji-test.txt | sha256sum -c -
|
||||
for l in en ko ja; do
|
||||
curl -L https://raw.githubusercontent.com/unicode-org/cldr-json/48.2.0/cldr-json/cldr-annotations-full/annotations/$l/annotations.json -o $l.json
|
||||
curl -L https://raw.githubusercontent.com/unicode-org/cldr-json/48.2.0/cldr-json/cldr-annotations-derived-full/annotationsDerived/$l/annotations.json -o $l-derived.json
|
||||
done
|
||||
map/cldr2emoji emoji-test.txt en.json en-derived.json ko.json ko-derived.json ja.json ja-derived.json >map/emoji.src
|
||||
map/mkemoji >map/emoji.dict
|
||||
```
|
||||
|
||||
The data is under the Unicode License v3; the complete text is in
|
||||
`LICENSES/Unicode-3.0.txt`.
|
||||
|
||||
## Japanese romaji
|
||||
|
||||
`hira.map` and `kata.map` are Mozc's default romaji table, one row per key,
|
||||
|
||||
50
map/cldr2emoji
Executable file
50
map/cldr2emoji
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Write emoji.src: every fully-qualified emoji of Unicode's emoji-test.txt
|
||||
but the skin-tone variants, each with its CLDR names and keywords in the
|
||||
languages given, as result-first TAB-separated rows for mkemoji."""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def emoji(path):
|
||||
out = []
|
||||
for line in path.open(encoding="utf-8"):
|
||||
if "; fully-qualified" not in line:
|
||||
continue
|
||||
cps = [int(cp, 16) for cp in line.split(";")[0].split()]
|
||||
if any(0x1F3FB <= cp <= 0x1F3FF for cp in cps):
|
||||
continue
|
||||
out.append("".join(map(chr, cps)))
|
||||
return out
|
||||
|
||||
|
||||
def annotations(path):
|
||||
"""CLDR annotations.json, plain or derived: emoji -> names, keywords."""
|
||||
root = json.load(path.open(encoding="utf-8"))
|
||||
table = root[next(iter(root))]["annotations"]
|
||||
return {e: a.get("tts", []) + a.get("default", []) for e, a in table.items()}
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 3:
|
||||
print(f"usage: {sys.argv[0]} emoji-test.txt annotations.json...",
|
||||
file=sys.stderr)
|
||||
return 2
|
||||
tables = [annotations(Path(arg)) for arg in sys.argv[2:]]
|
||||
print("# Result first, then its CLDR names and keywords; see map/README.")
|
||||
for e in emoji(Path(sys.argv[1])):
|
||||
aliases = []
|
||||
for table in tables:
|
||||
for alias in table.get(e.replace("️", ""), table.get(e, [])):
|
||||
alias = alias.strip()
|
||||
if alias and alias not in aliases:
|
||||
aliases.append(alias)
|
||||
if aliases:
|
||||
print(e + "\t" + "\t".join(aliases))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
15609
map/emoji.dict
15609
map/emoji.dict
File diff suppressed because it is too large
Load Diff
1923
map/emoji.src
1923
map/emoji.src
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user