關於離線聖經系統

這個系統是用 Javascript 寫的，因此它有幾個特性，

1. 要在瀏覽器中執行。
2. 一開始載入的時間比較長，因為需要將聖經的經文全部載入。
3. 搜尋的速度比較慢，因為 Javascript 的執行速度有點慢。

最近幾年我們與其他三戶鄰戶共用 ADSL 的線路，因此家裡都可以隨時上網，所以好像就不覺得離線的聖經查詢程式有多重要，只有偶爾回老家時或許會覺得有點用。只是我也在想，可能需要用離線搜尋的人真的不多，因此也就沒有努力在發展。一直到前陣子...

今年信望愛站突然決定要做一個繁星計劃，主要就是將信望愛站的資源全部弄成離線版，燒在 DVD 光碟片中，寄給平常不容易上網的弟兄姊妹，信望愛站好像做了幾千片的 DVD。前陣子 tjm 跟我在 skype 問到有沒有離線搜尋程式，我說我幾年前曾用 Javascript 寫過，因此我就給他們拿去放在光碟片中。

前幾天有位牧師在信望愛站提到繁星計劃裡面的一些資源，有點比不上線上資源，當然離線版總是無法像線上版那麼方便的。其中有一項就是離線搜尋程式只能查一個詞，無法做 and or not 的組合，牧師表示在使用上最重要的是 and，因為有時聖經經文只記得前後幾個詞，要找出經文的位置與前後文不太容易。我跟牧師討論了一下，牧師提到速度不會是問題，而且我那個程式找出來的結果精確性比較大。所以我就想再來修改好了。

昨天我比較有空堂的時間，於是將原本的程式拿出來看，才記得我原先的程式是從某一本書上的範例改來的(可以參看 2004 年寫的使用說明)，實際上人家的書上好像就有提供 and 與 or 的功能，只是我當初改寫的時候改掉了，改成只能做 or。於是花了大約一個小時將 or 改成 and，這好像就符合牧師的最低期待了，我將這程式改為 0.11 版。只是原先自己設想要寫的程式都沒寫，因此下午就繼續改。

只是太久沒有寫 Javascript 的程式，已經忘得差不多了，連怎麼除錯都搞不清楚。寫完之後發現完全不能執行，因此就跑去圖書館借了六、七本 Javascript 的書回來。我在回來的路上就想到，應該寫一個小程式來測試我那個計劃 postfix 運算式的函數到底有沒有寫錯，後來發現錯誤一大堆，我想主要是我對 Javascript 的語法與基本觀念不熟悉，只以 C 語言的概念來寫，就錯了一大堆。主要的差別是 Javascript 的變數型態是動態的，完全不會固定在某個資料型態上，偶爾也有幾個是我自己的邏輯錯誤。寫到六點多、改了不少錯誤，但程式還是不能執行。我快七點回到家，晚上大約快九點繼續改，後來終於將錯誤改完，可以執行了。因此我將這個新的程式當做 0.20版。

最近幾年我在學校裡面上資料結構課程中，都會上到電腦在做算術運算時，用 postfix 的型式來做比較方便，因為就直接從左到右計算就好，不需要考慮優先順序，我就想到寫一個輸入 postfix 型式字串的搜尋程式，只是一直沒有動手。這次趁著要改寫離線搜尋程式的機會，將這個想法實行出來也真的不錯。只是要使用者輸入 postfix 可能有點不習慣就是了，以下就做點 postfix 的說明。

我在這個新程式裡面以 *, & 當做 and、+, |當做 or、!, - 當做 not。postfix 就是運算子都放在運算元的後面，計算時從左邊開始看，遇到運算子時，就拿出最後的運算元出來做運算。可以參考我在學校資料結構第三章講義的第 38 頁之後的部份。舉個例子，要找同時出現「大衛」與「約拿單」的經文，就要輸入「大衛 約拿單 *」，要找出現「亞伯」但沒有「拉罕」也沒有「蘭」的經文時，就要輸入「亞伯 拉罕 蘭 + ! *」。我測試這個離線搜尋程式的結果應該與我的線上聖經查詢程式相同才對。

我有做一些容錯的處理，也就是如果 postfix 的型式打錯了，我的程式還是可以執行。postfix 的錯誤大約會有兩種原因，一個是運算子太多、另一個就是運算子太少。運算子太多時的處理很簡單，就是直接將運算子丟掉就好，例如輸入「大衛 約拿單 * +」，最後的那個 or(+)就是多的，會被直接丟掉，因此結果與「大衛 約拿單 *」相同。如果運算子太少的話，就預設自動加上 and(*) 的運算子，因此如果只要做 and 的人，可以單單輸入字串，例如「大衛 約拿單」與「大衛 約拿單 *」是相同的。

對了，我想每個 token 之後應該都要用空格隔開，字串與字串之間要留空格，字串與運算子之間也要留空間，運算子與運算子之間也要留空格，這樣比較保證是對的。

最後我遇到一個暫時還無法解決的問題。原先我的舊版程式曾在 IE 6.0 與 Mozilla 1.6 裡面測試過，都可以正常執行。但是最近我卻發現我的 0.10、0.11、0.20 版的程式都無法在 IE 裡面執行，不知原因是什麼。在 Firefox 裡面倒是執行得很正常。至於 IE 裡面為何無法執行呢？我還找不到原因，我猜可能是 Javascript 程式的問題，但實在找不出原因在哪裡，希望能夠早日解決這個問題。

這個程式還有很多需要加強與改善的地方，若您對這個程式有任何的建議，歡迎您到我的聖經網站(springbible)上反應，謝謝您的使用，願上帝的恩典伴隨著您。