学习制作Mozilla搜索插件(Mozilla-Search plugins)

Mozilla搜索插件在Mozilla和Mozilla Firefox里的表现形式不太一样,但Firefox也可以安装SearchSideBar这个扩展来实现同样的sidebar。

为Mozilla添加新的搜索插件很简单,如Mycroft上所说,只要你懂一点html的知识。Mycroft是搜索插件的"集散地",你在Firefox的搜索工具栏的下拉菜单里选"添加引擎"就会带你去这里,找到你想用的插件,点击链接安装它们。

Mycroft有很详细的制作教程,甚至还有一个plugin生成页面帮你,不过我没试过。

下面我结合我为CU精华贴搜索制作的搜索插件来介绍如何制作一个搜索插件。

首先,用你最喜欢的文本编辑器新建一个文件。我在Windows下用的是PSPad,你可能喜欢别的,当然用记事本也可以。Unix下就不用多说了,vi、emacs、nano随便你。

先写一些注释信息,以#开头,可以描述一下这个插件是为哪个搜索引擎创建的、作者是谁、最后更新时间等等。这些虽然是可写可不写的,但是强烈建议你加上,至少可以显得我们很专业。像我,就写这么一行:
# Mozilla plug-in file for ChinaUnix.net by wolfg <wolfg****@*****mail.com>
关于这些header信息如何写,可以参考http://mycroft.mozdev.org/deepdocs/headerinfo.html

下面开始真正的plugin代码。插件代码要求必须以SEARCH标签开始,
<search

接下来必须是version这个属性
version="7.1"
注意,这个version并不是指plugin自己的版本。至于7.1这个值是怎么来的,请详细阅读SEARCH标签的文档。

属性name和description都是必须的,name用来显示在选择搜索引擎的下拉菜单里。这里我写的是:
name="ChinaUnix.net"
description="ChinaUnix.net"

属性action、searchForm和method比较重要了,是plugin能否工作正常的条件之一。searchForm要指定包含输入搜索条件 表单(Form)的那个页面的url,比如CU的搜索就是http://search.chinaunix.net/cgi-bin/search; action则和搜索表单里的action一样,查看包含表单的那个页面的源代码就知道了;method呢,显然应该跟表单的method属性一样,但是 现在只能用GET。
method="GET"
action="http://search.chinaunix.net/cgi-bin/search"
searchForm="http://search.chinaunix.net/cgi-bin/search"

因为CU的搜索是简体中文页面,所以queryEncoding和queryCharset这两个属性也要加上。
queryEncoding="gb2312"
queryCharset="gb2312"

然后呢,用>关闭SEARCH标签的开始部分,跟写html标签一样。

在用</search>来结束SEARCH标签之前,还需要包含INPUT标签和INTERPRET标签。

INPUT标签是用来告诉Mozilla把什么信息提交给搜索页面的。

<input name="sourceid" value="Mozilla-search">
这个名为sourceid的INPUT是用来告诉搜索页面是Mozilla-search提交查询请求的,满足网站统计的需要。

<input name="key" user>

这个也是重要的地方,user表示这个是需要用户在搜索工具栏里输入的查询信息。这种需要用户输入的INPUT标签只能有一个。name的值要看搜索页面的源代码来确定。CU搜索页面的那个input的name是key,所以这里的name也是key。

CU的搜索还需要两个信息,forum_num和mode,这些就不能要求用户输入了,所以直接用value来指定固定的值。当然,这些也是通过查看搜索页面的源代码得知的。
<input name="forum_num" value="-1">
<input name="mode" value="title">

<inputnext name="begin" factor="50">
<inputprev>
<inputnext name="page_n" factor="1">
<inputprev>

inputnext和inputprev标签比较特殊,用来实现在Mozilla的侧栏(sidebar)里将查询结果分页。factor表示下一 页时属性的增长值。上面的代码表示每次按下"下一页",begin会增加50,按下"前一页"则减少50。(:factor是从0开始计算的。而CU的 搜索中page_n这个参数是从1开始的,所以在sidebar里的分页工作得不正常。已经有人提出了这个问题,,是个bug吗?)

