标签/Tag为[MT]的文章 [ 1/4 ]

[MT Plugin]全新改写的 Markdown 解析插件 ,

一直在用 Markdown 写Blog。
总觉得貌似解析效率有点不高。何况引入 代码高亮 后,处理代码显示是个问题。

检查了 MT 自带的 Markdown 解析插件 ( plugins/Markdown/Markdown.pl ) , 原来是 John Gruber 2004 写的第一版。

My God , so oooold。。。

John Gruber 这个原代码写的很经典, 但是究竟很老了。。

使用Nginx的proxy_cache功能缓存MT Tags ,

This is a sitelog of Easun.org.

一直以来,本站的 MT tag search 都使用的自己写的 Perl 脚本来缓存 后台 mt-search.cgi 的结果。 前台伪静态成 tag/key 模式。

详细介绍在这里:

  1. MT归档页面变更以及Tags搜索页面cache机制的变更
  2. 本站使用的文本缓存Tag搜索的Perl脚本

评论模式的小小改变和JS重写 ,,

This is a sitelog of Easun.org.

因为 PSGI 运行 MT ,貌似服务器执行效率不再是瓶颈, so 渐渐取消了了一些为了节省资源的"优化",简单记录如下:

  1. 评论后博文重建的改变
    原来为了效率。我的博文页其实有两个。一个是博文本身,另一个是 json 格式的评论全集。 比如这个: http://easun.org/blog/archives/json/311.json。 当每次有新的评论发表时候,我的原设计是并不刷新本页,只是重载 json 罢了。 通过自写的 JSjson 中的所有评论更新一遍。 而且每个页面的评论也都加入了"刷新" 和"重载"两个按钮。 其中"刷新"的含义是重载 json 文件, "重载"则从数据库重载。 抓图如下:
    旧模式评论
    而现在,考虑再三, 取消了 json 格式的博文页, 减少一次服务器写文件的次数? 同理,改写了 JS,移除了在加载文件同时加载 json 文件。 当然,保留了从数据库直接重载评论的设计。 顺便改了一下 "重载" 的 UI,让它更 醒目 一点 (也许是更*丑陋*了一点。哈哈),抓图如下:
    新模式评论

增加 GitHub 账号登陆 Movable Type 及全站搜索页面恢复 ,

又是愚人节,只是这个愚人节需要上班, 但愿通知大家上班的信息不要当作愚人节信息而忽略,这样的话估计就欲哭无泪了。呵呵 :D

Blog 自从复活以来,一直修修补补,说说最近的一些变化吧:) 简单如下:

[笔记]CentOS6 nginx下安装MT-PSGI环境的全过程

PSGI 运行 MovableType,是一直的梦想,说实在的,慢如蜗牛的 MT 后台已经早已厌倦了。只是不舍得转化到 WordPress 平台而已。

切换到了 vultr VPS + nginx, 这个愿望可以说距离实现近了一步,只是小有瓶颈,因为原版的 mt-starman-daemon 是针对 Debian 的。 移植到 CentOS6 上需要小小改动。

废话不说,直接记录过程吧。

先上几个参考教程:

  1. https://github.com/saahov/mt-starman-daemon
  2. http://www.centoscn.com/CentOS/help/2016/1209/8270.html
  3. https://www.tonyhead.com/archive/2014/08111250

PSGI 环境下的MT留言IP问题,其实很简单 ,

切换 MT 运行环境为nginx + PSGI,后台速度的确刷一下上去了。 但是,由于是所有的 cgi/pl 文件其实都交给了服务器的 mt-starman-daemon 本地网关守护进程, 所以所有的程序的来访IP都会变成 127.0.0.1 。 检查一下后台日志,的确如此,其他都不重要,但是留言/评论 的IP地址就不能不说遗憾。

检查配置 mt-starman-daemon 时的增加的 nginx 设置,如下:

