;ELC ;;; Compiled ;;; in Emacs version 26.3 ;;; with all optimizations. ;;; This file contains utf-8 non-ASCII characters, ;;; and so cannot be loaded into Emacs 22 or earlier. (and (boundp 'emacs-version) (< (aref emacs-version (1- (length emacs-version))) ?A) (string-lessp emacs-version "23") (error "`%s' was compiled for Emacs 23 or later" #$)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (byte-code "\300\301!\210\300\302!\210\300\303!\210\304\305\306\307\310\311%\207" [require cl-lib pyim-common pyim-pinyin custom-declare-group pyim-imobjs nil "Imobjs lib for pyim." :group pyim] 6) #@1812 Imobj (Input method object) 组成的 list. imobj 在 pyim 里面的概念,类似与编译器里面的语法树, 它代表 pyim 输入的字符串 entered 解析得到的一个结构化对象, 以全拼输入法的为例: 1. entered: nihaoma 2. imobj: (("n" "i" "n" "i") ("h" "ao" "h" "ao") ("m" "a" "m" "a")) 而 imobjs 是 imobj 组成的一个列表,因为有模糊音等概念的存在,一个 entered 需要以多种方式或者多步骤解析,得到多种可能的 imobj, 这些 imobj 组合构成在一起,构成了 imobjs 这个概念。比如: 1. entered: guafeng (设置了模糊音 en -> eng) 2. imobj-1: (("g" "ua" "g" "ua") ("f" "en" "f" "eng")) 3. imobj-2: (("g" "ua" "g" "ua") ("f" "eng" "f" "eng")) 4. imobjs: ((("g" "ua" "g" "ua") ("f" "en" "f" "eng")) (("g" "ua" "g" "ua") ("f" "eng" "f" "eng"))) 这个变量用来保存解析得到的 imobjs。 解析完成之后,pyim 会为每一个 imobj 创建对应 code 字符串, 然后在词库 中搜索 code 字符串来得到所需要的词条,最后使用特定的方式将得到的 词条组合成一个候选词列表:`pyim-candidates' 并通过 pyim-page 相关 功能来显示选词框,供用户选择词条,比如: 1. imobj: (("g" "ua" "g" "ua") ("f" "en" "f" "en")) 2. code: gua-fen 从上面的说明可以看出,imobj 本身也是有结构的: 1. imobj: (("g" "ua" "g" "ua") ("f" "en" "f" "en")) 我们将 ("g" "ua" "g" "ua") 这些子结构,叫做 imelem (IM element), *大 多数情况下*, 一个 imelem 能够代表一个汉字,这个概念在编辑 entered 的时候,非常有用。 另外要注意的是,不同的输入法, imelem 的内部结构是不一样的,比如: 1. quanping: ("g" "ua" "g" "ua") 2. shuangpin: ("h" "ao" "h" "c") 3. wubi: ("aaaa") (defvar pyim-imobjs nil (#$ . 608)) (pyim-register-local-variables '(pyim-imobjs)) #@215 按照 SCHEME-NAME 对应的输入法方案,从 ENTERED 字符串中创建一个 或者多个 imobj 组成的列表,不同的输入法,imobj 的结构也是不一样的。 (fn ENTERED &optional SCHEME-NAME) (defalias 'pyim-imobjs-create #[513 "\300\301\"\211\205\302\303\304\"!\"\207" [pyim-scheme-get-option :class intern format "pyim-imobjs-create:%S"] 7 (#$ . 2509)]) #@968 从用户输入的字符串 ENTERED 创建一个输入法内部对象列表: imobjs. 这个 imobjs 可能包含一个 imobj, 也可能包含多个,每个 imobj 都包含 声母和韵母的相关信息,比如: (pyim-imobjs-create:quanpin "woaimeinv" 'quanpin) 结果为: ((("w" "o" "w" "o") ("" "ai" "" "ai") ("m" "ei" "m" "ei") ("n" "v" "n" "v"))) 如果字符串无法正确处理,则返回 nil, 比如: (pyim-imobjs-create "ua" 'quanpin) 全拼输入法的 imelem 是四个字符串组成的 list, 类似: ("w" "o" "w" "o") 代表: (声母1, 韵母1, 声母2, 韵母2) 声母1和声母2一般用来生成 code 字符串,用于词库中寻找词条。声母2和 韵母2一般用来反向构建 entered 字符串,用于“多次选择生成词条”这个 功能。 大多数情况,声母1 = 声母2, 韵母1 = 韵母2, 只有在使用模糊音的时候, 才可能出现不一致的情况。 (fn ENTERED &optional _) (defalias 'pyim-imobjs-create:quanpin #[513 "\205i\300\231\205i\301\300\302\303\"\"\211G\304\305\211W\203]\211\2118\306!\211\204.\304\262\202T\305V\203M\211@\211\303@@P\240\266\211@AA\211\303\307@8P\240\266\310\"\262\266\211T\262\202\266\211\205g\311C!\266\203\207" ["" remove split-string "'" nil 0 pyim-pinyin-split 2 append pyim-imobjs-find-fuzzy:quanpin] 15 (#$ . 2900)]) #@38 (fn ENTERED &optional SCHEME-NAME) (defalias 'pyim-imobjs-create:shuangpin #[513 "\302\303\"\304\305\306#\307\310\"\262\310\203\252\211A\262\242\211A\262\242\205'\311!\205.\311!\312\"A@\312 \"AA\206A\306C\310\211\203\223\211@\206Q\313P\312\"A@\211\203g\306\n\nF\202o\n\nF@A@P\310\314\315#)\266\203\204\212\211B\262\266A\266\202\202C\210\211\203\245\211G\316V\203\245\211B\262\266\202\317\320\237!!\207" [pyim-pinyin-shuangpin-invalid-pinyin-regexp inhibit-changing-match-data pyim-scheme-get-option :keymaps replace-regexp-in-string "-" "" append nil char-to-string assoc " " t string-match 0 pyim-imobjs-find-fuzzy:quanpin pyim-permutate-list] 24 (#$ . 4280)]) #@38 (fn ENTERED &optional SCHEME-NAME) (defalias 'pyim-imobjs-create:xingma #[513 "\300\301\"\302C\303\304\305\306\307\310\"\311\"\312\313%\314\315\"\"\210\211\242\237C\262\207" [pyim-scheme-get-option :code-split-length nil mapc make-byte-code 257 "\211\211\302\230\262?\2051\211G\300W\203\301\301\242B\240\210\302\262\202\301\303\300O\301\242B\240\210\211\300\304O\262\202\207" vconcat vector ["" 0 nil] 5 "\n\n(fn X)" split-string "'"] 12 (#$ . 5015)]) #@48 用于处理模糊音的函数。 (fn IMOBJS) (defalias 'pyim-imobjs-find-fuzzy:quanpin #[257 "\300\211\211\211\203'\211@\301\302\303\"!\262@B\262\304A\"\262A\266\202\202\210\304\"\207" [nil pyim-permutate-list mapcar pyim-pinyin-find-fuzzy append] 10 (#$ . 5495)]) (provide 'pyim-imobjs)