INPUT标签的文档在这里

INTERPRET标签则是用来告诉Mozilla如何解释查询返回的结果的。至少要包括resultListStart、resultListEnd、 resultItemStart和resultItemEnd这四个属性。

<interpret
browserResultType="result"
charset = "gb2312"
resultListStart = '<table width=100% border="0" cellspacing="1" cellpadding="0" align="center">'
resultListEnd = "</table>"
resultItemStart="<td >"
resultItemEnd="</td>"
>

这里,resultListStart和resultListEnd是告诉Mozilla从什么地方开始查找查询结果,直到遇见什么为止。 resultItemStart和resultItemEnd告诉Mozilla在它们指定的范围内找<a xhref="" mce_href="" >标签以便生成sidebar里的查询结果列表。

现在该用</search>来结束SEARCH标签了。

最后,还需要BROWSER标签来指定与插件更新相关的一些信息,如更新的url和检查周期。
<browser
update="http://mycroft.mozdev.org/update.php/id0/chinaunix.src"
updateIcon="http://mycroft.mozdev.org/update.php/id0/chinaunix.gif"
updateCheckDays="7"
>

完整的代码如下:

# Mozilla plug-in file for ChinaUnix.net by wolfg <wolfg****@****mail.com>

<search
version="7.1"
name="ChinaUnix.net"
description="ChinaUnix.net"
method="GET"
action="http://search.chinaunix.net/cgi-bin/search"
searchForm="http://search.chinaunix.net/cgi-bin/search"
queryEncoding="gb2312"
queryCharset="gb2312"
>

<input name="sourceid" value="Mozilla-search">
<input name="key" user>
<input name="forum_num" value="-1">
<input name="mode" value="title">
<inputnext name="begin" factor="50">
<inputprev>
<inputnext name="page_n" factor="1">
<inputprev>

<interpret
browserResultType="result"
charset = "gb2312"
resultListStart = '<table width=100% border="0" cellspacing="1" cellpadding="0" align="center">'
resultListEnd = "</table>"
resultItemStart="<td >"
resultItemEnd="</td>"
>

</search>

<browser
update="http://mycroft.mozdev.org/update.php/id0/chinaunix.src"
updateIcon="http://mycroft.mozdev.org/update.php/id0/chinaunix.gif"
updateCheckDays="7"
>

现在保存这个文本文件,扩展名得是.src。 还需要为插件准备一个图标文件。这个图标得是16x16像素的gif、jpg、jpge或png文件,文件名 必须和插件代码的名字一致。比如,我这个代码文件叫chinaunix.src,那么它的图标文件就得是chinaunix.gif或 chinaunix.png什么的。详细要求在这里

在把你的插件提交到Mycroft之前,请遵照这里的要求检查一番吧。怎么安装你 的插件呢?最简单的办法,直接copy到Mozilla的searchplugins目录。默认情况下,Windows 下这个目录是C:/Program Files/Mozilla.org/Mozilla/searchplugins(Firefox的是C:/Program Files/Mozilla Firefox/searchplugins),Linux下是/usr/lib/Mozilla/searchplugins(非root用户需要写权限)。

一切正常?只要你满意就可以提交了,分享你的成果吧!

cygwin下不能退出Emacs

在Cygwin下练习使用Emacs,敲了C-x C-c后不退出。

google "emacs cygwin quit",发现不只我遇到这个问题,呵呵。

解决办法:修改启动Cygwin的批处理文件 cygwin.bat。

在@echo off后面加上这一行

set CYGWIN=binmode tty ntsec

改好以后是这样的:

@echo off
set CYGWIN=binmode tty ntsec
C:\
chdir C:\cygwin\bin

bash --login -i

Ref: http://lists.gnu.org/archive/html/help-gnu-emacs/2005-01/msg00499.html

CYGWIN这个环境变量的详细介绍在Cygwin的User Guide里可以找到。