codelocation /cgi-bin/mt/ {
proxy_set_headerHost $http_host;
proxy_set_headerX-Forwarded-Host $host;
proxy_set_headerX-Real-IP $remote_addr;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://starman;
}

配置中明确有原始访问的IP。。 那么还是看 MT 的程序。 根据直觉,直接查看 MT/App.pm, 搜索关键词 $ENV{REMOTE_ADDR},结果定位到如下:

codemy $trusted = $app->config->TransparentProxyIPs || 0;
my $remote_ip = (
$ENV{MOD_PERL}
? $app->{apache}->connection->remote_ip
: $ENV{REMOTE_ADDR}
);
$remote_ip ||= '127.0.0.1';
my $ip
= $trusted
? $app->get_header('X-Forwarded-For')
: $remote_ip;

呃, MT 本身就有这个功能。。。。。也就是 TransparentProxyIPs 。 这下简单了。 打开 mt-config.cgi, 增加以下设置:

TransparentProxyIPs 1

保存。 重启动 mt-starman-daemon。

再次发一条评论,测试可以正常获取原始IP地址。

弯路一堆。 幸好OK。

MovableType.org 一搜索。有详细解释,地址如下: https://movabletype.org/documentation/appendices/config-directives/transparentproxyips.html

-bbb。

Anyway,解决就好。

--EOF--

博客复活与调整 ,

网站带病运行一年,博客也中断更新一年。貌似今天又继续开写了。中断的原因基本上是因为懒、切换服务器加上一些额外的状况。

简单说说:

  1. 切换服务器:去年 3 月份的时候,主机就到期了。当时因为看大家的VPS都不错。就准备也试试。于是在2016年3月切换到了 vultr 。当时选择的东京机房的LEMP 方案,CentOS6x64系统,25GB SSD,1 CPU 1024MB Memory, 1000GB Bandwidth,每月5美元。 由于从 apache 切换到 nginx 。很多设置无法平滑过渡。故而简单给nginx添加Perl-CGI 的支持(Fast-CGI 模式)后就先运行了。切换完成后,导致无扩展名的Perl文件无法运行,跨域验证无设置导致主页分页无法正常运行,apache 和 nginx 的 rewrite 规则不兼容导致 tag 目录完全失效等等。
  2. 懒: 切换服务器后,想法很大: 准备研究以 PSGI 运行 MovableType,彻底解决 MovableType 瓶颈,但是发现在 CentOS nginx 上安装 mt-starman-daemon 有一定的技术瓶颈。而 nginx 对 pathinfo 的 不支持 也让以前写的后台脚本不能直接使用,nginx 的rewrite 规则居然需要重启 nginx 才能实现,没有面板的VPS,实在的懒得SSH 下敲命令,故而就拖了下来。。。。 总之,明日复明日。。 而系统的马马虎虎运行也自然没有写东西的欲望。。
  3. 琐事甚多:这一年,遭遇家人住院,工作变动等诸多因素,然后在博客投入的精力自然就不会太多。。。

回归正传,最近抽出了一点时间,做了一些调整之后,博客的所有的功能都已经修复,也成功的实现了 nginx + PSGI 运行 MovableType,重新享受数年前的飞一般的后台速度。。。 一段时间没有上vultr 控制主页,发现vultr 居然推出了2.5美元的产品? 不过仅仅是空白VPS,啥都需要自己装。。。也许接下折腾就是从 $5/mon 折腾到 $2.5/mo。

PS: 虽然是带病运行,但是 vultr VPS 也算满一年了,话说其性价比和稳定性都算比较好的。有需要VPS的还是可以考虑一下。 vultr VPS 对新用户很优惠,新用户注册完成后支付充值5美元后送20美元,可惜我 2016年3元就注册了。无法享受赠送。

接下来,有时间整理的话,我会把 在 CentOS6 系统的 nginx + PSGI 运行 MovableType 的过程分享给大家 :)

--EOF--

