Created
February 26, 2009 17:19
-
-
Save teramako/70963 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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][email protected](), $_[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