4 #pragma implementation "trans.h"
9 #include "support/filetools.h"
10 #include "tex-strings.h"
13 #include "trans_mgr.h"
24 bool DefaultTrans::init_ = false;
27 DefaultTrans::DefaultTrans()
36 string DefaultTrans::process(char c, TransManager & k)
41 return k.normalkey(c, dummy);
51 for(i = 0; i < 256; ++i)
54 for(i = 0; i < TEX_MAX_ACCENT + 1; ++i)
65 void Trans::InsertException(Trans::keyexc & exclist, char c,
66 string const & data, bool flag, tex_accent accent)
82 void Trans::FreeException(Trans::keyexc & exclist)
95 void Trans::FreeKeymap()
99 for(i = 0; i < 256; ++i)
104 for(i = 0; i < TEX_MAX_ACCENT + 1; ++i)
106 FreeException(kmod_list_[i]->exception_list);
107 delete kmod_list_[i];
113 bool Trans::IsDefined()
115 return !name_.empty();
119 string const & Trans::GetName()
134 struct keyword_item kmapTags[K_LAST-1] = {
142 tex_accent getkeymod(string const &);
145 void Trans::AddDeadkey(tex_accent accent, string const & keys,
146 string const & allowed)
148 if (kmod_list_[accent]) {
149 FreeException(kmod_list_[accent]->exception_list);
151 delete kmod_list_[accent];
154 kmod_list_[accent] = new kmod_list_decl;
155 kmod_list_[accent]->data = keys;
156 kmod_list_[accent]->accent = accent;
157 if (allowed == "all") {
158 kmod_list_[accent]->allowed= lyx_accent_table[accent].native;
160 kmod_list_[accent]->allowed = allowed;
163 for(string::size_type i = 0; i < keys.length(); ++i) {
165 if (keys[i] == char(254))
166 lyxerr << "check one triggered" << endl;
167 temp = keymap_[keys[i]] = new char[2];
168 temp[0] = 0; temp[1] = accent;
170 kmod_list_[accent]->exception_list = 0;
174 int Trans::Load(LyXLex & lex)
178 while (lex.IsOK() && !error) {
182 if (lyxerr.debugging(Debug::KBMAP))
183 lyxerr << "KMOD:\t" << lex.text() << endl;
184 if (lex.next(true)) {
185 if (lyxerr.debugging(Debug::KBMAP))
186 lyxerr << "key\t`" << lex.text()
191 string keys = lex.GetString();
193 if (lex.next(true)) {
194 if ( lyxerr.debugging(Debug::KBMAP))
195 lyxerr << "accent\t`" << lex.text()
200 tex_accent accent = getkeymod(lex.GetString());
202 if (accent == TEX_NOACCENT)
205 if (lex.next(true)) {
206 if (lyxerr.debugging(Debug::KBMAP))
207 lyxerr << "allowed\t`" << lex.text()
212 string allowed = lex.GetString();
214 AddDeadkey(accent, keys, allowed);
220 lyxerr[Debug::KBMAP] << "KCOMB:" << endl;
221 if (lex.next(true)) {
223 lyxerr[Debug::KBMAP] << str << endl;
227 tex_accent accent_1= getkeymod(str);
228 if (accent_1 == TEX_NOACCENT) return -1;
230 if (lex.next(true)) {
232 lyxerr[Debug::KBMAP] << str << endl;
236 tex_accent accent_2= getkeymod(str);
237 if (accent_2 == TEX_NOACCENT) return -1;
239 if (kmod_list_[accent_1] == 0 || kmod_list_[accent_2] == 0)
242 // Find what key accent_2 is on - should check about accent_1 also
245 for(key = 0; key < 256; ++key) {
246 if (keymap_[key] && keymap_[key][0] == 0
247 && keymap_[key][1] == accent_2)
253 allowed = lex.GetString();
254 lyxerr[Debug::KBMAP] << "allowed: "
259 InsertException(kmod_list_[accent_1]->exception_list,(char)key, allowed, true, accent_2);
266 if (lyxerr.debugging(Debug::KBMAP))
267 lyxerr << "KMAP:\t" << lex.text() << endl;
268 if (lex.next(true)) {
269 key_from= lex.text()[0];
270 if (lyxerr.debugging(Debug::KBMAP))
271 lyxerr << "\t`" << lex.text() << "'"
276 if (lex.next(true)) {
277 char const * t = lex.text();
278 string_to = strcpy(new char[strlen(t)+1], t);
279 if (key_from == char(254))
280 lyxerr << "check two triggered"
282 keymap_[key_from] = string_to;
283 if (lyxerr.debugging(Debug::KBMAP))
284 lyxerr << "\t`" << string_to << "'"
296 if (lyxerr.debugging(Debug::KBMAP))
297 lyxerr << "KXMOD:\t" << lex.text() << endl;
298 if (lex.next(true)) {
299 if (lyxerr.debugging(Debug::KBMAP))
300 lyxerr << "\t`" << lex.text() << "'"
302 accent = getkeymod(lex.GetString());
306 if (lex.next(true)) {
307 if (lyxerr.debugging(Debug::KBMAP))
308 lyxerr << "\t`" << lex.text() << "'"
314 if (lex.next(true)) {
315 if (lyxerr.debugging(Debug::KBMAP))
316 lyxerr << "\t`" << lex.text() << "'"
322 InsertException(kmod_list_[accent]->exception_list, key, str);
325 case LyXLex::LEX_FEOF:
326 lyxerr[Debug::PARSER] << "End of parsing" << endl;
329 lex.printError("ParseKeymapFile: "
330 "Unknown tag: `$$Token'");
338 bool Trans::isAccentDefined(tex_accent accent, KmodInfo & i)
340 if (kmod_list_[accent]!= 0) {
341 i = *kmod_list_[accent];
348 string Trans::process(char c, TransManager & k)
350 lyxerr << "enter process" << endl;
354 lyxerr << "finished variables" << endl;
356 if ((t == 0 && (dt[0] = c)) || (t[0] != 0 && (dt = t)) ){
357 lyxerr << "normalkey" << endl;
358 return k.normalkey(c, dt);
360 lyxerr << "deadkey" << endl;
361 return k.deadkey(c, *kmod_list_[(tex_accent)t[1]]);
366 int Trans::Load(string const & language)
368 string filename = LibFileSearch("kbd", language, "kmap");
369 if (filename.empty())
373 LyXLex lex(kmapTags, K_LAST-1);
374 lex.setFile(filename);
387 tex_accent getkeymod(string const & p)
388 /* return modifier - decoded from p and update p */
390 for (int i = 1; i <= TEX_MAX_ACCENT; ++i) {
391 if (lyxerr.debugging(Debug::KBMAP))
392 lyxerr << "p = " << p
393 << ", lyx_accent_table[" << i
394 << "].name = `" << lyx_accent_table[i].name
397 if ( lyx_accent_table[i].name && contains(p, lyx_accent_table[i].name)) {
398 lyxerr[Debug::KBMAP] << "Found it!" << endl;
399 return (tex_accent)i;