emoji: add one-shot candidate search

This commit is contained in:
2026-08-11 22:24:59 +09:00
parent 82276bf37f
commit 0fff17c8b8
14 changed files with 891 additions and 346 deletions

View File

@@ -0,0 +1,226 @@
! ⚠ ≠
!! ⚠
!= ≠
* ★
** ★
+ ±
+- ±
- →
-> →
. · … ÷
.. · …
... …
./ ÷
: ☹ ☺
:( ☹
:) ☺
< ← ≤ ≠ ♥
<- ←
<3 ♥
<= ≤
<> ≠
= ≡ ⇒
== ≡
=> ⇒
> ≥
>= ≥
^ ⁽ ⁾ ⁺ ⁻ ⁼ ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁱ ⁿ
^( ⁽
^) ⁾
^+ ⁺
^- ⁻
^0 ⁰
^1 ¹
^2 ²
^3 ³
^4 ⁴
^5 ⁵
^6 ⁶
^7 ⁷
^8 ⁸
^9 ⁹
^= ⁼
^i ⁱ
^n ⁿ
_ ₍ ₎ ₊ ₋ ₌ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₐ ₑ ₒ ₓ
_( ₍
_) ₎
_+ ₊
_- ₋
_0 ₀
_1 ₁
_2 ₂
_3 ₃
_4 ₄
_5 ₅
_6 ₆
_7 ₇
_8 ₈
_9 ₉
_= ₌
_a ₐ
_e ₑ
_o ₒ
_x ₓ
a α
al α
alp α
alph α
alpha α
b β 😊
be β
bet β
beta β
bl 😊
blu 😊
blus 😊
blush 😊
c χ
ch χ
chi χ
d ° δ Δ ↓
de Δ ° δ
deg °
del δ
delt δ
delta δ
dn ↓
e ε η
ep ε
eps ε
et η
eta η
f 凸
fu 凸
fuc 凸
fuck 凸
g γ Γ 😀
ga Γ γ
gam γ
gamm γ
gamma γ
gr 😀
gri 😀
grin 😀
h 😄 😊 ❤️
ha 😄 😊
hap 😄 😊
happ 😄 😊
happy 😄 😊
he ❤️
hea ❤️
hear ❤️
heart ❤️
i ∫ ∞ ι
ii ∫
in ∞
inf ∞
io ι
iot ι
iota ι
j 😂
jo 😂
joy 😂
k κ
ka κ
kap κ
kapp κ
kappa κ
l λ Λ 😂 ❤️ 👍
la Λ λ
lam λ
lamb λ
lambd λ
lambda λ
li 👍
lik 👍
like 👍
lo 😂 ❤️
lol 😂
lov ❤️
love ❤️
m × μ
mu μ ×
mul ×
n ν
nu ν
o ω Ω ●
om Ω ω
ome ω
omeg ω
omega ω
oo ●
p φ Φ π Π ∏ ψ Ψ
ph Φ φ
phi φ
pi π Π
pp ∏
ps Ψ ψ
psi ψ
r ρ
rh ρ
rho ρ
s σ Σ √ ∑ 😀 😄 😊
si Σ σ
sig σ
sigm σ
sigma σ
sm 😀 😄 😊
smi 😀 😄 😊
smil 😀 😄 😊
smile 😀 😄 😊
sq √
ss ∑
t τ θ Θ 👍
ta τ
tau τ
th Θ θ 👍
the θ
thet θ
theta θ
thu 👍
thum 👍
thumb 👍
thumbs 👍
thumbsu 👍
thumbsup 👍
u ↑ υ
up ↑ υ
ups υ
v ✓
vv ✓
x ξ Ξ ✗
xi ξ Ξ
xx ✗
z ζ
ze ζ
zet ζ
zeta ζ
~ ≈
~= ≈
따 👍
따봉 👍
미 😄 😊
미소 😄 😊
방 😊
방긋 😊
사 ❤️
사랑 ❤️
스 😀 😄
스마 😀 😄
스마일 😀 😄
엄 👍
엄지 👍
웃 😀 😄 😂
웃겨 😂
웃다 😀
웃음 😀 😄 😂
좋 👍
좋아 👍
좋아요 👍
찬 👍
찬성 👍
폭 😂
폭소 😂
하 ❤️
하트 ❤️

