且听疯吟 如此生活三十年
A Wox plugin let you search firefox bookmarks

###关于 Wox
最初是看到 V2EX 上的一个帖子 v2ex.com/t/93922,然后作者真的去写了并且发布在 Github 上了。
Windows 上的快速启动软件已经很多了,但是不管从功能、界面乃至理念来讲和 Alfred 都相去甚远,尤其是 Workflow 的概念。
Wox 现在发布了第一个 beta 版本,看上去已经很不错了,希望这个项目能坚持下去吧。

###Wox.Plugin.FirefoxBookmarks
Wox 的插件开发也比较简单,可以参考文档。写了个搜索 Firefox 书签的插件。
原理是读取 Firefox 书签,然后根据参数查询返回结果。

首先我们要获取到 Firefox Profile 的位置。Firefox 支持多个 Profile,我们可以获取到默认的 Profile 。Firefox Profile 路径及配置都保存在 %appdata%\Mozilla\Firefox\profiles.ini 中。打开这个配置文件可以看到每个 Profile 配置包含的参数:“IsRelative” 值为 “0” 代表绝对路径,“1” 代表相对路径;“Default=1” 代表默认启动的 Profile。
虽然可以通过引入 WindowsAPI (即 [DllImport("kernel32")])来解析 ini 配置文件,不过无需如此小题大做,毕竟只需要找到其中一行即可。下面是一个读取 Firefox 默认 Profile 的方法:

gist 11324134

这种读取方法对某些 Portable 版本无效,所以同时也提供了手动配置路径的方法。

Firefox 书签以及历史记录都保存在 Profile 里的 places.sqlite 中。其表结构可以参考 developer.mozilla.org/en-US/docs/The_Places_database
其中 moz_bookmarks 表中存储了书签及书签文件夹,且通过外键 fk 和 moz_places 关联。
Sqlite 的查询语法基本和标准 SQL 相同,比如:

SELECT moz_places.url, moz_bookmarks.title,parent.title as parent
FROM moz_bookmarks
JOIN moz_places ON moz_places.id = moz_bookmarks.fk
JOIN moz_bookmarks as parent ON parent.id = moz_bookmarks.parent
WHERE moz_bookmarks.type = 1

PS. 另一个快速切换电源计划的插件 Wox.Plugin.PowerPlan