[杂记]临时下线多说评论系统和 MovableType 6.2 发布 ,

时间总是飞速。 转眼国庆长假已经过去一周?

博客也好久没有更新了。 随便写点记录。

  1. 临时下线多说评论系统,原因嘛。最近的的多说越来越不正常了。。。评论显示不全,阵发性评论框不显示等等。。。。
    既然本博的每条多说评论都实现了实时写回本地数据库,不存在丢失评论问题,那么暂时下架吧。。
    下线的办法也很简单。 仅仅在我自己写的 js 中 设置easunConfig.load_duoshuo = false; 就万事大吉。

  2. MovableType 6.2 发布了。
    其实貌似发布在 10月8日。只是一直没有去看而已。
    仔细看了一下说明,主要更新为:

New and enhanced asset management features:

Upload multiple files asynchronously

You can upload multiple files by drag-and-drop from the posting screen and also from the "Upload Asset" menu. When upload is finished, you can edit the name, description and tags on the fly. Edit images easily

This new feature provide image editing function. You can scale images, rotate images and cropping images before to inserting the entries and web pages. Also, you can remove the GPS metadata and EXIF metadata. Default upload settings

Website administrator (and Blog administrator) can configure default settings for upload that including default upload destination and more.

Data API v3

Changed the authentication password

In the Data API v3, authentication password for "/authentication" endpoint was changed from user's password to user's web services password. The reason is security improvement. v1 and v2 are not changed. Possible to filter by date range.

The endpoints that list the objects such as listEntries, can now do filtering by date range.

主要热点为 多附件拖动上传。 因为打算停留在 5.x ,也就了解一下,跟新的朋友可以升级。

--EOF--

Movable Type 和 JS 删除 cookie 操作的弯路 ,

This is a sitelog of Easun.org.

话说: Movable Type 用户登录后退出貌似是http://easun.org/path_to_mt/mt.cp?__mode=logout&...

然后 302 回到当前页面。

这个过程究竟是干什么呢? 首先清理掉了 Session,这个是必须服务器支持的。

那么问题来了, 能不能不 302 ,直接我用 ajax 访问 上面的那个链接 OK ? 测试了一下。貌似 js 清除的 cookie 的值 mt_blog_user 为只是前台使用的。 后台使用还有 "mt_commenter","commenter_name","commenter_id" 这三个 cookie。 而 302 回原来界面的时候会清除这些 cookie.

知道了答案,于是开始修改,逻辑很清楚,ajax 访问上面的链接,清除服务器Session,然后自己写JS,清除这些 cookie,不就和原来逻辑一样了吗? 这样,点"退出"的时候页面不会跳转,会友好的多。

