From c2e093dbb337428d7701960e2ed007876aba1d21 Mon Sep 17 00:00:00 2001 From: Wade Brainerd Date: Mon, 09 Mar 2009 03:30:12 +0000 Subject: Add support for custom key map files. Add key builder. --- diff --git a/keyboard.py b/keyboard.py index c1f1e02..2ebb452 100644 --- a/keyboard.py +++ b/keyboard.py @@ -22,10 +22,12 @@ import gtk import rsvg import os, glob import pango +import simplejson # Tweaking variables. HAND_YOFFSET = -15 +# Unicode symbol for the paragraph key. PARAGRAPH_CODE = u'\xb6' # List of all key properties in the keyboard layout description. @@ -370,7 +372,7 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): """A GTK widget which implements an interactive visual keyboard, with support for custom data driven layouts.""" - def __init__(self, image, root_window): + def __init__(self, image, root_window, poll_keys=False, record_map=False): KeyboardData.__init__(self) gtk.DrawingArea.__init__(self) @@ -396,19 +398,30 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): self.modify_bg(gtk.STATE_NORMAL, self.get_colormap().alloc_color('#d0d0d0')) + self.record_map = record_map + + self.letter_map = [] + # Connect keyboard grabbing and releasing callbacks. - #self.connect('realize', self._realize_cb) - #self.connect('unrealize', self._unrealize_cb) + if poll_keys: + self.connect('realize', self._realize_cb) + self.connect('unrealize', self._unrealize_cb) - #def _realize_cb(self, widget): - # # Setup keyboard event snooping in the root window. - # self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK) - # self.key_press_cb_id = self.root_window.connect('key-press-event', self._key_press_release_cb) - # self.key_release_cb_id = self.root_window.connect('key-release-event', self._key_press_release_cb) + def _realize_cb(self, widget): + # Setup keyboard event snooping in the root window. + self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK) + self.key_press_cb_id = self.root_window.connect('key-press-event', self.key_press_release_cb) + self.key_release_cb_id = self.root_window.connect('key-release-event', self.key_press_release_cb) - #def _unrealize_cb(self, widget): - # self.root_window.disconnect(self.key_press_cb_id) - # self.root_window.disconnect(self.key_release_cb_id) + def _unrealize_cb(self, widget): + self.root_window.disconnect(self.key_press_cb_id) + self.root_window.disconnect(self.key_release_cb_id) + + def load_key_map(self, filename): + try: + self.letter_map = simplejson.loads(open(filename, 'r').read()) + except: + pass def set_layout(self, layout): """Sets the keyboard's layout from a layout description.""" @@ -423,16 +436,17 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): k['key-width'] = int(k['key-width'] * width_scale) k['key-height'] = int(k['key-height'] * height_scale) - self._make_key_images() + self._make_all_key_images() - def _make_key_images(self): - group = self.active_group + def _make_key_images(self, key): + key['key-images'] = {} + for group in [0, 1]: + for state in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.MOD5_MASK, gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK]: + key['key-images'][(state, group)] = self.get_key_image(key, state, group) + def _make_all_key_images(self): for key in self.keys: - key['key-images'] = {} - for group in [0, 1]: - for state in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.MOD5_MASK, gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK]: - key['key-images'][(state, group)] = self.get_key_image(key, state, group) + self._make_key_images(key) def _draw_key(self, k, draw, gc, for_pixmap, w=0, h=0): x1 = 0 @@ -441,7 +455,7 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): y2 = h # Outline rounded box. - gc.foreground = self.get_colormap().alloc_color((0.4*65536),int(0.7*65536),int(0.4*65536)) + gc.foreground = self.get_colormap().alloc_color(int(0.4*65536),int(0.7*65536),int(0.4*65536)) corner = 5 points = [ @@ -462,15 +476,26 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): text = '' if k['key-label']: text = k['key-label'] + else: - info = self.keymap.translate_keyboard_state( - k['key-scan'], self.active_state, self.active_group) - if info: - key = gtk.gdk.keyval_to_unicode(info[0]) - try: - text = unichr(key).encode('utf-8') - except: - pass + for l in self.letter_map: + if l['scan'] == k['key-scan'] and \ + l['state'] == self.active_state & (gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK) and \ + l['group'] == self.active_group: + text = l['letter'] + + if text == '' and self.record_map: + text = k['key-scan'] + + # else: + # info = self.keymap.translate_keyboard_state( + # k['key-scan'], self.active_state, self.active_group) + # if info: + # key = gtk.gdk.keyval_to_unicode(info[0]) + # try: + # text = unichr(key).encode('utf-8') + # except: + # pass try: layout = self.create_pango_layout(unicode(text)) @@ -547,19 +572,33 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): # Hack to get the current modifier state - which will not be represented by the event. state = gtk.gdk.device_get_core_pointer().get_state(self.window)[1] - #info = self.keymap.translate_keyboard_state(0x18, state, event.group) - #print "press %d state=%x group=%d level=%d" % (event.hardware_keycode, self.active_state, self.active_group, info[2]) - if self.active_group != event.group or self.active_state != state: self.active_group = event.group self.active_state = state self.queue_draw() + if self.record_map and event.string: + l = { + 'scan': event.hardware_keycode, + 'state': int(event.state) & (gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK), + 'group': event.group, + 'letter': unicode(event.string) + } + print '%r' % l + self.letter_map.append(l) + self._make_key_images(key) + self.queue_draw() + return False + def save_letter_map(self, filename): + text = simplejson.dumps(self.letter_map, sort_keys=True, indent=4) + f = open(filename, 'w') + f.write(text) + f.close() + def _keys_changed_cb(self, keymap): - print "keys-changed event" self._make_key_images() def clear_hilite(self): @@ -617,15 +656,3 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): return image -if __name__ == "__main__": - window = gtk.Window(gtk.WINDOW_TOPLEVEL) - window.set_title("keyboard widget") - window.connect("destroy", lambda w: gtk.main_quit()) - - k = KeyboardWidget(window) - k.set_layout(DEFAULT_LAYOUT) - - window.add(k) - window.show_all() - - gtk.main() diff --git a/keybuilder.py b/keybuilder.py new file mode 100755 index 0000000..9d32161 --- /dev/null +++ b/keybuilder.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# vi: sw=4 et +# Copyright 2008 by Kate Scheppke and Wade Brainerd. +# This file is part of Typing Turtle. +# +# Typing Turtle is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Typing Turtle is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Typing Turtle. If not, see . + +import sys +import keyboard + +import gtk + +window = gtk.Window(gtk.WINDOW_TOPLEVEL) +window.set_title("keyboard widget") +window.connect("destroy", lambda w: gtk.main_quit()) +window.show_all() +window.realize() + +image = keyboard.KeyboardImages(800,400) +image.load_images() + +k = keyboard.KeyboardWidget(image, window, True, record_map=True) +k.set_layout(keyboard.OLPC_LAYOUT) +k.load_key_map(sys.argv[1]) + +savebtn = gtk.Button() +savebtn.add(gtk.Label('Save Keys')) +savebtn.connect('clicked', lambda w: k.save_letter_map(sys.argv[1])) + +quitbtn = gtk.Button() +quitbtn.add(gtk.Label('Quit')) +quitbtn.connect('clicked', lambda w: gtk.main_quit()) + +hbox = gtk.HBox() +hbox.pack_start(savebtn) +hbox.pack_start(quitbtn) + +vbox = gtk.VBox() +vbox.pack_start(k) +vbox.pack_start(hbox) + +window.add(vbox) +window.show_all() + +gtk.main() + diff --git a/lessons/en_US/en_US.key b/lessons/en_US/en_US.key new file mode 100644 index 0000000..9fa37cc --- /dev/null +++ b/lessons/en_US/en_US.key @@ -0,0 +1,2234 @@ +[ + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 0 + }, + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 0 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 0 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 0 + }, + { + "group": 0, + "letter": "c", + "scan": 54, + "state": 0 + }, + { + "group": 0, + "letter": "c", + "scan": 54, + "state": 0 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 0 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 0 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 0 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 0 + }, + { + "group": 0, + "letter": "n", + "scan": 57, + "state": 0 + }, + { + "group": 0, + "letter": "n", + "scan": 57, + "state": 0 + }, + { + "group": 0, + "letter": "m", + "scan": 58, + "state": 0 + }, + { + "group": 0, + "letter": "m", + "scan": 58, + "state": 0 + }, + { + "group": 0, + "letter": ",", + "scan": 59, + "state": 0 + }, + { + "group": 0, + "letter": ",", + "scan": 59, + "state": 0 + }, + { + "group": 0, + "letter": ".", + "scan": 60, + "state": 0 + }, + { + "group": 0, + "letter": ".", + "scan": 60, + "state": 0 + }, + { + "group": 0, + "letter": "/", + "scan": 61, + "state": 0 + }, + { + "group": 0, + "letter": "/", + "scan": 61, + "state": 0 + }, + { + "group": 0, + "letter": "a", + "scan": 38, + "state": 0 + }, + { + "group": 0, + "letter": "a", + "scan": 38, + "state": 0 + }, + { + "group": 0, + "letter": "s", + "scan": 39, + "state": 0 + }, + { + "group": 0, + "letter": "s", + "scan": 39, + "state": 0 + }, + { + "group": 0, + "letter": "d", + "scan": 40, + "state": 0 + }, + { + "group": 0, + "letter": "d", + "scan": 40, + "state": 0 + }, + { + "group": 0, + "letter": "f", + "scan": 41, + "state": 0 + }, + { + "group": 0, + "letter": "f", + "scan": 41, + "state": 0 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 0 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 0 + }, + { + "group": 0, + "letter": "h", + "scan": 43, + "state": 0 + }, + { + "group": 0, + "letter": "h", + "scan": 43, + "state": 0 + }, + { + "group": 0, + "letter": "j", + "scan": 44, + "state": 0 + }, + { + "group": 0, + "letter": "j", + "scan": 44, + "state": 0 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 0 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 0 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 0 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 0 + }, + { + "group": 0, + "letter": ";", + "scan": 47, + "state": 0 + }, + { + "group": 0, + "letter": ";", + "scan": 47, + "state": 0 + }, + { + "group": 0, + "letter": "'", + "scan": 48, + "state": 0 + }, + { + "group": 0, + "letter": "'", + "scan": 48, + "state": 0 + }, + { + "group": 0, + "letter": "\\", + "scan": 51, + "state": 0 + }, + { + "group": 0, + "letter": "\\", + "scan": 51, + "state": 0 + }, + { + "group": 0, + "letter": "q", + "scan": 24, + "state": 0 + }, + { + "group": 0, + "letter": "q", + "scan": 24, + "state": 0 + }, + { + "group": 0, + "letter": "w", + "scan": 25, + "state": 0 + }, + { + "group": 0, + "letter": "w", + "scan": 25, + "state": 0 + }, + { + "group": 0, + "letter": "e", + "scan": 26, + "state": 0 + }, + { + "group": 0, + "letter": "e", + "scan": 26, + "state": 0 + }, + { + "group": 0, + "letter": "r", + "scan": 27, + "state": 0 + }, + { + "group": 0, + "letter": "r", + "scan": 27, + "state": 0 + }, + { + "group": 0, + "letter": "t", + "scan": 28, + "state": 0 + }, + { + "group": 0, + "letter": "t", + "scan": 28, + "state": 0 + }, + { + "group": 0, + "letter": "y", + "scan": 29, + "state": 0 + }, + { + "group": 0, + "letter": "y", + "scan": 29, + "state": 0 + }, + { + "group": 0, + "letter": "u", + "scan": 30, + "state": 0 + }, + { + "group": 0, + "letter": "u", + "scan": 30, + "state": 0 + }, + { + "group": 0, + "letter": "i", + "scan": 31, + "state": 0 + }, + { + "group": 0, + "letter": "i", + "scan": 31, + "state": 0 + }, + { + "group": 0, + "letter": "o", + "scan": 32, + "state": 0 + }, + { + "group": 0, + "letter": "o", + "scan": 32, + "state": 0 + }, + { + "group": 0, + "letter": "p", + "scan": 33, + "state": 0 + }, + { + "group": 0, + "letter": "p", + "scan": 33, + "state": 0 + }, + { + "group": 0, + "letter": "[", + "scan": 34, + "state": 0 + }, + { + "group": 0, + "letter": "[", + "scan": 34, + "state": 0 + }, + { + "group": 0, + "letter": "]", + "scan": 35, + "state": 0 + }, + { + "group": 0, + "letter": "]", + "scan": 35, + "state": 0 + }, + { + "group": 0, + "letter": "`", + "scan": 49, + "state": 0 + }, + { + "group": 0, + "letter": "`", + "scan": 49, + "state": 0 + }, + { + "group": 0, + "letter": "1", + "scan": 10, + "state": 0 + }, + { + "group": 0, + "letter": "1", + "scan": 10, + "state": 0 + }, + { + "group": 0, + "letter": "2", + "scan": 11, + "state": 0 + }, + { + "group": 0, + "letter": "2", + "scan": 11, + "state": 0 + }, + { + "group": 0, + "letter": "3", + "scan": 12, + "state": 0 + }, + { + "group": 0, + "letter": "3", + "scan": 12, + "state": 0 + }, + { + "group": 0, + "letter": "4", + "scan": 13, + "state": 0 + }, + { + "group": 0, + "letter": "4", + "scan": 13, + "state": 0 + }, + { + "group": 0, + "letter": "5", + "scan": 14, + "state": 0 + }, + { + "group": 0, + "letter": "5", + "scan": 14, + "state": 0 + }, + { + "group": 0, + "letter": "6", + "scan": 15, + "state": 0 + }, + { + "group": 0, + "letter": "6", + "scan": 15, + "state": 0 + }, + { + "group": 0, + "letter": "7", + "scan": 16, + "state": 0 + }, + { + "group": 0, + "letter": "7", + "scan": 16, + "state": 0 + }, + { + "group": 0, + "letter": "8", + "scan": 17, + "state": 0 + }, + { + "group": 0, + "letter": "8", + "scan": 17, + "state": 0 + }, + { + "group": 0, + "letter": "9", + "scan": 18, + "state": 0 + }, + { + "group": 0, + "letter": "9", + "scan": 18, + "state": 0 + }, + { + "group": 0, + "letter": "0", + "scan": 19, + "state": 0 + }, + { + "group": 0, + "letter": "0", + "scan": 19, + "state": 0 + }, + { + "group": 0, + "letter": "-", + "scan": 20, + "state": 0 + }, + { + "group": 0, + "letter": "-", + "scan": 20, + "state": 0 + }, + { + "group": 0, + "letter": "=", + "scan": 21, + "state": 0 + }, + { + "group": 0, + "letter": "=", + "scan": 21, + "state": 0 + }, + { + "group": 0, + "letter": "~", + "scan": 49, + "state": 1 + }, + { + "group": 0, + "letter": "~", + "scan": 49, + "state": 1 + }, + { + "group": 0, + "letter": "!", + "scan": 10, + "state": 1 + }, + { + "group": 0, + "letter": "!", + "scan": 10, + "state": 1 + }, + { + "group": 0, + "letter": "@", + "scan": 11, + "state": 1 + }, + { + "group": 0, + "letter": "@", + "scan": 11, + "state": 1 + }, + { + "group": 0, + "letter": "#", + "scan": 12, + "state": 1 + }, + { + "group": 0, + "letter": "#", + "scan": 12, + "state": 1 + }, + { + "group": 0, + "letter": "$", + "scan": 13, + "state": 1 + }, + { + "group": 0, + "letter": "$", + "scan": 13, + "state": 1 + }, + { + "group": 0, + "letter": "%", + "scan": 14, + "state": 1 + }, + { + "group": 0, + "letter": "%", + "scan": 14, + "state": 1 + }, + { + "group": 0, + "letter": "^", + "scan": 15, + "state": 1 + }, + { + "group": 0, + "letter": "^", + "scan": 15, + "state": 1 + }, + { + "group": 0, + "letter": "&", + "scan": 16, + "state": 1 + }, + { + "group": 0, + "letter": "&", + "scan": 16, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": "(", + "scan": 18, + "state": 1 + }, + { + "group": 0, + "letter": "(", + "scan": 18, + "state": 1 + }, + { + "group": 0, + "letter": ")", + "scan": 19, + "state": 1 + }, + { + "group": 0, + "letter": ")", + "scan": 19, + "state": 1 + }, + { + "group": 0, + "letter": "_", + "scan": 20, + "state": 1 + }, + { + "group": 0, + "letter": "_", + "scan": 20, + "state": 1 + }, + { + "group": 0, + "letter": "+", + "scan": 21, + "state": 1 + }, + { + "group": 0, + "letter": "+", + "scan": 21, + "state": 1 + }, + { + "group": 0, + "letter": "Q", + "scan": 24, + "state": 1 + }, + { + "group": 0, + "letter": "Q", + "scan": 24, + "state": 1 + }, + { + "group": 0, + "letter": "W", + "scan": 25, + "state": 1 + }, + { + "group": 0, + "letter": "W", + "scan": 25, + "state": 1 + }, + { + "group": 0, + "letter": "E", + "scan": 26, + "state": 1 + }, + { + "group": 0, + "letter": "E", + "scan": 26, + "state": 1 + }, + { + "group": 0, + "letter": "R", + "scan": 27, + "state": 1 + }, + { + "group": 0, + "letter": "R", + "scan": 27, + "state": 1 + }, + { + "group": 0, + "letter": "T", + "scan": 28, + "state": 1 + }, + { + "group": 0, + "letter": "T", + "scan": 28, + "state": 1 + }, + { + "group": 0, + "letter": "Y", + "scan": 29, + "state": 1 + }, + { + "group": 0, + "letter": "Y", + "scan": 29, + "state": 1 + }, + { + "group": 0, + "letter": "U", + "scan": 30, + "state": 1 + }, + { + "group": 0, + "letter": "U", + "scan": 30, + "state": 1 + }, + { + "group": 0, + "letter": "I", + "scan": 31, + "state": 1 + }, + { + "group": 0, + "letter": "I", + "scan": 31, + "state": 1 + }, + { + "group": 0, + "letter": "O", + "scan": 32, + "state": 1 + }, + { + "group": 0, + "letter": "O", + "scan": 32, + "state": 1 + }, + { + "group": 0, + "letter": "P", + "scan": 33, + "state": 1 + }, + { + "group": 0, + "letter": "P", + "scan": 33, + "state": 1 + }, + { + "group": 0, + "letter": "{", + "scan": 34, + "state": 1 + }, + { + "group": 0, + "letter": "{", + "scan": 34, + "state": 1 + }, + { + "group": 0, + "letter": "}", + "scan": 35, + "state": 1 + }, + { + "group": 0, + "letter": "}", + "scan": 35, + "state": 1 + }, + { + "group": 0, + "letter": "A", + "scan": 38, + "state": 1 + }, + { + "group": 0, + "letter": "A", + "scan": 38, + "state": 1 + }, + { + "group": 0, + "letter": "S", + "scan": 39, + "state": 1 + }, + { + "group": 0, + "letter": "S", + "scan": 39, + "state": 1 + }, + { + "group": 0, + "letter": "D", + "scan": 40, + "state": 1 + }, + { + "group": 0, + "letter": "D", + "scan": 40, + "state": 1 + }, + { + "group": 0, + "letter": "F", + "scan": 41, + "state": 1 + }, + { + "group": 0, + "letter": "F", + "scan": 41, + "state": 1 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 1 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 1 + }, + { + "group": 0, + "letter": "H", + "scan": 43, + "state": 1 + }, + { + "group": 0, + "letter": "H", + "scan": 43, + "state": 1 + }, + { + "group": 0, + "letter": "J", + "scan": 44, + "state": 1 + }, + { + "group": 0, + "letter": "J", + "scan": 44, + "state": 1 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 1 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 1 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 1 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 1 + }, + { + "group": 0, + "letter": ":", + "scan": 47, + "state": 1 + }, + { + "group": 0, + "letter": ":", + "scan": 47, + "state": 1 + }, + { + "group": 0, + "letter": "\"", + "scan": 48, + "state": 1 + }, + { + "group": 0, + "letter": "\"", + "scan": 48, + "state": 1 + }, + { + "group": 0, + "letter": "|", + "scan": 51, + "state": 1 + }, + { + "group": 0, + "letter": "|", + "scan": 51, + "state": 1 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 1 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 1 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 1 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 1 + }, + { + "group": 0, + "letter": "C", + "scan": 54, + "state": 1 + }, + { + "group": 0, + "letter": "C", + "scan": 54, + "state": 1 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 1 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 1 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 1 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 1 + }, + { + "group": 0, + "letter": "N", + "scan": 57, + "state": 1 + }, + { + "group": 0, + "letter": "N", + "scan": 57, + "state": 1 + }, + { + "group": 0, + "letter": "M", + "scan": 58, + "state": 1 + }, + { + "group": 0, + "letter": "M", + "scan": 58, + "state": 1 + }, + { + "group": 0, + "letter": "<", + "scan": 59, + "state": 1 + }, + { + "group": 0, + "letter": "<", + "scan": 59, + "state": 1 + }, + { + "group": 0, + "letter": ">", + "scan": 60, + "state": 1 + }, + { + "group": 0, + "letter": ">", + "scan": 60, + "state": 1 + }, + { + "group": 0, + "letter": "?", + "scan": 61, + "state": 1 + }, + { + "group": 0, + "letter": "?", + "scan": 61, + "state": 1 + }, + { + "group": 0, + "letter": "\u00a1", + "scan": 10, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a1", + "scan": 10, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ac", + "scan": 11, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ac", + "scan": 11, + "state": 128 + }, + { + "group": 0, + "letter": "\u0300", + "scan": 12, + "state": 128 + }, + { + "group": 0, + "letter": "\u0300", + "scan": 12, + "state": 128 + }, + { + "group": 0, + "letter": "\u0301", + "scan": 13, + "state": 128 + }, + { + "group": 0, + "letter": "\u0301", + "scan": 13, + "state": 128 + }, + { + "group": 0, + "letter": "\u0306", + "scan": 14, + "state": 128 + }, + { + "group": 0, + "letter": "\u0306", + "scan": 14, + "state": 128 + }, + { + "group": 0, + "letter": "\u030a", + "scan": 15, + "state": 128 + }, + { + "group": 0, + "letter": "\u030a", + "scan": 15, + "state": 128 + }, + { + "group": 0, + "letter": "\u0302", + "scan": 16, + "state": 128 + }, + { + "group": 0, + "letter": "\u0302", + "scan": 16, + "state": 128 + }, + { + "group": 0, + "letter": "\u030c", + "scan": 17, + "state": 128 + }, + { + "group": 0, + "letter": "\u030c", + "scan": 17, + "state": 128 + }, + { + "group": 0, + "letter": "\u0307", + "scan": 18, + "state": 128 + }, + { + "group": 0, + "letter": "\u0307", + "scan": 18, + "state": 128 + }, + { + "group": 0, + "letter": "\u0308", + "scan": 19, + "state": 128 + }, + { + "group": 0, + "letter": "\u0308", + "scan": 19, + "state": 128 + }, + { + "group": 0, + "letter": "\u0304", + "scan": 20, + "state": 128 + }, + { + "group": 0, + "letter": "\u0304", + "scan": 20, + "state": 128 + }, + { + "group": 0, + "letter": "\u0303", + "scan": 21, + "state": 128 + }, + { + "group": 0, + "letter": "\u0303", + "scan": 21, + "state": 128 + }, + { + "group": 0, + "letter": "\u03c9", + "scan": 24, + "state": 128 + }, + { + "group": 0, + "letter": "\u03c9", + "scan": 24, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f8", + "scan": 25, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f8", + "scan": 25, + "state": 128 + }, + { + "group": 0, + "letter": "\u0153", + "scan": 26, + "state": 128 + }, + { + "group": 0, + "letter": "\u0153", + "scan": 26, + "state": 128 + }, + { + "group": 0, + "letter": "\u0327", + "scan": 27, + "state": 128 + }, + { + "group": 0, + "letter": "\u0327", + "scan": 27, + "state": 128 + }, + { + "group": 0, + "letter": "\u032e", + "scan": 28, + "state": 128 + }, + { + "group": 0, + "letter": "\u032e", + "scan": 28, + "state": 128 + }, + { + "group": 0, + "letter": "\u0325", + "scan": 29, + "state": 128 + }, + { + "group": 0, + "letter": "\u0325", + "scan": 29, + "state": 128 + }, + { + "group": 0, + "letter": "\u032d", + "scan": 30, + "state": 128 + }, + { + "group": 0, + "letter": "\u032d", + "scan": 30, + "state": 128 + }, + { + "group": 0, + "letter": "\u032c", + "scan": 31, + "state": 128 + }, + { + "group": 0, + "letter": "\u032c", + "scan": 31, + "state": 128 + }, + { + "group": 0, + "letter": "\u0323", + "scan": 32, + "state": 128 + }, + { + "group": 0, + "letter": "\u0323", + "scan": 32, + "state": 128 + }, + { + "group": 0, + "letter": "\u0324", + "scan": 33, + "state": 128 + }, + { + "group": 0, + "letter": "\u0324", + "scan": 33, + "state": 128 + }, + { + "group": 0, + "letter": "\u0331", + "scan": 34, + "state": 128 + }, + { + "group": 0, + "letter": "\u0331", + "scan": 34, + "state": 128 + }, + { + "group": 0, + "letter": "\u0330", + "scan": 35, + "state": 128 + }, + { + "group": 0, + "letter": "\u0330", + "scan": 35, + "state": 128 + }, + { + "group": 0, + "letter": "\u00e6", + "scan": 38, + "state": 128 + }, + { + "group": 0, + "letter": "\u00e6", + "scan": 38, + "state": 128 + }, + { + "group": 0, + "letter": "\u00df", + "scan": 39, + "state": 128 + }, + { + "group": 0, + "letter": "\u00df", + "scan": 39, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f0", + "scan": 40, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f0", + "scan": 40, + "state": 128 + }, + { + "group": 0, + "letter": "\u00fe", + "scan": 41, + "state": 128 + }, + { + "group": 0, + "letter": "\u00fe", + "scan": 41, + "state": 128 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 128 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a3", + "scan": 43, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a3", + "scan": 43, + "state": 128 + }, + { + "group": 0, + "letter": "\u20ac", + "scan": 44, + "state": 128 + }, + { + "group": 0, + "letter": "\u20ac", + "scan": 44, + "state": 128 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 128 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 128 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 128 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ba", + "scan": 47, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ba", + "scan": 47, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a4", + "scan": 48, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a4", + "scan": 48, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a7", + "scan": 51, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a7", + "scan": 51, + "state": 128 + }, + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 128 + }, + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 128 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 128 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 128 + }, + { + "group": 0, + "letter": "\u00e7", + "scan": 54, + "state": 128 + }, + { + "group": 0, + "letter": "\u00e7", + "scan": 54, + "state": 128 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 128 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 128 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 128 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f1", + "scan": 57, + "state": 128 + }, + { + "group": 0, + "letter": "\u00f1", + "scan": 57, + "state": 128 + }, + { + "group": 0, + "letter": "\u00b5", + "scan": 58, + "state": 128 + }, + { + "group": 0, + "letter": "\u00b5", + "scan": 58, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ab", + "scan": 59, + "state": 128 + }, + { + "group": 0, + "letter": "\u00ab", + "scan": 59, + "state": 128 + }, + { + "group": 0, + "letter": "\u00bb", + "scan": 60, + "state": 128 + }, + { + "group": 0, + "letter": "\u00bb", + "scan": 60, + "state": 128 + }, + { + "group": 0, + "letter": "\u00bf", + "scan": 61, + "state": 128 + }, + { + "group": 0, + "letter": "\u00bf", + "scan": 61, + "state": 128 + }, + { + "group": 0, + "letter": "\u00a1", + "scan": 10, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a1", + "scan": 10, + "state": 129 + }, + { + "group": 0, + "letter": "\u00ac", + "scan": 11, + "state": 129 + }, + { + "group": 0, + "letter": "\u00ac", + "scan": 11, + "state": 129 + }, + { + "group": 0, + "letter": "\u0300", + "scan": 12, + "state": 129 + }, + { + "group": 0, + "letter": "\u0300", + "scan": 12, + "state": 129 + }, + { + "group": 0, + "letter": "\u0301", + "scan": 13, + "state": 129 + }, + { + "group": 0, + "letter": "\u0301", + "scan": 13, + "state": 129 + }, + { + "group": 0, + "letter": "\u0306", + "scan": 14, + "state": 129 + }, + { + "group": 0, + "letter": "\u0306", + "scan": 14, + "state": 129 + }, + { + "group": 0, + "letter": "\u030a", + "scan": 15, + "state": 129 + }, + { + "group": 0, + "letter": "\u030a", + "scan": 15, + "state": 129 + }, + { + "group": 0, + "letter": "\u0302", + "scan": 16, + "state": 129 + }, + { + "group": 0, + "letter": "\u0302", + "scan": 16, + "state": 129 + }, + { + "group": 0, + "letter": "\u030c", + "scan": 17, + "state": 129 + }, + { + "group": 0, + "letter": "\u030c", + "scan": 17, + "state": 129 + }, + { + "group": 0, + "letter": "\u0307", + "scan": 18, + "state": 129 + }, + { + "group": 0, + "letter": "\u0307", + "scan": 18, + "state": 129 + }, + { + "group": 0, + "letter": "\u0308", + "scan": 19, + "state": 129 + }, + { + "group": 0, + "letter": "\u0308", + "scan": 19, + "state": 129 + }, + { + "group": 0, + "letter": "\u0304", + "scan": 20, + "state": 129 + }, + { + "group": 0, + "letter": "\u0304", + "scan": 20, + "state": 129 + }, + { + "group": 0, + "letter": "\u0303", + "scan": 21, + "state": 129 + }, + { + "group": 0, + "letter": "\u0303", + "scan": 21, + "state": 129 + }, + { + "group": 0, + "letter": "\u03a9", + "scan": 24, + "state": 129 + }, + { + "group": 0, + "letter": "\u03a9", + "scan": 24, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d8", + "scan": 25, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d8", + "scan": 25, + "state": 129 + }, + { + "group": 0, + "letter": "\u0152", + "scan": 26, + "state": 129 + }, + { + "group": 0, + "letter": "\u0152", + "scan": 26, + "state": 129 + }, + { + "group": 0, + "letter": "\u0327", + "scan": 27, + "state": 129 + }, + { + "group": 0, + "letter": "\u0327", + "scan": 27, + "state": 129 + }, + { + "group": 0, + "letter": "\u032e", + "scan": 28, + "state": 129 + }, + { + "group": 0, + "letter": "\u032e", + "scan": 28, + "state": 129 + }, + { + "group": 0, + "letter": "\u0325", + "scan": 29, + "state": 129 + }, + { + "group": 0, + "letter": "\u0325", + "scan": 29, + "state": 129 + }, + { + "group": 0, + "letter": "\u032d", + "scan": 30, + "state": 129 + }, + { + "group": 0, + "letter": "\u032d", + "scan": 30, + "state": 129 + }, + { + "group": 0, + "letter": "\u032c", + "scan": 31, + "state": 129 + }, + { + "group": 0, + "letter": "\u032c", + "scan": 31, + "state": 129 + }, + { + "group": 0, + "letter": "\u0323", + "scan": 32, + "state": 129 + }, + { + "group": 0, + "letter": "\u0323", + "scan": 32, + "state": 129 + }, + { + "group": 0, + "letter": "\u0324", + "scan": 33, + "state": 129 + }, + { + "group": 0, + "letter": "\u0324", + "scan": 33, + "state": 129 + }, + { + "group": 0, + "letter": "\u0331", + "scan": 34, + "state": 129 + }, + { + "group": 0, + "letter": "\u0331", + "scan": 34, + "state": 129 + }, + { + "group": 0, + "letter": "\u0330", + "scan": 35, + "state": 129 + }, + { + "group": 0, + "letter": "\u0330", + "scan": 35, + "state": 129 + }, + { + "group": 0, + "letter": "\u00c6", + "scan": 38, + "state": 129 + }, + { + "group": 0, + "letter": "\u00c6", + "scan": 38, + "state": 129 + }, + { + "group": 0, + "letter": "\u1e9c", + "scan": 39, + "state": 129 + }, + { + "group": 0, + "letter": "\u1e9c", + "scan": 39, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d0", + "scan": 40, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d0", + "scan": 40, + "state": 129 + }, + { + "group": 0, + "letter": "\u00de", + "scan": 41, + "state": 129 + }, + { + "group": 0, + "letter": "\u00de", + "scan": 41, + "state": 129 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 129 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a3", + "scan": 43, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a3", + "scan": 43, + "state": 129 + }, + { + "group": 0, + "letter": "\u20ac", + "scan": 44, + "state": 129 + }, + { + "group": 0, + "letter": "\u20ac", + "scan": 44, + "state": 129 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 129 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 129 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 129 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 129 + }, + { + "group": 0, + "letter": "\u00aa", + "scan": 47, + "state": 129 + }, + { + "group": 0, + "letter": "\u00aa", + "scan": 47, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a4", + "scan": 48, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a4", + "scan": 48, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a7", + "scan": 51, + "state": 129 + }, + { + "group": 0, + "letter": "\u00a7", + "scan": 51, + "state": 129 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 129 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 129 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 129 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 129 + }, + { + "group": 0, + "letter": "\u00c7", + "scan": 54, + "state": 129 + }, + { + "group": 0, + "letter": "\u00c7", + "scan": 54, + "state": 129 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 129 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 129 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 129 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d1", + "scan": 57, + "state": 129 + }, + { + "group": 0, + "letter": "\u00d1", + "scan": 57, + "state": 129 + }, + { + "group": 0, + "letter": "\u00b5", + "scan": 58, + "state": 129 + }, + { + "group": 0, + "letter": "\u00b5", + "scan": 58, + "state": 129 + }, + { + "group": 0, + "letter": "\u00ab", + "scan": 59, + "state": 129 + }, + { + "group": 0, + "letter": "\u00ab", + "scan": 59, + "state": 129 + }, + { + "group": 0, + "letter": "\u00bb", + "scan": 60, + "state": 129 + }, + { + "group": 0, + "letter": "\u00bb", + "scan": 60, + "state": 129 + }, + { + "group": 0, + "letter": "\u00bf", + "scan": 61, + "state": 129 + }, + { + "group": 0, + "letter": "\u00bf", + "scan": 61, + "state": 129 + } +] \ No newline at end of file diff --git a/lessons/ne_NP/ne_NP.key b/lessons/ne_NP/ne_NP.key new file mode 100644 index 0000000..4dc84da --- /dev/null +++ b/lessons/ne_NP/ne_NP.key @@ -0,0 +1,2282 @@ +[ + { + "group": 0, + "letter": "`", + "scan": 49, + "state": 0 + }, + { + "group": 0, + "letter": "`", + "scan": 49, + "state": 0 + }, + { + "group": 0, + "letter": "1", + "scan": 10, + "state": 0 + }, + { + "group": 0, + "letter": "1", + "scan": 10, + "state": 0 + }, + { + "group": 0, + "letter": "2", + "scan": 11, + "state": 0 + }, + { + "group": 0, + "letter": "2", + "scan": 11, + "state": 0 + }, + { + "group": 0, + "letter": "3", + "scan": 12, + "state": 0 + }, + { + "group": 0, + "letter": "3", + "scan": 12, + "state": 0 + }, + { + "group": 0, + "letter": "4", + "scan": 13, + "state": 0 + }, + { + "group": 0, + "letter": "4", + "scan": 13, + "state": 0 + }, + { + "group": 0, + "letter": "5", + "scan": 14, + "state": 0 + }, + { + "group": 0, + "letter": "5", + "scan": 14, + "state": 0 + }, + { + "group": 0, + "letter": "6", + "scan": 15, + "state": 0 + }, + { + "group": 0, + "letter": "6", + "scan": 15, + "state": 0 + }, + { + "group": 0, + "letter": "7", + "scan": 16, + "state": 0 + }, + { + "group": 0, + "letter": "7", + "scan": 16, + "state": 0 + }, + { + "group": 0, + "letter": "8", + "scan": 17, + "state": 0 + }, + { + "group": 0, + "letter": "8", + "scan": 17, + "state": 0 + }, + { + "group": 0, + "letter": "9", + "scan": 18, + "state": 0 + }, + { + "group": 0, + "letter": "9", + "scan": 18, + "state": 0 + }, + { + "group": 0, + "letter": "0", + "scan": 19, + "state": 0 + }, + { + "group": 0, + "letter": "0", + "scan": 19, + "state": 0 + }, + { + "group": 0, + "letter": "-", + "scan": 20, + "state": 0 + }, + { + "group": 0, + "letter": "-", + "scan": 20, + "state": 0 + }, + { + "group": 0, + "letter": "=", + "scan": 21, + "state": 0 + }, + { + "group": 0, + "letter": "=", + "scan": 21, + "state": 0 + }, + { + "group": 0, + "letter": "q", + "scan": 24, + "state": 0 + }, + { + "group": 0, + "letter": "q", + "scan": 24, + "state": 0 + }, + { + "group": 0, + "letter": "w", + "scan": 25, + "state": 0 + }, + { + "group": 0, + "letter": "w", + "scan": 25, + "state": 0 + }, + { + "group": 0, + "letter": "e", + "scan": 26, + "state": 0 + }, + { + "group": 0, + "letter": "e", + "scan": 26, + "state": 0 + }, + { + "group": 0, + "letter": "r", + "scan": 27, + "state": 0 + }, + { + "group": 0, + "letter": "r", + "scan": 27, + "state": 0 + }, + { + "group": 0, + "letter": "t", + "scan": 28, + "state": 0 + }, + { + "group": 0, + "letter": "t", + "scan": 28, + "state": 0 + }, + { + "group": 0, + "letter": "y", + "scan": 29, + "state": 0 + }, + { + "group": 0, + "letter": "y", + "scan": 29, + "state": 0 + }, + { + "group": 0, + "letter": "u", + "scan": 30, + "state": 0 + }, + { + "group": 0, + "letter": "u", + "scan": 30, + "state": 0 + }, + { + "group": 0, + "letter": "i", + "scan": 31, + "state": 0 + }, + { + "group": 0, + "letter": "i", + "scan": 31, + "state": 0 + }, + { + "group": 0, + "letter": "o", + "scan": 32, + "state": 0 + }, + { + "group": 0, + "letter": "o", + "scan": 32, + "state": 0 + }, + { + "group": 0, + "letter": "p", + "scan": 33, + "state": 0 + }, + { + "group": 0, + "letter": "p", + "scan": 33, + "state": 0 + }, + { + "group": 0, + "letter": "[", + "scan": 34, + "state": 0 + }, + { + "group": 0, + "letter": "[", + "scan": 34, + "state": 0 + }, + { + "group": 0, + "letter": "]", + "scan": 35, + "state": 0 + }, + { + "group": 0, + "letter": "]", + "scan": 35, + "state": 0 + }, + { + "group": 0, + "letter": "a", + "scan": 38, + "state": 0 + }, + { + "group": 0, + "letter": "a", + "scan": 38, + "state": 0 + }, + { + "group": 0, + "letter": "s", + "scan": 39, + "state": 0 + }, + { + "group": 0, + "letter": "s", + "scan": 39, + "state": 0 + }, + { + "group": 0, + "letter": "d", + "scan": 40, + "state": 0 + }, + { + "group": 0, + "letter": "d", + "scan": 40, + "state": 0 + }, + { + "group": 0, + "letter": "f", + "scan": 41, + "state": 0 + }, + { + "group": 0, + "letter": "f", + "scan": 41, + "state": 0 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 0 + }, + { + "group": 0, + "letter": "g", + "scan": 42, + "state": 0 + }, + { + "group": 0, + "letter": "h", + "scan": 43, + "state": 0 + }, + { + "group": 0, + "letter": "h", + "scan": 43, + "state": 0 + }, + { + "group": 0, + "letter": "j", + "scan": 44, + "state": 0 + }, + { + "group": 0, + "letter": "j", + "scan": 44, + "state": 0 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 0 + }, + { + "group": 0, + "letter": "k", + "scan": 45, + "state": 0 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 0 + }, + { + "group": 0, + "letter": "l", + "scan": 46, + "state": 0 + }, + { + "group": 0, + "letter": ";", + "scan": 47, + "state": 0 + }, + { + "group": 0, + "letter": ";", + "scan": 47, + "state": 0 + }, + { + "group": 0, + "letter": "'", + "scan": 48, + "state": 0 + }, + { + "group": 0, + "letter": "'", + "scan": 48, + "state": 0 + }, + { + "group": 0, + "letter": "\\", + "scan": 51, + "state": 0 + }, + { + "group": 0, + "letter": "\\", + "scan": 51, + "state": 0 + }, + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 0 + }, + { + "group": 0, + "letter": "z", + "scan": 52, + "state": 0 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 0 + }, + { + "group": 0, + "letter": "x", + "scan": 53, + "state": 0 + }, + { + "group": 0, + "letter": "c", + "scan": 54, + "state": 0 + }, + { + "group": 0, + "letter": "c", + "scan": 54, + "state": 0 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 0 + }, + { + "group": 0, + "letter": "v", + "scan": 55, + "state": 0 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 0 + }, + { + "group": 0, + "letter": "b", + "scan": 56, + "state": 0 + }, + { + "group": 0, + "letter": "n", + "scan": 57, + "state": 0 + }, + { + "group": 0, + "letter": "n", + "scan": 57, + "state": 0 + }, + { + "group": 0, + "letter": "m", + "scan": 58, + "state": 0 + }, + { + "group": 0, + "letter": "m", + "scan": 58, + "state": 0 + }, + { + "group": 0, + "letter": ",", + "scan": 59, + "state": 0 + }, + { + "group": 0, + "letter": ",", + "scan": 59, + "state": 0 + }, + { + "group": 0, + "letter": ".", + "scan": 60, + "state": 0 + }, + { + "group": 0, + "letter": ".", + "scan": 60, + "state": 0 + }, + { + "group": 0, + "letter": "/", + "scan": 61, + "state": 0 + }, + { + "group": 0, + "letter": "/", + "scan": 61, + "state": 0 + }, + { + "group": 0, + "letter": "~", + "scan": 49, + "state": 1 + }, + { + "group": 0, + "letter": "~", + "scan": 49, + "state": 1 + }, + { + "group": 0, + "letter": "!", + "scan": 10, + "state": 1 + }, + { + "group": 0, + "letter": "!", + "scan": 10, + "state": 1 + }, + { + "group": 0, + "letter": "@", + "scan": 11, + "state": 1 + }, + { + "group": 0, + "letter": "@", + "scan": 11, + "state": 1 + }, + { + "group": 0, + "letter": "#", + "scan": 12, + "state": 1 + }, + { + "group": 0, + "letter": "#", + "scan": 12, + "state": 1 + }, + { + "group": 0, + "letter": "$", + "scan": 13, + "state": 1 + }, + { + "group": 0, + "letter": "$", + "scan": 13, + "state": 1 + }, + { + "group": 0, + "letter": "%", + "scan": 14, + "state": 1 + }, + { + "group": 0, + "letter": "%", + "scan": 14, + "state": 1 + }, + { + "group": 0, + "letter": "^", + "scan": 15, + "state": 1 + }, + { + "group": 0, + "letter": "^", + "scan": 15, + "state": 1 + }, + { + "group": 0, + "letter": "&", + "scan": 16, + "state": 1 + }, + { + "group": 0, + "letter": "&", + "scan": 16, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": ")", + "scan": 19, + "state": 1 + }, + { + "group": 0, + "letter": ")", + "scan": 19, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": "*", + "scan": 17, + "state": 1 + }, + { + "group": 0, + "letter": "(", + "scan": 18, + "state": 1 + }, + { + "group": 0, + "letter": "(", + "scan": 18, + "state": 1 + }, + { + "group": 0, + "letter": "_", + "scan": 20, + "state": 1 + }, + { + "group": 0, + "letter": "_", + "scan": 20, + "state": 1 + }, + { + "group": 0, + "letter": "+", + "scan": 21, + "state": 1 + }, + { + "group": 0, + "letter": "+", + "scan": 21, + "state": 1 + }, + { + "group": 0, + "letter": "Q", + "scan": 24, + "state": 1 + }, + { + "group": 0, + "letter": "Q", + "scan": 24, + "state": 1 + }, + { + "group": 0, + "letter": "W", + "scan": 25, + "state": 1 + }, + { + "group": 0, + "letter": "W", + "scan": 25, + "state": 1 + }, + { + "group": 0, + "letter": "E", + "scan": 26, + "state": 1 + }, + { + "group": 0, + "letter": "E", + "scan": 26, + "state": 1 + }, + { + "group": 0, + "letter": "R", + "scan": 27, + "state": 1 + }, + { + "group": 0, + "letter": "R", + "scan": 27, + "state": 1 + }, + { + "group": 0, + "letter": "T", + "scan": 28, + "state": 1 + }, + { + "group": 0, + "letter": "T", + "scan": 28, + "state": 1 + }, + { + "group": 0, + "letter": "Y", + "scan": 29, + "state": 1 + }, + { + "group": 0, + "letter": "Y", + "scan": 29, + "state": 1 + }, + { + "group": 0, + "letter": "U", + "scan": 30, + "state": 1 + }, + { + "group": 0, + "letter": "U", + "scan": 30, + "state": 1 + }, + { + "group": 0, + "letter": "I", + "scan": 31, + "state": 1 + }, + { + "group": 0, + "letter": "I", + "scan": 31, + "state": 1 + }, + { + "group": 0, + "letter": "O", + "scan": 32, + "state": 1 + }, + { + "group": 0, + "letter": "O", + "scan": 32, + "state": 1 + }, + { + "group": 0, + "letter": "P", + "scan": 33, + "state": 1 + }, + { + "group": 0, + "letter": "P", + "scan": 33, + "state": 1 + }, + { + "group": 0, + "letter": "{", + "scan": 34, + "state": 1 + }, + { + "group": 0, + "letter": "{", + "scan": 34, + "state": 1 + }, + { + "group": 0, + "letter": "}", + "scan": 35, + "state": 1 + }, + { + "group": 0, + "letter": "}", + "scan": 35, + "state": 1 + }, + { + "group": 0, + "letter": "A", + "scan": 38, + "state": 1 + }, + { + "group": 0, + "letter": "A", + "scan": 38, + "state": 1 + }, + { + "group": 0, + "letter": "S", + "scan": 39, + "state": 1 + }, + { + "group": 0, + "letter": "S", + "scan": 39, + "state": 1 + }, + { + "group": 0, + "letter": "D", + "scan": 40, + "state": 1 + }, + { + "group": 0, + "letter": "D", + "scan": 40, + "state": 1 + }, + { + "group": 0, + "letter": "F", + "scan": 41, + "state": 1 + }, + { + "group": 0, + "letter": "F", + "scan": 41, + "state": 1 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 1 + }, + { + "group": 0, + "letter": "G", + "scan": 42, + "state": 1 + }, + { + "group": 0, + "letter": "H", + "scan": 43, + "state": 1 + }, + { + "group": 0, + "letter": "H", + "scan": 43, + "state": 1 + }, + { + "group": 0, + "letter": "J", + "scan": 44, + "state": 1 + }, + { + "group": 0, + "letter": "J", + "scan": 44, + "state": 1 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 1 + }, + { + "group": 0, + "letter": "K", + "scan": 45, + "state": 1 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 1 + }, + { + "group": 0, + "letter": "L", + "scan": 46, + "state": 1 + }, + { + "group": 0, + "letter": ":", + "scan": 47, + "state": 1 + }, + { + "group": 0, + "letter": ":", + "scan": 47, + "state": 1 + }, + { + "group": 0, + "letter": "\"", + "scan": 48, + "state": 1 + }, + { + "group": 0, + "letter": "\"", + "scan": 48, + "state": 1 + }, + { + "group": 0, + "letter": "|", + "scan": 51, + "state": 1 + }, + { + "group": 0, + "letter": "|", + "scan": 51, + "state": 1 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 1 + }, + { + "group": 0, + "letter": "Z", + "scan": 52, + "state": 1 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 1 + }, + { + "group": 0, + "letter": "X", + "scan": 53, + "state": 1 + }, + { + "group": 0, + "letter": "C", + "scan": 54, + "state": 1 + }, + { + "group": 0, + "letter": "C", + "scan": 54, + "state": 1 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 1 + }, + { + "group": 0, + "letter": "V", + "scan": 55, + "state": 1 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 1 + }, + { + "group": 0, + "letter": "B", + "scan": 56, + "state": 1 + }, + { + "group": 0, + "letter": "N", + "scan": 57, + "state": 1 + }, + { + "group": 0, + "letter": "N", + "scan": 57, + "state": 1 + }, + { + "group": 0, + "letter": "M", + "scan": 58, + "state": 1 + }, + { + "group": 0, + "letter": "M", + "scan": 58, + "state": 1 + }, + { + "group": 0, + "letter": "<", + "scan": 59, + "state": 1 + }, + { + "group": 0, + "letter": "<", + "scan": 59, + "state": 1 + }, + { + "group": 0, + "letter": ">", + "scan": 60, + "state": 1 + }, + { + "group": 0, + "letter": ">", + "scan": 60, + "state": 1 + }, + { + "group": 0, + "letter": "?", + "scan": 61, + "state": 1 + }, + { + "group": 0, + "letter": "?", + "scan": 61, + "state": 1 + }, + { + "group": 1, + "letter": "\u091e", + "scan": 49, + "state": 0 + }, + { + "group": 1, + "letter": "\u091e", + "scan": 49, + "state": 0 + }, + { + "group": 1, + "letter": "\u0967", + "scan": 10, + "state": 0 + }, + { + "group": 1, + "letter": "\u0967", + "scan": 10, + "state": 0 + }, + { + "group": 1, + "letter": "\u0968", + "scan": 11, + "state": 0 + }, + { + "group": 1, + "letter": "\u0968", + "scan": 11, + "state": 0 + }, + { + "group": 1, + "letter": "\u0969", + "scan": 12, + "state": 0 + }, + { + "group": 1, + "letter": "\u0969", + "scan": 12, + "state": 0 + }, + { + "group": 1, + "letter": "\u096a", + "scan": 13, + "state": 0 + }, + { + "group": 1, + "letter": "\u096a", + "scan": 13, + "state": 0 + }, + { + "group": 1, + "letter": "\u096b", + "scan": 14, + "state": 0 + }, + { + "group": 1, + "letter": "\u096b", + "scan": 14, + "state": 0 + }, + { + "group": 1, + "letter": "\u096c", + "scan": 15, + "state": 0 + }, + { + "group": 1, + "letter": "\u096c", + "scan": 15, + "state": 0 + }, + { + "group": 1, + "letter": "\u096d", + "scan": 16, + "state": 0 + }, + { + "group": 1, + "letter": "\u096d", + "scan": 16, + "state": 0 + }, + { + "group": 1, + "letter": "\u096e", + "scan": 17, + "state": 0 + }, + { + "group": 1, + "letter": "\u096e", + "scan": 17, + "state": 0 + }, + { + "group": 1, + "letter": "\u096f", + "scan": 18, + "state": 0 + }, + { + "group": 1, + "letter": "\u096f", + "scan": 18, + "state": 0 + }, + { + "group": 1, + "letter": "\u0966", + "scan": 19, + "state": 0 + }, + { + "group": 1, + "letter": "\u0966", + "scan": 19, + "state": 0 + }, + { + "group": 1, + "letter": "\u0913", + "scan": 20, + "state": 0 + }, + { + "group": 1, + "letter": "\u0913", + "scan": 20, + "state": 0 + }, + { + "group": 1, + "letter": "\u200c", + "scan": 21, + "state": 0 + }, + { + "group": 1, + "letter": "\u200c", + "scan": 21, + "state": 0 + }, + { + "group": 1, + "letter": "\udbbf\udffb", + "scan": 24, + "state": 0 + }, + { + "group": 1, + "letter": "\udbbf\udffb", + "scan": 24, + "state": 0 + }, + { + "group": 1, + "letter": "\u0927", + "scan": 25, + "state": 0 + }, + { + "group": 1, + "letter": "\u0927", + "scan": 25, + "state": 0 + }, + { + "group": 1, + "letter": "\u092d", + "scan": 26, + "state": 0 + }, + { + "group": 1, + "letter": "\u092d", + "scan": 26, + "state": 0 + }, + { + "group": 1, + "letter": "\u091a", + "scan": 27, + "state": 0 + }, + { + "group": 1, + "letter": "\u091a", + "scan": 27, + "state": 0 + }, + { + "group": 1, + "letter": "\u0924", + "scan": 28, + "state": 0 + }, + { + "group": 1, + "letter": "\u0924", + "scan": 28, + "state": 0 + }, + { + "group": 1, + "letter": "\u0925", + "scan": 29, + "state": 0 + }, + { + "group": 1, + "letter": "\u0925", + "scan": 29, + "state": 0 + }, + { + "group": 1, + "letter": "\u0917", + "scan": 30, + "state": 0 + }, + { + "group": 1, + "letter": "\u0917", + "scan": 30, + "state": 0 + }, + { + "group": 1, + "letter": "\u0937", + "scan": 31, + "state": 0 + }, + { + "group": 1, + "letter": "\u0937", + "scan": 31, + "state": 0 + }, + { + "group": 1, + "letter": "\u092f", + "scan": 32, + "state": 0 + }, + { + "group": 1, + "letter": "\u092f", + "scan": 32, + "state": 0 + }, + { + "group": 1, + "letter": "\u0909", + "scan": 33, + "state": 0 + }, + { + "group": 1, + "letter": "\u0909", + "scan": 33, + "state": 0 + }, + { + "group": 1, + "letter": "\udbbf\udff4", + "scan": 34, + "state": 0 + }, + { + "group": 1, + "letter": "\udbbf\udff4", + "scan": 34, + "state": 0 + }, + { + "group": 1, + "letter": "\u0947", + "scan": 35, + "state": 0 + }, + { + "group": 1, + "letter": "\u0947", + "scan": 35, + "state": 0 + }, + { + "group": 1, + "letter": "\u092c", + "scan": 38, + "state": 0 + }, + { + "group": 1, + "letter": "\u092c", + "scan": 38, + "state": 0 + }, + { + "group": 1, + "letter": "\u0915", + "scan": 39, + "state": 0 + }, + { + "group": 1, + "letter": "\u0915", + "scan": 39, + "state": 0 + }, + { + "group": 1, + "letter": "\u092e", + "scan": 40, + "state": 0 + }, + { + "group": 1, + "letter": "\u092e", + "scan": 40, + "state": 0 + }, + { + "group": 1, + "letter": "\u0901", + "scan": 41, + "state": 0 + }, + { + "group": 1, + "letter": "\u0901", + "scan": 41, + "state": 0 + }, + { + "group": 1, + "letter": "\u0928", + "scan": 42, + "state": 0 + }, + { + "group": 1, + "letter": "\u0928", + "scan": 42, + "state": 0 + }, + { + "group": 1, + "letter": "\u091c", + "scan": 43, + "state": 0 + }, + { + "group": 1, + "letter": "\u091c", + "scan": 43, + "state": 0 + }, + { + "group": 1, + "letter": "\u0935", + "scan": 44, + "state": 0 + }, + { + "group": 1, + "letter": "\u0935", + "scan": 44, + "state": 0 + }, + { + "group": 1, + "letter": "\u092a", + "scan": 45, + "state": 0 + }, + { + "group": 1, + "letter": "\u092a", + "scan": 45, + "state": 0 + }, + { + "group": 1, + "letter": "\u093f", + "scan": 46, + "state": 0 + }, + { + "group": 1, + "letter": "\u093f", + "scan": 46, + "state": 0 + }, + { + "group": 1, + "letter": "\u0938", + "scan": 47, + "state": 0 + }, + { + "group": 1, + "letter": "\u0938", + "scan": 47, + "state": 0 + }, + { + "group": 1, + "letter": "\u0941", + "scan": 48, + "state": 0 + }, + { + "group": 1, + "letter": "\u0941", + "scan": 48, + "state": 0 + }, + { + "group": 1, + "letter": "\u094d", + "scan": 51, + "state": 0 + }, + { + "group": 1, + "letter": "\u094d", + "scan": 51, + "state": 0 + }, + { + "group": 1, + "letter": "\u0936", + "scan": 52, + "state": 0 + }, + { + "group": 1, + "letter": "\u0936", + "scan": 52, + "state": 0 + }, + { + "group": 1, + "letter": "\u0939", + "scan": 53, + "state": 0 + }, + { + "group": 1, + "letter": "\u0939", + "scan": 53, + "state": 0 + }, + { + "group": 1, + "letter": "\u0905", + "scan": 54, + "state": 0 + }, + { + "group": 1, + "letter": "\u0905", + "scan": 54, + "state": 0 + }, + { + "group": 1, + "letter": "\u0916", + "scan": 55, + "state": 0 + }, + { + "group": 1, + "letter": "\u0916", + "scan": 55, + "state": 0 + }, + { + "group": 1, + "letter": "\u0926", + "scan": 56, + "state": 0 + }, + { + "group": 1, + "letter": "\u0926", + "scan": 56, + "state": 0 + }, + { + "group": 1, + "letter": "\u0932", + "scan": 57, + "state": 0 + }, + { + "group": 1, + "letter": "\u0932", + "scan": 57, + "state": 0 + }, + { + "group": 1, + "letter": "\u0903", + "scan": 58, + "state": 0 + }, + { + "group": 1, + "letter": "\u0903", + "scan": 58, + "state": 0 + }, + { + "group": 1, + "letter": "\u093d", + "scan": 59, + "state": 0 + }, + { + "group": 1, + "letter": "\u093d", + "scan": 59, + "state": 0 + }, + { + "group": 1, + "letter": "\u0964", + "scan": 60, + "state": 0 + }, + { + "group": 1, + "letter": "\u0964", + "scan": 60, + "state": 0 + }, + { + "group": 1, + "letter": "\u0930", + "scan": 61, + "state": 0 + }, + { + "group": 1, + "letter": "\u0930", + "scan": 61, + "state": 0 + }, + { + "group": 1, + "letter": "\u0965", + "scan": 49, + "state": 1 + }, + { + "group": 1, + "letter": "\u0965", + "scan": 49, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffd", + "scan": 10, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffd", + "scan": 10, + "state": 1 + }, + { + "group": 1, + "letter": "\u0908", + "scan": 11, + "state": 1 + }, + { + "group": 1, + "letter": "\u0908", + "scan": 11, + "state": 1 + }, + { + "group": 1, + "letter": "\u0918", + "scan": 12, + "state": 1 + }, + { + "group": 1, + "letter": "\u0918", + "scan": 12, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffc", + "scan": 13, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffc", + "scan": 13, + "state": 1 + }, + { + "group": 1, + "letter": "\u091b", + "scan": 14, + "state": 1 + }, + { + "group": 1, + "letter": "\u091b", + "scan": 14, + "state": 1 + }, + { + "group": 1, + "letter": "\u091f", + "scan": 15, + "state": 1 + }, + { + "group": 1, + "letter": "\u091f", + "scan": 15, + "state": 1 + }, + { + "group": 1, + "letter": "\u0920", + "scan": 16, + "state": 1 + }, + { + "group": 1, + "letter": "\u0920", + "scan": 16, + "state": 1 + }, + { + "group": 1, + "letter": "\u0921", + "scan": 17, + "state": 1 + }, + { + "group": 1, + "letter": "\u0921", + "scan": 17, + "state": 1 + }, + { + "group": 1, + "letter": "\u0922", + "scan": 18, + "state": 1 + }, + { + "group": 1, + "letter": "\u0922", + "scan": 18, + "state": 1 + }, + { + "group": 1, + "letter": "\u0923", + "scan": 19, + "state": 1 + }, + { + "group": 1, + "letter": "\u0923", + "scan": 19, + "state": 1 + }, + { + "group": 1, + "letter": "\u0914", + "scan": 20, + "state": 1 + }, + { + "group": 1, + "letter": "\u0914", + "scan": 20, + "state": 1 + }, + { + "group": 1, + "letter": "\u0902", + "scan": 21, + "state": 1 + }, + { + "group": 1, + "letter": "\u0902", + "scan": 21, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffa", + "scan": 24, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udffa", + "scan": 24, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff9", + "scan": 25, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff9", + "scan": 25, + "state": 1 + }, + { + "group": 1, + "letter": "\u0910", + "scan": 26, + "state": 1 + }, + { + "group": 1, + "letter": "\u0910", + "scan": 26, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff8", + "scan": 27, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff8", + "scan": 27, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff7", + "scan": 28, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff7", + "scan": 28, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff6", + "scan": 29, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff6", + "scan": 29, + "state": 1 + }, + { + "group": 1, + "letter": "\u090a", + "scan": 30, + "state": 1 + }, + { + "group": 1, + "letter": "\u090a", + "scan": 30, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff5", + "scan": 31, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff5", + "scan": 31, + "state": 1 + }, + { + "group": 1, + "letter": "\u0907", + "scan": 32, + "state": 1 + }, + { + "group": 1, + "letter": "\u0907", + "scan": 32, + "state": 1 + }, + { + "group": 1, + "letter": "\u090f", + "scan": 33, + "state": 1 + }, + { + "group": 1, + "letter": "\u090f", + "scan": 33, + "state": 1 + }, + { + "group": 1, + "letter": "\u0943", + "scan": 34, + "state": 1 + }, + { + "group": 1, + "letter": "\u0943", + "scan": 34, + "state": 1 + }, + { + "group": 1, + "letter": "\u0948", + "scan": 35, + "state": 1 + }, + { + "group": 1, + "letter": "\u0948", + "scan": 35, + "state": 1 + }, + { + "group": 1, + "letter": "\u0906", + "scan": 38, + "state": 1 + }, + { + "group": 1, + "letter": "\u0906", + "scan": 38, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff3", + "scan": 39, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff3", + "scan": 39, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff2", + "scan": 40, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff2", + "scan": 40, + "state": 1 + }, + { + "group": 1, + "letter": "\u093e", + "scan": 41, + "state": 1 + }, + { + "group": 1, + "letter": "\u093e", + "scan": 41, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff1", + "scan": 42, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff1", + "scan": 42, + "state": 1 + }, + { + "group": 1, + "letter": "\u091d", + "scan": 43, + "state": 1 + }, + { + "group": 1, + "letter": "\u091d", + "scan": 43, + "state": 1 + }, + { + "group": 1, + "letter": "\u094b", + "scan": 44, + "state": 1 + }, + { + "group": 1, + "letter": "\u094b", + "scan": 44, + "state": 1 + }, + { + "group": 1, + "letter": "\u092b", + "scan": 45, + "state": 1 + }, + { + "group": 1, + "letter": "\u092b", + "scan": 45, + "state": 1 + }, + { + "group": 1, + "letter": "\u0940", + "scan": 46, + "state": 1 + }, + { + "group": 1, + "letter": "\u0940", + "scan": 46, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff0", + "scan": 47, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udff0", + "scan": 47, + "state": 1 + }, + { + "group": 1, + "letter": "\u0942", + "scan": 48, + "state": 1 + }, + { + "group": 1, + "letter": "\u0942", + "scan": 48, + "state": 1 + }, + { + "group": 1, + "letter": "\u200d", + "scan": 51, + "state": 1 + }, + { + "group": 1, + "letter": "\u200d", + "scan": 51, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfef", + "scan": 52, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfef", + "scan": 52, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfee", + "scan": 53, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfee", + "scan": 53, + "state": 1 + }, + { + "group": 1, + "letter": "\u090b", + "scan": 54, + "state": 1 + }, + { + "group": 1, + "letter": "\u090b", + "scan": 54, + "state": 1 + }, + { + "group": 1, + "letter": "\u0950", + "scan": 55, + "state": 1 + }, + { + "group": 1, + "letter": "\u0950", + "scan": 55, + "state": 1 + }, + { + "group": 1, + "letter": "\u094c", + "scan": 56, + "state": 1 + }, + { + "group": 1, + "letter": "\u094c", + "scan": 56, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfed", + "scan": 57, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfed", + "scan": 57, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfec", + "scan": 58, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfec", + "scan": 58, + "state": 1 + }, + { + "group": 1, + "letter": "\u0919", + "scan": 59, + "state": 1 + }, + { + "group": 1, + "letter": "\u0919", + "scan": 59, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfeb", + "scan": 60, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfeb", + "scan": 60, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfea", + "scan": 61, + "state": 1 + }, + { + "group": 1, + "letter": "\udbbf\udfea", + "scan": 61, + "state": 1 + }, + { + "group": 1, + "letter": "\u200c", + "scan": 21, + "state": 0 + }, + { + "group": 1, + "letter": "\u200c", + "scan": 21, + "state": 0 + } +] \ No newline at end of file diff --git a/lessonscreen.py b/lessonscreen.py index 33b15eb..4e52579 100644 --- a/lessonscreen.py +++ b/lessonscreen.py @@ -127,6 +127,9 @@ class LessonScreen(gtk.VBox): self.keyboard = keyboard.KeyboardWidget(self.keyboard_images, self.activity) self.keyboard.set_layout(keyboard.OLPC_LAYOUT) + code = locale.getdefaultlocale()[0] + self.keyboard.load_key_map('lessons/%s/%s.key' % (code, code)) + self.pack_start(hbox, False, False, 10) self.pack_start(frame, True, True) self.pack_start(self.keyboard, False) @@ -359,8 +362,9 @@ class LessonScreen(gtk.VBox): return True # Extract information about the key pressed. - key = gtk.gdk.keyval_to_unicode(event.keyval) - if key != 0: key = unichr(key) + key = event.string + #key = gtk.gdk.keyval_to_unicode(event.keyval) + #if key != 0: key = unichr(key) key_name = gtk.gdk.keyval_name(event.keyval) # Convert Return keys to paragraph symbols. diff --git a/mainscreen.py b/mainscreen.py index c459ac4..1646b00 100644 --- a/mainscreen.py +++ b/mainscreen.py @@ -91,7 +91,7 @@ class MainScreen(gtk.VBox): # Load all the keyboard images. width = int(gtk.gdk.screen_width()) - height = int(gtk.gdk.screen_height()*0.4) + height = int(gtk.gdk.screen_height()*0.3) self.keyboard_images = keyboard.KeyboardImages(width, height) self.keyboard_images.load_images() -- cgit v0.9.1