diff options
-rw-r--r-- | edit-vimperator-files.js | 5 | ||||
-rw-r--r-- | google-translator.js | 15 | ||||
-rw-r--r-- | maine_coon.js | 63 | ||||
-rw-r--r-- | pino.js | 30 | ||||
-rw-r--r-- | pixiv.js | 23 | ||||
-rw-r--r-- | pluginManager.js | 2 | ||||
-rw-r--r-- | readitlater.js | 697 | ||||
-rw-r--r-- | sl.js | 2 | ||||
-rw-r--r-- | stella.js | 50 | ||||
-rw-r--r-- | twittperator.js | 22 | ||||
-rw-r--r-- | twittperator/pong.tw | 24 | ||||
-rw-r--r-- | win-mouse.js | 3 |
12 files changed, 557 insertions, 379 deletions
diff --git a/edit-vimperator-files.js b/edit-vimperator-files.js index dddd6c6..0ee97fc 100644 --- a/edit-vimperator-files.js +++ b/edit-vimperator-files.js @@ -35,7 +35,7 @@ THE POSSIBILITY OF SUCH DAMAGE. // INFO {{{ let INFO = <> - <plugin name="EditVimperatorFile" version="1.2.2" + <plugin name="EditVimperatorFile" version="1.2.3" href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/edit-vimperator-files.js" summary="Open vimperator files with text-editor." lang="en-US" @@ -50,7 +50,7 @@ let INFO = <description><p></p></description> </item> </plugin> - <plugin name="EditVimperatorFile" version="1.2.2" + <plugin name="EditVimperatorFile" version="1.2.3" href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/edit-vimperator-files.js" summary="Vimperator 関連のファイルをエディタで開く" lang="ja" @@ -110,6 +110,7 @@ let INFO = completion.vimperatorFiles = function (context, args) { context.title = ['Filename', 'Directory']; + context.anchored = false; context.completions = util.Array.uniq(getItems().map(function ([file, dir]) [file, dir])); }; diff --git a/google-translator.js b/google-translator.js index edd3a64..63eb1f2 100644 --- a/google-translator.js +++ b/google-translator.js @@ -191,6 +191,20 @@ let INFO = (liberator.globalVariables.google_translator_actions || 'echo').split(' ') }; + function getTexts () + util.Array.uniq( + [it.textContent.trim().replace(/\n|\s+/g, ' ') for (it in Iterator(util.evaluateXPath('//text()')))], + true + ); + + function textCompleter (context, args) { + context.completions = [ + [it, ''] + for ([, it] in Iterator(getTexts())) + if (it.length > 3 && !/^\s*</(it)) + ]; + } + function guessRequest (text, done) { let url = 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0' + @@ -360,6 +374,7 @@ let INFO = [['-to', '-t'], commands.OPTION_STRING, null, languages], [['-guess', '-g'], commands.OPTION_NOARG] ], + completer: textCompleter }, true ); diff --git a/maine_coon.js b/maine_coon.js index f7ee430..ad0023f 100644 --- a/maine_coon.js +++ b/maine_coon.js @@ -38,7 +38,7 @@ let PLUGIN_INFO = <name lang="ja">メインクーン</name> <description>Make the screen larger</description> <description lang="ja">なるべくでかい画面で使えるように</description> - <version>2.6.2</version> + <version>2.6.5</version> <author mail="anekos@snca.net" homepage="http://d.hatena.ne.jp/nokturnalmortum/">anekos</author> <minVersion>3.0</minVersion> <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/maine_coon.js</updateURL> @@ -141,32 +141,33 @@ let PLUGIN_INFO = ]]></detail> </VimperatorPlugin>; -let tagetIDs = (liberator.globalVariables.maine_coon_targets || '').split(/\s+/); -let elemStyle = - ( - liberator.globalVariables.maine_coon_style - || - libly.$U.toStyleText({ - height: '1em', - margin: 0, - padding: '3px', - border: '1px solid #b3b3b3', - borderLeft: 0, - borderBottom: 0, - textAlign: 'left', - color: '#000', - font: '11px/1 sans-serif', - background: '#ebebeb' - }) - ); - - (function () { let U = libly.$U; let mainWindow = document.getElementById('main-window'); let messageBox = document.getElementById('liberator-message'); let bottomBar = document.getElementById('liberator-bottombar'); + let commandlineBox = document.getElementById('liberator-commandline-command'); + + let tagetIDs = (liberator.globalVariables.maine_coon_targets || '').split(/\s+/); + let elemStyle = + ( + liberator.globalVariables.maine_coon_style + || + libly.$U.toStyleText({ + height: '1em', + margin: 0, + padding: '3px', + border: '1px solid #b3b3b3', + borderLeft: 0, + borderBottom: 0, + textAlign: 'left', + color: '#000', + font: '11px/1 sans-serif', + background: '#ebebeb' + }) + ); + function s2b (s, d) !!((!/^(\d+|false)$/i.test(s)|parseInt(s)|!!d*2)&1<<!s); @@ -329,6 +330,19 @@ let elemStyle = } })(); + function makeTimeoutDelay (f, n) { + if (typeof n === 'undefined') + n = 1; + + if (n > 1) + f = makeTimeoutDelay(f, n - 1); + + return function () setTimeout(f, 10); + } + + function focusToCommandline () + commandlineBox.inputField.focus(); + let useEcho = false; let autoHideCommandLine = false; @@ -374,15 +388,18 @@ let elemStyle = } U.around(commandline, 'input', function (next, args) { - bottomBar.collapsed = false; let result = next(); inputting = true; + bottomBar.collapsed = false; + focusToCommandline(); return result; }, true); U.around(commandline, 'open', function (next, args) { + let result = next(); bottomBar.collapsed = false; - return next(); + focusToCommandline(); + return result; }, true); U.around(commandline, 'close', function (next, args) { @@ -35,13 +35,12 @@ var PLUGIN_INFO = <name>{NAME}</name> <description>Open livedoor Reader pinned items</description> <description lang="ja">livedoor Reader でピンを立てたページを開く</description> - <minVersion>2.3</minVersion> - <maxVersion>2.4</maxVersion> + <minVersion>3.0</minVersion> <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/pino.js</updateURL> <require type="plugin">_libly.js</require> <author mail="snaka.gml@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/snaka72/">snaka</author> <license>MIT style license</license> - <version>1.4.0</version> + <version>1.4.1</version> <detail><![CDATA[ == Subject == Open livedoor Reader pinned items. @@ -285,7 +284,7 @@ let self = liberator.plugins.pino = (function() { liberator.echoerr("Can't get pinned list. Maybe you should login to livedoor."); return; } - result = liberator.eval(data.responseText); + result = unentifyObjectValues(liberator.eval(data.responseText)); }); request.addEventListener("onFailure", function(data) { liberator.echoerr("Can't get pinned list!!!"); @@ -331,6 +330,29 @@ let self = liberator.plugins.pino = (function() { function isLoginPage(response) response.responseText.substr(0, 5) == '<?xml' + function unentify(s) { + const EntityTable = {amp: '&'}; + return s.replace( + /&([a-z-A-Z]+);/g, + function (whole, name) (name in EntityTable ? EntityTable[name] : whole) + ); + }; + + function unentifyObjectValues(obj) { + let result = Object.create(obj); + for (let [n, v] in Iterator(obj)) { + switch (typeof v) { + case "object": + result[n] = unentifyObjectValues(v); + break; + case "string": + result[n] = unentify(v); + break; + } + } + return result; + } + // }}} // API /////////////////////////////////////////////////////////// {{{ return { @@ -1,6 +1,6 @@ // INFO // var INFO = -<plugin name="pixiv.js" version="0.4" +<plugin name="pixiv.js" version="0.5" summary="Download image from pixiv" href="http://github.com/vimpr/vimperator-plugins/blob/master/pixiv.js" xmlns="http://vimperator.org/namespaces/liberator"> @@ -176,21 +176,30 @@ commands.addUserCommand( }; let getImageUrls=function(pageContents){ - let url=new Array(); + const BIG='_big'; + let url=[]; + let strScript; + let fst,snd; + let strFst=''; + let strSnd=''; let tblElm; let i; let htmldoc=getDOMHtmlDocument(pageContents); if(htmldoc){ let max=htmldoc.getElementsByClassName('image-container').length; - let strScript; - let st,end; for(i=0;i<max;i++){ strScript=htmldoc.getElementsByClassName('image-container').item(i) .getElementsByTagName('script').item(0) .childNodes.item(0).nodeValue; - st=strScript.substr(strScript.search(/unshift/i)+'unshift'.length+2); - end=st.substr(0,st.indexOf("'")); - url.push(end); + fst=strScript.search(/unshift/i)+'unshift'.length+2; + snd=strScript.lastIndexOf('_'); + strFst=strScript.substr(fst,snd-fst); + + fst=snd; + snd=strScript.indexOf("'",fst); + strSnd=strScript.substr(fst,snd-fst); + + url.push(strFst+BIG+strSnd); } }else{ url.length=0; diff --git a/pluginManager.js b/pluginManager.js index f28590a..629a4e7 100644 --- a/pluginManager.js +++ b/pluginManager.js @@ -312,7 +312,7 @@ Plugin.prototype = { // {{{ headers: {} }; - if (url && /^(http|ftp):\/\//.test(url)){ + if (url && /^(https?|ftp):\/\//.test(url)){ let xhr = util.httpGet(url); let version = ''; let source = xhr.responseText || ''; diff --git a/readitlater.js b/readitlater.js index cac1fd0..7b26984 100644 --- a/readitlater.js +++ b/readitlater.js @@ -2,20 +2,22 @@ * readitlater.js * read it later apiをたたく * API Reffernce : http://readitlaterlist.com/api/docs/ - * TODO:sendに対応する + * TODO:ADDにbufferからのリストを入れられるように */ let PLUGIN_INFO = <VimperatorPlugin> <name>readitlater</name> - <description lang="ja">read it later の apiをたたく</description> - <version>0.0.2</version> + <description lang="ja">Read it Later を快適に使うためのプラグインです</description> + <version>0.1.2</version> <minVersion>3.0</minVersion> <maxVersion>3.0</maxVersion> <author mail="ninja.tottori@gmail.com" homepage="http://twitter.com/ninja_tottori">ninja.tottori</author> <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/readitlater.js</updateURL> <detail lang="ja"><![CDATA[ - ReadItLaterに追加したりするプラグインです。 + + Q.これは何? + A.Read it Later を快適に使うためのプラグインです 注意1. パスワードマネージャに依存してるので、ReadItLaterのID/PWをパスワードマネージャに登録しておく必要があります。 @@ -29,27 +31,31 @@ let PLUGIN_INFO = 同じキーで1時間に10000回コールするとアレされるそうなので、チームotsuneの方達などは独自で取った方がいいかと思います。 - == Command == :ril + :ril add 今見ているページのurlとtitleを登録します - :ril add - rilした時と同じです。 オプションとして url , title が選べるので適当に編集して登録もできます。 - + :ril get - 登録されてるページの情報を取得してバッファにechoします。 - マウスでクリックするもよし、;oするもよし。 - オプションとして num , read , tags が指定できます。 - num => 数字を入れるとその数だけリストを取得します。 - :ril get num 3 - とか + 登録されてるページの情報を取得してキャッシュしときます。 + デフォルトは50件ですが + let g:readitlater_get_count = 100 + とかで取得件数を変更できます。 + add , open , read された後に問答無用で同期かけに行ってますので、件数をやたらに増やさない方がいいかもしれません。 + + :ril open + <Space>で補完にreaditlaterのリストが出てくるので、任意のURLを選択(<Space>)して実行すると新しいタブに開きます。 + :ril open! と!をつけると既読のみ補完に表示されます。 - read => 指定すると既読のものだけ取得します。 - :ril get read - みたいな + また、開くと同時に既読フラグを立てに行く事ができます。 + let g:readitlater_open_as_read = 1 + としてもらえれば大丈夫です。 + ※初回はキャッシュにデータが入っていないと思うので自分で:ril getしてやる必要があります。 - tags => 指定するとtagがついているものだけ取得します。 + :ril read + 既読フラグを立てる為のサブコマンドです。 + openした時に既読にしたくないっていう人はこれを使って既読フラグを立てて下さい。 :ril stats since, list, unread, read の情報がとれます @@ -59,318 +65,411 @@ let PLUGIN_INFO = </VimperatorPlugin>; - - -commands.addUserCommand(['ril','readitlater'], 'read it late plugin', - function(args){ - - ReadItLater.add(args); - - }, - { - options : [], - subCommands: [ - new Command(["add"], "Add a page to a user's list", - function (args) { - ReadItLater.add(args); - },{ - options : [ - [["url","u"],commands.OPTION_STRING,null, - [[ buffer.URL ,"target url"]] - ], - - [["title","t"],commands.OPTION_STRING,null, - [[ buffer.title ,"title"]] - ], - ], - } - ), - - new Command(["get"], "Retrieve a user's reading list", - function (args) { - ReadItLater.get(args); - },{ - options : [ - [["num"],commands.OPTION_INT], - [["read","-r"],commands.OPTION_NOARG], - [["tags","-t"],commands.OPTION_NOARG], - //[["myAppOnly"],commands.OPTION_NOARG], - ], - } - ), - - new Command(["stats"], "Retrieve information about a user's list", - function (args) { - ReadItLater.stats(); - },{} - ), - /* - new Command(["test"], "Return stats / current rate limit information about your API key", - function () { - ReadItLater.apiTest(); - },{} - ), - */ - ], - - - }, - true -); - - -let ReadItLater = { - api_key : (liberator.globalVariables.readitlater_api_key) ? liberator.globalVariables.readitlater_api_key : "966T6ahYgb081icU10d44byL31p5bF20" , - - text : function(){ // {{{ - - let req = new libly.Request( - "https://text.readitlaterlist.com/v2/text" , // url - null, // headers - { // options - asynchronous:true, - postBody:getParameterMap( - { - apikey : this.api_key, - url : buffer.URL, - mode : "less", - images : 0, +(function(){ + + commands.addUserCommand(["ril","readitlater"], "Read It Late plugin", + function(args){ + ReadItLater.add(args); + }, + { + subCommands: [ + new Command(["add","a"], "Add a page to a user's list", + function (args) { + ReadItLater.add(args); + },{ + options : [ + [["url","u"],commands.OPTION_STRING,null, + (function(){ + return [[ buffer.URL ,"target url"]] + }) + ], + + [["title","t"],commands.OPTION_STRING,null, + (function(){ + return [[ buffer.title ,"title"]] + }) + ], + ], } - ) - } - + ), + + new Command(["get","g"], "Retrieve a user's reading list", + function (args) { + ReadItLater.get(args); + },{ + options : [ + //[["num"],commands.OPTION_INT], + //[["read","-r"],commands.OPTION_NOARG], + //[["tags","-t"],commands.OPTION_NOARG], + //[["myAppOnly"],commands.OPTION_NOARG], + ], + } + ), + + new Command(["open","o"], "Open url in new tab from RIL list.", + function (args) { + ReadItLater.open(args); + },{ + bang: true, + completer : list_completer, + } + ), + + new Command(["read","r"], "Mark items as read.", + function (args) { + ReadItLater.send(args); + },{ + bang: true, + completer : list_completer, + } + ), + + new Command(["stats"], "Retrieve information about a user's list", + function (args) { + ReadItLater.stats(); + },{} + ), + + /* + new Command(["test"], "Return stats / current rate limit information about your API key", + function () { + ReadItLater.apiTest(); + },{} + ), + */ + ], + + + }, + true ); - req.addEventListener("onSuccess",function(data){ - e(data.responseText) - }); - - req.addEventListener("onFailure",function(data){ - liberator.echoerr(data.statusText); - liberator.echoerr(data.responseText); - }); - - req.post(); - - }, // }}} - - - - get : function(args){ // {{{ - // document => http://readitlaterlist.com/api/docs#get - - let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); - let logins = manager.findLogins({},"http://readitlaterlist.com","",null); - - let req = new libly.Request( - "https://readitlaterlist.com/v2/get" , // url - null, // headers - { // options - asynchronous:true, - postBody:getParameterMap( - { - apikey : this.api_key, - username : encodeURIComponent(logins[0].username), - password : encodeURIComponent(logins[0].password), - format : "json", - count : (args["num"]? args["num"] : 30 ), - state : (args["read"]) ? "read" : "unread", - tags : (args["tags"]) ? 1 : 0, - myAppOnly : (args["myAppOnly"]) ? 1 : 0, - } - ) - } - - ); - req.addEventListener("onSuccess",function(data){ - let res = libly.$U.evalJson(data.responseText); - liberator.echo( - <style type="text/css"><![CDATA[ - div.result{color:gold;padding-left:1em;line-height:1.5em;} - .result a{text-decoration:none;} - .result a:hover{text-decoration:underline;} - ]]></style> + - <div>#ReadItLater Your List</div> - ); - for (let key in res.list){ - liberator.echo( - <div class="result"> - <a href={res.list[key].url}> - {res.list[key].title} - </a> - </div> + let ReadItLater = { + api_key : (liberator.globalVariables.readitlater_api_key) ? liberator.globalVariables.readitlater_api_key : "966T6ahYgb081icU10d44byL31p5bF20" , + + text : function(){ // {{{ + + let req = new libly.Request( + "https://text.readitlaterlist.com/v2/text" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + url : buffer.URL, + mode : "less", + images : 0, + } + ) + } + ); - } - }); - req.addEventListener("onFailure",function(data){ - liberator.echoerr(data.statusText); - liberator.echoerr(data.responseText); - }); + req.addEventListener("onSuccess",function(data){ + e(data.responseText) + }); - req.post(); - - }, // }}} + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + req.post(); + + }, // }}} - add : function(args){ // {{{ + get : function(args,silent){ // {{{ + // document => http://readitlaterlist.com/api/docs#get - let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); - let logins = manager.findLogins({},"http://readitlaterlist.com","",null); + let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); + let logins = manager.findLogins({},"http://readitlaterlist.com","",null); + let store = storage.newMap("readitlater",{store:true}); - let req = new libly.Request( - "https://readitlaterlist.com/v2/add" , // url - null, // headers - { // options - asynchronous:true, - postBody:getParameterMap( - { - apikey : this.api_key, - username : encodeURIComponent(logins[0].username), - password : encodeURIComponent(logins[0].password), - url : encodeURIComponent((args["url"]) ? (args["url"]) : buffer.URL), - title : encodeURIComponent((args["title"]) ? args["title"] : buffer.title), + let req = new libly.Request( + "https://readitlaterlist.com/v2/get" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + username : encodeURIComponent(logins[0].username), + password : encodeURIComponent(logins[0].password), + format : "json", + count : (liberator.globalVariables.readitlater_get_count? liberator.globalVariables.readitlater_get_count : 50 ), + //state : (args["read"]) ? "read" : "unread", + //tags : (args["tags"]) ? 1 : 0, + //myAppOnly : (args["myAppOnly"]) ? 1 : 0, + } + ) } - ) - } - - ); + + ); - req.addEventListener("onSuccess",function(data){ - liberator.echo("[ReadItLater] OK.") - }); + req.addEventListener("onSuccess",function(data){ + let res = libly.$U.evalJson(data.responseText); + let cnt = 0; + for (let key in res.list){ + store.set(key,res.list[key]); + cnt++; + } + if(!silent){liberator.echo("[ReadItLater] " + cnt + " found.")}; + store.save(); + }); + + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + + req.post(); + + }, // }}} + + + add : function(args){ // {{{ + + let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); + let logins = manager.findLogins({},"http://readitlaterlist.com","",null); + let req = new libly.Request( + "https://readitlaterlist.com/v2/add" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + username : encodeURIComponent(logins[0].username), + password : encodeURIComponent(logins[0].password), + url : encodeURIComponent((args["url"]) ? (args["url"]) : buffer.URL), + title : encodeURIComponent((args["title"]) ? args["title"] : buffer.title), + } + ) + } + + ); - req.addEventListener("onFailure",function(data){ - liberator.echoerr(data.statusText); - liberator.echoerr(data.responseText); - }); + var ref = this; + req.addEventListener("onSuccess",function(data){ + liberator.echo("[ReadItLater] OK.") + ref.get(null,true); + }); - req.post(); - - }, // }}} + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + req.post(); + + }, // }}} + open : function(args){ //{{{ + liberator.open(args, liberator.NEW_BACKGROUND_TAB); + if(liberator.globalVariables.readitlater_open_as_read == 1) this.send(args); - stats : function(){ // {{{ + }, // }}} - let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); - let logins = manager.findLogins({},"http://readitlaterlist.com","",null); + send : function(args) { //{{{ + // http://readitlaterlist.com/api/docs/#send - let req = new libly.Request( - "https://readitlaterlist.com/v2/stats" , // url - null, // headers - { // options - asynchronous:true, - postBody:getParameterMap( - { - apikey : this.api_key, - username : encodeURIComponent(logins[0].username), - password : encodeURIComponent(logins[0].password), - format : "json", - } - ) - } - - ); + let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); + let logins = manager.findLogins({},"http://readitlaterlist.com","",null); - req.addEventListener("onSuccess",function(data){ - let res = libly.$U.evalJson(data.responseText); - liberator.echo( - <style type="text/css"><![CDATA[ - div.stats{font-weight:bold;text-decoration:underline;color:gold;padding-left:1em;line-height:1.5em;} - ]]></style> + - <div>#ReadItLater Stats</div> + - <div class="stats"> - since : {unixtimeToDate(res.user_since)} <br /> - list : {res.count_list} <br /> - unread : {res.count_unread} <br /> - read : {res.count_read} <br /> - </div> - ); - }); - - req.addEventListener("onFailure",function(data){ - liberator.echoerr(data.statusText); - liberator.echoerr(data.responseText); - }); - - req.post(); - - }, // }}} - - - - apiTest : function(){ // {{{ - - let req = new libly.Request( - "https://readitlaterlist.com/v2/api" , // url - null, // headers - { // options - asynchronous:true, - postBody:getParameterMap( - { - apikey : this.api_key, - } - ) - } - - ); + function make_read_list(args){ + let o = {}; + for (let i = 0; i < args.length; i++) { + o[i] = {"url":encodeURIComponent(args[i])}; + }; + return JSON.stringify(o); + }; - req.addEventListener("onSuccess",function(data){ - liberator.echo( - <div> - X-Limit-User-Limit : {data.transport.getResponseHeader("X-Limit-User-Limit")} <br /> - X-Limit-User-Remaining : {data.transport.getResponseHeader("X-Limit-User-Remaining")} <br /> - X-Limit-User-Reset : {data.transport.getResponseHeader("X-Limit-User-Reset")} <br /> - X-Limit-Key-Limit : {data.transport.getResponseHeader("X-Limit-Key-Limit")} <br /> - X-Limit-Key-Remaining : {data.transport.getResponseHeader("X-Limit-Key-Remaining")} <br /> - X-Limit-Key-Reset : {data.transport.getResponseHeader("X-Limit-Key-Reset")} <br /> + let req = new libly.Request( + "https://readitlaterlist.com/v2/send" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + username : encodeURIComponent(logins[0].username), + password : encodeURIComponent(logins[0].password), + read : make_read_list(args), + } + ) + } + ); - </div> + var ref = this; + req.addEventListener("onSuccess",function(data){ + liberator.echo("[ReadItLater] OK.") + ref.get(null,true); + }); + + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + + req.post(); + + + }, // }}} + + stats : function(){ // {{{ + + let manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager); + let logins = manager.findLogins({},"http://readitlaterlist.com","",null); + let req = new libly.Request( + "https://readitlaterlist.com/v2/stats" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + username : encodeURIComponent(logins[0].username), + password : encodeURIComponent(logins[0].password), + format : "json", + } + ) + } + ); - }); - - req.addEventListener("onFailure",function(data){ - liberator.echoerr(data.statusText); - liberator.echoerr(data.responseText); - }); - - req.post(); - - }, // }}} - - - -} - - + req.addEventListener("onSuccess",function(data){ + let res = libly.$U.evalJson(data.responseText); + liberator.echo( + <style type="text/css"><![CDATA[ + div.stats{font-weight:bold;text-decoration:underline;color:gold;padding-left:1em;line-height:1.5em;} + ]]></style> + + <div>#ReadItLater Stats</div> + + <div class="stats"> + since : {unixtimeToDate(res.user_since)} <br /> + list : {res.count_list} <br /> + unread : {res.count_unread} <br /> + read : {res.count_read} <br /> + </div> + ); + }); + + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + + req.post(); + + }, // }}} + + + + apiTest : function(){ // {{{ + + let req = new libly.Request( + "https://readitlaterlist.com/v2/api" , // url + null, // headers + { // options + asynchronous:true, + postBody:getParameterMap( + { + apikey : this.api_key, + } + ) + } + + ); -function unixtimeToDate(ut) { - var t = new Date( ut * 1000 ); - t.setTime( t.getTime() + (60*60*1000 * 9) ); // +9は日本のタイムゾーン - return t; -} - + req.addEventListener("onSuccess",function(data){ + liberator.echo( + <div> + X-Limit-User-Limit : {data.transport.getResponseHeader("X-Limit-User-Limit")} <br /> + X-Limit-User-Remaining : {data.transport.getResponseHeader("X-Limit-User-Remaining")} <br /> + X-Limit-User-Reset : {data.transport.getResponseHeader("X-Limit-User-Reset")} <br /> + X-Limit-Key-Limit : {data.transport.getResponseHeader("X-Limit-Key-Limit")} <br /> + X-Limit-Key-Remaining : {data.transport.getResponseHeader("X-Limit-Key-Remaining")} <br /> + X-Limit-Key-Reset : {data.transport.getResponseHeader("X-Limit-Key-Reset")} <br /> + + </div> + ); + }); + + req.addEventListener("onFailure",function(data){ + liberator.echoerr(data.statusText); + liberator.echoerr(data.responseText); + }); + + req.post(); + + }, // }}} + + + + } + + function list_completer(context,args){ // {{{ + + function sortDate(store){ + let ary = []; + for (let s in store){ + ary.push([s[1].time_updated,s[1]]); // 更新日でソート + } + ary.sort(function(a,b){return -(a[0] - b[0])}); + return ary; + } + + let store = storage.newMap("readitlater",{store:true}); + let list = sortDate(store); + + context.title = ["url","title"] + context.filters = [CompletionContext.Filter.textDescription]; // titleも補完対象にする + context.compare = void 0; + context.anchored = false; + context.completions = (function(){ + let links = []; + for(let i in list){ + let item = list[i][1]; + if(!args["bang"]){ + if(item.state == 0) links.push([item.url,item.title]); // 既読のみ + }else{ + if(item.state == 1) links.push([item.url,item.title]); // 未読のみ + } + } + return links; + })(); + + } //}}} + + + + + function unixtimeToDate(ut) { + var t = new Date( ut * 1000 ); + t.setTime( t.getTime() + (60*60*1000 * 9) ); // +9は日本のタイムゾーン + return t; + } + + function getParameterMap(parameters){ + let map = ""; + for (let key in parameters){ + if (map) map += "&"; + map += key + "=" + parameters[key]; + } + return map + } -function getParameterMap(parameters){ - let map = ""; - for (let key in parameters){ - if (map) map += "&"; - map += key + "=" + parameters[key]; - } - return map -} + // for debug + function e(v,c){ + if(c) util.copyToClipboard(v); + liberator.log(v,-1) + } +})(); -// for debug -function e(v,c){ - if(c) util.copyToClipboard(v); - liberator.log(v,-1) -} @@ -548,7 +548,7 @@ self.init(); // ----------------------------------------------------- // Commmand // ----------------------------------------------------- -commands.addUserCommand(['sl'],decodeURIComponent(escape('キータイプを矯正します。')), +commands.addUserCommand(['sl'], 'キータイプを矯正します。', function(args){ let opt = {}; @@ -964,35 +964,11 @@ Thanks: set volume (value) (this.player.setVolume(value), this.volume), fetch: function (filepath) { - function _fetch (id, t) { - let url = - "http://youtube.com/get_video?video_id=" + id + - "&t=" + decodeURIComponent(t) + - (quality ? "&fmt=" + quality : ''); - U.download(url, filepath, '.flv', self.title); - } - - let self = this; - // all(1080p,720p,480p,360p) -> 37, 22, 35, 34, 5 // FIXME 一番初めが最高画質だと期待 - let cargs = content.wrappedJSObject.yt.config_.SWF_CONFIG.args; - let quality = cargs.fmt_map.match(/^\d+/); - let t = cargs.t; - let id = this.id; - - // 時間が経っていると無効化されてしまっている - //_fetch(t, id); - - U.httpRequest( - U.currentURL, - null, - function (xhr) { - // XXX t が変わるために、キャッシュを利用できない問題アリアリアリアリ - let [, t] = xhr.responseText.match(/swfHTML.*&t=([^&]+)/); - _fetch(id, t); - } - ); + let cargs = content.wrappedJSObject.yt.config_.PLAYER_CONFIG.args; + let url = decodeURIComponent(cargs.fmt_url_map.split(',')[0].split('|')[1]); + U.download(url, filepath, '.flv', this.title); }, makeURL: function (value, type) { @@ -1478,6 +1454,7 @@ Thanks: functions: { currentTime: 'w', + fetch: 'x', makeURL: 'x', muted: 'w', pause: 'x', @@ -1527,6 +1504,25 @@ Thanks: get volume () parseInt(this.player.__stella_volume), set volume (value) (this.api_setVolume(value), this.player.__stella_volume = value), + fetch: function(filepath) { + let self = this; + let id = U.currentURL.match(/vimeo\.com\/(\d+)/)[1]; + U.httpRequest( + 'http://www.vimeo.com/moogaloop/load/clip:' + id, + null, + function(xhr) { + let doc = xhr.responseXML; + let signature = U.xpathGet('/xml/request_signature', doc).textContent; + let timestamp = U.xpathGet('/xml/timestamp', doc).textContent; + let isHD = parseInt(U.xpathGet('/xml/video/isHD', doc).textContent); + let url = 'http://www.vimeo.com/moogaloop/play/clip:' + id + + '/' + signature + '/' + timestamp + + '/?q=' + (isHD ? 'hd' : 'sd'); + U.download(url, filepath, isHD ? '.mp4' : '.flv', self.title); + } + ); + }, + makeURL: function (value, type) { switch (type) { case Player.URL_ID: diff --git a/twittperator.js b/twittperator.js index 66f5c0b..edf0d04 100644 --- a/twittperator.js +++ b/twittperator.js @@ -1439,6 +1439,9 @@ let PLUGIN_INFO = if (msg.text) Twittperator.onMessage(msg); + + if (msg.friends) + Twittperator.onFriends(msg); } function clearPluginData() { @@ -1637,6 +1640,9 @@ let PLUGIN_INFO = io.getRuntimeDirectories("plugin/twittperator").forEach(loadPluginFromDir(true)); io.getRuntimeDirectories("twittperator").forEach(loadPluginFromDir(false)); }, // }}} + onFriends: function(msg) { // {{{ + __context__.Friends = friends = msg.friends; + }, // }}} onMessage: function(msg) { // {{{ history.unshift(msg); if (history.length > setting.historyLimit) @@ -2230,7 +2236,12 @@ let PLUGIN_INFO = let arg = args.literalArg.slice(0, context.caret); let m; - if (m = arg.match(/(RT\s+)@.*$/)) { + if (m = arg.match(/^D\s+/)) { + context.title = ["Name#ID", "Entry"]; + context.advance(m[0].length); + Completers.name(rejectMine)(context, args); + return; + } else if (m = arg.match(/(RT\s+)@.*$/)) { (m.index === 0 ? Completers.name_id : Completers.name_id_text)(m.index === 0 && rejectMine)(context, args); } else if (m = tailMatch(/(^|\b|\s)#[^#\s]*$/, arg)) { @@ -2280,7 +2291,7 @@ let PLUGIN_INFO = (!lastTime || ((lastTime + setting.statusValidDuration * 1000) < now)); let completer = args.bang ? subCommandCompleter : commandCompelter; - let matches = args.bang || args.literalArg.match(/(RT\s+|)@|#/); + let matches = args.bang || args.literalArg.match(/(RT\s+|)@|#|^D\s+/); if (!matches) return; @@ -2331,6 +2342,10 @@ let PLUGIN_INFO = if (!history) history = __context__.Tweets = Store.get("history", []); + let friends = __context__.Friends; + if (!friends) + friends = __context__.Friends = Store.get("friends", []); + let tw = new TwitterOauth(Store); // ストリーム @@ -2351,7 +2366,7 @@ let PLUGIN_INFO = if (setting.useChirp){ if(setting.allReplies) ChirpUserStream.start({"replies":"all"}); - else + else ChirpUserStream.start(); } @@ -2361,6 +2376,7 @@ let PLUGIN_INFO = __context__.onUnload = function() { Store.set("history", history); + Store.set("friends", friends); ChirpUserStream.stop(); TrackingStream.stop(); }; diff --git a/twittperator/pong.tw b/twittperator/pong.tw index 4f21b7e..35b3053 100644 --- a/twittperator/pong.tw +++ b/twittperator/pong.tw @@ -11,23 +11,25 @@ plugins.twittperator.ChirpUserStream.addListener( function onMsg (msg, raw) { + function negi (pattern, reply) { + if (RegExp('^\\s*@' + screenName + '\\s+' + pattern + '\s*$')(msg.text.trim())) { + plugins.twittperator.Twitter.say('@' + msg.user.screen_name + ' ' + reply, msg.id_str); + return true; + } + } + if (!(msg.text && msg.user)) return; if (msg.text.trim() === ('@' + screenName)) return plugins.twittperator.Twitter.say('@' + msg.user.screen_name, msg.id_str); - if (RegExp('^\\s*@' + screenName + '\\s+ping\s*$')(msg.text.trim())) - return plugins.twittperator.Twitter.say('@' + msg.user.screen_name + ' pong', msg.id_str); - - if (RegExp('^\\s*@' + screenName + '\\s+pong\s*$')(msg.text.trim())) - return plugins.twittperator.Twitter.say('@' + msg.user.screen_name + ' pang', msg.id_str); - - if (RegExp('^\\s*@' + screenName + '\\s+pang\s*$')(msg.text.trim())) - return plugins.twittperator.Twitter.say('@' + msg.user.screen_name + ' bang', msg.id_str); - - if (RegExp('^\\s*@' + screenName + '\\s+bang\s*$')(msg.text.trim())) - return plugins.twittperator.Twitter.say('@' + msg.user.screen_name + ' ( \u25D5 \u203F\u203F \u25D5 )', msg.id_str); + negi('ping', 'pong') || + negi('pong', 'pang') || + negi('pang', 'bang') || + negi('bang', '( \u25D5 \u203F\u203F \u25D5 )') || + negi('\u30C6\u30A3\u30ED', '\u30D5\u30A3\u30CA\u30FC\u30EC') || + true; } ); })(); diff --git a/win-mouse.js b/win-mouse.js index bbb1a8a..12fa8fa 100644 --- a/win-mouse.js +++ b/win-mouse.js @@ -610,7 +610,7 @@ let INFO = y: args['-y'] }); if (args['-click']) - API.click({name: args['-click']}); + API.click({name: args['-click'], blur: args['-blur']}); } let xpath = args.literalArg; @@ -631,6 +631,7 @@ let INFO = literal: 0, bang: true, options: [ + [['-blur'], commands.OPTION_NOARG], [['-index'], commands.OPTION_INT], [['-x'], commands.OPTION_INT], [['-y'], commands.OPTION_INT], |