/** * ==VimperatorPlugin== * @name LDR unread counter * @description Display the unread count of LDR to the statusbar * @description-ja ステータスバーにLDRの未読件数を表示 * @version 0.1b * @author teramako teramako@gmail.com * ==/VimperatorPlugin== * * まず最初に * let livedoor_id = "" * とユーザIDを設定してください。 */ liberator.plugins.ldrUnreadCounter = (function(){ const defaultNameSpace = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; const gIntervalName = "ldr_check_intervals"; const userIdName = "livedoor_id"; var statusPanel, canvas; var icon_image = new Image(); icon_image.src = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAQ5JREFUOMul" + "kz1OAzEQhT87hihN2kUU3opjRELaiCYVgstQIKXLEdJT09IgrVJwi4SG7ehIgbR/Zik2WLblCCn7" + "JMuemeenmbFHALDsOk7BUghx+Xji5QPUpGEQVOjYrUyUePUwivqlqTvcNdVzG5zqubV3K0PINXWH" + "+mqFn9LtBjDOGWuHXABl6uP1hbEYV5bVcYH92rBfG1tOtAcAZQXJd7+7guPkxp4vrjc27vJl2kLa" + "wofq97R15Be5Fdk+GRt3+fYZ/y6+OwJNCWS5baKLtO25gjv/J/48+2R5P+LsLaP6fPV8AJxHPpJb" + "NwCznGaWM04yz6dLKAChF8NmQTIQAuC/LIpDW3QwDsWLEL8RGH9NPOjBNQAAAABJRU5ErkJggg=="; /** * initial function */ function init(){ createStatusButton(); manager.start(); } /** * create Status Icon to status line */ function createStatusButton(){ function createElement(localName, attrs, namespace){ var elm = document.createElementNS(namespace ? namespace : defaultNameSpace, localName); for (let name in attrs) elm.setAttribute(name, attrs[name]); return elm; } // FIXME: onclick時にLDRを開くように要修正 statusPanel = createElement("statusbarpanel", { id: "ldr_unread_count_panel", tooltiptext: "Count: " }); canvas = createElement("canvas", { id: "ldr_unread_count_image", width: "24", height: "16" },"http://www.w3.org/1999/xhtml"); statusPanel.appendChild(canvas); // Iconだけ最初に描画がしておく var ctx = canvas.getContext("2d"); icon_image.onload=function(){ ctx.drawImage(icon_image,0,0); }; //ctx.drawImage(icon_image,0,0); document.getElementById("status-bar").insertBefore(statusPanel, document.getElementById("security-button").nextSibling); } function updateTooltip(str){ statusPanel.setAttribute("tooltiptext",str); } /** * Update StatusIcon * @param {String|Number} count */ function updateCanvasCount(count){ count = "" + count; var ctx = canvas.getContext("2d"); ctx.clearRect(0,0,24,16); ctx.save(); // LDR Icon の描画 ctx.drawImage(icon_image,0,0); var width = ctx.canvas.width; var height = ctx.canvas.height; var len = ctx.mozMeasureText(count); // 未読件数の背景を暗くする // XXX: もっと良い色募集 ctx.save(); ctx.fillStyle = "rgba(48,48,48,0.75)"; ctx.fillRect(width-len-1,4,len+1,12); ctx.restore(); // 未読件数の描画 // XXX: もっと良い色募集 ctx.fillStyle = "Cyan"; ctx.mozTextStyle = "12px sans-serif"; ctx.translate(width - len-1, height-1); ctx.mozDrawText(count); ctx.restore(); } /** * Draw Stop mark */ function canvasDrawStop(){ var ctx = canvas.getContext("2d"); ctx.clearRect(0,0,24,16); ctx.drawImage(icon_image,0,0); ctx.save(); //禁止マークの描画 ctx.strokeStyle = "Red"; ctx.lineWidth = "2"; ctx.beginPath(); ctx.arc(17,9,6,0,Math.PI*2,false); ctx.stroke(); ctx.translate(17,9); ctx.rotate(Math.PI/4); ctx.beginPath(); ctx.moveTo(-6,0); ctx.lineTo(6,0); ctx.stroke(); ctx.restore(); } var unreadCount = 0; function setCount(count){ unreadCount = count; updateTooltip("Unread: " + count); updateCanvasCount(count); } function checkCount(id){ var xhr; try { xhr = new XMLHttpRequest(); xhr.mozBackgroundRequest = true; xhr.open("GET", "http://rpc.reader.livedoor.com/notify?user=" + id, false); xhr.send(null); setCount(xhr.responseText.split("|")[1]); } catch (e){ liberator.log(e,0); liberator.echoerr("LDR Unread Counter: " + e.message); } } var timer = null; function startup(id){ setTimeout(function(){ checkCount(id); timer = setTimeout(arguments.callee, manager.interval); }, 1000); } // --------------------------------------------------- // PUBLIC // --------------------------------------------------- var manager = { get user_id(){ return liberator.globalVariables[userIdName]; }, get interval(){ var interval = liberator.globalVariables[gIntervalName]; if (interval){ interval = parseInt(interval,10); } return (isNaN(interval) ? 120 : interval) * 1000; }, set interval(value){ value = parseInt(value,10); if (isNaN(value)) return null; liberator.globalVariables[gIntervalName] = value; return value; }, get count(){ return unreadCount; }, start: function(){ if (!this.user_id){ liberator.echoerr("LDR Unread Counter: Please :let " + userIdName + " = "); // FIXME: なんかエラーが出る。原因が良く分からん //this.stop(); return; } if (timer === null) startup(this.user_id); else liberator.echoerr("LDR Unread Counter has already started"); }, stop: function(){ window.clearTimeout(timer); timer = null; canvasDrawStop(); updateTooltip("LDR Unread Counter: stoped"); }, open: function(){ liberator.open(["http://reader.livedoor.com/reader/"]); } }; init(); return manager; })(); // vim: sw=4 ts=4: 34; summary="Get Watchizu URL of current machine location" href="http://github.com/vimpr/vimperator-plugins/blob/master/watchizu.js" xmlns="http://vimperator.org/namespaces/liberator"> <author email="mitsugu.oyama@gmail.com">Mitsugu Oyama</author> <license href="http://opensource.org/licenses/mit-license.php">MIT</license> <project name="Vimperator" minVersion="2.3"/> <p> You can get Watchizu URL of current machine location by this plugin. </p> <item> <tags>'Watchizu'</tags> <spec>:watchizu</spec> <description> <p>You can get <link topic="http://watchizux.gsi.go.jp/index.html">Watchizu</link> URL of current machine location by this plugin.</p> </description> </item> </plugin>; (function(){ commands.addUserCommand( ['watchize'], 'Get Watchize URL of current location', function(){ let form=function(v){ let ret=String(v); if(ret.length<2) ret='0'+ret; return ret; }; let conv=function(bl){ let h=Math.floor(bl); let m=Math.floor((bl-h)*60); let s=Math.floor((bl-h-(m/60))*3600); return ''+h+form(m)+form(s); }; let strURL='http://watchizu.gsi.go.jp/watchizu.aspx'; let Cc=Components.classes; let Ci=Components.interfaces; let geolocation=Cc["@mozilla.org/geolocation;1"] .getService(Ci.nsIDOMGeoGeolocation); geolocation.getCurrentPosition(function(position){ let strL='?b='+conv(position.coords.latitude) +'&l='+conv(position.coords.longitude); liberator.echo(strURL+strL); util.copyToClipboard(strURL+strL,true); }); } ); })();