View File

@@ -1,183 +0,0 @@
! !
!! ⚠
!= ≠
* *
** ★
+ +
+- ±
- -
-> →
. .
.. ·
... …
./ ÷
: :
:( ☹
:) ☺
< <
<- ←
<3 ♥
<= ≤
<> ≠
= =
== ≡
=> ⇒
> >
>= ≥
D D
De Δ
G G
Ga Γ
I I
II ∫
L L
La Λ
O O
Om Ω
P P
PP ∏
Ph Φ
Pi Π
Ps Ψ
S S
SS ∑
Si Σ
T T
Th Θ
X X
Xi Ξ
^ ^
^( ⁽
^) ⁾
^+ ⁺
^- ⁻
^0 ⁰
^1 ¹
^2 ²
^3 ³
^4 ⁴
^5 ⁵
^6 ⁶
^7 ⁷
^8 ⁸
^9 ⁹
^= ⁼
^i ⁱ
^n ⁿ
_ _
_( ₍
_) ₎
_+ ₊
_- ₋
_0 ₀
_1 ₁
_2 ₂
_3 ₃
_4 ₄
_5 ₅
_6 ₆
_7 ₇
_8 ₈
_9 ₉
_= ₌
_a ₐ
_e ₑ
_o ₒ
_x ₓ
a a
al al
alp alp
alph alph
alpha α
b b
be be
bet bet
beta β
c c
ch ch
chi χ
d d
de de
deg °
del del
delt delt
delta δ
dn ↓
e e
ep ep
eps ε
et et
eta η
f f
fu fu
fuc fuc
fuck 凸
g g
ga ga
gam gam
gamm gamm
gamma γ
i i
in in
inf ∞
io io
iot iot
iota ι
k k
ka ka
kap kap
kapp kapp
kappa κ
l l
la la
lam lam
lamb lamb
lambd lambd
lambda λ
m m
mu μ
mul ×
n n
nu ν
o o
om om
ome ome
omeg omeg
omega ω
oo ●
p p
ph ph
phi φ
pi π
ps ps
psi ψ
r r
rh rh
rho ρ
s s
si si
sig sig
sigm sigm
sigma σ
sq √
t t
ta ta
tau τ
th th
the the
thet thet
theta θ
u u
up ↑
ups υ
v v
vv ✓
x x
xi ξ
xx ✗
z z
ze ze
zet zet
zeta ζ
~ ~
~= ≈

View File

@@ -1,100 +1,108 @@
!! ⚠
!= ≠
**
+- ±
->
.. ·
...
./ ÷
:(
:)
<-
<=
<>
==
=>
>=
^(
^)
^+
^-
^=
_(
_)
_+
_-
_=
~=
^0
_0
^1 ¹
_1
^2 ²
_2
<3
^3 ³
_3
^4
_4
^5
_5
^6
_6
^7
_7
^8
_8
^9
_9
_a
alpha α
beta β
chi χ
deg °
delta δ
De Δ
dn
_e
eps ε
eta η
fuck
gamma γ
Ga Γ
^i
II
inf
iota ι
kappa κ
lambda λ
La Λ
mul ×
mu μ
^n
nu ν
omega ω
Om Ω
oo
_o
phi φ
Ph Φ
pi π
Pi Π
PP
psi ψ
Ps Ψ
rho ρ
sigma σ
Si Σ
sq
SS
tau τ
theta θ
Th Θ
up
ups υ
vv
xi ξ
Xi Ξ
xx
_x
zeta ζ
# Result first, followed by one or more TAB-separated aliases.
⚠ !!
**
± +-
->
· ..
...
÷ ./
:(
:)
<-
<=
<> !=
==
=>
>=
^(
^)
^+
^-
^=
_(
_)
_+
_-
_=
~=
^0
_0
¹ ^1
_1
² ^2
_2
<3
³ ^3
_3
^4
_4
^5
_5
^6
_6
^7
_7
^8
_8
^9
_9
_a
α alpha
β beta
χ chi
° deg
δ delta
Δ De
dn
_e
ε eps
η eta
fuck
γ gamma
Γ Ga
^i
II
inf
ι iota
κ kappa
λ lambda
Λ La
× mul
μ mu
^n
ν nu
ω omega
Ω Om
oo
_o
φ phi
Φ Ph
π pi
Π Pi
PP
ψ psi
Ψ Ps
ρ rho
σ sigma
Σ Si
sq
SS
τ tau
θ theta
Θ Th
up
υ ups
vv
ξ xi
Ξ Xi
xx
_x
ζ zeta
# Small multilingual emoji seed. Shared aliases intentionally produce choices.
😀 웃음 웃다 스마일 smile grin
😄 웃음 미소 스마일 smile happy
😂 웃음 폭소 웃겨 joy lol
😊 미소 방긋 smile blush happy
❤️ 사랑 하트 heart love
👍 좋아요 찬성 따봉 엄지 thumbsup like

