关于离线圣经系统

这个系统是用 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)上反应,谢谢您的使用,愿上帝的恩典伴随着您。