aboutsummaryrefslogtreecommitdiffstats
path: root/retweet.js
blob: 3d9bbc9ce7c745dbe47d9b6ce78a96902dc2482a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// PLUGIN_INFO//{{{
var PLUGIN_INFO =
<VimperatorPlugin>
  <name>retweet</name>
  <description>ReTweet This Page.</description>
  <description lang="ja">開いているTweetをReTweetします</description>
  <author mail="from.kyushu.island@gmail.com" homepage="http://iddy.jp/profile/from_kyushu">from_kyushu</author>
  <version>0.2</version>
  <license>GPL</license>
  <minVersion>1.2</minVersion>
  <maxVersion>2.1</maxVersion>
  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/retweet.js</updateURL>
  <require type="plugin">_libly.js</require>
  <detail><![CDATA[

== Command ==
Usage:
  :rtt
    ReTweet This Post.

  ]]></detail>
</VimperatorPlugin>;
//}}}
//
(
  function()
  {
    var password;
    var username;
    var passwordManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
    var $U = liberator.plugins.libly.$U;

    function getBody()
    {
      var body = $U.getFirstNodeFromXPath("//span[@class='entry-content']").innerHTML;
      //return body.replace(/<[^>]*>/g, "");
      var tags = body.match(/<[^>]*>/g);
      for(var tag in tags)
      {
        body = body.replace(tags[tag],"");
      }
      return body;
    }

    function getUserName()
    {
      return $U.getFirstNodeFromXPath("//div[@class='screen-name']/a").innerHTML;
    }

    function getShortenUrl(longUrl)
    {
      var xhr = new XMLHttpRequest();
      var req = "http://bit.ly/api?url=" + encodeURIComponent(longUrl);
      xhr.open('GET',req, false);
      xhr.send(null);
      if(xhr.status != 200)
      {
        return longUrl;
      }
      return xhr.responseText;
    }

    function sendTwitter(url,name,body)
    {
      var xhr = new XMLHttpRequest();
      var statusText = "RT @" + name + " [" + url +"]: " + body;
      xhr.open("POST", "https://twitter.com/statuses/update.json", false, username, password);
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("status=" + encodeURIComponent(statusText) + "&source=Vimperator");

      liberator.echo("[RT] Your post was sent.");
    }

    commands.addUserCommand(
      ['retweet[This]','rtt'],
      'ReTweet This.',
      function()
      {
        try
        {
          var logins = passwordManager.findLogins({}, "http://twitter.com","https://twitter.com",null);
          var body = getBody();
          var name = getUserName();
          var url = getShortenUrl(buffer.URL);
          if(logins.length)
          {
            username = logins[0].username;
            password = logins[0].password;
            sendTwitter(url,name,body);
          }
          else if(liberator.globalVariables.twitter_username && liberator.globalVariables.twitter_password)
          {
            username = liberator.globalVariables.twitter_username;
            password = liberator.globalVariables.twitter_password;
            sendTwitter(url,name,body);
          }
          else
          {
            throw "Accont not found";
          }
        }
        catch(e)
        {
          liberator.echoerr(e);
        }
      }
    );
  }
)();
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/extensions-manager.js</updateURL> <minVersion>2.3</minVersion> <maxVersion>2.3</maxVersion> <detail><![CDATA[ アドオンの有効無効状態を保存復帰できるプラギン 詳しくはヘルプを読んでくれよ :help extension-manager-plugin ]]></detail> <detail lang="ja"><![CDATA[ Store / Restore current extensions state. read the help with the below command. ":help extension-manager-plugin" ]]></detail> </VimperatorPlugin>; // }}} // INFO {{{ let INFO = <> <plugin name="extension-manager" version="1.1.0" href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/extension-manager.js" summary="extension manager" lang="en-US" xmlns="http://vimperator.org/namespaces/liberator"> <author email="anekos@snca.net">anekos</author> <license>New BSD License</license> <project name="Vimperator" minVersion="2.3"/> <p> Extention manager death yohooo </p> <item> <tags>:extstate</tags> <spec>:exts<oa>tate</oa> <a>sub-command</a> <a>name</a> <oa>extension-names...</oa></spec> <description> <p> Store or restore current extensions state with <a>name</a>. <p>The following <a>sub-commands</a> are interpreted.</p> if the <oa>extension-names</oa> arguments are specified, this command is only for these extensions. <ul> <li>store</li> <li>restore</li> </ul> </p> </description> </item> </plugin> <plugin name="extension-manager" version="1.1.0" href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/extension-manager.js" summary="extension manager" lang="ja" xmlns="http://vimperator.org/namespaces/liberator"> <author email="anekos@snca.net">anekos</author> <license>New BSD License</license> <project name="Vimperator" minVersion="2.3"/> <p> extention manager </p> <item> <tags>:extstate</tags> <spec>:exts<oa>tate</oa> <a>sub-command</a> <a>name</a> <oa>extension-names...</oa></spec> <description> <p> 拡張の有効無効状態を <a>name</a> で保存復帰します。 <oa>extension-names</oa> で拡張名を指定しておくと、指定された拡張のみが保存復帰の対象になります。 <p>以下の <a>sub-commands</a> があります。</p> <dl> <dt>store</dt><dd>保存</dd> <dt>restore</dt><dd>復帰</dd> </dl> </p> </description> </item> <item> <tags>:extbisect</tags> <spec>:extbisect <a>sub-command</a></spec> <description> <p> 問題のある拡張などをあぶり出すためのコマンドです 二分探索ぽい方法よって効率的に困った拡張を探し出します 自動的に拡張の有効無効を切り替えていくのでかなり楽が出来ると思います </p> <p> 作業手順 (ok fail start を実行すると自動的に再起動します) <ol> <li>":extbisect start" で開始</li> <li>問題が起きていないかテスト</li> <li>起きていなければ":extbisect ok"起きていれば":extbisect fail"を実行</li> <li>再起動するので2 を再び繰り返す</li> </ol> <p> 問題のある拡張がなんであるか確定したら ok/fail したときにメッセージが出ます メッセージを確認したら":extbisect reset" で拡張の状態を元に戻してください </p> <p> テストを行うことでエラーで Firefox が終了してしまう場合は再起動後に ok / fail を実行してください </p> </p> </description> </item> </plugin> </>; // }}} (function () { let states = storage.newMap('plugins-extman-states', {store: true}); let bisect = storage.newMap('plugins-extman-bisect', {store: true}); states.modify = bisect.modify = function (name, func) this.set(name, func(this.get(name))); function xabled (id, enable) services.get("extensionManager")[enable ? 'enableItem' : 'disableItem'](id); function xabledWithName (name, enable) xabled(liberator.getExtension(name), enable); function cmp (s1, s2) (s1.toLowerCase() == s2.toLowerCase()); function extFilter (exts, names) (names && names.length) ? exts.filter(function (ext) names.some(function (name) cmp(name, ext.name))) : exts; function store (name, targets) { let es = extFilter(liberator.extensions, targets); states.set(name, {extensions: es, date: new Date()}); } function slash (ary, index) [ary.slice(0, index), ary.slice(index)]; function isVimp (ext) (ext.name == 'Vimperator'); store('last'); let extState = { store: function (name, targets) { function done () liberator.echo('extensions state was stored to "' + name + '".'); if (!name) return liberator.echoerr('too few arguments'); if (states.get(name)) { commandline.input( 'overwrite? [y/n]', function (answer) (answer.toLowerCase() == 'y' ? (store(name, targets, true), done()) : liberator.echo('canceled')) ); } else { store(name, targets, true); done(); } }, restore: function (name, targets) { if (!name) return liberator.echoerr('too few arguments'); let state = states.get(name); if (!state) return liberator.echoerr('"' + name + '" has not been stored.'); let es = state.extensions; if (targets.length) es = es.filter(function (ext) targets.some(function (t) t == ext.name)); es.forEach(function (ext) xabled(ext.id, ext.enabled)); liberator.echo('extensions state was restored from "' + name + '".'); }, flush: function () { states.save(); }, __noSuchMethod__: function (name) { liberator.echoerr(name + ' is not valid sub-command'); } }; let extBisect = { start: function () { if (this.__notReady(false)) return; let targets = liberator.extensions.filter(function (ext) !isVimp(ext) && ext.enabled); bisect.set('store', liberator.extensions); bisect.set('state', 'started'); let ([a, b] = slash(targets, targets.length / 2)) { bisect.set('yet', a); bisect.set('current', b); } bisect.save(); this.__reflectCurrent(); liberator.restart(); }, ok: function () { if (this.__notReady(true)) return; if (this.__finished(true)) return; bisect.modify('yet', function (value) { let [a, b] = slash(value, value.length / 2); bisect.set('current', a); return b; }); this.__reflectCurrent(); liberator.restart(); }, fail: function () { if (this.__notReady(true)) return; if (this.__finished(false)) return; bisect.modify('current', function (value) { let [a, b] = slash(value, value.length / 2); bisect.set('yet', a); return b; }); this.__reflectCurrent(); liberator.restart(); }, show: function () { function f (ext) liberator.echo(' ' + ext.name); liberator.echo('<<current>>'); bisect.get('current').forEach(f) liberator.echo('<<yet>>'); bisect.get('yet').forEach(f) }, reset: function () { if (this.__notReady(true)) return; bisect.set('state', ''); bisect.get('store').forEach(function (ext) xabled(ext.id, ext.enabled)); bisect.save(); liberator.echo('extensions were reset'); liberator.restart(); }, __notReady: function (started) { if (!!(bisect.get('state') == 'started') == !!started) return false; liberator.echoerr('extbisect has ' + (started ? 'not ' : '') + 'been started.'); return true; }, __finished: function (ok) { function answer (ext) { liberator.echo(util.escapeString(ext.name) + ' is the criminal!!'); return true; } let current = bisect.get('current'); let yet = bisect.get('yet'); if (ok && yet.length <= 1) return answer(yet[0]); if (!ok && current.length <= 1) return answer(current[0]); return false; }, __reflectCurrent: function () { let current = bisect.get('current'); liberator.extensions.forEach( function (ext) (xabled(ext.id, isVimp(ext) || current.some(function (e) e.id == ext.id))) ); }, __noSuchMethod__: function (name) { liberator.echoerr(name + ' is not valid sub-command'); } }; commands.addUserCommand( ['exts[tate]'], 'store / restore extensions state (enabled / disabled).', function (args) { let [cmd,] = args; extState[cmd](args[1], args.slice(2)); }, { completer: function (context, args) { if (args.length == 1) { context.title = ['sub command', 'description']; context.completions = [ ['store', 'store current state'], ['restore', 'restore current state'], ['flush', 'flush'] ]; } else if (args.length == 2) { context.title = ['name']; context.completions = [[name, state.date] for ([name, state] in states)]; } else if (args.length >= 3) { let exts = liberator.extensions; context.title = ['name']; context.quote = ['', util.escapeString, '']; context.completions = [[ext.name, ext.description] for each (ext in exts)]; } } }, true ); commands.addUserCommand( ['extbisect'], 'bisectrrrrrrrrrrr', function (args) { let [cmd,] = args; extBisect[cmd](); }, { completer: function (context, args) { if (args.length == 1) { context.title = ['sub command', 'description']; context.completions = [ ['start', 'start bisect'], ['ok', ''], ['fail', ''], ['reset', ''], ['show', ''] ]; } } }, true ); states.save(); })(); // vim:sw=2 ts=2 et si fdm=marker: