咬文嚼字一篇

“志不在多,精华就行。”

我的 Blog 历史是从 2003 年初开始记载的。一直以来都没有写文章的习惯,Blog 自然就冷冷清清。

其间换过好几个系统,到后来就喜欢在 Blog 转载别人的文章,也许那就是作为一个 Blog 入门者的必经之路罢。

2004 年的国庆长假,心血来潮和 david 一起上国外网站上乱转,就在那时发现了MT,当时MT 3.X已经出来了,喜欢新鲜的我就尝试着安装一个用自己一点都不懂的语言 Perl 写的 CMS 系统。花了一天加上一个通宵总算把 MT 装成功了,在看官方文档时,还翻译了一部分(好傻,网上早就有人翻译过了),那也是我第一次翻译e文。安装 MT 时查看了许多资料,浏览了好多国外的 Blog 后才真正见识到 Blog 之所以流行的原因:原创文章,大家共同讨论。转载文章的一个最大缺陷是和文章作者的交流不便,甚至根本就不知道谁是文章作者。

为此我把 Blog 的描述改为“志不在多,精华就行。”

“就”字在这里显得不够谦虚,意味着我的 Blog 上的文章全是精华,太……了,所以我把它改成“才”,表示我的目标和方向。

这就是:“志不在多,精华才行。”

— EOF —

Windows(IIS)平台下MT2.661的安装、汉化、配置及插件的安装

