マジック:ザ・ギャザリング公式サイトからカードリストのJSONを取得するグリモンスクリプト

個人的に需要がある「かもしれない」からグリモンスクリプト書いた。
jQueryjavascriptも専門外なので、ソースが酷いのはご容赦ください。。

// ==UserScript==
// @name           mtg-cardlist
// @namespace      http://yosiopp.net/
// @description    getting card list by JSON
// @include        http://mtg-jp.com/cardlist/list/*
// ==/UserScript==

// main process
function main($){
  function lp(o){
    var n = true;
    var s = "{";
    for(var k in o){
      if(!n) s += ',';
      if(k == null){
        s += "\"" + k + "\": null";
      }
      else if(Object.prototype.toString.call(o[k]) === "[object Object]"){
        var t = lp(o[k]);
        s += "\"" + k + "\":";
        s += t;
      }
      else{
        s += "\"" + k + "\":\"" + o[k] + "\"";
      }
      n = false;
    }
    s += "}";
    return s;
  }
  function toJsonString(a){
    var i;
    var m = true;
    var s = "[";
    for(i=0; i < a.length; i++){
      var o = a[i];
      if(!m) s += ',';
      s += lp(o);
      m = false;
    }
    s += "]";
    return s;
  };
  function getJson(){
    var trs = $('.container .content .inner tbody').children();
    var arry = new Array(trs.length/3-1);
    var i,j=0;
    for(i = 3; i < trs.length; i++){
      if(i%3==0){
        // name 
        var t1 = $(trs[i].children[1]).find("a.cardlink");
        var ja = t1.text();
        ja = ja.substring(1, ja.length-1);
        var rb = t1.next().text();
        var en = t1.next().attr("name").replace(/_s\+/g,"'s ").replace(/_/g,",").replace(/\+/g," ");
        arry[j] = {
          "name":{
            "ja": ""+ja,
            "en": ""+en,
            "rb": ""+rb
          }
        }
        // image
        arry[j]["image"] = $(trs[i].children[0]).find("img").attr("src");
      }
      else if(i%3==1){
        // type
        arry[j]["type"] = $(trs[i].children[0]).text();

        // cost
        var t2 = $(trs[i].children[1]);
        if(t2.find("img") && 0 < t2.find("img").length){
          t2.find("img").each(function(){$(this).after("<span class=\"tmp\">" + $(this).attr("alt") + "</span>");});
          arry[j]["cost"] = t2.text();
          t2.find("span.tmp").remove();
        }
        
        // p/t
        if(trs[i].children.length == 3){
          var pt = $(trs[i].children[2]).text();
          arry[j]["pt"] = (pt && 0 < pt.length) ? pt : null;
        }
        else{
          arry[j]["pt"] = null;
        }
      }
      else{
        // text
        var t3 = $(trs[i].children[0]);
        if(t3.find("img") && 0 < t3.find("img").length){
          t3.find("img").each(function(){$(this).after("<span class=\"tmp\">" + $(this).attr("alt") + "</span>");});
          arry[j]["text"] = t3.text();
          t3.find("span.tmp").remove();
        }
        else{
          arry[j]["text"] = t3.text();
        }
        j += 1;
      }
    }
    var s = toJsonString(arry);
    $("body").html(s).css({"background-color":"#fff","font-size":"120%"});
  }
  
  $('.container .content h2').after("<div id=\"ins_cardlist\"><input type=\"button\" id=\"get_json\" value=\"GET JSON\" /></div>");
  $('#ins_cardlist').css({"text-align":"right","margin-right":"20px"});
  $("#get_json").click(getJson);
}

(function(d, func) {
  var check = function() {
    if (typeof unsafeWindow.jQuery == 'undefined') return false;
      func(unsafeWindow.jQuery); return true;
    }
    if (check()) return;
    var s = d.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js';
    d.getElementsByTagName('head')[0].appendChild(s);
    (function() {
      if (check()) return;
      setTimeout(arguments.callee, 100);
    })();
  })(document, function($) {
  main($);
});

たとえばエルドラージ覚醒|カードギャラリー|マジック:ザ・ギャザリング 日本公式ウェブサイトにアクセスし、ロードが完了すると、
画面に「GET JSON」って書かれたボタンが表示されます。
ボタンを押すと、bodyの中身を全部消して代わりにJSONを表示する、という仕組み。
なんというか、いろいろ手抜きですみません。。。

jsonの構造は、こんなカンジ。

[
  {
    "name":{
      "ja":"",  // 日本語カード名
      "en":"",  // 英語カード名
      "rb":""   // 日本語カード名ひらがな
    },
    "type":"",  // カードタイプ − サブタイプ
    "image":"", // 画像URI
    "cost":"",  // マナ・コスト。例){1}{W}{W}
    "pt":"",    // P/T(存在しない場合、null)
    "text":""   // カードテキスト。一部の起動コストは{T}のように記載
  },
]

http://yosiopp.net/js/mtg-cardlist.user.js
不具合などあったら教えてくれると嬉しいです><;