发信人: nullspace (nullspace), 信区: OurSoftware
标  题: 关于cterm3.20中的可定制状态识别
发信站: 武汉白云黄鹤站 (2004年09月16日09:40:36 星期四), 站内信件
 
关于cterm3.20中的可定制状态识别
-------------------------------

    cterm提供的许多服务（包括基本的鼠标操作、文章下载、消息、整字处理等等）
都与用户处于BBS的当前状态有关，该状态是根据当前屏幕识别的。

    举例来说：如果屏幕第1行（标题行）有“版主:”字样，则认为是位于版面文章
列表状态，这时鼠标指向2－23行时会高亮，可以点击阅读文章，可以翻页等等。
 
    cterm内部使用了比较复杂的算法来判断状态（不仅靠关键字，还有对光标、ANSI
码、对特定行的综合分析等等）。

    但是，由于国内使用的BBS版本繁多，标准不尽一致，有时同一系列的BBS系统也
有许多细节差别，使用的字句不同更是常事。因此cterm作者没有精力也不可能完全
考虑到所有可能的情况。假如有某种情形cterm没考虑到，这时就会状态识别不出或不
对，就可能导致鼠标无效、文章下载出错或其它错误。
    例如：cterm原来是按最末行（状态行）中的关键字“Ctrl-Q”识别编辑文章状态，
但没有考虑到小百合的编辑文章状态行是“CTRL+Q”就导致不认为是编辑状态，从而
整字功能失效。
 
    因此，在3.20中提供了新的状态识别机制：用脚本提供状态识别，而脚本使用的
关键字甚至算法是可定制的。

    就是说，如果用户发现自己的BBS上某项功能失效，怀疑跟状态不对有关，这时就
可以自己修改脚本以使状态正确。(当然不用脚本的话也可以报告给作者，请作者查病
因，改源码，再把修改编译后的程序重新发布或打补丁，只是一来总要麻烦作者，二
来不够迅捷)。

    修改脚本不一定非得脚本语言很精通。其实一般情况下只要依照格式改动一下字
典数据就可以了。
 
    现在对状态的识别分别针对FireBird与Maple两大系列的BBS类型，前者使用的字
典是FBKeywords，后者是MapleKeywords (类型为python的dict)。
    字典是以状态常数为key的，常数的定义与cterm内部一致，所以一定不能更改。
状态的含义从常数名上一眼可以看出就不多加解释了。
    字典与状态常数定义在sitestatus.py内。该文件可以用任何文本编辑器打开。
 
    为使算法简洁起见，现在脚本的状态识别只使用了关键字，而且关键字之间的关
系是“或”的关系，所以有可能某些情况下识别不如cterm现有的内部算法准确

    当然如有必要也很容易扩充为：
    - 指定cursor位置
    - 关键字所在的行可指定为cursor.y
    - 可指定关键字所在列(用正则亦能表达)
    - 行列可用范围
    - 关键字用正则表达式
    - 关键字之间可为与的关系(用正则亦能表达)
    相关函数是ct_system.py中的GetScreenStatus(), GetStatusByKeyWord()。
对python语言没有一定了解的人莫轻易改动函数
 
    另外，对于消息的识别目前仍是内部算法为主。但提供了接口OnGetMessage()，
内容暂未编写。用户如有兴趣可以自己编辑。
    它现在直接return（返回None），这时自动使用内部消息算法。
自己编写识别消息算法后，返回值就是如下格式的一个tuple：
    (id, message)
否则无效，仍用内部消息识别
 
    最后希望：假如你发现并改正了某个状态识别错误，请发信告知作者，以便将你
的修改加入下一个cterm版本中去。

    btw: 有了这个机制后，再有状态不对引起的错误，假如能通过修改脚本字典改
正，就不能算是bug了，也不能完全算作者的责任了:) 
--
this is not my qmd
※ 修改:·nullspace 於 09月16日09:48:19 修改本文·[FROM: 202.118.19.63]
※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·[FROM: 202.118.19.63]
