時計坂一刻館三号室

在 Firefox 中将 Thunderbird 设为默认 RSS 阅读器……

屈超(沙滩凉鞋) 发表于 2008 年 6月 3 日 7 时 42 分

Set ThunderBird as Default RSS Reader in Firefox

之前主要用 Google Reader ……
但在线工具毕竟是在线工具……
没有手感 -__- ……
在我还没下定决心用 Google Gear 之前……
我想到了用 ThunderBird ……

好歹自己也算是个 ThunderBird 的拥趸了……
不仅仅只是把它作为一个邮件终端……
还利用其强悍的 Filter 和 Tag 功能管理邮件列表、订阅新闻组……
然后配合 LightningGoogle Calendar 和 Treo 来实现 GTD ……
这次将其提拔为 RSS 阅读器实在是最近有点儿心痒……
想折腾折腾工作环境……

好吧……
入正题……
有人可能会问……
Firefox 不是允许选择线下 RSS 阅读软件么?」
是的……
的确可以……
但是你可以指定 ThunderBird 作为阅读器试试看……
点击 “Subscribe Now” 后除了呼出 ThunderBird 外并没有执行订阅操作……
自家人都不认自家人了……
像个什么话!

屡试屡爽之后……
我意识到这可能是个 Bug ……
二话不说上 Bugzilla 一搜……
果然就就是 Bug 350735 ……
不过前年的 Bug 至今还没解决还真是有点儿那啥……

继续搜索……
找到几种解决临时方案……
其中在 MozillaZine 论坛找到的方案应该是最通用的一种了……
作者 alta88 说是由于 Thunderbird 接受 Feed 的参数与 Firefox 发送的不符而造成的……
知道原因就好办了……
马上搜索 ThunderBird 源码……
在 components\newsblog.js 中找到了如下代码:
(Portable ThunderBird 位于 App\thunderbird\components\newsblog.js)

  1. /* nsICommandLineHandler */
  2. handle : function(cmdLine)
  3. {
  4. // we only care about "-mail someurl" where someurl is a feed: url
  5. // we also don't want to remove the parameter in case we don't end up handling it...
  6.  
  7. var mailPos = cmdLine.findFlag("mail", false);
  8. if (mailPos != -1 && cmdLine.length >= mailPos )
  9. {
  10. var uriStr = cmdLine.getArgument(mailPos + 1);
  11. if (/^feed:/i.test(uriStr))
  12. {
  13. var mailWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService()
  14. .QueryInterface(Components.interfaces.nsIWindowMediator).getMostRecentWindow("mail:3pane");
  15.  
  16. // if we don't have a 3 pane window visible already, then we can optimize and do nothing here,
  17. // that will let the default command line handler create a 3pane window for us using the feed
  18. // URL as an argument to that window when it gets constructed...so we only care about the
  19. // case where we want to re-use an existing 3 pane to subscribe to the feed url
  20. if (mailWindow)
  21. {
  22. cmdLine.handleFlagWithParam("mail", false); // eat up the arguments we are now handling
  23. cmdLine.preventDefault = true; // prevent the default cmd line handler from doing anything
  24.  
  25. var feedHandler = Components.classes["@mozilla.org/newsblog-feed-downloader;1"].getService(Components.interfaces.nsINewsBlogFeedDownloader);
  26. if (feedHandler)
  27. feedHandler.subscribeToFeed(uriStr, null, mailWindow.msgWindow);
  28. }
  29. }
  30. }
  31. },

显然可以看出……
ThunderBird 要求 Feed 作为 Mail 参数来传递……
具体格式为:

  1. thunderbird.exe -mail feed:URL

我在命令行下测试如下命令……

  1. thunderbird.exe -mail feed:http://www.quchao.com/feed/

果然成功地订阅成功……

问题找出来就好解决了……
两种方案……
让 Firefox 附上参数……
或让 ThunderBird 忽略参数……
显然添加参数比忽略参数要安全……
毕竟 ThunderBird 不只是 RSS 阅读器而已……
忽略掉参数怕会影响其它的服务哟……

那么就拿 Firefox 开刀吧……
看了 alta88 的解决方案……
他增加了两个 pref 变量用来保存参数和 Feed 协议……
很通用的方法……
但我个人觉得没有必要……
不如直接判断阅读器的文件名……
包含 Thunderbird 变添加参数后发送……
一来不必往 Pref 里添加并不常用的变量……(洁癖作祟?)
二来其它 RSS 阅读器没准就直接支持 Firefox 的方式……