关于本文:
本文介绍的MT安装在Windows XP + IIS5.1环境下搭建成功,在其它Win32平台下的搭建步骤也大体相同。安装使用的MT是2.661英文版,并使用中文语言包进行汉化,同时添加了几个比较常用的插件。网上可以找到安装步骤更为简便的汉化安装版,本文不做介绍,有兴趣的可以参考《Movable Type 完全手册》(http://mtbook.net/),还有安装配置视频(http://isrc.nchu.edu.tw/phpadmin/MovableType.htm)。

准备工作:

1. 下载ActivePerl

在官方主页 http://www.activestate.com/ 注册后即可免费下载各种平台下的标准版。
我使用的是 ActivePerl 5.8.6.811 Windows MSI 安装版,可直接点击以下链接下载:
http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.6.811-MSWin32-x86-122208.msi

2. 下载MT源码

现在官方 http://www.movabletype.org/ 的MT代码不再提供下载了,好像只有原来拥有MT account的用户才可以下载。网上有一些说法是注册一个TypeKey就可以下载,但在写这篇文章时,注册后登录下载却提示“找不到用户记录”,不能肯定是不是个别情况,大家不妨去试试看吧。

注册TypeKey:
如果你还没有 TypeKey 帐户,可以点击以下链接申请一个:
https://www.typekey.com/t/typekey/register?lang=en-us
提交完你的注册信息后,你将收到一封注册确认邮件,打开邮件中提示的链接即可激活你的帐户。

登录下载:
TypeKey 登录页面:https://www.typekey.com/t/typekey
MT 下载登录页面:https://secure.sixapart.com/t/account
成功登录后应该出现以下界面(https://secure.sixapart.com/t/account):

这里有两个版本可以下载,第一个是2.661版,它是MT的最后的一个多用户免费版;如果单用户能够满足你的要求,则可以下载3.16版本的。以下是官方对3.16免费使用的说明:
“You can download an unsupported version of Movable Type for free. You’re limited to 1 author and 3 weblogs. The paid license benefits below are not available with the free version.”
即免费版本有一个作者和三个网志的限制,功能上也比收费版的要差一些,既然是免费版本,也顾不了那么多了。
我选择下载Movable Type 2.661版本,接下来选择完整版(Full version)和.zip压缩文件格式(.zip(Good for Windows servers)),如图:

点击 Download Movable Type 即可开始下载。
如果找不到下载地址,我这里也提供了一个MT 2.661的下载地址(不能保证链接长期有效):
http://www.mrsjenni.com/stuff/MT-2.661-full-lib.zip
http://www.qinyu.net/download/MT-2.661-full-lib.zip

注:没有填写表单就下载MT-2.661-full-lib.zip是违反Movable Type授权的。

环境搭建:

1. 安装ActivePerl。

选择预设安装路径C:\perl\,并在安装选项页中把“Create IIS script mapping for Perl”和“Create IIS script mapping for Perl ISAPI”勾选上,完成安装。

2. 配置MT存放路径和IIS

在硬盘上新建三个目录 J:\MT\cgi-bin\、J:\MT\mt\ 和 J:\MT\db\ ,这三个目录的用处如下:
J:\MT\cgi-bin\:用于存放动态文件,即程序主体,这个目录中有执行cgi脚本的权限;
J:\MT\mt\:用于存放静态文件,如.html网页、图片等,IIS将把这个目录中的所有内容以静态网页的形式呈现,各个用户导出的静态网页就存放在这个目录下;
J:\MT\db\:使用文本数据库Berkeley DB时用于存放数据库文件,当然如果使用MySQL,也可以将数据库文件放到这个目录下,易于管理。

然后将下载的MT源码压缩包MT-2.661-full-lib.zip解压到 J:\MT\cgi-bin\ 目录中,将docs, images和styles.css移动到 J:\MT\mt\ 目录下。
在IIS中添加一个虚拟目录 cgi-bin 指向 J:\MT\cgi-bin\,在设置访问权限向导中应把“执行(如 ISAPI 应用程序或 CGI)”勾选上,如下图:

在这个虚拟目录中还应配置应用程序映射,将.cgi和.pl关联到perl:.cgi C:\Perl\bin\perl.exe “%s” %s GET,HEAD,POST
.pl C:\Perl\bin\perl.exe “%s” %s GET,HEAD,POSTActivePerl安装时默认已经把.pl关联好了,我们只要再把.cgi关联上就行了,如下图所示:

在IIS中再添加一个虚拟目录 user 指向 J:\MT\mt\,在设置访问权限向导中应把“运行脚本(如 ASP)”和“执行(如 ISAPI 应用程序或 CGI)”前面复选框的勾选去掉,如下图:
image
如果你的IIS安装了服务器扩展,则还需将CGI扩展设置为“允许”,完成设置。

开始安装

1. 配置mt.cfg

用文本编辑打开J:\MT\cgi-bin\mt.cfg。
下面对一些常用的参数配置作简要说明:

参数
配置说明

CGIPath http://WWW.YOUR-SITE.COM/PATH/TO/MT/
存放cgi脚本的虚拟目录的URL

DataSource ./db
数据源,数据库文件的存放路径

# StaticWebPath /path/to/static-files/
静态文件的存放路径
静态文件包括MT源码中的docs, images, styles.css

# CGIMaxUpload 500000
CGI最大允许上传的文件大小,默认为1MB

# TempDir /tmp/
上传文件临时目录
如果该项有设置,当上传同名文件时MT会提示你是否覆盖

# NoHTMLEntities 1
是否将字符转成HTML实体;1-否

# PublishCharset Shift_JIS
网志所使用的字符集

# DefaultTemplate default.tmpl
默认的搜索模块模板,后面在汉化时会用到。

AltTemplate comments comments.tmpl
为多个网志替代模板

以下是一个我的配置清单:CGIPath http://localhost/cgi-bin/
DataSource J:\MT\db\
StaticWebPath http://localhost/user/
TempDir /tmp/
NoHTMLEntities 1
PublishCharset UTF-8
AltTemplate comments comments.tmpl

2. 设置数据库

MT支持多种数据库,默认情况下会使用Bekeley DB文本数据库,则只需建立数据库文件保存的路径即可,即J:\MT\db\。
如果要使用MySQL,则要把DataSource改为以下代码:ObjectDriver DBI::mysql
Database your_database_name
DBUser your_username
DBHost your_database_host并把mt-db-pass.cgi文件中的database_password改为你的数据库用户的密码。
对于一般使用者来说,Bekeley DB已经足够了,因此这里我就使用Bekeley DB作为数据库。另外几种数据库由于用的较少,这里就不作介绍了。

3. 检测数据库

运行 http://localhost/cgi-bin/mt-check.cgi 查看是否可以开始安装MT了。
此时会提示以下信息:
DB_File… Your server does not have DB_File installed. DB_File is required if you want to use the Berkeley DB/DB_File backend. Please consult the installation instructions for help in installing DB_File. DBD::mysql… Your server does not have DBD::mysql installed. DBI and DBD::mysql are required if you want to use the MySQL database backend. Please consult the installation instructions for help in installing DBD::mysql.

如果使用Berkeley DB,则需要安装DB_File;
如果使用MySQL则需安装DBD::mysql。

安装方法:
运行命令提示符窗口,输入ppm,如下所示:

然后选择你要安装的软件包,输入相应的命令:
BerkeleyDB: Install DB_File
MYSQL: Install DBD::mysql(或DBD-mysql)
ppm将自动下载并安装软件包,如图所示:

再次运行 http://localhost/cgi-bin/mt-check.cgi 就可以发现DB_File已经安装成功了。

4. 激活系统

运行 http://localhost/cgi-bin/mt-load.cgi 以激活系统,当出现以下字样时,表示激活成功:
Loading initial data into system… Loading weblog… Loading author… Loading permissions… Loading templates… Mapping templates to blog archive types… Mapping template ID ’12’ to ‘Daily’ Mapping template ID ’12’ to ‘Weekly’ Mapping template ID ’12’ to ‘Monthly’ Mapping template ID ’13’ to ‘Category’ Mapping template ID ’14’ to ‘Individual’ Done loading initial data! All went well. VERY IMPORTANT NOTE: Now that you have run mt-load.cgi, you will never need to run it again. You should now delete mt-load.cgi from your webserver. FAILURE TO DELETE mt-load.cgi INTRODUCES A MAJOR SECURITY RISK.

程序提示你删除mt-load.cgi,因为以后不再需要用到它了;如果不删除,将会导致安全问题。
至此MT 2.661 英文版就安装完成了。
在 http://localhost/cgi-bin/mt.cgi 使用初始用户名“Melody”以及密码“Nelson”登录MT管理中心,注意区分大小写,登录成功后管理界面如图:

汉化MT

接下来先来汉化MT,汉化完成后再来配置MT,如果你想继续使用英文版的MT,请跳过这步。

我整理了一份汉化包提供下载:
MT 汉化包下载
汉化包中包含以下文件夹和文件:
lang-zh-cn:汉化图片
default-templates.pl:默认模板
search_templates:搜索模块的简体语言包
zh_cn_utf_8:UTF-8编码的简体语言包
zh_cn_gb2312:gb2312编码的简体语言包
docs:简体中文帮助文档
style.css: 汉化后中文字体太小,请用这个样式表覆盖原来的样式表你需要做以下事情:

1. 图片的汉化
将lang-zh-cn放到 J:\MT\mt\images\ 目录下。

2. 默认模板的汉化
将default-templates.pl 放到 J:\MT\cgi-bin\lib\MT\ 目录下,覆盖原文件。

3. 操作语言的汉化
将UTF-8或gb2312编码的简体语言文件 zh_cn.pm 放到 J:\MT\cgi-bin\lib\MT\L10N\ 目录下。

4. 帮助文档的汉化
将docs放到 J:\MT\mt\ 中,替换掉原来的英文帮助文档。

5. 搜索模块的汉化
将 search_templates 目录中的 default_zh.tmpl 放到 J:\MT\cgi-bin\ search_templates\ 目录下,并在mt.cfg 中加入一行:DefaultTemplate default_zh.tmpl

6. 时间日期的汉化
a. 打开参数设定模板文件J:\MT\cgi-bin\tmpl\cms\cfg_prefs.tmpl,找到 “<select name=”language” class=”menu”>”
在它下面加入这行:
“<option value=”zh”<TMPL_IF NAME=LANGUAGE_ZH> selected</TMPL_IF>><MT_TRANS phrase=”Chinese”>”
b. 设置时间显示格式。打开J:\MT\cgi-bin\lib\MT\Util.pm,找到
“%Languages = (”
在下面加入这段(中文已转换成Unicode):
‘zh’ => [ [ ‘&#26143;&#26399;&#26085;’, ‘&#26143;&#26399;&#19968;’, ‘&#26143;&#26399;&#20108;’, ‘&#26143;&#26399;&#19977;’, ‘&#26143;&#26399;&#22235;’, ‘&#26143;&#26399;&#20116;’, ‘&#26143;&#26399;&#20845;’], [ ‘&#19968;&#26376;’, ‘&#20108;&#26376;’, ‘&#19977;&#26376;’, ‘&#22235;&#26376;’, ‘&#20116;&#26376;’, ‘&#20845;&#26376;’, ‘&#19971;&#26376;’, ‘&#20843;&#26376;’, ‘&#20061;&#26376;’, ‘&#21313;&#26376;’, ‘&#21313;&#19968;&#26376;’, ‘&#21313;&#20108;&#26376;’ ], [ ‘&#19978;&#21320;’, ‘&#19979;&#21320;’ ], “%Y&#24180;%m&#26376;%d&#26085; %p%I&#28857;%M&#20998;”, “%Y&#24180;%m&#26376;%d&#26085; %A”, “%p%I&#28857;%M&#20998;”, “%Y&#24180;%m&#26376;”, ],

再找到以下注释:
“## This is a dreadful hack.在注释下添加以下代码:if ($lang eq ‘zh’) {
$format =~ s!%B %Y!$Languages{$lang}->[6]!g;
}”
这样每月归档的月份显示就会自动套用前面设置的格式。

配置MT

1. 切换语言

运行 http://localhost/cgi-bin/mt.cgi 登录MT后台管理,点击右侧的菜单“EDIT YOU PROFILE”修改个人数据。选择你的操作语言为“PRC Chinese”,并修改管理密码,如图所示:

点击 SAVE 更新你的资料,回到主菜单,这时界面已经变成简体中文的了:
image

2. 新建网志

先删除系统预设的网志“FIRST WEBLOG”,因为它在汉化前就已经存在了,里面的模板都还是英文的。
点击右侧菜单的“建立新的网志”进入新网志的配置,我的配置如下:

主要配置说明:
网站文件绝对路径:我的网志在服务器上保存的路径,这些网志都是静态文件,因此把它们放到虚拟目录user中,如果有多个用户,则不能直接把生成的网志都存放在 J:/MT/mt/ 目录下,应该在该目录下为每个网志建立一个目录,如 J:/MT/mt/fengdongren/,否则重建文档时可能会覆盖掉同名档案,访问时也没法分清到底是谁的网志,发生混乱。站点网址:指向我的网志目录的网址,我的网志目录在虚拟目录user中,因此我的站点网址将会是:
http://localhost/hily/_本机存档路径:MT中每个网志就是一个静态文件,为使网志结构清晰,一般是在网站文件绝对路径下新建一个名为archives的目录,用于存放这些文件,如:J:/MT/mt/fengdongren/archives/
存档网址:类同站点网址,即指向我的本机存档路径的网址,这里应该是:
http://localhost/hily/_archives/
时区:中国所在时区就是“UTC+8(中国沿海,台湾)”配置完后点击保存,页面就切换到这个网志的详细设置和维护界面了:

其他的配置相对较简单,这里不做过多介绍。

3. 预览网志

新建一个类别,增加几篇文章,然后更新系统,看看效果吧:
http://localhost/hily/_

4. 安装XINHA

MT自带的编辑器的可视化编辑功能太差了,幸亏有XINHA,它是一个WYSIWYG(What You See Is What You Get)编辑器,是HTMLAREA 3.0的改进版,下面来看看怎么安装。
发布:http://xinha.python-hosting.com/
下载:http://xinha.gogo.co.nz/xinha-nightly.zip
我下载的是就新版本,不是稳定版。这个版本中还存在一些Bug,我汉化并修正了一份,这里提供下载:
Xinha 汉化修改版下载
把压缩包内容解压到CGI根目录下的xinha文件夹中。接下来就是要把Xinha整合到MT的文章编辑中,我参考了 Jedi 汉化的MT中整合htmlArea的界面,修改了edit_entry.tmpl模板,如果你比较懒,就拿我这份去用吧:
edit_entry.tmpl 模板
记得要把变量设置_editor_url = ‘/cgi-bin/xinha/’改为你的xinha文件夹所在的绝对路径。
Xinha里面带有好多插件,我对其中主要用到的插件进行了汉化。一些插件需要PHP的支持(比如ImageManager),还有一些不适合在MT中工作(比如FullPage,它会在文章中生成<html>标签),考虑到这里只是用它来整合MT,就没有对它们做太多的修改。不使用的插件尽量删除它们的源代码,因为有可能会带来安全问题(比如利用ImageManager可以任意上传文件)。
现在来看看整合后的编辑器界面:

很酷吧。

5. 模板连接到文件的隐患

david 的提醒下,发现MT中模板连接到文件这块确实存在一个严重的问题:用户通过父路径(../)可以把他的模板保存到系统中的任意位置。单用户则罢(没有谁喜欢整自己吧),如果这个MT中有多个网志多个作者,就可能存在一些有意无意的非法操作,恶意将模板文件生成并覆盖其他作者的网志文件。
解决方法:有两种选择,要么去掉这个功能;要么修改MT代码。我不会perl,只能选择去掉这个功能。打开模板 tmpl\cms\edit_template.tmpl ,去掉其中的这段代码即可:
<tr> <td valign=”top”><img src=”<TMPL_VAR NAME=STATIC_URI>/hily/_images/spacer.gif” width=””1″ height=”10″></td> </tr> <tr> <td valign=”top”><font class=”title”><MT_TRANS phrase=”Link this template to a file”> <a href=”#” onclick=”openManual(‘item_link_this_template_to_a_file’)”>(?)</a><br> <input class=”text” name=”linked_file” value=”<TMPL_VAR NAME=LINKED_FILE>”></td> </tr>

6. 编辑框里频繁断行?

不觉得MT的编辑框都太小了吗?宽度不到500px,页面整体布局看起来比较协调,但是编辑区里的文本却经常断行,显得很混乱,不够实用。
解决方法:打开样式表,找到textarea.width500条目,修改宽度为合适宽度,并增加两条规则让文本太长时显示滚动条而不是自动换行:
overflow: scroll; word-wrap: normal;

安装插件

MT的插件资源非常丰富,这些插件可以在 http://mt-plugins.org/ 找到。下面介绍一下MT里常用的插件及其安装,至于插件的使用不多作介绍:

1. WHOLESYSTEM

发布:http://www.rayners.org/2003/01/mtwholesystem.php
下载:http://www.rayners.org/plugins/wholesystem.zip
从字面上理解就是整个系统,它的功能就是为整个多用户的MT系统提供一个组织页面,将所有网志中的最新网志整理到一起。
使用方法很简单,新增一个网志,用于汇整整个系统中的网志,并在主索引模板中的适当位置加入下面这些代码即可:
<h2>Latest Entries</h2> <MTWholeSystemEntries lastn=”5″> <a href=”<$MTEntryLink$>”><$MTEntryTitle$></a> on <a href=”<$MTBlogURL$>”><$MTBlogName$></a><br /> </MTWholeSystemEntries>
我把id为content的块替换成如下字符串:
<div id=”content”> <div class=”blog”> <h2>Latest Entries</h2> <MTWholeSystemEntries lastn=”5″> <$MTEntryTrackbackData$> <MTDateHeader> <h2 class=”date”> <$MTEntryDate format=”%x”$> </h2> </MTDateHeader> <div class=”blogbody”> <a href=”<$MTEntryLink$>”><$MTEntryTitle$></a> on <a href=”<$MTBlogURL$>”><$MTBlogName$></a><br /> <a name=”<$MTEntryID pad=”1″$>”></a> <h3 class=”title”><$MTEntryTitle$></h3> <$MTEntryBody$> <MTEntryIfExtended> <span class=”extended”><a href=”<$MTEntryPermalink$>#more”>详细阅读 “<$MTEntryTitle$>”</a></span><br /> </MTEntryIfExtended> <div class=”posted”>由 <$MTEntryAuthor$> 发表于 <a href=”<$MTEntryPermalink$>”><$MTEntryDate format=”%X”$></a> <MTEntryIfAllowComments> | <a href=”<$MTCGIPath$><$MTCommentScript$>?entry_id=<$MTEntryID$>” onclick=”OpenComments(this.href); return false”>回复 (<$MTEntryCommentCount$>)</a> </MTEntryIfAllowComments> <MTEntryIfAllowPings> | <a href=”<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&amp;entry_id=<$MTEntryID$>” onclick=”OpenTrackback(this.href); return false”>引用 (<$MTEntryTrackbackCount$>)</a> </MTEntryIfAllowPings> </div> </div> </MTWholeSystemEntries> <MTEntries> </MTEntries> </div> </div>
来看看效果,很简单吧:

到这里还不算完,如果系统中有新的网页出现时,这个汇总网志并不能自动重建。因此,我们需要定时给它重建,但这样就显得麻烦了。有什么办法让MT自动更新重建呢?
答案是计划任务+MT-Rebuild。
计划任务应该都知道是什么东东吧,不知道的运行“开始-程序-附件?-系统工具-任务计划”看看。现在要介绍的是MT-Rebuild,它其实是一个脚本程序mt-rebuild.pl,它能够在命令行下对特定的某个网志进行重建,这里我们就要用它来定时重建汇总网志“MT SYSTEM”,id为4。
还是先下载吧:
MT-Rebuild:http://www.mplode.com/tima/files/mt-plugins/mt-rebuild.tar.gz
下载完后把mt-rebuild.pl放到CGI根目录下。
命令参数参考:# 重建所有网志中的所有文章和索引(mt-rebuild v0.2新增命令):
mt-rebuild -all
# 重建指定网志中的所有文章和索引:
mt-rebuild -mode=”all” -blog_id=0
# 重建指定网志中的所有文章,但不重建索引:
mt-rebuild -mode=”all” -blog_id=0 -no_indexes
# 重建指定网志中的一个文章类别:
mt-rebuild -mode=”archive” -blog_id=0 -archive_type=”(Individual|Daily|Weekly|Monthly|Category)”
# 重建指定网志中的一篇特定的文章:
mt-rebuild -mode=”entry” -blog_id=”0″ -entry_id=0
# 重建指定网志的主索引:
mt-rebuild -mode=”index” -blog_id=”0″ -template=”your template name”添加计划任务,设置任务运行程序:c:\perl\bin\perl.exe J:\MT\cgi-bin\mt-rebuild.pl -mode=”index” -blog_id=”2″ –template=”index”在计划页中设置定时选项,我的配置是“从2005-5-1起,每天,0:00”。这样,我在自己的网页中发表的新文章在第二天就能更新到汇总网志上了(重建索引命令中的template不支持中文,所以我只好把索引模板的名称改回英文的了)。

2. MT-Blacklist

发布:http://www.jayallen.org/projects/mt-blacklist/
下载:http://www.jayallen.org/projects/mt-blacklist/1.65/MT-Blacklist.zip
Blacklist,即黑名单,它是一个用于防御回复和引用攻击的插件。这里有 Jedi 的繁体版。
使用方法:
将插件包中的mt-blacklist.cgi放到CGI根目录下;
将插件包中的Blacklist.pl放到plugins目录下;
在extlib目录下新建一目录jayallen,将其余三个.pm文件放入。
为了使用方便,我想把Blacklist做成菜单链接放到MT管理首页右边的菜单下。打开位于tmpl/cms/目录下的模板list_blog.tmpl,在其中相应位置添加以下代码:
<tr> <td colspan=”2″><img src=”<TMPL_VAR NAME=STATIC_URI>/hily/_images/spacer.gif” width=””1″ height=”15″></td> </tr> <tr> <td width=””36″><a href=”<TMPL_VAR NAME=SCRIPT_URI>mt-blacklist.cgi”><img src=”<TMPL_VAR NAME=STATIC_URI>/hily/_images/mtblacklist.gif” width=””36″ height=”32″” border=””0″></a></td> <td width=””210″><a href=”<TMPL_VAR NAME=SCRIPT_URI>mt-blacklist.cgi”><font class=”command”><MT_TRANS phrase=”Set up blacklist”></a><br><font class=”instructional”><MT_TRANS phrase=”Blacklist helps you resist comment spam”></font></td> </tr>
并在zh_cn.pm中增加字典条目如下:’Set up blacklist’ => ‘配置Blacklist’,
‘Blacklist helps you resist comment spam’ => ‘Blacklist帮助你抵抗回复垃圾’,请将BLACKLIST的图标保存到images目录下:
完成设置后看看效果:

点击“配置BLACKLIST”,在配置选项中激活BLACKLIST就可以使用了。
注:发现Blacklist的一点小bug,它读取的操作全是UTC标准时间,可惜我不懂perl,自己不会改。

3. MT-LIST + MT-RSSFEED

发布:http://www.timaoutloud.org/code/mt/
下载:http://www.mplode.com/tima/files/mt-plugins/mt-list.tar.gz
http://www.mplode.com/tima/files/mt-plugins/mt-rssfeed.tar.gz
MT-LIST能够创建简单的RSS种子列表(或数组),在这个列表中可以实现循环、排序以及随机选择。而MT-RSSFEED可以用来格式化显示单个RSS种子的内容。这样通过MT-LIST在外层的循环,再由MT-RSSFEED在循环体中输出各个RSS种子的内容,就可以在你的网志上读取和显示出其他网志上RSS种子的内容列表清单甚至是文章内容。
官方的mt-rssfeed.pl在处理中文时候会出错,这里提供patch过的mt-rssfeed.pl和它需要的一个文件gb2312.enc的下载地址:
http://www.foresee.com.cn/blogs/neo/files/mt-rssfeed.pl
http://www.fayland.org/journal/gb2312.enc
使用方法:
将插件包中的mt-rssfeed.pl和mt-list.pl放到plugins目录下;
将gb2312.enc放到C:\Perl\site\lib\XML\Parser\Encodings\目录下;
将插件包中的LP.pm放到extlib/XML/RSS/目录下(你可能要建立这个目录)。
配置mt-rssfeed.pl中的RSS路径:
# my $RSSFEED_DATA_DIR = “./db/”;
如果你用的是Berkeley DB,MT-RSSFEED将用使用MT的默认数据库路径,这里无需更改,如果你使用MySQL或者你要让RSS文件缓存在其他目录,则需要更改。
下面介绍一下MT-LIST以及MT-RSSFEED的标签的用法(建议打开一个具体的RSS种子对照起来看):

1). MT-LIST
MTList name=“string”用于建立一个简单的RSS种子列表(或数组),每个种子各占用一行。
name:为这个列表指定一个名称。MTListFile name=“string” file=“string”类似MTList,这个标签也是用于建立一个RSS种子列表,不同的是它的来源是file属性所指定的本地文件,而不是包含在标签里的字符串。
name:为这个列表指定一个名称。MTListLoop name=“string” [rnd=“integer”, count=“integer”, offset=“integer”, sort=“ascending|descending”]用于控制指定列表中RSS种子的循环。
name:使用哪个列表
rnd:可选属性,设置从列表中随机选出多少个不重复的项目。
count:可选属性,设置从列表中选择出的项目的总数。
offset:可选属性,设置列表开始时的偏移量,即从第几个项目开始。offset默认为1。
sort:设置列表中项目的排序规则(根据RSS种子的地址)。ascending-升序|descending-降序。
如果设置了rnd,那么count和offset都将被忽略。MTListLoop的默认操作方式是使用所有列表项目,无偏移且不排序。 MTListLoopItem插入当前循环体中的项目。MTListLoopItemIndex插入当前循环体在列表中的位置(或已循环的次数)。

2). MT-RSSFEED
a. 种子标签:
MTRSSFeed [file=“url” var=“MTvar_name” debug=“0|1|2”]
这是最外层的标签,表示它是一个RSS种子。其它所有的MT-RSSFEED标签都必须嵌套在这个标签中。
file:除非这个标签包含在MTListLoop中,否则这个属性是必须的。
var:MT变量名称
debug:它会改变实际输出的模板,但是会在重建时输出有用的调试作息。
默认值为0(0-关闭调试|1-打开普通调试|2-打开详细调试)
MTRSSFeedCacheDate [format=“mt-date-format”]
RSS种子的更新日期。
format:日期的显示格式。这是一个可选属性,默认情况下会按照MT的日期格式显示。
MTRSSFeedURL
这个RSS种子的URL地址。
MTRSSFeedTitle
这个RSS种子的标题。
MTRSSFeedTitleExists
一个条件标签,RSS种子的标题存在时才会显示它所包含的内容。
MTRSSFeedLink
与这个RSS种子关联的网页的URL地址。
MTRSSFeedLinkExists
一个条件标签,RSS种子关联的网页的URL地址存在时才会显示它所包含的内容。
MTRSSFeedDescription
关于这个RSS种子的制作者以及RSS种子内容的描述,包含所有HTML原始标签。
MTRSSFeedDescriptionExists
一个条件标签,以上所述RSS种子的描述存在时才会显示它所包含的内容。
MTRSSFeedDescriptionEncoded
关于这个RSS种子的制作者以及RSS种子内容的描述,不包含HTML原始标签。
MTRSSFeedDescriptionEncodedExists
一个条件标签,以上所述RSS种子的描述存在时才会显示它所包含的内容。
MTRSSFeedLanguage
RSS种子所使用的语言代码,中文是ZH。其它语言对应的代码请看ISO639标准:
http://www.oasis-open.org/cover/iso639a.html
MTRSSFeedLanguageExists
一个条件标签,RSS种子的语言存在时时才会显示它所包含的内容。
b. 项目标签:
MTRSSFeedItemsExist
一个条件标签,当有项目标签存在时才会显示它所包含的内容。
MTRSSFeedItems [lastn=“n”]
显示n个项目标签。它包含着一些类似MTRSSFeedItemXXX的标签。
MTRSSFeedItemCount
包含在RSS种子中的项目总数。
MTRSSFeedItemTitle
RSS种子中当前项目的标题。这个标签必须包含在一个MTRSSFeedItems标签中。
MTRSSFeedItemTitleExists
一个条件标签,当前项目标签的标题存在时才会显示它所包含的内容。
MTRSSFeedItemLink
RSS种子中当前项目的URL地址。这个标签必须包含在一个MTRSSFeedItems标签中。
MTRSSFeedItemLinkExists
一个条件标签,当前项目标签的URL地址存在时才会显示它所包含的内容。
MTRSSFeedItemDescription
RSS种子中当前项目的描述,包含所有HTML原始标签。这个标签必须包含在一个MTRSSFeedItems标签中。
MTRSSFeedItemDescriptionExists
一个条件标签,上述当前项目的描述存在时才会显示它所包含的内容。
MTRSSFeedItemDescriptionEncoded
RSS种子中当前项目的描述,不包含HTML原始标签。这个标签必须包含在一个MTRSSFeedItems标签中。
MTRSSFeedItemDescriptionEncodedExists
一个条件标签,上述当前项目的描述存在时才会显示它所包含的内容。
c. 图像标签:
MTRSSFeedImageExists
一个条件标签,当有图像标签存在时才会显示它所包含的内容。
MTRSSFeedImage
一个图像标签,它包含着一些类似MTRSSFeedItemXXX的标签。
MTRSSFeedImageURL
图像文件的URL地址。
MTRSSFeedImageURLExists
一个条件标签,当图像文件的URL地址存在时才会显示它所包含的内容。
MTRSSFeedImageHeight
图像的高度,单位是像素。
MTRSSFeedImageHeightExists
一个条件标签,当图像的高度存在时才会显示它所包含的内容。
MTRSSFeedImageWidth
图像的宽度,单位是像素。
MTRSSFeedImageWidthExists
一个条件标签,当图像的宽度存在时才会显示它所包含的内容。
MTRSSFeedImageLink
图像链接的URL地址,即当用户点击图像时将会去往的地址。
MTRSSFeedImageLinkExists
一个条件标签,当图像链接的URL地址存在时才会显示它所包含的内容。
MTRSSFeedImageTitle
图像标题。
MTRSSFeedImageTitleExists
一个条件标签,当图像标题存在时才会显示它所包含的内容。
MTRSSFeedImageDescription
图像文件的描述。
MTRSSFeedImageDescriptionExists
一个条件标签,当图像文件的描述存在时才会显示它所包含的内容。
通用标签:
MTRSSFeedElement name=“namespace_qualified_tag_name”
这是一个非常有用的标签,它可以处理在RSS种子中channel部分出现的,但mt-rssfeed不能直接支持的标签数据。name这个属性是必须的,它代表RSS种子的命名空间。例如name=”http://purl.org/dc/elements/1.1/date”将会插入格林威治标准时间。如果你没有设置name,mt-rssfeed将会采取默认的命名空间。
MTRSSFeedElementExists name=“namespace_qualified_tag_name”
一个条件标签,当某个特定标签存在时才会显示它所包含的内容。这个标签经常会与MTRSSFeedElement配合使用。name属性与上述MTRSSFeedElement标签中的意义一样。
MTRSSFeedItemElement name=“namespace_qualified_tagname”
这是一个非常有用的标签,它可以处理在RSS种子中item部分出现的,但mt-rssfeed不能直接支持的标签数据。name属性与上述MTRSSFeedElement标签中的意义一样。
MTRSSFeedItemElementExists name=“namespace_qualified_tag_name”
一个条件标签,当在RSS种子channel部分存在某个特定标签时才会显示它所包含的内容。这个标签经常会与MTRSSFeedItemElement配合使用。name属性与上述MTRSSFeedElement标签中的意义一样。
通用标签属性:
state=“0|1”
这是一个可选的属性,它可以应用于任何一个以Exists结束的标签。它是一个布尔值,表示是否要显示标签包含的内容。默认为1(1-是|0-否)
写了这么多,来举个例子看看吧。
新建一个索引模板,模板内容如下,其中< MTList>标签嵌套的内容就是要读取的其它网志的RSS种子,通过标签的循环和其它标签的格式化,就可以输出RSS种子中的指定部分了:
<html> <body> <MTList name=”feeds”> http://www.mplode.com/tima/xml/index.xml http://www.movabletype.org/index.xml </MTList> <MTListLoop name=”feeds”> <MTRSSFeed> <$MTRSSFeedTitle$><br/> <ul><MTRSSFeedItems lastn=”5″> <li><a href=”<$MTRSSFeedItemLink$>”><$MTRSSFeedItemTitle$></a></li> </MTRSSFeedItems></ul> </MTRSSFeed> </MTListLoop> <p>Syndicated using <a href=”http://www.mplode.com/tima/files/mt-plugins/#mt-rssfeed”>mt-rssfeed</a></p> </body> </html>
模板名为test,输出文件为test.html,保存后重建索引,打开http://localhost/hily/_test.html就可以看到效果了:

扩展用法:可以把要读取的RSS种子地址全部放到一个新建的模板feeds中,然后把以上模板中的<MTList>嵌套的内容改为<$MTInclude module=”feeds”$>就可以了。这样做的好处是:RSS种子集中存放,易于管理。
另外,你也可以利用RSSFEED把这个MT系统中所有网页的xml搜罗起来,建立一个索引页。但这个索引页与WHOLESYSTEM生成的略有不同,WHOLESYSTEM是按发表时间生成的,而RSSFEED则是按网志生成的。
如果要系统自动更新RSSFEED模块的内容的话,请参照上面对WHOLESYSTEM自动更新的介绍。
另外,我发现patch过的mt-rssfeed.pl还不是很完美,虽然从RSS种子中正确地读出中文,但是嵌套在标签中的中文却还是一团乱码。重建以下这个索引模板,就能发现问题了:这里不会乱码
<MTList name=”feeds”> </MTList> <MTListLoop name=”feeds” <MTRSSFeed> <$MTRSSFeedTitle$> <MTRSSFeedTitleExists>这里就会乱码</MTRSSFeedTitleExists> </ul> </MTRSSFeed> </MTListLoop>
如果一定要在标签里使用中文,请把中文转成unicode转义符。我简单地写了一个非ASCII字符和unicode转义符之间互换的工具(Characters – Escape Characters Converter),希望能够帮上你:
Characters – Escape Characters Converter

4. MTFastInclude

发布:http://www.nonplus.net/software/mt/MTFastInclude.htm
下载:http://www.nonplus.net/software/download/mt/MTFastInclude.zip
MT中有很多MTInclude的标签,用来包含外联文件、模板或模块。但是使用这些标签会降低你的重建效率,只为每次重建时MT都要读取和加载那些文件或编译那些模板和模块。安装了MTFastInclude后就可以大大加快处理速度,它能够将常用的MTInclude标签内容缓存起来,这样只有第一次重建会加载和编译相应模块,以后每次重建就可以直接从缓存中读取了。
使用方法:
将压缩包中的MTFastInclude.pl放到plugins目录中就可以了。
这个插件默认会把所有的MTInclude标签缓存,如果你不想缓存某个特定的标签,请在标签中加上属性no_cache=”1″。

5. MT-Medic

发布:http://www.nonplus.net/software/mt/MT-Medic.htm
下载:http://www.nonplus.net/software/download/mt/MT-Medic.zip
这是一个对MT进行快速诊断和管理的插件,使用方法也非常简单,更改mt-medic.cgi文件中的操作密码后把它放到CGI根目录下即可。

6. MTEntryIfComments

发布:http://www.nonplus.net/software/mt/MTEntryIfComments.htm
下载:
这是一个用来检测某个网志的回复或引用是否存在的插件。MT中有很多条件输出标签,当标签的条件为“真”时才输出嵌套在标签里的内容。MTEntryIfComments的使用的标签与其十分地类似,它定义了两种标签 <MTEntryIfComments>和<MTEntryIfPings>,分别用于检测回复或引用是否存在。
两个标签中都可以包含一个判断条件,标签支持以下:count_greater_than=”n”如果这个网志的回复或引用大于n条,条件为真 count_less_than=”n”如果这个网志的回复或引用少于n条,条件为真 count_equals=”n”如果这个网志的回复或引用等于n条,条件为真如果标签中不包含判断条件,则默认为count_greater_than=”0″。下面就在回复中使用MTEntryIfComment举两个例子:
a. 根据回复的数量显示不同的内容:<MTEntryIfComments count_equals=”0″>没有回复</MTEntryIfComments><br /> <MTEntryIfComments count_equals=”1″>只有1条回复</MTEntryIfComments><br /> <MTEntryIfComments count_greater_than=”1″><br /> 共<MTEntryCommentCount>条回复<br /> </MTEntryIfComments>
b. 没有回复时不显示回复区块:
<MTEntryIfComments><br /> <div class=”comments-head”><a name=”comments”></a>回复</div><br /> <MTComments><br /> <div class=”comments-body”><br /> <$MTCommentBody$><br /> <span class=”comments-post”><br /> <MTIfNonEmpty tag=”MTCommentAuthorLink”>由<br /> <$MTCommentAuthorLink spam_protect=”1″$> 发表于<MTElse>Posted at</MTElse><br /> </MTIfNonEmpty><br /> <$MTCommentDate$></span><br /> </div><br /> </MTComments><br /> </MTEntryIfComments>

该结束了

好了好了,装了上面这么多插件,真是累呀。相信有了以上的基础再装其它插件也不是太难了。剩下的事情就是好好地修改一下你的模板了,再好好地写几篇文章,让大伙儿都来瞻仰瞻仰。

第一次写这么长篇大论的东西,难免会有错误存在,欢迎你指出和纠正。

— EOF —