fygul
新手上路
新手上路
阅读:5872回复:5

多行詞庫輸入

楼主#
更多 发布于:2012-12-23 20:19
先簡單說明一下這裡所謂的「多行詞庫輸入」
一般用詞庫輸入時,通常是限於同一行的詞庫文字
若像多行的簽名檔(雖然現在很多論壇軟體已提供簽名檔設置,不需經常輸入)
或多行的文字模板
可能就要分幾次輸入。或自己用剪、貼的動作來達成
而「多行詞庫輸入」則用一個字碼組合來輸入多行文字

這功能有幾個輸入法軟體做出來(僅指台灣方面的,自己只對這方面較清楚)
如:嘸蝦米與「偽.蝦米」
http://www.ptt.cc/man/Liu/DA17/M.1183784094.A.E26.html
(如果文字行的開頭要用「+」符號時怎麼辦?同樣再多加個「+」。)
大新倉頡也有這功能(http://www.eztyping.com.tw/newcj_brief.htm


自己利用小小平台的「命令直通車」功能,模擬上述「多行詞庫輸入」
但只將多行文字讀入clipboard,還要按Ctrl+V做貼上的動作才會把多行文字真正輸出

具體作法如下:
先聲明一下:以下只是自己的作法,請自行依實際情況做適度調整
自己的東西都放在yong/tw/資料夾之下,這樣不會與小小原來的東西混一起
tw裡面建個plugin資料夾,放這功能所要用的程式與「多行式詞庫」檔案

一、先做好「多行式詞庫」,假定名稱為ml_wbank.txt
內容像以下的範例:
<llzl>聯絡資料</llzl>
<qzw>千字文</qzw>
 
===分隔線==========
<llzl>
聯絡資料範例
姓名
電話:1234567890
手機:0987654321
電子郵件:mailbox@dd.com
地址:太陽系地球村
</llzl>
<qzw>
天地玄黃 宇宙洪荒 日月盈昃 辰宿列張 寒來暑往
...中間省略...
徘徊瞻眺 孤陋寡聞 愚蒙等誚 謂語助者 焉哉乎也
</qzw>


分隔線上方只是類似摘要,沒有實質作用,真正內容在分隔線之下
這裡面只放2個例子,一個是聯絡資料,打算以llzl這組字碼來輸入
另一個是千字文,打算以qzw這組字碼來輸入。當然不會真有人這樣輸入千字文的,這只是個例子
用像html tag的方式,以組合字碼,前後包住一段文字,如千字文的內容是在<qzw>與</qzw>的中間

二、在碼表(或分詞庫)中加入命令直通車的指令
如以下二行:
llzl $GO(聯絡資料,tw\plugin\llzl.pyw)
qzw $GO(千字文,tw\plugin\qzw.pyw)


自己是把命令直通車功能用的指令行都放在單獨的分詞庫檔案中(為方便說明,這裡假定檔名為cmds.dic),非直接放在碼表中
然後設置
dicts=tw/cmds.dic

如果原本有慣用的分詞庫(假定名稱為wbank.dic),兩個分詞庫也可串一起用
dicts=tw/wbank.dic tw/cmds.dic


三、做好llzl.pyw與qzw.pyw
因命令直通車目前不支援命令參數,所以利用二支python小程式,執行下述四、主程式,將自己的檔案名稱(就是組字碼)傳入
二支程式的內容完全一樣,只有檔案名稱不一樣
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
import sys
 
def main():
    path, filename = os.path.split(sys.argv[0])
    basename, ext = os.path.splitext(filename)
    os.chdir('tw/plugin/')
    os.system('mlbank.pyw ' + basename)
 
if __name__ == '__main__':
    main()


四、主程式:mlbank.pyw
利用這程式讀取所要的文字行區段,複製到clipboard
這程式是粗略做的,目前只用在Windows平台,若要用在Linux上,必須修改
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
src = 'ml_wbank.txt'
 
import sys
import os
import win32clipboard
import win32con
import win32gui
 
def main():
    if len(sys.argv) > 1:
        tag_start = '<{}>'.format(sys.argv[1])
        tag_end = '</{}>'.format(sys.argv[1])
        text = ''
        with open(src, encoding='utf-8') as f:
            start = False
            match_start = False
            for line in f:
                if start:
                    if match_start:
                        if line.rstrip() == tag_end:
                            break
                        else:
                            text += line
                    elif line.rstrip() == tag_start:
                        match_start = True
                    else:
                        continue
                elif line.startswith('='):
                    start = True
                else:
                    continue
 
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, text)
        win32clipboard.CloseClipboard()
 