View File

@@ -1,39 +1,71 @@
#!/bin/sh
#!/usr/bin/env python3
"""Write emoji.dict to stdout from a result-first UTF-8 TSV file."""
awk '
BEGIN { FS = "\t" }
/^$/ { next }
{
key = $1
val = $2
map[key] = val
for(i = 1; i < length(key); i++){
p = substr(key, 1, i)
if(!(p in map))
map[p] = p
}
}
END {
for(k in map)
print k "\t" map[k]
}
' $1 | sort -k1,1 > emoji.map
import sys
import unicodedata
from pathlib import Path
awk '
BEGIN { FS = "\t" }
/^$/ { next }
{
key = $1
val = $2
for(i = 1; i <= length(key); i++){
p = substr(key, 1, i)
dict[p] = dict[p] " " val
}
}
END {
for(p in dict){
sub(/^ /, "", dict[p])
print p "\t" dict[p]
}
}
' $1 | sort -k1,1 > emoji.dict
SOURCE = Path(__file__).with_name("emoji.src")
def fold(s):
s = "".join(chr(ord(c) + 32) if "A" <= c <= "Z" else c for c in s)
return unicodedata.normalize("NFC", s)
def read(path):
entries = []
with path.open(encoding="utf-8") as src:
for lineno, raw in enumerate(src, 1):
line = raw.rstrip("\r\n")
if not line.strip() or line.lstrip().startswith("#"):
continue
fields = line.split("\t")
if len(fields) < 2:
raise ValueError(f"{path}:{lineno}: need a result and an alias")
result = unicodedata.normalize("NFC", fields[0])
if not result or any(c.isspace() for c in result):
raise ValueError(f"{path}:{lineno}: bad result")
for field in fields[1:]:
alias = fold(field)
if not alias or alias != alias.strip():
raise ValueError(f"{path}:{lineno}: bad alias")
entries.append((result, alias))
return entries
def add(table, key, result):
values = table.setdefault(key, [])
if result not in values:
values.append(result)
def build(entries):
exact = {}
prefix = {}
for result, alias in entries:
for n in range(1, len(alias) + 1):
add(exact if n == len(alias) else prefix, alias[:n], result)
for key in sorted(exact.keys() | prefix.keys()):
values = exact.get(key, []) + prefix.get(key, [])
values = list(dict.fromkeys(values))
yield f"{key}\t{' '.join(values)}"
def main():
if len(sys.argv) > 2:
print(f"usage: {sys.argv[0]} [emoji.src]", file=sys.stderr)
return 2
path = Path(sys.argv[1]) if len(sys.argv) == 2 else SOURCE
try:
for line in build(read(path)):
print(line)
except (OSError, UnicodeError, ValueError) as error:
print(error, file=sys.stderr)
return 1
return 0
if __name__ == "__main__":
sys.exit(main())