summary refs log tree commit diff
path: root/scripts/emoji_codegen.py
blob: 4dbb382d0edb75f4655047ada68df0cba5c15daa (plain) (blame)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3

import sys
import re

from jinja2 import Template


class Emoji(object):
    def __init__(self, code, shortname):
        self.code = repr(code.encode('utf-8'))[1:].strip("'")
        self.shortname = shortname

def generate_code(emojis, category):
    tmpl = Template('''
const std::vector<Emoji> emoji::Provider::{{ category }} = {
    // {{ category.capitalize() }}
    {%- for e in emoji %}
        {QString::fromUtf8("{{ e.code }}"), "{{ e.shortname }}", emoji::Emoji::Category::{{ category.capitalize() }}},
    {%- endfor %}
};
    ''')

    d = dict(category=category, emoji=emojis)
    print(tmpl.render(d))

def generate_qml_list(**kwargs):
    tmpl = Template('''
const QVector<Emoji> emoji::Provider::emoji = {
    {%- for c in kwargs.items() %}
    // {{ c[0].capitalize() }}
    {%- for e in c[1] %}
    {QString::fromUtf8("{{ e.code }}"), "{{ e.shortname }}", emoji::Emoji::Category::{{ c[0].capitalize() }}},
    {%- endfor %}
    {%- endfor %}
};
    ''')
    d = dict(kwargs=kwargs)
    print(tmpl.render(d))

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('usage: emoji_codegen.py /path/to/emoji-test.txt')
        sys.exit(1)

    filename = sys.argv[1]

    people = []
    nature = []
    food = []
    activity = []
    travel = []
    objects = []
    symbols = []
    flags = []

    categories = {
        'Smileys & Emotion': people,
        'People & Body': people,
        'Animals & Nature': nature,
        'Food & Drink': food,
        'Travel & Places': travel,
        'Activities': activity,
        'Objects': objects,
        'Symbols': symbols,
        'Flags': flags
    }

    current_category = ''
    for line in open(filename, 'r'):
        if line.startswith('# group:'):
            current_category = line.split(':', 1)[1].strip()

        if not line or line.startswith('#'):
            continue

        segments = re.split(r'\s+[#;] ', line.strip())
        if len(segments) != 3:
            continue

        code, qualification, charAndName = segments

        # skip fully qualified versions of same unicode
        if code.endswith('FE0F'):
            continue

        if qualification == 'component':
            continue

        char, name = re.match(r'^(\S+) E\d+\.\d+ (.*)$', charAndName).groups()

        categories[current_category].append(Emoji(char, name))

    # Use xclip to pipe the output to clipboard.
    # e.g ./codegen.py emoji.json | xclip -sel clip
    generate_code(people, 'people')
    generate_code(nature, 'nature')
    generate_code(food, 'food')
    generate_code(activity, 'activity')
    generate_code(travel, 'travel')
    generate_code(objects, 'objects')
    generate_code(symbols, 'symbols')
    generate_code(flags, 'flags')
    generate_qml_list(people=people, nature=nature, food=food, activity=activity, travel=travel, objects=objects, symbols=symbols, flags=flags)