Skip to content

Instantly share code, notes, and snippets.

@teramako
Created February 26, 2009 17:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teramako/70963 to your computer and use it in GitHub Desktop.
Save teramako/70963 to your computer and use it in GitHub Desktop.
liberator.plugins.delicious = (function(){
function getBookmarkFile(){
let file = services.get("directory").get("ProfD",Ci.nsIFile)
file.append("ybookmarks.sqlite");
if (!file.exists() || !file.isReadable()){
return null;
}
manager.file = file;
return file;
}
const ss = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
let dbc = null;
function initialize(){
let file = getBookmarkFile();
if (!file) return;
dbc = ss.openDatabase(file);
}
function getAllTags(){
let list = [];
let st = dbc.createStatement("SELECT name FROM tags");
try {
while (st.executeStep()){
list.push(st.getString(0));
}
} finally {
st.reset();
}
return list;
}
function tagCompletion(context, args){
let filter = context.filter;
let have = filter.split(",");
args.completeFilter = have.pop();
let prefix = filter.substr(0, filter.length - args.completeFilter.length);
let tags = getAllTags();
return [[prefix + tag, tag] for ([i, tag] in Iterator(tags)) if (have.indexOf(tag)<0)];
}
function bookmarkSearch(tags, query){
if (!query && (!tags || tags.length == 0))
return [];
let sql;
let list = [];
let st;
try {
if (!tags || tags.length == 0){
sql = [
'SELECT name,url,description FROM bookmarks',
'WHERE name like ?1 OR',
'url like ?1 OR',
'description like ?1'
].join(" ");
st = dbc.createStatement(sql);
st.bindUTF8StringParameter(0, '%' + query + '%');
} else {
let sqlList = [
'SELECT b.name,b.url,b.description',
'FROM bookmarks b, bookmarks_tags bt, tags t',
'WHERE bt.tag_id = t.rowid',
'AND b.rowid = bt.bookmark_id',
'AND t.name in (',
['?' + (parseInt(i)+1) for (i in tags)].join(","),
')'];
if (query){
let num = tags.length + 1;
sqlList.push([
'AND (',
'b.name like', '?' + num,
'OR b.url like', '?' + num,
'OR b.description like', '?' + num,
')',
'GROUP BY b.rowid HAVING COUNT (b.rowid) = ?' + (num+1)
].join(" "));
sql = sqlList.join(" ");
st = dbc.createStatement(sql);
st.bindUTF8StringParameter(tags.length, '%'+query+'%');
st.bindInt32Parameter(tags.length+1, tags.length);
} else {
sqlList.push('GROUP BY b.rowid HAVING COUNT (b.rowid) =?' + (tags.length + 1));
sql = sqlList.join(" ");
st = dbc.createStatement(sql);
st.bindInt32Parameter(tags.length, tags.length);
}
for (let i in tags){
st.bindUTF8StringParameter(i, tags[i]);
}
}
liberator.echomsg(sql, 5);
while (st.executeStep()){
let name = st.getString(0);
let url = st.getString(1);
let note = st.getString(2);
list.push([<a highlight="URL" href={url}>{name}</a>, note]);
}
} finally {
st.reset();
}
return list;
}
commands.addUserCommand(["delicious[search]","ds[earch]"], "Delicious Bookmark Search",
function(args){
if (args.length > 0){
liberator.open(args[0], liberator.CURRENT_TAB);
return;
}
let list = bookmarkSearch(args["-tags"], args["-query"]);
let xml = template.tabular(["Title","Note"], [], list);
liberator.echo(xml, true);
},{
options: [
[["-tags","-T"], commands.OPTION_LIST, null, tagCompletion],
[["-query","-q"], commands.OPTION_STRING]
],
completer: function(context, args){
let list = bookmarkSearch(args["-tags"], args["-query"]);
if (list.length > 0){
context.title = ["URL","TITLE"];
context.completions = list.map(function($_){
return [$_[0].@href.toString(), $_[0].text().toString()];
});
}
},
},true);
let manager = {
init: function(){
if (dbc){
try {
this.close();
} catch(e) {}
}
initialize();
},
listByTags: function(tags, query){
return bookmarkSearch(tags, query);
},
close: function(){
dbc.close();
}
};
manager.init();
autocommands.add('VimperatorLeavePre','.',function(){
manager.close();
});
return manager;
})();
function onUnload(){
liberator.plugins.delicious.close();
}
// vim: sw=2 ts=2 et:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment