diff --git a/examples/eekxml/mim2remap b/examples/eekxml/mim2remap deleted file mode 100755 index 36e1377a..00000000 --- a/examples/eekxml/mim2remap +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2011 Daiki Ueno -# Copyright (C) 2011 Red Hat, Inc. - -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License -# as published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. - -# This library 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 -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 USA - -import json -from gi.repository import Gdk -import sys, os.path, re - -class MapFile(object): - MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*(?:"(.*?)"|\?(.*?))\)') - - def __init__(self, path): - self.__dict = dict() - - with open(path, 'r') as fp: - for line in fp: - match = re.match(self.MAPENTRY_PATTERN, line) - if match: - if match.group(1): - keyseq = re.sub(r'\\(.)', r'\1', match.group(1)) - # should check G-* and A-* - else: - keyseq = re.sub(r'\\(.)', r'\1', match.group(2)) - # combination of keys is not supported - if len(keyseq) > 1: - continue - try: - keyval = Gdk.unicode_to_keyval(ord(keyseq)) - keyseq = Gdk.keyval_name(keyval) - except: - pass - if match.group(3): - insert = match.group(3).decode('UTF-8') - else: - insert = match.group(4).decode('UTF-8') - replace = {} - if len(insert) > 1: - replace = { 'name': insert, - 'label': insert } - else: - try: - keyval = Gdk.unicode_to_keyval(ord(insert)) - name = Gdk.keyval_name(keyval) - replace = { 'name': name, - 'label': insert, - 'xkeysym': keyval } - except: - replace = { 'name': insert, - 'label': insert } - self.__dict[keyseq] = replace - - def __str__(self): - return json.dumps(self.__dict) - -if __name__ == "__main__": - mapfile = MapFile(sys.argv[1]) - print mapfile diff --git a/examples/eekxml/mim2remap.el b/examples/eekxml/mim2remap.el new file mode 100644 index 00000000..ec2c9469 --- /dev/null +++ b/examples/eekxml/mim2remap.el @@ -0,0 +1,164 @@ +;; mim2remap.el -- generate eekxml remap file from m17n MIM file +;; Copyright (C) 2011 Daiki Ueno +;; Copyright (C) 2011 Red Hat, Inc. + +;; This program 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. + +;; This program 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 this program. If not, see +;; . + +;;; Commentary: + +;; emacs -Q -batch -l mim2remap.el -f batch-mim2remap \ +;; /usr/share/m17n/te-inscript.mim trans + +;;; Code: + +(require 'json) + +(defconst mim2remap--char-to-keyname-alist + '((32 . "space") + (33 . "exclam") + (34 . "quotedbl") + (35 . "numbersign") + (36 . "dollar") + (37 . "percent") + (38 . "ampersand") + (39 . "apostrophe") + (40 . "parenleft") + (41 . "parenright") + (42 . "asterisk") + (43 . "plus") + (44 . "comma") + (45 . "minus") + (46 . "period") + (47 . "slash") + (48 . "0") + (49 . "1") + (50 . "2") + (51 . "3") + (52 . "4") + (53 . "5") + (54 . "6") + (55 . "7") + (56 . "8") + (57 . "9") + (58 . "colon") + (59 . "semicolon") + (60 . "less") + (61 . "equal") + (62 . "greater") + (63 . "question") + (64 . "at") + (65 . "A") + (66 . "B") + (67 . "C") + (68 . "D") + (69 . "E") + (70 . "F") + (71 . "G") + (72 . "H") + (73 . "I") + (74 . "J") + (75 . "K") + (76 . "L") + (77 . "M") + (78 . "N") + (79 . "O") + (80 . "P") + (81 . "Q") + (82 . "R") + (83 . "S") + (84 . "T") + (85 . "U") + (86 . "V") + (87 . "W") + (88 . "X") + (89 . "Y") + (90 . "Z") + (91 . "bracketleft") + (92 . "backslash") + (93 . "bracketright") + (94 . "asciicircum") + (95 . "underscore") + (96 . "grave") + (97 . "a") + (98 . "b") + (99 . "c") + (100 . "d") + (101 . "e") + (102 . "f") + (103 . "g") + (104 . "h") + (105 . "i") + (106 . "j") + (107 . "k") + (108 . "l") + (109 . "m") + (110 . "n") + (111 . "o") + (112 . "p") + (113 . "q") + (114 . "r") + (115 . "s") + (116 . "t") + (117 . "u") + (118 . "v") + (119 . "w") + (120 . "x") + (121 . "y") + (122 . "z") + (123 . "braceleft") + (124 . "bar") + (125 . "braceright") + (126 . "asciitilde"))) + +(defun mim2remap--char-to-keyname (char) + (let ((entry (assq char mim2remap--char-to-keyname-alist))) + (if entry + (cdr entry)))) + +(defun mim2remap (file map) + (with-current-buffer (find-file-noselect file) + (let (sexp) + (goto-char (point-min)) + (while (and (null sexp) (not (eobp))) + (setq sexp (read (current-buffer))) + (if (eq (car sexp) 'map) + (setq sexp (cdr sexp)) + (setq sexp nil))) + (if sexp + (setq sexp (assq map sexp))) + (unless sexp + (error "No map named %S in %s" map file)) + (json-encode + (mapcar + (lambda (entry) + (let ((from (car entry)) + (to (car (cdr entry)))) + (cons (if (listp from) + (car from) + (or (mim2remap--char-to-keyname (aref from 0)) + (error "No keyname for %c" (aref from 0)))) + (if (characterp to) + (list (cons :text (char-to-string to))) + (list (cons :text to)))))) + (cdr sexp)))))) + +(defun batch-mim2remap () + (interactive) + (let ((file (car command-line-args-left)) + (map (car (cdr command-line-args-left)))) + (princ (mim2remap file (intern map))) + (setq command-line-args-left (nthcdr 2 command-line-args-left)))) + +;;; mim2remap.el ends here