我的修改方法如下:
找到 Firefox 的 components\FeedConverter.js 文件……
(Portable 版本位于 App\firefox\components\FeedConverter.js)
搜索:

  1. var ios =
  2. Cc["@mozilla.org/network/io-service;1"].
  3. getService(Ci.nsIIOService);
  4. var feedURI = ios.newURI(spec, null, null);
  5. if (feedURI.schemeIs("http")) {
  6. feedURI.scheme = "feed";
  7. spec = feedURI.spec;
  8. }
  9. else
  10. spec = "feed:" + spec;
  11.  
  12. var ss =
  13. Cc["@mozilla.org/browser/shell-service;1"].
  14. getService(Ci.nsIShellService);
  15. ss.openApplicationWithURI(clientApp, spec);

替换为:

  1. // Hacked by Chappell.Wat from http://QuChao.com @ 2008-6-3
  2. if (clientApp.persistentDescriptor.toLowerCase().indexOf('thunderbird') != -1) {
  3. var targetFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
  4. try {
  5. targetFile.initWithPath(clientApp.persistentDescriptor);
  6. }
  7. catch(e) {
  8. alert(e);
  9. return(false);
  10. }
  11. if (!targetFile.exists()) {
  12. alert('Client Does Not Exists.');
  13. return(false);
  14. }
  15. spec = 'feed:' + spec;
  16. var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
  17. process.init(targetFile);
  18. var arguments = ['-mail', spec];
  19. process.run(false, arguments, arguments.length,{});
  20. } else {
  21. var ios =
  22. Cc["@mozilla.org/network/io-service;1"].
  23. getService(Ci.nsIIOService);
  24. var feedURI = ios.newURI(spec, null, null);
  25. if (feedURI.schemeIs("http")) {
  26. feedURI.scheme = "feed";
  27. spec = feedURI.spec;
  28. }
  29. else
  30. spec = "feed:" + spec;
  31.  
  32. var ss =
  33. Cc["@mozilla.org/browser/shell-service;1"].
  34. getService(Ci.nsIShellService);
  35. ss.openApplicationWithURI(clientApp, spec);
  36. }

原理是判断阅读器文件名……
包含 “thunderbird” 便发送 -mail 参数……
至于为何要换 openApplicationWithURI 函数为 run ……
事出无奈……
openApplicationWithURI 似乎无法发送形如 -mail feed:URL 的参数……
且源码应该是被封在 browser.xpt 里……
不过使用效果一样就行了……

最后……
轮到测试时间了……
测试之前我建议还没有在 ThunderBird 里建立 RSS 账户的朋友去新建一个……
(File -> New -> Account… -> RSS News & Blogs)
我当初修改了好久均无法调用订阅动作……
看了代码才知道是没有 RSS 账户提供绑定……
(详见 components\newsblog.js 文件的 120-132 行 )

下面跟着我一起访问 feed:http//www.quchao.com/feed/
(要是觉得慢也可以自己随便找个源喔……)
浏览器会把你带到订阅界面……
在下拉菜单中选择 “Choose Application” 并定位于你的 ThunderBird ……
(如顶图)
接下来猛击 “Subscribe Now”……
不出意外 ThunderBird 应该被激活(或启动)来验证 Feed 地址……
如果验证无误……
这个 Feed 应该就乖乖躺在你的 RSS 账户里了……
如果没有它躺下……
您可以在本文后留下您遇到的问题……
我会尽力解答……

Use FolderPane Tools to change the order

题外话一:
如果你和我一样由于邮箱太多……
新建的 RSS 账户位于底部看不见的话……
我建议使用 FolderPane Tools 来调整账户的顺序……
(如上图)

题外话二:
如果你和我一样不习惯将 RSS 和 Mail 数据放在一起的话……
你可以看看这篇文章……
顺便说一下我的 RSS 账户 ID 是 11……
(现在你知道我到底在 ThunderBird 里放了多少东西了吧)
修改完后……
RSS、邮件和新闻组的数据放在不同的文件夹……
看着舒心……
用着也放心……

题外话三:
很早之前用过一个名为 RSS News Ticker 的软件……
相当好用……
但是该软件的更新是全局式的……
比如你设置 10 分钟更新一次……
那么不管 RSS 有没有显示完它都会“敬业”地进行更新……
我的想法是仅仅订阅一个源……
这个源包含所有我未读 RSS ……
是否能通过编写 Thunderbird 扩展来完成呢……
考虑ing……