修改如下:

  1. 增加 clear_login_cookie 函数:如下

    javascriptfunction clear_login_cookie() {
    var name_array = ["mt_commenter","commenter_name","commenter_id"];
    var i = name_array.length;
    while (i--) {
    var name= name_array[i];
    mtDeleteCookie(name,mtCookiePath, mtCookieDomain,
    location.protocol == 'https:');
    }
    }
    ```
    
  2. 修改 mtSignOut 函数。
    定位 location.href = url; 修改为:

    code//location.href = url;
    clear_login_cookie();
    $.get(url, {ajax:'1'});
    mtFireEvent('usersignin');
    

    以为万事大吉,结果,运行之,发现虽然显示退出了, 但是mt_commenter","commenter_name","commenter_id 三个 cookie 并没有清理掉???

多处 Debug 无果, 最后又回归到了原来的模式,仔细研究了一下直接访问 302cookie 设定:

mt_commenter=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_name=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_id=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

呃,貌似根本没有 CookieDomain 设定。。。。 根本原因在于:

JS如果要删除(重新设置)某个 cookie ,必须知道原来设置的 pathdomain,不然会认为是完全不同的两个 cookie , 而悲催的事情是 js 无法获知原来设置的 cookie 的 pathdomain的。

原因知道了,只好硬编码了。幸好 mtCookiePath 定义的本身就是 /,回到 function clear_login_cookie(),重写如下:

code <!--lang:javascript-->
function clear_login_cookie() {
var name_array = ["mt_commenter","commenter_name","commenter_id"];
var i = name_array.length;
while (i--) {
var name= name_array[i];
mtDeleteCookie(name,mtCookiePath);
}
}

再次测试,一切 OK 。 但是弯路浪费了我 N 长时间。 记下来供同好者鉴。

吐槽一下: 为什么 Movable Type 设定这些 cookie 要和 公开的 cookie (mt_blog_user) 设定不同的 pathdomain 呢? 费解。

--EOF--

[JS随笔]网站评论、显示界面细微调整和杂谈 ,,

随笔写下一些东西,作为 SiteLog 和备忘。

都是一些评论、显示界面的调整,一个意图:用户体验。 说的不好听的就是"路杨的强迫症又犯了",反正是折腾无极限。。

这两个月, 整个 Blog 的 js 估计被我修改过不下10次,有些是纯粹为了闭包,有些是为了美观和清晰流程。。。

简单记下曾经的修改吧。

先说前端:

  1. ajax提交优化。 所有流程彻底闭包为一个函数,和 json 显示本地评论互动,增加了提交成功后如果通过审查的话,动态加载新评论及动画,并同时重置评论提交表单。
  2. 多说评论界面优化。 绑定了原来系统的显示/隐藏评论、 显示/隐藏评论框的函数,让原来界面的操作同时操作两个系统的界面。 在 SOTHINK提示下,虽然依然设置多说评论框为默认,但是登录本地系统(包括QQ等本地系统支持的社交帐号)的朋友则显示"本地评论系统评论框"。 代码片段为:

    codevar check_mt_user = function(u) {
    if(typeof duoshuoQuery.is_ds_hide =='undefined') {
    if (!u) u = w.mtGetUser();
    if (u && u.is_authenticated) { duoshuoQuery.is_ds_hide=true;}
    else duoshuoQuery.is_ds_hide=false;
    }
    };
    
  3. 本地json评论界面优化。 彻底完成本地评论js的闭包。进一步和多说评论界面糅合, 增加了刷新重载 两个操作界面,前者从本地文本静态json cache中重新获取本地评论,后者读取 MySQL 库实时获取本地评论。

  4. 延迟加载图片重写。 也完成了一次JS闭包。 美化了延迟加载图片时候占位的动画,因为目前本站仅在评论者头像上使用延迟加载图片技术,也许大家并不能彻底体验到界面的加载过程(因为加载的太快了)。。。

上面的所有修改,均可以查看本站现有 JS 来获得代码。 本站的 JS 并无加密 :P

再说后台:

  1. 彻底解决了QQ头像、Gravatar 头像显示问题。 并缓存Gravatar 头像到本地。 不同原来的做法。这次写 插件,直接 hook 了 MT::Author::userpic_url 。 比较极端的做法。 代码如下:

    codeour($old);
    {
    no warnings 'redefine';
    no strict 'refs';
    require MT::Author;
    If ($old = MT::Author->can('userpic_url')) {
    *MT::Author::userpic_url = sub{
    my ($author) = @_;
    if ( ($author->auth_type =~ m/^QQ/ ) && $author->hint && ($author->hint=~ m!^https?://!) ) { return $author->hint. '#QQ' ;}
    my ($oldurl) = $old->(@_);
    return $oldurl if ($oldurl);
    my $email = $author->email;
    return &_hdlr_gravatar_url_mail($email);
    };
    }
    }
    
  2. 更换了后台插入图片后的显示,适应 HTML5。 这个没有写插件,直接Hacklib/MT/Asset/Image.pm 中的 can_html 。 更加的简单粗暴。 代码片段如下:

    code$text = sprintf(
    '<figure class="post-image"><img title="%s" src="%s" %s %s /></figure>',
    MT::Util::encode_html( $asset->label ),
    MT::Util::encode_html( $asset->url ),
    undef,undef,
    );
    

要查看详细的修改文件,可以移步到我的 GitHub

其他:

话说,多说 服务器维护了。 貌似以为会好一点,结果似乎结果一样? 另外,多说评论加载不出来时候,下面的加载动画一直显示的时候, 这个时候刷新就OK了,觉很奇怪, 查看了一下 log。 结果,100% 的在出现这个状态的时候,浏览器报错:

17:24:55.691 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://easun.duoshuo.com/api/threads/listPosts.json?thread_key=301&author_key=1&url=http%3A%2F%2Feasun.org%2Fblog%2Farchives%2Fgodaddy_cpanel_perl_dbdmysql.html&title=Godaddy%20cPanel%20%E4%B8%BB%E6%9C%BA%E5%92%8C%20Perl%E6%A8%A1%E5%9D%97%20DBD%3Amysql&require=site%2Cvisitor%2Cnonce%2Clang%2Cunread%2Clog%2CextraCss&site_ims=1442293934&lang_ims=1442293934&referer=http%3A%2F%2Feasun.org%2Fblog%2F&v=15.4.27. (Reason: CORS header 'Access-Control-Allow-Origin' missing).1

干啥子嘛~~
明显的服务器响应问题。。。
判断跨域的服务端脚本的得到没有执行。。
其实listPosts.json 返回数据了,可惜被浏览器拒绝了。 难怪不显示。。。。。。
话说,抛开 服务器 判断跨域的服务端脚本的问题。 listPosts.json 难道一定要用 JSON 模式? 又不是 POST, GET 而已,换成 JSONP 模式不就万事大吉了,而且也能节省服务器的判断跨域,输出 Access-Control-Allow-Origin header。。。。。。

另外,服务器维护了, 貌似脚本的版本还是 2015-04-27 。。。。

--EOF--

[随笔]关于 JS 和 ajax 提交评论等等 ,

This is a sitelog of Easun.org.

因为 本地评论 JS 化,又重写了一遍 MTajax 提交过程。梳理了一下流程。

主要是删除了 MT 提交过程的 2次服务器认证,把第一次服务器认证(登录信息预提交验证) mtCommentSessionVerify 有限度地交给 JS + cookie

简单的说,就是设置全局变量 usernull,然后重新在 cookie 中读取 user 来判断登录信息是否正常? 然后其他的认证在 提交表格 时完成就好。 简单 JS 片段如下:

code var refresh_user = function(u) {
if (u) mtSetUser(u);
if (!u) { user = null; mtFireEvent('usersignin'); u = mtGetUser(); }
if ( u && u.is_authenticated ) { /* do nothing*/ }
else { $f.find(':input[name="sid"]').attr("value","") ; ShowCommentsOpenData(); }
};

然后发现 JQ $.ajax 的小问题:

我的 $.ajax 如下:

code$.ajax({
type: 'POST',
cache:false,
url: url,
context: el,
xhrFields: { withCredentials: true },
data: $f.serialize(),
success: successfuc,
beforeSend:beforefun,
error: errorfun,
complete:completefuc
});

本来是吧 refresh_user 写到 beforeSend 中的,但是执行的时候发现 refresh_user 中对 $f 的改变,并没有在 data: $f.serialize() 中 体现出来。 所以只好显式在 $.ajax 前调用此函数了。

笔记下来,为自己提醒。

另外,本来对 JS 全面进行 JQ 改写来着,但是实际对 form 元素操作中发现,同样对

code<form name="comments_form" id="comments-form">
<input type="hidden" name="preview" value="" />
...
</form>

中 的 name="preview"value 操作。 原来的代码是

codevar f = document['comments_form'];
if (f.preview.value == '') f.preview.value = '1';

JQ 呢? 貌似。。。。。

codevar $f = $("#comments-form");
var $preview= $f.find(':input[name="preview"]');
if ($preview.attr("value") == '') $preview.attr("value","1");

f$f 是为了方便操作预先定义好的。 貌似还是不用 JQ 操作的快一点。或者就现在这样混合用吧。。。。

另外,给 ajax 提交完成后刷新新评论搞了一段简单的 JQ 特效: 代码如下:

code var animate_item = function(id) {
var $el =$("#comments-content .comment#comment-"+id);
var _top = $el.offset().top - ( $(window).height() - $el.height() )/2;
$("html,body").animate({scrollTop:_top},1000);
$el.addClass("notice")
.animate({left:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'0px',opacity:'1'},"slow");
var total= parseInt( $("#comments").attr("data-total"));
function c() { $el.removeClass("notice").addClass( (total%2) ? "odd":"even" ); }
$el.one('click',c).one('mouseover',c);
};

没有抓 gif ,简单完成效果如下:

jq_submit_png.png

--EOF--

[MT Plugin]QQ互联插件-用QQ账号登陆您的MT ,

QQ互联插件-用QQ账号登陆您的MT

( QQ Connect Commenters Plugin for Movable Type )

Authors: 路杨 (EasunLee) Copyright 2015 Easun.org. License: Artistic, licensed under the same terms as Perl itself

qq_login.png

概述

MT QQ互联插件 (QQ Connect Commenters plugin for Movable Type) 允许用户用 QQ 号码登陆你的 Movable Type 博客。
本插件严格使用 QQ互联 的 Open API 编写。安全可靠。 它可以给您的博客带来良好的用户体验。 一旦使用这个插件,评论者可以自动获取QQ昵称、头像等资源。

请注意: QQ互联 (QQ Connect)官方使用的机制是审核制度,并不是使用这个插件就直接可以使用QQ登陆。 您需要去 QQ互联 (QQ Connect) 官方注册您使用本插件的网站并获取属于自己的 APPID 并提交审核。审核过程可能需要1周或者更长时间。

关于 QQ互联 (QQ Connect) 的注册,请 百度 之。或者读取官方资料: http://wiki.connect.qq.com/

运行环境

  • Movable Type 4.2 或者更高版本
  • JSON::XS 2.0 或者更高版本
  • jQuery (非必需,建议)

Movable Type 的 extlib 中已经包含了必需的 JSON:XS 版本。

安装

  1. 下载并解压本插件。

  2. 复制(上传) QQCommenters/mt-static 下的内容到 /path/to/mt/mt-static/

  3. 复制(上传) QQCommenters/plugins 下的内容到 /path/to/mt/plugins/

  4. 登陆您的 Movable Type 后台 -> Plugin Settings 去设置您的 QQ APP IDAPP KEY

  5. 在 后台->Registration Settings -> Authentication Methods 中选启用 QQ 。
  6. 在前台选择登陆,您会看见 QQ 登陆 的选项已经有了。 如果您的网站通过审核,可以之直接使用了。

关于 QQ互联 功能的申请

关于 QQ互联 功能的申请,简单减少一下流程:

  1. 用您的QQ账号登陆 http://connect.qq.com/intro/login 并申请网站接入。
  2. 详细描述您要接入的网站信息。请注意 回调地址 一定要填写为*您的Movable Type 后台 CommentScript 的完整地址,并且带上 http:// 或者 https:// 的前缀*。比如 (http://your_domain/cgi-bin/mt/mt-comments.cgi)。
    可以设置多个回调地址,用 分号 分开即可。 QQ互联 (QQ Connect) 的官方APP帮助文档 写的像浆糊一样,而且处处错误。这个地方官方文档写就是有问题。
  3. 腾讯 的QQ 登陆审核一个要求,就是登陆页面要设置 醒目的QQ登录入口。而我们的前端如果不做修改的话,会很简洁,这个就需要自己在前台放端代码。 简单的分享一下我的一些前端 JS 代码:

[随笔]Movable Type 的数据库瓶颈与多说评论反向同步 ,

随笔 而已,能力所限,只是个人看法。

就向大家看见的这样,由于多说服务器的原因,路杨正在逐步把 多说的评论写回本地 Movable Type 的数据库。

过程不算难。通过 API 获得 JSON 数据,分析后写入MT评论数据库罢了。 为了区分和拓展,给 MT 数据库的评论表增加了3行,分别记录 远程服务器名(remote_service),远程服务器ID (remote_id) 和 UA ( agent)。

mt_db_table_comment.png

开始直接 Perl 脚本。核心代码为

[模板]MT下最简单的实现CSS压缩的办法 ,

MT下最简单的实现CSS压缩(优化)的办法

大家都知道。 CSS压缩可以给网站访问提速, 这个也是 Google Yahoo 等大网站对于网站优化提出的标注之一。
但是,CSS压缩对于网站开发者来说,也意味着可读性降低,也意味着需要保留两份代码,一份正常的可读性高的,一份压缩的的供网站使用。
对于业余站长,压缩CSS是个可爱又可恨的东西,需要第3方工具来完成。
其实,对于 MT 程序来说,利用一点点模板变通可以实现 CSS的自动压缩。
简单的来说就是利用 MT 模板 Tag 自身的几个全局过滤函数的过滤/替换功能:

  1. strip_linefeeds
    strip_linefeeds 很好理解,就是把Tag内所有的换行去掉,让他变成一行。 使用办法 <$MT:tag strip_linefeeds="1" $>

  2. strip
    strip 过滤则是用特定字符替换掉 Tag 内的就空白(1个或者多个连续空格),比如我要把这些空白替换成一个空格则是用 <$MT:tag strip=" " $>

  3. 正则方式regex_replace=["正则表达式匹配部分","要替换成的内容"]
    这是最强大的功能,我们用它来替换掉原始CSS 的注释部分。 当然为了表达式简单,我只替换/*[注释内容]*/ 方式,而不处理 //[注释内容] 样式,这个就需要你的原始CSS 的注释必须是 /*[注释内容]*/ 方式,而不是 //[注释内容],但是修改所有的 //[注释内容]/*[注释内容]*/ 并不是太繁琐的事情。如果要处理 //[注释内容]方式,必须在 strip_linefeeds 之前使用。我的使用办法 <$MT:tag regex_replace="/\/\*.+?\*\//g","" $>
    注意,正则表达式兼容 Perl 正则,但是只识别 /../模式。

  4. trim
    trim 很好理解,就是把Tag内开头和结尾的空白去掉。 使用办法 <$MT:tag trim="1" $>

[MT Hack]修改模板来完成MT的AJAX提交评论 ,

曾经,本站在MT3时代,曾经写过以AJAX提交评论预览 的帖子。

那个也是通过修改模板+自写js实现,没有对MT的源代码进行任何修改,绿色无污染,不影响升级。

后来,通过自己摸索,也实现了 ajax 方式提交评论。但是一直都没有写出教程,今天有点时间。特意写出分享之。

具体效果见本站评论提交(预览和发表)。

言归正传,要实现 ajax 方式首先要定义一系列 js 函数。 由于 本站已经迁移到了 JQuery 平台,所以在改写 mt.js 需要先加入 JQ 支持,即加入:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

[SiteLog]升级MT到5.2.13,记录下对一些pm的修改 ,

升级MT到5.2.13。

记录下对一些 pm 的修改,方便以后覆盖升级。


1. /lib/MT/Template/ContextHandlers.pm :

修改位置: sub _math_operation
代码:

    ##分页 By easunlee#
   elsif ( ( 'pages' eq $op ) || ( 'paging' eq $op ) ) {
        return $ctx->error( MT->translate('Division by zero.') )
            if $rvalue == 0;
        return  int( ($lvalue+$rvalue-1) / $rvalue) ;
    }

2. /lib/MT/Template/Tags/Comment.pm :

修改位置: sub _hdlr_comment_author_link
代码:

    if ($cmntr) {
        $name = encode_html( remove_html( $cmntr->nickname ) )
            if $cmntr->nickname;
        if ( $cmntr->url && ($cmntr->url !~ /^QQ\|/ ) ){#EasunLee            
            return sprintf(
                qq(<a title="%s" href="%s"%s>%s</a>),
                encode_html( $cmntr->url ),
                encode_html( $cmntr->url ),
                $target, $name
            );
        }

修改位置: sub _hdlr_comment_author_identity
代码:

    my $auth_type = $cmntr->auth_type;
   ....

    my $result
        = qq{<img title=\"$auth_type User\" src=\"$logo\" width=\"16\" height=\"16\" />}; #EasunLee

--EOF--

Movable Type 6.1.1 released

https://movabletype.org/news/2015/04/movable_type_611_released.html

We are pleased to inform you that Movable Type 6.1.1 has been shipped.

In Movable Type 6.1.1, we have not only resolved many cases submitted by our engineers as well as many of our valued community members, but also improving the Content Sync feature.

Improved feature: Content Sync (Movable Type Advanced)

The content sync feature is now improved with user feedback. This change improves the stability and speed of processing and improves convenience.

To sync the difference between the previous version

In the previous version, Movable Type had been working to completely synchronize both the source and destination directories, so the processing time and the number of processed files increased and also extended proportionally. In addition, if you have to work with other systems in the destination server, unintended deletion of files may occur.

In the new version, it was changed to copy only the files and directories that have been added, updated and deleted from the previous processing result. By this change, processing speed and stability has been greatly improved. (First time only, all of the files may take some time to sync to the target.)

To be able to set more than one schedule

If you want to make multiple synchronization schedules, now you can create or replicate existing settings without the effort of having to enter the information of the delivery destination every time.

Release notes

Please review the Movable Type release notes to see everything that was added and improved since the version you are currently using. Also review the known issues sections in case there are items of which you should be aware before upgrading.

Download

If you have an existing Movable Type 6 license, you can download the latest Movable Type from our download portal using your Six Apart ID.

To purchase a new license or an upgrade, please visit MovableType.com for more information, or feel free to contact us if you have any questions.

[SiteLog]终于迎来了原生的MT主页/分类页的分页 ,

 This is a SiteLog for Easun.org。

   对于静态发布的MT来说,主页/分类页 的分页很不好实现。一直以来,要在主页展示更多页面的朋友们都是利用一个  插件PageArchives  来实现。对我来说,实现这个功能实在太繁琐了点,也就懒得折腾。

今天,在测试MT5的新主题( Rainier 1.04)的时候,居然发现可以分页了。

立即查看模板,发现可以原生分页,分页由 mt-seach.cgi 完成。呃,又是这个 cgi ,看来资源大户的名气又要响亮一点了。

我的模板是在一直 在 "Professional Blog" 上修改的。 不想再次重写模板了。 直接移植吧。

其实很简单,要实现分页,必须给 <mt:Entries> 加上 search_results 选项。

[Perl]本站使用的文本缓存Tag搜索的Perl脚本 ,

Movable Type 资源瓶颈基本上都是mt-search.cgi

不管是站内自定义搜索,还是按照Tags进行查询,都调用的是这个脚本。

本站灵感来之 AnySQL 的文本缓存。 但是不同于 AnySQL 的一直是独立的cgi文件进行缓存,配合.htaccess 和默认搜索慢板完成

这次更新后台,这个独立cgi脚本也做了小的逻辑修改。

特共享之,供有动手精神的同好自我完善。

代码如下:

1   2   3   4