// // tada.js // // LICENSE: {{{ // Copyright (c) 2009 snaka // // Distributable under the terms of an MIT-style license. // http://www.opensource.jp/licenses/mit-license.html // }}} // PLUGIN INFO: {{{ var PLUGIN_INFO = {NAME} Show ToDo items in commandline buffer. Also add item to your Ta-da list. コマンドラインバッファからTa-Da list のToDo一覧を参照したり、からToDo項目を追加したりします。 2.0pre 2.0 http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/tada.js snaka MIT style license 0.8 ; // }}} liberator.plugins.tada = (function(){ // COMMAND {{{ commands.addUserCommand( ["tada"], "Show / Add ToDo items to Ta-Da list. (:tada [LISTNAME] [SUBJECT])", function(args) { var listId; switch (args.length) { case 0: showTodoItems(getDefaultListId()); break; case 1: if (listId = getListId(args[0])) showTodoItems(listId); else addTodoItem(getDefaultListId(), args[0]); break; default: if (listId = getListId(args[0])) addTodoItem([listId, args[0]], args[1]); else addTodoItem(getDefaultListId(), args.join(' ')); } }, { completer: tadaListCompleter, argCount: "*", literal: true }, true // for DEVELOP ); commands.addUserCommand( ["tadamail"], "Mail Ta-Da list. (:tadamail [LISTNAME])", function(args) { // switch(args.length) { case 0: break; default: sendEmail([getListId(args[0]), args[0]]); } }, { completer: tadaListCompleter, argCount: "*" }, true ); commands.addUserCommand( ["tadaclearcache"], "Clear Ta-da lists cache", function() cachedLists = [] ); // }}} // PUBLIC {{{ var PUBLICS = { // for DEBUG {{{ // getListId: getListId, // getDefaultListId: getDefaultListId, // getLists: getLists, // showTodoItems: showTodoItems, // addTodoItem: addTodoItem, // }}} }; // }}} // PRIVATE {{{ function tadaListCompleter(context, args) { if (args.length > 1) return; context.title = ["List", "Items left"]; context.completions = getLists().map(function(item) [item[1], item[2]]); } function getURI() { if (userId = g('tada_userId')) return "http://" + userId + ".tadalist.com/lists/"; throw "Please specify your user id to global variable 'tada_userId'."; } function parseListId(source) { let m; if (m = source.match(/\/lists\/([0-9]+)/)) return m[1]; return source; } function getListId(name) { var list = getLists(); for(var i in list) { if (list[i][1] == name) return list[i][0]; } return null; } // Get default list id and name by Array // @return [defaultListId, defaultListName] // 1.Use global variable g:tadaDefaultListName if specified. // 2.Use first list if global variable not specified or specified list name is not // exist in your lists. function getDefaultListId() { var defaultId; var defaultName; if (defaultName = g('tadaDefaultListName')) if (defaultId = getListId(defaultName)) return [defaultId, defaultName]; var lists = getLists(); // [[id, name], ...] return [lists[0][0], lists[0][1]]; } var cachedLists = []; // Get Your 'MyLists' // @return [[id, name, left], .... ] function getLists() { if (cachedLists.length > 0) return cachedLists; var req = new libly.Request(getURI(), null, {asynchronous: false}); req.addEventListener('onSuccess', function(data) { liberator.log("success"); data.getHTMLDocument(); $LXs("//div[@id='Container']/div[2]/div/div/ul/li/a", data.doc).forEach(function(item){ var left = $LX("../span/strong[text()]", item); cachedLists.push([parseListId(item.href), item.innerHTML, left.innerHTML]); }); }); req.get(); if (cachedLists.length == 0) throw "Cannot get your list. Please chehek " + getURI() + " is accessible."; return cachedLists; } function showTodoItems(listId) { var req = new libly.Request(getURI() + listId.toString()); req.addEventListener('onSuccess', function(data) { liberator.log("success"); data.getHTMLDocument(); var list = ; $LXs("//ul[@id='incomplete_items']/li/form", data.doc).forEach(function(item){ list.li +=
  • {item.textContent.replace(/^\s*|\n|\r|\s*$/g, '')}
  • ; }); liberator.echo(list.toXMLString(), commandline.FORCE_MULTILINE); liberator.log(list.toXMLString()); }); req.get(); } function addTodoItem([listId, listName], content) { var endpoint = getURI() + listId + "/items" liberator.log("endpoint:" + endpoint); var req = new libly.Request( endpoint, null, { postBody: "item[content]=" + encodeURIComponent(content) } ); req.addEventListener('onSuccess', function(data) { liberator.echo("Posted[" + listName + "]:" + content); liberator.plugins.posted = data; }); req.addEventListener('onFailure', function(data) { liberator.echoerr("POST FAILURE: " + content); }); req.post(); } function sendEmail([listId, listName]) { var endpoint = getURI() + listId + "/email"; liberator.log("endpoint:" + endpoint); var req = new libly.Request(endpoint, null, {postBody: "dummy=hoge"}); req.addEventListener('onSuccess', function(data) { liberator.echo("Send Ta-Da list '" + listName + "' to your email address."); }); req.addEventListener('onFailure', function(data) { liberator.echoerr("EMAIL SENDING ERROR."); liberator.log(data.responseText); }); req.post(); } // Utilities function g(str) liberator.globalVariables[str]; function $LXs(a,b) libly.$U.getNodesFromXPath(a, b); function $LX(a,b) libly.$U.getFirstNodeFromXPath(a, b); return PUBLICS; // }}} })(); // vim: sw=2 ts=2 et si fdm=marker: