aboutsummaryrefslogtreecommitdiffstats
path: root/src/virtualkeyboard/hangul.h
blob: e30a659aac7eda49f360dfef88e5c84a6635fbd1 (plain)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef HANGUL_H
#define HANGUL_H

#include <QString>
#include <QList>
#include <QMap>

namespace QtVirtualKeyboard {

class Hangul
{
    Q_DISABLE_COPY(Hangul)

    enum HangulMedialIndex {          // VIndex    Letter Jungseong   Double Jamo
        // ----------------------------------------------------------------------
        HANGUL_MEDIAL_A,              //      0      314F      1161
        HANGUL_MEDIAL_AE,             //      1      3150      1162
        HANGUL_MEDIAL_YA,             //      2      3151      1163
        HANGUL_MEDIAL_YAE,            //      3      3152      1164
        HANGUL_MEDIAL_EO,             //      4      3153      1165
        HANGUL_MEDIAL_E,              //      5      3154      1166
        HANGUL_MEDIAL_YEO,            //      6      3155      1167
        HANGUL_MEDIAL_YE,             //      7      3156      1168
        HANGUL_MEDIAL_O,              //      8      3157      1169
        HANGUL_MEDIAL_WA,             //      9      3158      116A     3157+314F
        HANGUL_MEDIAL_WAE,            //     10      3159      116B     3157+3150
        HANGUL_MEDIAL_OE,             //     11      315A      116C     3157+3163
        HANGUL_MEDIAL_YO,             //     12      315B      116D
        HANGUL_MEDIAL_U,              //     13      315C      116E
        HANGUL_MEDIAL_WEO,            //     14      315D      116F     315C+3153
        HANGUL_MEDIAL_WE,             //     15      315E      1170     315C+3154
        HANGUL_MEDIAL_WI,             //     16      315F      1171     315C+3163
        HANGUL_MEDIAL_YU,             //     17      3160      1172
        HANGUL_MEDIAL_EU,             //     18      3161      1173
        HANGUL_MEDIAL_YI,             //     19      3162      1174     3161+3163
        HANGUL_MEDIAL_I               //     20      3163      1175
    };

    enum HangulFinalIndex {           // TIndex    Letter Jongseong   Double Jamo
        // ----------------------------------------------------------------------
        HANGUL_FINAL_NONE,            //      0       n/a       n/a
        HANGUL_FINAL_KIYEOK,          //      1      3131      11A8
        HANGUL_FINAL_SSANGKIYEOK,     //      2      3132      11A9
        HANGUL_FINAL_KIYEOK_SIOS,     //      3      3133      11AA     3131+3145
        HANGUL_FINAL_NIEUN,           //      4      3134      11AB
        HANGUL_FINAL_NIEUN_CIEUC,     //      5      3135      11AC     3134+3148
        HANGUL_FINAL_NIEUN_HIEUH,     //      6      3136      11AD     3134+314E
        HANGUL_FINAL_TIKEUT,          //      7      3137      11AE
        HANGUL_FINAL_RIEUL,           //      8      3139      11AF
        HANGUL_FINAL_RIEUL_KIYEOK,    //      9      313A      11B0     3139+3131
        HANGUL_FINAL_RIEUL_MIEUM,     //     10      313B      11B1     3139+3141
        HANGUL_FINAL_RIEUL_PIEUP,     //     11      313C      11B2     3139+3142
        HANGUL_FINAL_RIEUL_SIOS,      //     12      313D      11B3     3139+3145
        HANGUL_FINAL_RIEUL_THIEUTH,   //     13      313E      11B4     3139+314C
        HANGUL_FINAL_RIEUL_PHIEUPH,   //     14      313F      11B5     3139+314D
        HANGUL_FINAL_RIEUL_HIEUH,     //     15      3140      11B6     3139+314E
        HANGUL_FINAL_MIEUM,           //     16      3141      11B7
        HANGUL_FINAL_PIEUP,           //     17      3142      11B8
        HANGUL_FINAL_PIEUP_SIOS,      //     18      3144      11B9     3142+3145
        HANGUL_FINAL_SIOS,            //     19      3145      11BA
        HANGUL_FINAL_SSANGSIOS,       //     20      3146      11BB     3145+3145
        HANGUL_FINAL_IEUNG,           //     21      3147      11BC
        HANGUL_FINAL_CIEUC,           //     22      3148      11BD
        HANGUL_FINAL_CHIEUCH,         //     23      314A      11BE
        HANGUL_FINAL_KHIEUKH,         //     24      314B      11BF
        HANGUL_FINAL_THIEUTH,         //     25      314C      11C0
        HANGUL_FINAL_PHIEUPH,         //     26      314D      11C1
        HANGUL_FINAL_HIEUH            //     27      314E      11C2
    };

    Hangul();

public:
    static QString decompose(const QString &source);
    static QString compose(const QString &source);
    static bool isJamo(const ushort &unicode);

private:
    static bool isMedial(HangulMedialIndex vowel);
    static bool isFinal(HangulFinalIndex consonant);
    static ushort findDoubleMedial(HangulMedialIndex vowel);
    static ushort findDoubleFinal(HangulFinalIndex consonant);
    static ushort packDoubleMedial(HangulMedialIndex a, HangulMedialIndex b);
    static ushort packDoubleFinal(HangulFinalIndex a, HangulFinalIndex b);
    static void unpackDoubleMedial(ushort key, HangulMedialIndex &a, HangulMedialIndex &b);
    static void unpackDoubleFinal(ushort key, HangulFinalIndex &a, HangulFinalIndex &b);
    static QMap<ushort, HangulMedialIndex> initDoubleMedialMap();
    static QMap<ushort, HangulFinalIndex> initDoubleFinalMap();

    static const QList<ushort> initials;
    static const QList<ushort> finals;
    static const QMap<ushort, HangulMedialIndex> doubleMedialMap;
    static const QMap<ushort, HangulFinalIndex> doubleFinalMap;
    static const int SBase;
    static const int LBase;
    static const int VBase;
    static const int TBase;
    static const int LCount;
    static const int VCount;
    static const int TCount;
    static const int NCount;
    static const int SCount;
};

} // namespace QtVirtualKeyboard

#endif