The Old Blog Archive (Traditional Chinese), 2004-2009

Ruby與輸入法的第一步:用Ruby撰寫OpenVanilla filter模組

(更新:目前放入 trunk 的原始碼,還加入了「正體中文用詞轉簡體中文用詞」的功能。先前 OV 的簡繁轉換模組僅能做「字」的轉換,這個 filter 能做簡單的「詞」轉換。使用 script language + regex engine 來寫輸入法相關模組,果然是輕鬆快速許多的)

有時候跟朋友聊天,會有意外的收獲。

最近在研究embedded Ruby,也就是將Ruby放進用C/C++撰寫的程式中使用。其中最重要的計劃,就是想用Ruby來撰寫OpenVanilla的輸入法模組──如果這件事可行,將來撰寫、測試輸入法的難度,又可以比現在再簡單些,同時在演算法設計和資料結構/架構上,也會比現在用C/C++來撰寫來得輕鬆許多。

但是一想到要橋接(bridge)OpenVanilla的輸入法架構,就覺得有很多要先想好的事,有點複雜。

結果因為momizi指出我blog上的錯字,我回應說:「orz… 我需要我的常見錯字filter」──我常把「開催」(日文kaisai,舉辦的意思)寫成「開摧」、「間諜」寫成「間碟」──嗯,OpenVanilla filter不正是OV模組中最簡單的一種嗎?

於是,用Ruby來撰寫OV filter,並以此做為proof of concept的想法就出現了。

是的… 於是我們有了第一個用Ruby寫成的OV模組(更詳細的原始程式碼在這裡):

class OVOFRubyFilter
  def process(str)
    # do some brain-dead, 火星文-style substituion
    str.gsub!(/ㄅ/, "吧")
    str.gsub!(/ㄇ/, "嗎")    

    # fix lukhnos's typo
    str.gsub!(/開摧/, "開催")
    # ...

    # returns the string
    str
  end
end

這個模組目前暫時稱為OVOFRubyBased,裡面使用了embedded Ruby interpreter,會載入一個名為ov_ruby_filter.rb的程式。

只要編譯好這個模組,日後只要修改 .rb 就可以改變 filter 行為。目前的 build system 暫時只支援 OS X 10.4 ,但只要修改 Makefile 應該就能在其他版本的 OS X 或平台上使用(唔,不過 filter 支援,好像目前只有 OS X 版最完整?)。

另外就是,目前還沒辦法像Ruby on Rails的dev mode那麼神,只要一改.rb,行為就改變。這個應該可以當做一個to-do item。

這個proof of concept完成後,接下來則可以著手輸入法的部份,未來還可能架構一整個subsystem,用Ruby來載入一整組名為ov_*_input_method.rb或ov_*_filter.rb的模組群。這樣就可以完全用Ruby來寫輸入法了。不過,如何跨平台deploy,恐怕也會是個大問題。

越來越好玩了。

編譯方法

請使用最新的OpenVanilla原始碼,然後進 trunk/Modules/OVOFRubyBased/ ,執行:

make ; sudo make install

然後開啟新應用程式,啟動OVOFRubyBased這個filter module,就可以開始了。

不想把模組安裝在/Library/OpenVanilla下的朋友,可以把OVOFRubyBased.dylib及OFOFRubyBased/這目錄一併複製到~/Library/OpenVanilla/0.7.2/Modules/下,這樣就可以在不sudo的情況下修改ov_ruby_filter.rb,不過如上所述,每次改完,還是得開新應用程式才能生效。至少還是比需要重新編譯好多了。:)

3 Responses to “Ruby與輸入法的第一步:用Ruby撰寫OpenVanilla filter模組”

  1. on 06 Jul 2007 at 19:02godfat 真常

    有考慮過 swig 嗎?
    雖然似乎會變得複雜很多

  2. [...] http://lukhnos.org/blog/zh/archives/526 [...]

  3. [...] 前一陣子看到 lukhnos 在寫一個能讓 OV 用 Ruby 來寫 filter 的模組,一時心血來潮想看看如何用 python 來寫 OV 的 filter 的模組。花了點時間研究了一下如何在 C/C++ 中內藏 python。 雖說用 python 來寫程式作研究也有好一陣子,也曾經用過 SWIG 來控制用 C/C++ 寫的物理模擬程式, 在 C/C++ 中呼叫 python 倒是第一次實做。花了點時間寫了個 prototype,在 lukhnos 的協助下,搞定了一個讓 OV 可以用 python 寫 filter 的模組 (在 OV 的 svn repository: Modules/OVOFPythonBased/ 中)。 [...]