[080418] 天涯助手 1.3:高亮楼主 && 只看楼主 (UserScript)

屈超(沙滩凉鞋) 发表于 2008 年 4月 18 日 12 时 48 分

[080418]
修正本脚本在天涯某些使用 Ajax 进行分页的版面里无法正确获取首页楼主 ID 的 Bug……
使用鄙人所架设的 ChinaList for Pagerization 源的朋友……
如果想更好使用本脚本……
请在 Pagerization 的 Excluded Pages 添加以下页面……

http://cache.tianya.cn/publicforum/content/*
http://cache.tianya.cn/techforum/content/*
http://*.tianya.cn/new/publicforum/Content.asp?idWriter=*
http://*.tianya.cn/new/techforum/Content.asp?idWriter=*

经过鄙人测试……
该脚本应该算是比较圆满了……
如没有大的问题就不会再更新了……
:)

[080417]
终于解决了此脚本运行时出现的兼容问题……
我开始以为是 FF2 和 FF3 所渲染出来的页面差异问题……
害我昨天的更新还专门针对浏览器的大版本来区别处理……
今天找 ObiWan 测试后才知道“全世界”就我的 Firefox 渲染出来的页面代码不同……(笑)
我的系统和环境基本都是英文的……
不知道和语言版本有没有关系……
不过算了……
既然代码有些许不同……
我只好用正则来解决了……
起初怕正则效率低影响大伙儿的看帖热情……
写完后测试下发现还不错……
哎……
早就该采用正则 + Xpath 这样比较科幻的方法来解决的……
害我昨天白更新了……

浮动控制栏 今天最大的更新是添加了“浮动控制栏”……
Skyee 说这种方便的玩意儿是“小白专用”的……
那我觉得他应该就算最大的小白了……
浮动栏的效果不错……(如右图)
还可以从猴子命令里进行隐藏哟……(-__-|)

1.2 的更新内容如下:
1.添加浮动控制栏……
2.修正某些 Bug ……
3.改用正则替换解决版本间兼容问题……

============================================

[080416]
发布后收到许多 FF2 用户不能正常使用的反馈……
坐下来研究了下……
原来是 FF2 和 FF3 对 HTML 源码进行整理的结果不同所致……
无奈只能找出尘封已久的 FF2.0.014 测试并更新……
目前应该能支持 FF2 平台了……
另外……
Adblock+Firebug 等会对页面源码进行修改的插件也在一定程度上影响了脚本效果……
我只能尽可能地加以兼容……
GreaseMonkey 本身对脚本的影响也不小……
比如某些旧版本的猴子在读写选项值时是不支持 Unicode 字符的……
就需要用 encodeURI 和 decodeURI 加以处理……

1.1 的更新内容如下:
1.支持 FF2 平台……
2.修正某些 Bug ……
3.缩小代码重构范围来提高速度……

ToDo:
1.完善对某些特殊版面(使用 js 分页)的支持……
目前仅支持该类型版面(如开心乐园)帖子的第一页……

2.增加浮动按钮方便激活功能……
3.消除与 Pagerization 的冲突……

============================================

[080415]
几个月前就答应 Skyee 君要编写这样一个用户脚本(GreaseMonkey UserScript)……
而当时也确实着手去写了一个……
无奈天涯社区里帖子的 HTML 代码实在是太不规范……
无法用 XPath 去做预想中的操作……
然后编写工作就中断了……

近来天涯俨然成了我等“愤怒青年”(笑)的集散地……
闲暇时刻要在那里耗费不少时间……
而帖子里主次不分的回复也着实让俺深切体会到了 Skyee 君的痛苦……
于是乎俺下定决心要写为天涯论坛写一个“只看楼主”的猴子脚本了……

花了两个晚上的时间……
终于实现了这个功能……
天涯社区的帖子代码嵌套有不小问题……
导致 DOM 树生长得很畸形……
因此 XPath 只用在了取楼主 ID 这样的小地方……
真正的操作还是通过重构源码来实现的……
有兴趣的朋友还是直接看代码吧……

该脚本为用户提供了两个主要的功能……
一是仅显示楼主所发的帖子……(Ctrl - Y)
二是高亮显示楼主所发的帖子……(Alt - Y)
个人觉得第二个功能似乎还要更常用一些……
毕竟天涯里的回帖也是战斗的乐趣所在……
因此俺给高亮功能提供了较大的自由度……
你可以通过编写 CSS 自定义高亮的效果……
(默认是粗体+红色边框…… 详见后面的截图)