if __name__ == '__main__':
    main()


上述工作正確做好後,要正常發揮作用,需有以下執行的條件。當然先決條件是要有執行小小的環境
一、Windows平台,32或64位元
二、Python 3.x,配合Windows平台的版本
三、Python for Windows extensions

二、三項也可用
http://www.activestate.com/activepython
就包含在內
若用便㩗版,可用
http://portablepython.com/
也包含第三項,記得把python執行檔的位置設在系統路徑中

一切就緒後,照以往般使用小小,切換到能使用上述二個命令直通車指令的輸入法
輸入llzl,選「->聯絡資料」。此時會執行指令,有個命令窗口短暫出現一下並關閉。文字會複製到clipboard中
在任一文字視窗中按Ctrl+V,把多行文字貼上

這作法並不是很理想,要透過剪貼板才能達成工作,只能算是個變通的方式。也許有人會有更好的想法與作法
對於有類似「命令直通車」的輸入法而言(台灣方面的輸入法有少數幾個有這類功能),在尚不支援多行詞庫功能時,若有使用多行詞庫的需要,這變通的作法算是可通用的
程式也並不一定要用python做,ruby或其他合適的語言大致上也可達成
當然若輸入法軟體直接內建支持多行詞庫的功能當然是最好不過了


補充說明一下:
上述步驟一、三、四的檔案是採utf-8編碼,這是因在自己的環境中要使用utf-8文字的關係
若要用GBK編碼,主程式中開啟檔案的地方就要修改一下

自己在Win 7 64位元上使用,在notepad.exe程式視窗中貼上時,不會換行,不知為何?沒去細察原因
但在其它文字編輯軟體上則是正常


另外有兩處非與本主題有直接相關的問題,在此一併提出來
在小小的設置檔中,路徑的分隔符號,通常用 / 就可以,這對於可在Windows與Linux平台執行的軟體是很方便的,不須因換平台而修改設置檔中的這類符號
但在做這功能時發現,命令直通車中的指令路徑,在Windows機器不能用 / ,而要像:
llzl $GO(聯絡資料,tw\plugin\llzl.pyw)
另一處類似的情形是在yong.ini的help項,如:
help=字根表 tw\hanpin.pdf
若改用 / 符號,就不行了
沙发#
发布于:2012-12-23 21:45
不用那么麻烦
$[说明]$FILE(文件名)
可以输入多行文本和图片,文本的话,内容用gb18030
 
fygul
新手上路
新手上路
板凳#
发布于:2012-12-24 10:22
照周老師說的方法,馬上試了一下
用命令直通車的方式加入:
test $[測試]$FILE(tw\plugin\test.txt)

輸入test,會讀入test.txt中的文字內容,並將文字輸出
又學了一招,謝謝了

回頭再看了一下chm檔的說明,在「其它说明」──「码表设置」找到了$FILE的用法
发送文件
$FILE(file.ext)
支持发送文本文件和图片,文本文件必须是gb18030格式,且大小小于4KB,图片的话在Windows上必须是bmp图片。


$[ ]的用法,說明中好像沒有
fygul
新手上路
新手上路
地板#
发布于:2012-12-24 10:42
回 1楼(dgod) 的帖子
dgod:不用那么麻烦
$[说明]$FILE(文件名)
可以输入多行文本和图片,文本的话,内容用gb18030
 
 (2012-12-23 21:45) 

對了
周老師可有注意到最後一段所提到的路徑分隔符號的問題
4楼#
发布于:2012-12-24 10:43
fygul,你好,
真是不错呢,这个帖子严谨详细,简直就是教程了,感谢分享经验。
如果小小没有这些功能,确实可以好好学习下您的做法。
5楼#
发布于:2012-12-24 12:06
回 3楼(fygul) 的帖子
fygul:對了
周老師可有注意到最後一段所提到的路徑分隔符號的問題 (2012-12-24 10:42) 

路径分隔符取决于系统是否支持。一般来说应该用/,大多数情况下应该是可以的。
我就不详细测了。
游客

返回顶部