diff options
| author | Kenichi Handa | 2004-05-17 00:21:11 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2004-05-17 00:21:11 +0000 |
| commit | ba1d5dcd24ae3c035c54165d49c562a5de25cbdc (patch) | |
| tree | 1313453ecf8021ee7e2a24506a4e3cf0630cbab0 | |
| parent | f9f14309cbfc5fc1d0354b4d1b870fd1e4991656 (diff) | |
| download | emacs-ba1d5dcd24ae3c035c54165d49c562a5de25cbdc.tar.gz emacs-ba1d5dcd24ae3c035c54165d49c562a5de25cbdc.zip | |
New file.
| -rw-r--r-- | leim/quail/sisheng.el | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/leim/quail/sisheng.el b/leim/quail/sisheng.el new file mode 100644 index 00000000000..245127873b6 --- /dev/null +++ b/leim/quail/sisheng.el | |||
| @@ -0,0 +1,290 @@ | |||
| 1 | ;;; sisheng.el --- sisheng input method for Chinese pinyin transliteration | ||
| 2 | |||
| 3 | ;; Copyright (C) 2004 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Werner LEMBERG <wl@gnu.org> | ||
| 6 | |||
| 7 | ;; Keywords: multilingual, input method, Chinese, pinyin, sisheng | ||
| 8 | |||
| 9 | ;; This program is free software; you can redistribute it and/or modify | ||
| 10 | ;; it under the terms of the GNU General Public License as published by | ||
| 11 | ;; the Free Software Foundation; either version 2, or (at your option) | ||
| 12 | ;; any later version. | ||
| 13 | |||
| 14 | ;; This program is distributed in the hope that it will be useful, | ||
| 15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | ;; GNU General Public License for more details. | ||
| 18 | |||
| 19 | ;; You should have received a copy of the GNU General Public License | ||
| 20 | ;; along with GNU Emacs; see the file COPYING. If not, write to | ||
| 21 | ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | |||
| 23 | ;;; Commentary: | ||
| 24 | |||
| 25 | ;;; Code: | ||
| 26 | |||
| 27 | (require 'quail) | ||
| 28 | |||
| 29 | (defconst sisheng-regexp | ||
| 30 | "[āēīōūǖ]\\|üē") | ||
| 31 | |||
| 32 | ;; First element is the key, | ||
| 33 | ;; second element is the vowel used for the input sequence, | ||
| 34 | ;; last four elements are the resulting tones. | ||
| 35 | ;; | ||
| 36 | (defconst sisheng-vowel-table | ||
| 37 | '(("ā" "a" "ā" "á" "ǎ" "à") | ||
| 38 | ("ē" "e" "ē" "é" "ě" "è") | ||
| 39 | ("ī" "i" "ī" "í" "ǐ" "ì") | ||
| 40 | ("ō" "o" "ō" "ó" "ǒ" "ò") | ||
| 41 | ("ū" "u" "ū" "ú" "ǔ" "ù") | ||
| 42 | ("ǖ" "v" "ǖ" "ǘ" "ǚ" "ǜ") | ||
| 43 | ("üē" "ve" "üē" "üé" "üě" "üè"))) | ||
| 44 | |||
| 45 | |||
| 46 | ;; All possible syllables in Mandarin Chinese, presented in the first | ||
| 47 | ;; tone. Note that make-sisheng-rules always constructs rules for all | ||
| 48 | ;; four tones even if some of those tones aren't used in Mandarin. | ||
| 49 | ;; | ||
| 50 | (defconst sisheng-syllable-table | ||
| 51 | '("ā" "āi" "ān" "āng" "āo" | ||
| 52 | |||
| 53 | "bā" "bāi" "bān" "bāng" "bāo" | ||
| 54 | "bēi" "bēn" "bēng" | ||
| 55 | "bī" "biān" "biāo" "biē" "bīn" "bīng" | ||
| 56 | "bō" | ||
| 57 | "bū" | ||
| 58 | |||
| 59 | "cā" "cāi" "cān" "cāng" "cāo" | ||
| 60 | "cē" "cēn" "cēng" | ||
| 61 | "cī" | ||
| 62 | "cōng" "cōu" | ||
| 63 | "cū" "cuān" "cuī" "cūn" "cuō" | ||
| 64 | |||
| 65 | "chā" "chāi" "chān" "chāng" "chāo" | ||
| 66 | "chē" "chēn" "chēng" | ||
| 67 | "chī" | ||
| 68 | "chōng" "chōu" | ||
| 69 | "chū" "chuā" "chuāi" "chuān" "chuāng" "chuī" "chūn" "chuō" | ||
| 70 | |||
| 71 | "dā" "dāi" "dān" "dāng" "dāo" | ||
| 72 | "dē" "dēi" "dēn" "dēng" | ||
| 73 | "dī" "diān" "diāo" "diē" "dīng" "diū" | ||
| 74 | "dōng" "dōu" | ||
| 75 | "dū" "duān" "duī" "dūn" "duō" | ||
| 76 | |||
| 77 | "ē" "ēi" "ēn" "ēng" "ēr" | ||
| 78 | |||
| 79 | "fā" "fān" "fāng" | ||
| 80 | "fēi" "fēn" "fēng" | ||
| 81 | "fiāo" | ||
| 82 | "fō" "fōu" | ||
| 83 | "fū" | ||
| 84 | |||
| 85 | "gā" "gāi" "gān" "gāng" "gāo" | ||
| 86 | "gē" "gēi" "gēn" "gēng" | ||
| 87 | "gōng" "gōu" | ||
| 88 | "gū" "guā" "guāi" "guān" "guāng" "guī" "gūn" "guō" | ||
| 89 | |||
| 90 | "hā" "hāi" "hān" "hāng" "hāo" | ||
| 91 | "hē" "hēi" "hēn" "hēng" | ||
| 92 | "hōng" "hōu" | ||
| 93 | "hū" "huā" "huāi" "huān" "huāng" "huī" "hūn" "huō" | ||
| 94 | |||
| 95 | "jī" "jiā" "jiān" "jiāng" "jiāo" "jiē" "jīn" "jīng" "jiōng" "jiū" | ||
| 96 | "jū" "juān" "juē" "jūn" | ||
| 97 | |||
| 98 | "kā" "kāi" "kān" "kāng" "kāo" | ||
| 99 | "kē" "kēi" "kēn" "kēng" | ||
| 100 | "kōng" "kōu" | ||
| 101 | "kū" "kuā" "kuāi" "kuān" "kuāng" "kuī" "kūn" "kuō" | ||
| 102 | |||
| 103 | "lā" "lāi" "lān" "lāng" "lāo" | ||
| 104 | "lē" "lēi" "lēng" | ||
| 105 | "lī" "liā" "liān" "liāng" "liāo" "liē" "līn" "līng" "liū" | ||
| 106 | "lōng" "lōu" | ||
| 107 | "lū" "luān" "lūn" "luō" | ||
| 108 | "lǖ" "lüē" | ||
| 109 | |||
| 110 | "mā" "māi" "mān" "māng" "māo" | ||
| 111 | "mē" "mēi" "mēn" "mēng" | ||
| 112 | "mī" "miān" "miāo" "miē" "mīn" "mīng" "miū" | ||
| 113 | "mō" "mōu" | ||
| 114 | "mū" | ||
| 115 | |||
| 116 | "nā" "nāi" "nān" "nāng" "nāo" | ||
| 117 | "nē" "nēi" "nēn" "nēng" | ||
| 118 | "nī" "niān" "niāng" "niāo" "niē" "nīn" "nīng" "niū" | ||
| 119 | "nōng" "nōu" | ||
| 120 | "nū" "nuān" "nuō" | ||
| 121 | "nǖ" "nüē" | ||
| 122 | |||
| 123 | "ō" "ōu" | ||
| 124 | |||
| 125 | "pā" "pāi" "pān" "pāng" "pāo" | ||
| 126 | "pēi" "pēn" "pēng" | ||
| 127 | "pī" "piān" "piāo" "piē" "pīn" "pīng" | ||
| 128 | "pō" "pōu" | ||
| 129 | "pū" | ||
| 130 | |||
| 131 | "qī" "qiā" "qiān" "qiāng" "qiāo" "qiē" "qīn" "qīng" "qiōng" "qiū" | ||
| 132 | "qū" "quān" "quē" "qūn" | ||
| 133 | |||
| 134 | "rān" "rāng" "rāo" | ||
| 135 | "rē" "rēn" "rēng" | ||
| 136 | "rī" | ||
| 137 | "rōng" "rōu" | ||
| 138 | "rū" "ruā" "ruān" "ruī" "rūn" "ruō" | ||
| 139 | |||
| 140 | "sā" "sāi" "sān" "sāng" "sāo" | ||
| 141 | "sē" "sēn" "sēng" | ||
| 142 | "sī" | ||
| 143 | "sōng" "sōu" | ||
| 144 | "sū" "suān" "suī" "sūn" "suō" | ||
| 145 | |||
| 146 | "shā" "shāi" "shān" "shāng" "shāo" | ||
| 147 | "shē" "shēi" "shēn" "shēng" | ||
| 148 | "shī" | ||
| 149 | "shōu" | ||
| 150 | "shū" "shuā" "shuāi" "shuān" "shuāng" "shuī" "shūn" "shuō" | ||
| 151 | |||
| 152 | "tā" "tāi" "tān" "tāng" "tāo" | ||
| 153 | "tē" "tēi" "tēng" | ||
| 154 | "tī" "tiān" "tiāo" "tiē" "tīng" | ||
| 155 | "tōng" "tōu" | ||
| 156 | "tū" "tuān" "tuī" "tūn" "tuō" | ||
| 157 | |||
| 158 | "wā" "wāi" "wān" "wāng" | ||
| 159 | "wēi" "wēn" "wēng" | ||
| 160 | "wō" | ||
| 161 | "wū" | ||
| 162 | |||
| 163 | "xī" "xiā" "xiān" "xiāng" "xiāo" "xiē" "xīn" "xīng" "xiōng" "xiū" | ||
| 164 | "xū" "xuān" "xuē" "xūn" | ||
| 165 | |||
| 166 | "yā" "yān" "yāng" "yāo" | ||
| 167 | "yē" | ||
| 168 | "yī" "yīn" "yīng" | ||
| 169 | "yō" "yōng" "yōu" | ||
| 170 | "yū" "yuān" "yuē" "yūn" | ||
| 171 | |||
| 172 | "zā" "zāi" "zān" "zāng" "zāo" | ||
| 173 | "zē" "zēi" "zēn" "zēng" | ||
| 174 | "zī" | ||
| 175 | "zōng" "zōu" | ||
| 176 | "zū" "zuān" "zuī" "zūn" "zuō" | ||
| 177 | |||
| 178 | "zhā" "zhāi" "zhān" "zhāng" "zhāo" | ||
| 179 | "zhē" "zhēi" "zhēn" "zhēng" | ||
| 180 | "zhī" | ||
| 181 | "zhōng" "zhōu" | ||
| 182 | "zhū" "zhuā" "zhuāi" "zhuān" "zhuāng" "zhuī" "zhūn" "zhuō")) | ||
| 183 | |||
| 184 | ;; This function converts e.g. | ||
| 185 | ;; | ||
| 186 | ;; "zhuō" | ||
| 187 | ;; | ||
| 188 | ;; into | ||
| 189 | ;; | ||
| 190 | ;; (("zhuo4" ["zhuò"]) | ||
| 191 | ;; ("zhuo3" ["zhuǒ"]) | ||
| 192 | ;; ("zhuo2" ["zhuó"]) | ||
| 193 | ;; ("zhuo1" ["zhuō"])) | ||
| 194 | ;; | ||
| 195 | (defun quail-make-sisheng-rules (syllable) | ||
| 196 | (let ((case-fold-search t) | ||
| 197 | vowel-match | ||
| 198 | vowel-list | ||
| 199 | input-vowel | ||
| 200 | base-key | ||
| 201 | key | ||
| 202 | value | ||
| 203 | key-value-list | ||
| 204 | (i 1)) | ||
| 205 | (string-match sisheng-regexp syllable) | ||
| 206 | (setq vowel-match (downcase (match-string 0 syllable))) | ||
| 207 | (setq vowel-list | ||
| 208 | (cdr (assoc-string vowel-match sisheng-vowel-table))) | ||
| 209 | (setq input-vowel (car vowel-list)) | ||
| 210 | (setq base-key (replace-match input-vowel nil nil syllable)) | ||
| 211 | (while (<= i 4) | ||
| 212 | (setq key (concat base-key (number-to-string i))) | ||
| 213 | (setq value (vector (replace-match (nth i vowel-list) nil nil syllable))) | ||
| 214 | (push (list key value) key-value-list) | ||
| 215 | (setq i (1+ i))) | ||
| 216 | key-value-list)) | ||
| 217 | |||
| 218 | ;; Set up sisheng input method. | ||
| 219 | ;; | ||
| 220 | (quail-define-package | ||
| 221 | "chinese-sisheng" ; name | ||
| 222 | "Chinese" ; language | ||
| 223 | "ǚ" ; title | ||
| 224 | t ; guidance | ||
| 225 | "Sìshēng input method for pīnyīn transliteration of Chinese. | ||
| 226 | |||
| 227 | Examples: shuang1 -> shuāng | ||
| 228 | Lv3 -> Lǚ | ||
| 229 | AN4 -> ÀN | ||
| 230 | |||
| 231 | Use the fifth (unstressed) tone for syllables containing `ü' | ||
| 232 | without a tone mark. | ||
| 233 | |||
| 234 | Example: nve5 -> nüe | ||
| 235 | " ; docstring | ||
| 236 | nil ; translation-keys | ||
| 237 | t ; forget-last-selection | ||
| 238 | nil ; deterministic | ||
| 239 | nil ; kbd-translate | ||
| 240 | nil ; show-layout | ||
| 241 | nil ; create-decode-map | ||
| 242 | nil ; maximum-shortest | ||
| 243 | nil ; overlay-plist | ||
| 244 | nil ; update-translation-function | ||
| 245 | nil ; conversion-keys | ||
| 246 | t ; simple | ||
| 247 | ) | ||
| 248 | |||
| 249 | ;; Call quail-make-sisheng-rules for all syllables in sisheng-syllable-table. | ||
| 250 | ;; | ||
| 251 | (let ((case-table-save (current-case-table)) | ||
| 252 | sisheng-list) | ||
| 253 | (set-case-table (standard-case-table)) | ||
| 254 | (dolist (syllable sisheng-syllable-table) | ||
| 255 | (setq sisheng-list | ||
| 256 | (append (quail-make-sisheng-rules syllable) | ||
| 257 | sisheng-list))) | ||
| 258 | |||
| 259 | (dolist (syllable sisheng-syllable-table) | ||
| 260 | (setq sisheng-list | ||
| 261 | (append (quail-make-sisheng-rules (upcase-initials syllable)) | ||
| 262 | sisheng-list))) | ||
| 263 | |||
| 264 | (dolist (syllable sisheng-syllable-table) | ||
| 265 | (setq sisheng-list | ||
| 266 | (append (quail-make-sisheng-rules (upcase syllable)) | ||
| 267 | sisheng-list))) | ||
| 268 | |||
| 269 | (eval `(quail-define-rules | ||
| 270 | ,@sisheng-list | ||
| 271 | |||
| 272 | ("lv5" ["lü"]) | ||
| 273 | ("lve5" ["lüe"]) | ||
| 274 | ("nv5" ["nü"]) | ||
| 275 | ("nve5" ["nüe"]) | ||
| 276 | |||
| 277 | ("Lv5" ["Lü"]) | ||
| 278 | ("Lve5" ["Lüe"]) | ||
| 279 | ("Nv5" ["Nü"]) | ||
| 280 | ("Nve5" ["Nüe"]) | ||
| 281 | |||
| 282 | ("LV5" ["LÜ"]) | ||
| 283 | ("LVE5" ["LÜE"]) | ||
| 284 | ("NV5" ["NÜ"]) | ||
| 285 | ("NVE5" ["NÜE"]))) | ||
| 286 | (set-case-table case-table-save)) | ||
| 287 | |||
| 288 | ;; Local Variables: | ||
| 289 | ;; coding: utf-8 | ||
| 290 | ;; End: | ||