除了  Ctrl - Y 和 Alt - Y 两个快捷键……
你还可以通过状态栏的猴子的菜单命令来控制……
在猴子图标上点击右键并选择 User Script Commands……
选单中……
1.天涯助手 - 只看楼主/恢复
2.天涯助手 - 高亮楼主/恢复
3.天涯助手 - 隐藏浮栏/恢复
(自 1.2 起添加了浮动控制栏可供更方便地操作……)

下面来讲解一下功能配置……
在 GreaseMoneky 中选中本脚本并进行编辑……
脚本信息的下方便是配置代码段……

  1. /*-----------------------------------------------------------------------------
  2. * Configuration
  3. *-------------------------------------------------------------------------- */
  4. // Auto show author's only? [true or false]
  5. var AUTO_ENABLE = false;
  6.  
  7. // Auto highlight author's? [true or false]
  8. var AUTO_HIGHLIGHT = false;
  9.  
  10. // Disable the hotkeys? [true or false] (Note: Ctrl-Y to hide/show; Alt-Y to highlight/restore)
  11. var DISABLE_HOTKEY = false;
  12.  
  13. // Hightlight style, Sample: font-weight:bold!important;border:1px solid red;
  14. var HIGHLIGHT_STYLE = '';
  15.  
  16. // Normal style, Sample: font-weight:normal!important;border:0;
  17. var NORMAL_STYLE = '';

其中……
AUTO_ENABLE 设置是否自动开启“只看楼主”功能……(true 或 false)
AUTO_HIGHLIGHT 设置是否自动开启“高亮楼主”功能……(true 或 false)
DISABLE_HOTKEY 设置是否禁用快捷键……(Ctrl - Y 和 Alt - Y)
HIGHLIGHT_STYLE 设置高亮帖子的 CSS ……(默认是粗体加红框显示)
NORMAL_STYLE 设置非高亮状态时的 CSS ……

说这么多不如直接给出截图……
(截图来源于此贴……
如果您觉得截图内容侵犯了您的权益……
请联系我移除……)

原始状态:
原始状态

只看楼主 (Ctrl-Y):
只看楼主 (Ctrl-Y)

高亮楼主 (Alt-Y):
高亮楼主 (Alt-Y)

猴子命令:
高亮楼主 (Alt-Y)

浮动控制栏:
浮动控制栏

功能就介绍到这里……
感兴趣的朋友可以直接下载试用……
国外用户:http://www.QuChao.com/Projects/UserScripts/Tianya_Helper.user.js
国内用户:http://VIP.YYJoy.com/Chappell/UserScripts/Tianya_Helper.user.js
脚本官方http://UserScripts.org/Scripts/Source/25213.User.js

有什么意见和建议就留言吧……
如有需要俺会及时更新的……
今天就到这里吧……

[2007.07.20] Baidu Auto Pager 1.1 (A GreaseMonkey Addon)

屈超(沙滩凉鞋) 发表于 2007 年 7月 20 日 7 时 50 分

[2007.07.20]
刚去 UserScripts 找脚本时顺便看了一下自己的页面……
寒……
居然还有留言……
仔细一看……
人家是报错的……
原来上次提交的时候传了个未写完的文件……
这次修正了……
顺便添加了个页数显示……
PS.
实际上俺自己已经开始用 Pagerization 了……
真是不厚道……

[2007.06.02]
为了节省资源一直不敢用 GreaseMonkey ……
昨天实在受不了 IE TabBtChina 的处理速度了……
于是可耻地向 GreaseMonkey 妥协了……
果然装了 Show Btchina 之后访问它起来就快多了……
(而且连广告都没有了……)
之后还装了 GoogleAutoPager 等 Addons ……

接着就自己写了一个 BaiduAutoPager ……
由于百度惯用 GB2312 ……
因此正好利用 Firefox 的 overrideMimeType 特性来解决 XMLHTTP 乱码问题……
暂时还没支持 Baidu MP3贴吧等部分……
等下次升级吧……

作用嘛……
不用多说了……
就是随着页面不断往下翻页……
陆续在同一页面显示下个分页的 Baidu 的搜索结果……
当然前提是搜索结果足够多……
双击页面即可开/关这个功能……

上个图看看……

Demo for BaiduAutoPager 1.0

