1 #ifndef TABLEDICT_H
2 #define TABLEDICT_H
3 
4 #include "fcitx-utils/utf8.h"
5 #include "fcitx-config/fcitx-config.h"
6 #include "fcitx-config/hotkey.h"
7 #include "fcitx-utils/memory.h"
8 #include "fcitx/candidate.h"
9 
10 #define MAX_CODE_LENGTH  30
11 #define PHRASE_MAX_LENGTH 10
12 #define FH_MAX_LENGTH  10
13 #define TABLE_AUTO_SAVE_AFTER 1024
14 #define AUTO_PHRASE_COUNT 10000
15 #define SINGLE_HZ_COUNT 66000
16 
17 #define RECORDTYPE_NORMAL 0x0
18 #define RECORDTYPE_PINYIN 0x1
19 #define RECORDTYPE_CONSTRUCT 0x2
20 #define RECORDTYPE_PROMPT 0x3
21 
22 struct _FcitxTableState;
23 
24 typedef enum {
25     TABLE_NEW = 0, // thus fcitx_utils_new will set this to default value
26     TABLE_PENDING = 1,
27     TABLE_REGISTERED = 2
28 } TableStatus;
29 
30 typedef enum {
31     AD_NO = 0,
32     AD_FAST = 1,
33     AD_FREQ = 2
34 } ADJUSTORDER;
35 
36 typedef struct {
37     char            strFH[FH_MAX_LENGTH * UTF8_MAX_LENGTH + 1];
38 } FH;
39 
40 typedef struct {
41     unsigned char   iFlag;  // 1 --> 正序   0 --> 逆序
42     unsigned char   iWhich; //第几个字
43     unsigned char   iIndex; //第几个编码
44 } RULE_RULE;
45 
46 typedef struct {
47     unsigned char   iWords; //多少个字
48     unsigned char   iFlag;  //1 --> 大于等于iWords  0 --> 等于iWords
49     RULE_RULE      *rule;
50 } RULE;
51 
52 typedef struct _RECORD {
53     char           *strCode;
54     char           *strHZ;
55     struct _RECORD *next;
56     struct _RECORD *prev;
57     uint32_t    iHit;
58     uint32_t    iIndex;
59     int8_t          type;
60 } RECORD;
61 
62 typedef struct _AUTOPHRASE {
63     char           *strHZ;
64     char           *strCode;
65     char            iSelected;
66     struct _AUTOPHRASE *next;   //构造一个队列
67 } AUTOPHRASE;
68 
69 /* 根据键码生成一个简单的索引,指向该键码起始的第一个记录 */
70 typedef struct {
71     RECORD         *record;
72     char            cCode;
73 } RECORD_INDEX;
74 
75 typedef struct {
76     char strHZ[UTF8_MAX_LENGTH + 1];
77 } SINGLE_HZ;
78 
79 typedef enum {
80     CM_NONE,
81     CM_ALT,
82     CM_CTRL,
83     CM_SHIFT,
84     _CM_COUNT
85 } ChooseModifier;
86 
87 typedef struct {
88     char* strInputCode;
89     RECORD_INDEX* recordIndex;
90     unsigned char iCodeLength;
91     unsigned char iPYCodeLength;
92     char* strIgnoreChars;
93     unsigned char   bRule;
94     RULE* rule;
95     uint32_t iRecordCount;
96     RECORD* tableSingleHZ[SINGLE_HZ_COUNT];
97     RECORD* tableSingleHZCons[SINGLE_HZ_COUNT];
98     unsigned int iTableIndex;
99     boolean bHasPinyin;
100     RECORD* currentRecord;
101     RECORD* recordHead;
102     int iFH;
103     FH* fh;
104     char* strNewPhraseCode;
105     AUTOPHRASE* autoPhrase;
106     AUTOPHRASE* insertPoint;
107     int32_t iAutoPhrase;
108     int iTableChanged;
109     int iHZLastInputCount;
110     SINGLE_HZ hzLastInput[PHRASE_MAX_LENGTH]; //Records last HZ input
111     RECORD* promptCode[256];
112     FcitxMemoryPool* pool;
113 } TableDict;
114 
115 typedef struct {
116     FcitxGenericConfig   config;
117     char           *uniqueName;
118     char           *strName;
119     char           *strIconName;
120     char           *strPath;
121     ADJUSTORDER     tableOrder;
122     int             iSimpleLevel;
123     int             iPriority;
124     boolean         bUsePY;
125     char            cPinyin;    //输入该键后,表示进入临时拼音状态
126     int             iTableAutoSendToClient; //自动上屏
127     int             iTableAutoSendToClientWhenNone; //空码自动上屏
128     boolean         bSendRawPreedit;
129     char           *strEndCode; //中止键,按下该键相当于输入该键后再按一个空格
130     boolean         bUseMatchingKey; //是否模糊匹配
131     char            cMatchingKey;
132     boolean         bTableExactMatch;    //是否只显示精确匹配的候选字/词
133     boolean         bAutoPhrase; //是否自动造词
134     boolean         bAutoPhrasePhrase;   //词组是否参与造词
135     int32_t         iAutoPhraseLength;    //自动造词长度
136     int             iSaveAutoPhraseAfter;   //选择N次后保存自动词组,0-不保存,1-立即保存
137     boolean         bPromptTableCode;    //输入完毕后是否提示编码
138     boolean         bNoMatchDontCommit;
139     char           *strSymbol;
140     char           *strSymbolFile;
141     char           *strChoose;      //设置选择键
142     ChooseModifier  chooseModifier;
143     char           *langCode;
144     char           *kbdlayout;
145     boolean         customPrompt;
146     boolean         bUseAlternativePageKey;
147     boolean         bUseAlternativeCandidateWordNumber;
148     int             iCandidateWordNumber;
149     boolean         bFirstCandidateAsPreedit;
150     boolean         bCommitAndPassByInvalidKey;
151     boolean         bCommitKeyCommitWhenNoMatch;
152     boolean         bIgnorePunc;
153     char*           ignorePuncList;
154     FcitxHotkey     hkAlternativePrevPage[2];
155     FcitxHotkey     hkAlternativeNextPage[2];
156     FcitxHotkey     hkCommitKey[2];
157     FcitxCandidateLayoutHint layoutHint;
158     boolean         bEnabled;
159 
160     struct _FcitxTableState* owner;
161     TableDict* tableDict;
162     boolean bUseAutoSend;
163     char* confName;
164     TableStatus status;
165 
166     UT_hash_handle hh;
167 } TableMetaData;
168 
169 boolean LoadTableDict(TableMetaData* tableMetaData);
170 void SaveTableDict(TableMetaData* tableMetaData);
171 void FreeTableDict(TableMetaData* tableMetaData);
172 void UpdateTableMetaData(TableMetaData* tableMetaData);
173 
174 void TableInsertPhrase(TableDict* tableDict, const char *strCode, const char *strHZ);
175 RECORD *TableFindPhrase(const TableDict* tableDict, const char *strHZ);
176 boolean TableCreatePhraseCode(TableDict* tableDict, char* strHZ);
177 void TableCreateAutoPhrase(TableMetaData* tableMetaData, char iCount);
178 RECORD *TableHasPhrase(const TableDict* tableDict, const char *strCode, const char *strHZ);
179 void TableDelPhraseByHZ(TableDict* tableDict, const char *strHZ);
180 void TableDelPhrase(TableDict* tableDict, RECORD * record);
181 void TableUpdateHitFrequency(TableMetaData* tableMetaData, RECORD * record);
182 int TableCompareCode(const TableMetaData* tableMetaData, const char* strUser, const char* strDict, boolean exactMatch);
183 int TableFindFirstMatchCode(TableMetaData* tableMetaData, const char* strCodeInput, boolean exactMatch, boolean cacheCurrentRecord);
184 void TableResetFlags(TableDict* tableDict);
185 
186 boolean IsInputKey(const TableDict* tableDict, int iKey);
187 boolean IsEndKey(const TableMetaData* tableMetaData, char cChar);
188 boolean IsIgnoreChar(const TableDict* tableDict, char cChar);
189 unsigned int CalHZIndex(char *strHZ);
190 boolean HasMatchingKey(const TableMetaData* tableMetaData, const char* strCodeInput);
191 CONFIG_BINDING_DECLARE(TableMetaData);
192 
193 #endif
194 // kate: indent-mode cstyle; space-indent on; indent-width 0;
195