;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\300\304!\210\300\305!\210\306\307\310\311\312\313%\207" [require cl-lib pyim-common pyim-dcache pyim-scheme pyim-pymap custom-declare-group pyim-cstring nil "Chinese string tools for pyim." :group pyim] 6) #@384 用于 code 选取的基准字符串。 `pyim-cstring-to-codes' 获取到一个词条的多个 codes 时,会将所有的 codes 与这个字符串进行比较,然后选择一个最相似的 code 输出. 这个字符串主要用于全拼和双拼输入法的多音字矫正,一般使用用户输入 生成的 imobjs 转换得到,保留了用户原始输入的许多信息。 (defvar pyim-cstring-to-code-criteria nil (#$ . 667)) #@1202 一个基于 pyim 的中文分词函数。这个函数可以将中文字符 串 CHINESE-STRING 分词,得到一个词条 alist,这个 alist 的元素 都是列表,其中第一个元素为分词得到的词条,第二个元素为词条相对于 字符串中的起始位置,第三个元素为结束位置。分词时,默认词条不超过 6个字符,用户可以通过 MAX-WORD-LENGTH 来自定义,但值得注意的是: 这个值设置越大,分词速度越慢。 如果 DELETE-DUPS 设置为 non-nil, 一个中文字符串只保留一种分割方式。 比如: 我爱北京天安门 => 我爱 北京 天安门 如果 PREFER-SHORT-WORD 为 non-nil, 去重的时候则优先保留较短的词。 注意事项: 1. 这个工具使用暴力匹配模式来分词,*不能检测出* pyim 词库中不存在 的中文词条。 2. 这个函数的分词速度比较慢,仅仅适用于中文短句的分词,不适用于 文章分词。根据评估,20个汉字组成的字符串需要大约0.3s, 40个 汉字消耗1s,随着字符串长度的增大消耗的时间呈几何倍数增加。 (fn CHINESE-STRING &optional MAX-WORD-LENGTH DELETE-DUPS PREFER-SHORT-WORD) (defalias 'pyim-cstring-split-to-list #[1025 "\300C\300C\301\302\303\304\305\n\"\306\"\307\310%\240\210\211\301\302\311\304\305\"\312\"\313\310%\240\210\314 \210\211\242\315\316\304!\262\"\317\"\300\211\203\202\211@\320@\300\321\322$\211\211\203y\211@\323\324\"\211\211\203p\211@\211@\232\203i B\262 A\266\202\202T\266A\266\202\202I\266A\266\202\202;\210\203\222\325\326\327\330 %\202\223\211\266\202\207" [nil make-byte-code 514 "G\302W\203 \303\207\304\305\306\307#\211G\211\300\206\310X\205\"\211\\EC\266\202\301\242\311\211!A!\"\"\207" vconcat vector [2 nil append mapconcat identity "" 6 reverse] 9 "\n\n(fn MY-LIST NUMBER)" "\204\302\207\303\300\242\"\301\242AT\"\"\207" [nil append] 7 pyim-dcache-init-variables mapcar char-to-string 1 pyim-cstring-to-pinyin "-" t pyim-dcache-get (code2word) cl-delete-duplicates :test #[514 "A@A@\3008\3008X\206\211X?\207" [2] 8 "\n\n(fn X1 X2)"] :from-end] 18 (#$ . 1112)]) #@470 将中文字符串 STRING 分词. 在分词的位置插入空格或者自定义分隔符 SEPERATERS,默认情况下较长的 词条优先使用,如果 PREFER-SHORT-WORD 设置为 t,则优先使用较短的 词条。默认最长词条不超过6个字符,用户可以通 MAX-WORD-LENGTH 来 自定义词条的最大长度,但值得注意的是,这个值设置越大,分词速度越 慢。 (fn STRING &optional PREFER-SHORT-WORD SEPARATOR MAX-WORD-LENGTH) (defalias 'pyim-cstring-split-to-string #[1025 "\300\301\"\203\302\303\304\305#\306\"\202C\307\310\311\312\313\314   #\315\"\316\317%\320#\207" [pyim-string-match-p "\\CC" split-string replace-regexp-in-string "\\(\\CC+\\)" "@@@@\\1@@@@" "@@@@" mapconcat make-byte-code 257 "\211G\303V\205\304\305\"\204\306\300\301\302$\207\307\307Q\207" vconcat vector [0 pyim-string-match-p "\\CC" pyim-cstring-split-to-string-1 " "] 6 "\n\n(fn STR)" ""] 14 (#$ . 3302)]) #@123 `pyim-cstring-split-to-string' 内部函数。 (fn CHINESE-STRING &optional PREFER-SHORT-WORD SEPARATOR MAX-WORD-LENGTH) (defalias 'pyim-cstring-split-to-string-1 #[1025 "G\300\301$\302\211\211\203'\211@\211A@B\262\3038B\262A\266\202\202\f\210\304\305\306\"!\262\307\211W\203\\\211\211T\235\203J\206F\310B\262\n\211TOB\262\210\211T\262\2022\266\211\237\262\311\312\313#\207" [pyim-cstring-split-to-list t nil 2 cl-delete-duplicates sort < 0 " " mapconcat identity ""] 14 (#$ . 4255)]) #@61 将一个 buffer 中的中文文章,进行分词操作。 (defalias 'pyim-cstring-split-buffer #[0 "\300\301!\210eb\210m\204&\302\303 \304 \"\303 \304 Td^|\210\305!c\210\306c\266\202eb\210\300\307!\207" [message "分词开始!" buffer-substring-no-properties line-beginning-position line-end-position pyim-cstring-split-to-string "\n" "分词完成!"] 4 (#$ . 4782) nil]) (defalias 'pyim-hanzi2pinyin 'pyim-cstring-to-pinyin) #@906 将汉字字符串转换为对应的拼音字符串的工具. 如果 SHOU-ZI-MU 设置为 t, 转换仅得到拼音首字母字符串。当 RETURN-LIST 设置为 t 时,返回一个拼音列表,这个列表包含词条的一个 或者多个拼音(词条包含多音字时);如果 IGNORE-DUO-YIN-ZI 设置为 t, 遇到多音字时,只使用第一个拼音,其它拼音忽略;当 ADJUST-DUO-YIN-Zi 设置为 t 时, `pyim-cstring-to-pinyin' 会使用 pyim 已 安装的词库来校正多音字,但这个功能有一定的限制: 1. pyim 普通词库中不存在的词条不能较正 2. 多音字校正速度比较慢,实时转换会产生卡顿。 BUG: 当 STRING 中包含其它标点符号,并且设置 SEPERATER 时,结果会 包含多余的连接符:比如: '你=好' --> 'ni-=-hao' (fn STRING &optional SHOU-ZI-MU SEPARATOR RETURN-LIST IGNORE-DUO-YIN-ZI ADJUST-DUO-YIN-ZI) (defalias 'pyim-cstring-to-pinyin #[1537 "\300\301\"\204\203C\207\207\302\211C\302\211\300\303 \"\203*\304\305\306\307 #\310\"\2021 \311!\262\262\312\313\314\315\311\316!\317\"\320\321%\"\210\211\242\237\240\210\322\242!\262\203\201\323 \210\211\203|\211@\324\325\326#\327\330\" \235\203sB\262\266A\266\202\202X\210\211\237\262\211\206\206\331\313\314\332\311\316\"\333\"\334\335%\203\241@C\202\242\"\203\254\211\202\261\324\325\336#\266\202\207" [pyim-string-match-p "\\cc" nil "\\CC" split-string replace-regexp-in-string "\\(\\cc\\)" "@@@@\\1@@@@" "@@@@" vconcat mapc make-byte-code 257 "\211\247\203\n\301!\262\211G\302V\203\300C\300\242B\240\207\211G\303V\2032\304\305\"\2032\300\306\307!!\300\242B\240\207\211G\303V\205@\300C\300\242B\240\207" vector [char-to-string 1 0 pyim-string-match-p "\\cc" pyim-pymap-cchar2py-get string-to-char] 5 "\n\n(fn STR)" pyim-permutate-list2 pyim-dcache-init-variables mapconcat identity "-" pyim-dcache-get (code2word) mapcar "\302\303\304\305\306\307\300!\310\"\311\312%\301#\207" [mapconcat make-byte-code 257 "\300\203 \211\301\302O\207\207" vconcat vector [0 1] 4 "\n\n(fn STR)"] 8 "\n\n(fn X)" " "] 19 (#$ . 5226)]) (defalias 'pyim-hanzi2pinyin-simple 'pyim-cstring-to-pinyin-simple) #@118 简化版的 `pyim-cstring-to-pinyin', 不处理多音字。 (fn STRING &optional SHOU-ZI-MU SEPARATOR RETURN-LIST) (defalias 'pyim-cstring-to-pinyin-simple #[1025 "\300\301%\207" [pyim-cstring-to-pinyin t] 10 (#$ . 7438)]) (defalias 'pyim-hanzi2xingma 'pyim-cstring-to-xingma) #@193 返回汉字 STRING 对应形码方案 SCHEME-NAME 的 code (不包括 code-prefix)。当RETURN-LIST 设置为 t 时,返回一个 code list。 (fn STRING SCHEME-NAME &optional RETURN-LIST) (defalias 'pyim-cstring-to-xingma #[770 "\301\302\303\304#)\266\203\205W\305\306\"\307\310\311!P!\312\313\314\315\316\317!\320\"\321\322%\323\324\325\326\n\"!\327\"\"\330\331\"\206G\332!\205G\"\211\205U\203S\211\202U\211@\266\204\207" [inhibit-changing-match-data "^\\cc+\\'" nil t string-match pyim-scheme-get-option :code-prefix intern "pyim-cstring-to-xingma:" symbol-name cl-remove-if-not make-byte-code 257 "\301!@\300\232\207" vconcat vector [pyim-dcache-code-split] 3 "\n\n(fn X)" sort cl-copy-list pyim-dcache-call-api search-word-code #[514 "GGV\207" [] 4 "\n\n(fn A B)"] mapcar #[257 "\300!A@\207" [pyim-dcache-code-split] 3 "\n\n(fn X)"] functionp] 12 (#$ . 7728)]) #@112 返回汉字 STRING 的五笔编码 (不包括 code-prefix) 编码列表。 (fn STRING &optional SCHEME-NAME) (defalias 'pyim-cstring-to-xingma:wubi #[513 "G\300\301\302#\303=\203/\304@\"\304A@\"\205*\211\205*\305\303O\305\303OPC\266\202\202\256\306=\203f\304@\"\304A@\"\304\3038\"\205a\205a\211\205a\305\307O\305\307O\305\303OQC\266\203\202\256\306V\203\255\304@\"\304A@\"\304\3038\"\304S8\"\205\250\205\250\205\250\211\205\250\305\307O\305\307O\305\307O\305\307ORC\266\204\202\256\310\207" [split-string "" t 2 pyim-cstring-to-xingma 0 3 1 nil] 14 (#$ . 8632)]) #@468 将 STRING 转换为 SCHEME-NAME 对应的 codes. 当 pyim class 为拼音,并且提供 CRITERIA 字符串时,检索到的所有 codes 会和这个字符串进行比较,然后选择一个相似度最高的 code 作为 输出,这种处理方式适合拼音输入法,形码输入法一般不需要类似的操作。 CRITERIA 字符串一般是通过 imobjs 构建的,它保留了用户原始的输入信 息。 (fn STRING SCHEME-NAME &optional CRITERIA) (defalias 'pyim-cstring-to-codes #[770 "\300\301\"\211\302=\203\303\304#\202>\305\306\307\304\306\304&\306G\310W\203'\202<\311\312\313\314\315\316\n!\317\"\320\321%\"\262\211@C\266\202\207" [pyim-scheme-get-option :class xingma pyim-cstring-to-xingma t pyim-cstring-to-pinyin nil "-" 1 sort make-byte-code 514 "\301\300\"\301\300\"W\207" vconcat vector [pyim-string-distance] 6 "\n\n(fn A B)"] 14 (#$ . 9261)]) #@86 获取光标一个中文字符串,字符数量为:NUMBER. (fn &optional NUMBER) (defalias 'pyim-cstring-at-point #[256 "\212`\211Z\211\300V\203\211\202e\301\"\211;\205)\211GU\205)\302\303\"?\205)\211\266\204)\207" [0 buffer-substring-no-properties pyim-string-match-p "\\CC"] 8 (#$ . 10162)]) (defalias 'pyim-cwords-at-point 'pyim-cstring-words-at-point) #@775 获取光标当前的词条列表,当 END-OF-POINT 设置为 t 时,获取光标后的词条列表。 词条列表的每一个元素都是列表,这些列表的第一个元素为词条,第二个元素为光标处到词条 头部的距离,第三个元素为光标处到词条尾部的距离。 其工作原理是: 1. 使用 `thing-at-point' 获取当前光标处的一个字符串,一般而言:英文会得到 一个单词,中文会得到一个句子。 2. 英文单词直接返回这个单词的列表。 3. 中文句子首先用 `pyim-cstring-split-to-list' 分词,然后根据光标在中文句子 中的位置,筛选出符合要求的中文词条。得到并返回 *一个* 或者 *多个* 词条 的列表。 (fn &optional END-OF-POINT) (defalias 'pyim-cstring-words-at-point #[256 "\301`\203 \302g!\202\302h!\303\304\301\"\211G\305\304!\211\205\211@\205%A\205@\211\205@U\203;\211ZT\202@ZT\306\211\211\203w\307\310\n\"\204w\311V\203j\311\262\311Z\311\\\n^O\262 \202w\262\312\313\n^O\262 \203\353\307\310\n\"\204\353\314 !\262\211\203\320\211@\211A@\3158\203\252W\203\307Y\202\265X\203\307V\203\307@Z ZEB\262\266A\266\202\202\213\210\211\206\376 \203\342 \312\316E\202\347 \316\312EC\202\376\205\376 Z ZEC)\207" [case-fold-search t string thing-at-point word bounds-of-thing-at-point nil pyim-string-match-p "\\CC" 5 0 9 pyim-cstring-split-to-list 2 1] 20 (#$ . 10541)]) (defalias 'pyim-forward-word 'pyim-cstring-forward-word) #@109 向前移动 ARG 英文或者中文词,向前移动时基于 *最长* 的词移动。 (fn &optional ARG) (defalias 'pyim-cstring-forward-word #[256 "\211\204\300\262\211\301\211W\205.\211\302\303!\304\305\301\306\307\"B\"\211\206!\300\300]\211u\266\211T\262\202 \207" [1 0 pyim-cstring-words-at-point t cl-reduce max mapcar #[257 "\3008\207" [2] 3 "\n\n(fn WORD)"]] 11 (#$ . 12111) "P"]) (defalias 'pyim-backward-word 'pyim-cstring-backward-word) #@112 向后移动 ARG 个英文或者中文词,向后移动时基于 *最长* 的词移动。 (fn &optional ARG) (defalias 'pyim-cstring-backward-word #[256 "\211\204\300\262\211\301\211W\2052\211\302 \303\304\301\305\306\"B\"\211\206 \300\300]\211\206'\300[u\266\211T\262\202 \207" [1 0 pyim-cstring-words-at-point cl-reduce max mapcar #[257 "\211A@\207" [] 2 "\n\n(fn WORD)"]] 11 (#$ . 12579) "P"]) (provide 'pyim-cstring)