GreaseMonkey 用户可直接点下列 URI 进行安装:
http://userscripts.org/scripts/source/9610.user.js

[070520] 自用 Javascript 缩图函数 (onDOMLoaded)……

屈超(沙滩凉鞋) 发表于 2007 年 5月 20 日 8 时 24 分

[更新日志]

070520:Norman 君给出了 Dean Edwards 等关于 onDOMLoaded 事件的跨浏览器解决方案……
其实 onDOMLoaded 是 DOM 被载入(图片尚未载入)状态下的一个“不存在的”事件……
由于不同浏览器的支持度不同……
所以需要进行 Hack ……
所幸 Dean 和其他一些朋友反复研究后给出了解决方案……
在此表示感谢……
对于缩图函式本身的改进就是合并了上个版本的两个不同模式(快速和平缓)……
所谓快速模式是用了 while 循环……
速度快但是容易造成假死……
所谓平缓模式则用 setInterval 函式来解决上述问题……
可惜 setInterval 有最短周期限制……
所以速度比较慢……
从快速到平缓模式的切换临界值我设置为 500 ……
也即当一个页面的图片达到 500 时便启用平缓模式来缩图……
大伙儿可以根据自己需求更改……
具体请看 resizeImgs 函式的第二行……

070516:感谢 Norman 君在提升代码性能上的建议……
将遍历所有元素更改为遍历图像数组……
至于 Norman 所提议的在图像读取之前即进行缩图的功能……
未能实现……
一来是因为 Firefox 并不支持 onreadystatechange 事件(只有 onload ?)……
二来则在测试中发现 IE 下在 interactive 状态下调整图像大小也需要刷新以后才能执行……
也就是说都得等到页面加载完毕(或者加载一次)后才能进行操作……
恕鄙人才疏学浅……
如有解决方案望留言教授……

原理呢……
就是遍历图像数组……
如果定义了 resize 属性就进行缩图……
当 resize 的值为数字(而且小于原图宽度)就缩小到该数字宽度……
当 resize 为其它值则缩小到预设宽度……
至于为什么要清除 height 属性……
答曰:为了保持宽、高之比……
以上……

由于代码过长……
暂不贴出……
使用方法请参看 Demo ……

演示http://Demo.QuChao.com/Resize/
下载http://www.box.net/shared/semf3lqy2h

补充
回应某朋友在 IM 上的疑惑……
JS 的缩图是和服务器端语言不同滴……
有锯齿(或者叫“失真”?)是正常滴……
而且把“能耗”转交给客户端是“不负责任”滴……
所以尽量不要在所谓的“杀猫帖”中使用……
因为 JS 去遍历这些图片元素需要时间……
而且“缩略”的动作直到所有图片读取完成才会生效……
完全就没有效果了嘛……

知名 AJAX Toolkit 小结 ……

屈超(沙滩凉鞋) 发表于 2006 年 5月 23 日 3 时 04 分

前言

说它们“知名”……
恐怕有些得归功于他们那“知名”的冠名者……

下面凉鞋根据自己的开发经验总结一下……
排名部分先后 ……
一家之言……
望同各位讨论切磋……

目录:

  1. 前言
  2. Google Web Toolkit
  3. Spry framework
  4. Yahoo! User Interface Library
  5. BackBase Ajax Development Framework
  6. Script.aculo.us
  7. jQuery
  8. Prototype JavaScript Library
  9. Simple Ajax ToolKit
  10. Rico
  11. PEAR::Package::HTML_AJAX
  12. 结语

JavaScript 版本语言包系统……

屈超(沙滩凉鞋) 发表于 2006 年 5月 21 日 7 时 31 分

前言

AnyMedia 自从 3.0.0 版本附带了多国语言包……
昨天也收到 Oberguru 翻译的德文版本……
当然……
除了主体文件实现多语言还不够……
包括安装、升级文档在内的部分也得相应提供多语言才行……
为了赶在 3.5.1 释出之前实现文档的多语言系统……
于是到处寻找 JavaScript 版本的多语言系统……
未果……
使用 xml + xsl 的倒是找到一个……
可惜对浏览器支持太差……
恼火……
于是乎自己硬头皮写了一套……
不多说……
记录如下:

目录:

播放器加载中……
读取中……
图书数据加载中……
读取中……
剧集数据加载中……
读取中……
专辑数据加载中……
读取中……
Firefox Download Day 2008
歌曲数据加载中……
读取中……
通讯方式加载中……
读取中……
QR Code 加载中……
读取中……