aboutsummaryrefslogtreecommitdiffstats
path: root/retweet.js
blob: 09d4d3e5e34d8b1250debd82b8803c6dd2d50aed (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
110
111
112
113
114
// 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.3</version>
  <license>GPL</license>
  <minVersion>1.2</minVersion>
  <maxVersion>2.1</maxVersion>
  <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/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('//a[contains(concat(" ",normalize-space(@class)," "),"screen-name")]').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,comment)
    {
      var xhr = new XMLHttpRequest();
      var statusText = (comment ? comment + " " : "") + "RT @" + name + " [" + url +"]: " + body;
      return liberator.echo(statusText);
      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(args)
      {
        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,args.literalArg);
          }
          else if(liberator.globalVariables.twitter_username && liberator.globalVariables.twitter_password)
          {
            username = liberator.globalVariables.twitter_username;
            password = liberator.globalVariables.twitter_password;
            sendTwitter(url,name,body,args.literalArg);
          }
          else
          {
            throw "Accont not found";
          }
        }
        catch(e)
        {
          liberator.echoerr(e);
        }
      },
      {
        literal: 0
      },
      true
    );
  }
)();
an> Link == http://d.hatena.ne.jp/nokturnalmortum/20080918#1221729188 ]]></detail> </VimperatorPlugin>; // }}} (function () { liberator.log('readcatlater.js loading'); // このプラグインでブックマークしたときに必ずつくタグ const RCL_TAG = 'readcatlater'; // このプラグインが保存するブックマークのフォルダ名 // 変更しても良いし、場所を移動しても平気である。 const FOLDER_NAME = 'L'; // 逆順表示 const REVERSE = eval(liberator.globalVariables.readcatlater_reverse || 'false'); let prefs = { prefix: 'extensions.vimperator.plugins.readcatlater.', prefs: Components.classes["@mozilla.org/preferences-service;1"]. getService(Components.interfaces.nsIPrefBranch), get: function (name, def) { var name, type; try { const nsIPrefBranch = Components.interfaces.nsIPrefBranch; name = this.prefix + name; type = this.prefs.getPrefType(name); switch (type) { case nsIPrefBranch.PREF_STRING: try { return this.prefs.getComplexValue(name, Components.interfaces.nsISupportsString).data; } catch (e) { this.prefs.getCharPref(name); } break; case nsIPrefBranch.PREF_INT: return this.prefs.getIntPref(name); break; case nsIPrefBranch.PREF_BOOL: return this.prefs.getBoolPref(name); default: return def; } } catch (e) { return def; } }, set: function (name, value, type) { var name = this.prefix + name; switch (type || typeof value) { case 'string': let str = Cc['@mozilla.org/supports-string;1']. createInstance(Ci.nsISupportsString); str.data = value; return this.prefs.setComplexValue(name, Components.interfaces.nsISupportsString, str); case 'boolean': return this.prefs.setBoolPref(name, value); case 'number': return this.prefs.setIntPref(name, value); default: alert('unknown pref type'); } }, }; const migemo = Cc['@piro.sakura.ne.jp/xmigemo/factory;1']. getService(Components.interfaces.pIXMigemoFactory). getService("ja"); const tagssvc = Cc["@mozilla.org/browser/tagging-service;1"]. getService(Ci.nsITaggingService); const IOService = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService); const myURI = IOService.newURI("http://www.mozilla.com", null, null); const bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]. getService(Ci.nsINavBookmarksService); const history = Cc["@mozilla.org/browser/nav-history-service;1"]. getService(Ci.nsINavHistoryService); let [folderId, folderGUID] = [prefs.get('folderId', false), prefs.get('folderGUID', false)]; if (!(folderGUID && folderId && (folderId == bookmarks.getItemIdForGUID(folderGUID)))) { folderId = bookmarks.createFolder(bookmarks.toolbarFolder, FOLDER_NAME, bookmarks.DEFAULT_INDEX); prefs.set('folderId', folderId); prefs.set('folderGUID', bookmarks.getItemGUID(folderId)); } /* // Get an array of tags for a URI let myTags = tagssvc.getTagsForURI(myURI, {}); // Get an array of URIs for a tag let taggedURIs = tagssvc.getURIsForTag("mozilla"); // Get an array of all tags let arrayOfAllTags = tagssvc.allTags; // Remove tags from a URI tagssvc.untagURI(myURI, ["mozilla", "firefox"]); */ function openURI (uri) { if (window.content.document.location.href == 'about:blank') { window.loadURI(uri); } else { if ('delayedOpenTab' in window) window.delayedOpenTab(uri, null); else window.getBrowser().addTab(uri, null); } } function makeURI (uri) { return IOService.newURI(uri, null, null); } function addEntry (doc, tags) { var loc = doc.location.href; var title = doc.title || loc; var uri = makeURI(loc); var bkmk = bookmarks.insertBookmark(folderId, uri, bookmarks.DEFAULT_INDEX, title); tags.push(RCL_TAG); tagssvc.tagURI(uri, tags); return title; } function splitBySpaces (str) { return [it for each (it in str.split(/\s+/)) if (/\w/.test(it))]; } function RCL_Bookmarks (terms) { try { let query = history.getNewQuery(); query.setFolders([folderId], 1); let m; if (terms) { let ts = splitBySpaces(terms).map(function (it) { var re = new RegExp(migemo.getRegExp(it), 'i'); var f = function (it) re.exec(it); return {s: it, r: f}; }); m = function (it) ts.some(function (t) (it.URI.indexOf(t.s) >= 0 || it.title.indexOf(t.s) >= 0 || t.r(it.URI) || t.r(it.title)) ? true : false); } else { m = function () true; } let result = []; let qres = history.executeQueries([query], 1, history.getNewQueryOptions()); let folderNode = qres.root; let closeOriginally = !folderNode.containerOpen; if (closeOriginally) folderNode.containerOpen = true; for (let i = 0; i < folderNode.childCount; ++i) { let node = folderNode.getChild(i); if (PlacesUtils.nodeIsBookmark(node)) { let it = {id: node.itemId, title: node.title, URI: node.uri }; if (m(it)) result.push(it); } } if (closeOriginally) folderNode.containerOpen = false; return liberator.globalVariables.readcatlater_reverse ? result.reverse() : result; } catch (e) { liberator.log(e); } } function completer (context, arg) { context.title = ['URL', 'Title']; context.completions = RCL_Bookmarks(context.filter). filter(function (it) it.id). map(function (it) [it.URI, bookmarks.getItemTitle(it.id)]); } function removeItems (uri) { var removed = false; for each (let id in bookmarks.getBookmarkIdsForURI(makeURI(uri), {})) if (folderId == bookmarks.getFolderIdForItem(id)) { removed = true; bookmarks.removeItem(id); } return removed; } /******************************************************************************** * Add Command ********************************************************************************/ commands.addUserCommand( ['readcatlater', 'rcl'], 'read cat later', function (args) { var res = addEntry(window.content.document, splitBySpaces(args.string)); if (res) liberator.echo('"' + buffer.title + '" was added'); else liberator.echo("this URI already exists!?"); }, {}, true ); commands.addUserCommand( ['readcatnow', 'rcn'], 'read cat now', function (arg) { let opennum = arg['-number']; if (opennum) { liberator.log(typeof opennum) let us = RCL_Bookmarks(arg.literalArg).reverse().splice(0, opennum).map(function (it) it.URI); liberator.open(us, liberator.NEW_BACKGROUND_TAB); if (!arg.bang) { us.forEach(removeItems); liberator.echo('[' + us + '] was removed.'); } } else { let uri = arg.string; openURI(uri); if (!arg.bang && removeItems(uri)) liberator.echo('"' + uri + '" was removed.'); } }, { literal: 0, options: [ [['-number', '-n'], commands.OPTION_INT] ], completer: completer }, true ); commands.addUserCommand( ['deletecatnow', 'dcn'], 'delete cat now', function (arg) { let uri = arg.string; if (removeItems(uri)) liberator.echo('"' + uri + '" was removed.'); }, { completer: completer }, true ); liberator.log('readcatlater.js loaded'); })();