はてなハイクからアメーバなうに投稿

  • /*
     * @title はてなハイクからアメーバなうに投稿
     * @description はてなハイクの各投稿にアメーバなうに投稿するためのボタンを付けます。
     * @license MIT License
     */
    
    
    Hatena.Haiku.Pager.addEventListener('loadedEntries', addButtonsToFragment);
    addButtonsToFragment(document.body);
    void(0);
    
    function addButtonsToFragment (root) {
      var aStarURLs = Ten.DOM.getElementsByClassName('star-url', root);
      for (var i = 0; i < aStarURLs.length; i++) {
        var aStarURL = aStarURLs[i];
        appendButton(aStarURL);
      }
    }
    
    function appendButton (aStarURL) {
      var starURL = aStarURL.href;
      var m = starURL.match(/(\d+)/);
      var eid = m[1];
      if (!eid) return;
    
      var iContainer = aStarURL;
      var bContainer = null;
      while (iContainer.parentNode && iContainer.parentNode.nodeType == 1) {
        iContainer = iContainer.parentNode;
        if (iContainer.className.match(/\b(?:list-body|entry)\b/)) {
          break;
        } else if (iContainer.className.match(/\binfo\b/)) {
          bContainer = iContainer;
        }
      }
      bContainer = bContainer || iContainer;
    
      var img = document.createElement('img');
      img.src = 'http://stat001.ameba.jp/user_images/20100525/10/now-api/3c/22/p/o0079005110557906632.png';
      img.style.height = '16px';
      img.style.cursor = 'pointer';
      img.style.verticalAlign = 'bottom';
      img.onclick = function () {
        var apiURL = '/api/statuses/show/' + m[1] + '.json?body_formats=api';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', apiURL, true);
        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4) {
            if (xhr.status < 400) {
              var json = JSON.parse(xhr.responseText);
              processJSON(json, iContainer);
              img.parentNode.removeChild(img);
            }
          }
        };
        xhr.send(null);
      };
      bContainer.appendChild(img);
    
      if (iContainer.hatenaHaikuNowButton && iContainer.hatenaHaikuNowButton.parentNode) {
        iContainer.hatenaHaikuNowButton.parentNode.removeChild(iContainer.hatenaHaikuNowButton);
      }
      iContainer.hatenaHaikuNowButton = img;
    }
    
    function processJSON (json, iContainer) {
      var body = json.text;
      var target = json.target.title;
      if (body.substring(0, json.target.word.length + 1) == json.target.word + '=') {
        body = body.substring(json.target.word.length + 1);
      }
      if (/^id:[0-9A-Za-z_@-]+$/.test(json.target.word)) {
        target = null;
      }
      var url = json.link;
    
      var nowText = (target ? '[' + target + '] ' : '') + body + ' ' + url;
      if (window.Hatena && Hatena.Visitor && Hatena.Visitor.name == json.user.screen_name) {
        //
      } else {
        nowText = 'RH id:' + json.user.screen_name + ' ' + nowText;
      }
    
      var url = 'http://now.ameba.jp/?entryText=' + encodeURIComponent(nowText);
      var iframe = document.createElement('iframe');
      iframe.src = url;
      iframe.style.width = '100%';
      iframe.style.height = '8em';
      iframe.style.border = '1px solid #EEEEEE';
      iframe.style.borderStyle = 'solid none';
      iContainer.appendChild(iframe);
    }
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2011/03/24 12:19:11 - 2011-03-24