Rewrite mim2remap in elisp to properly parse *.mim files.
This commit is contained in:
@ -1,73 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
|
||||||
# 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
|
|
||||||
164
examples/eekxml/mim2remap.el
Normal file
164
examples/eekxml/mim2remap.el
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
;; mim2remap.el -- generate eekxml remap file from m17n MIM file
|
||||||
|
;; Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
||||||
|
;; 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
|
||||||
|
;; <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; 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
|
||||||
Reference in New Issue
Block a user