Table of Contents

概要

  • レア狐魂一覧CSV整形スクリプト に移行のため、更新終了。(2015-11-23)

  • 狐魂一覧ページから、狐魂名, URL, 勢力を読み取って Wiki テーブル化するブックマークレット。

  • Opera, Chrome, Firefox 対応。
  • 各狐魂の区切りは、Opera は改行コードだが、Chrome, Firefox は「[br]」になっているので、エディタで置換する必要あり。(2013-06-21 廃止)
  • prompt ではなく、別タブに出力するようにした。(2013-06-21)
  • CSV, PukiWikiテーブルを選択式にした。(2013-06-21)
  • CCPショップだけでなく、通常のショップにも対応。(2013-06-21)
  • グループ, レア度, アイコンURLもテーブルに追加。(2013-06-22)
  • HTMLテーブルとして出力するオプションを設定。(2013-07-08)

ソース

  • makeCCList.zip
    javascript: (function(){
    if ( ! location.host.match( /concon-collector.com/ ) ){
    	alert( 'コンコレサイトではありません' );
    	return;
    }
    
    var ccpShopUrl = 'http://concon-collector.com/ccpshop/exchange/';
    var nomarlShopUrl = 'http://concon-collector.com/shop/kokon/';
    var icon40Url = 'http://c2.concon-collector.com/img/pc/card40/';
    var icon60Url = 'http://c2.concon-collector.com/img/pc/card/';
    var icon200Url = 'http://c2.concon-collector.com/img/pc/card200/';
    
    /**
    	整形フラグ
    	0: CSV として整形する。
    	1: Puki Wiki用に整形する。
    	2: Table として表示
    */
    var formatType = 2;
    
    var fmt = [
    	{	/* CSV */
    		'init': '名前,勢力,グループ,レア度,URL,アイコン\n',
    		'row': function( name, power, group, rarity, url, icon ){
    			return name + ',' + power + ',' + group + ',' + rarity + ',' + url+ ',' + icon + '\n';
    		},
    		'finish': '',
    	},
    	{	/* Puki Wiki */
    		'init': '|~名前|~勢力|~グループ|~レア度|~アイコン|\n',
    		'row': function( name, power, group, rarity, url, icon ){
    			url = group != 'S' ?
    				ccpShopUrl + url :
    				nomarlShopUrl + url;
    			group = group != 'S' ?
    				'' + group + '' :
    				'ショップ';
    			return '|[[' + name + '>' + url + ']]|' 
    				+ 'CENTER:' + power + '|' 
    				+ 'CENTER:' + group + '|' 
    				+ 'CENTER:' + rarity + '|' 
    				+ '[[&ref(' + icon60Url + icon + ');>' + url + ']]|' 
    				+ '\n'; 
    		},
    		'finish': '',
    	},
    	{	/* Table */
    		'init': '<table border="1">\n<tr><th>名前</th><th>勢力</th><th>グループ</th><th>レア度</th><th>URL</th><th>アイコン</th></tr>\n',
    		'row': function( name, power, group, rarity, url, icon ){
    			return '<tr><th>' + name + '</th><td>' + power + '</td><td>' + group + '</td><td>' + rarity + '</td><td>' + url+ '</td><td>' + icon + '</td></tr>\n';
    		},
    		'finish': '</table>\n',
    	},
    ][ formatType ];
    
    location.pathname.match( /^\/(ccp)?shop\/kokon(list)?\/(\d+)\/?(\d+)?/ );
    var group = RegExp.$1 ?
    	RegExp.$3 :	/* 第xx弾 */
    	'S';		/* ショップ */
    var rarity = RegExp.$4 || 3;
    
    var param = {
    	true: {		/* CCP Shop */
    		'descPath': './tbody/tr/td[2]',
    		'descMatch': /(\S+)\s*勢力\s+(\S)/,
    		'ccUrl': function(tbl){ return getStringByXpath( './tbody/tr/td/a/@href', tbl ); }, 
    		'ccIcon': function(tbl){
    			return getStringByXpath( './/img[contains(@src, "/card/")]/@src', tbl ) ||
    				getStringByXpath( './/img[contains(@src, "/card40/")]/@src', tbl );
    		}, 
    	},
    	false: {	/* Normal Shop */ 
    		'descPath': './tbody/tr/td',
    		'descMatch': /(\S+)\s*Lv\..*勢力\s+(\S)/,
    		'ccUrl': function(tbl){ return location.href; },
    		'ccIcon': function(tbl){
    			return getStringByXpath( './/img[contains(@src, "/card/")]/@src', tbl ) ||
    				getStringByXpath( './/img[contains(@src, "/card40/")]/@src', tbl );
    		}, 
    	},
    }[ group != 'S' ];
    
    var result = fmt.init;
    var tables = document.getElementsByTagName('table');
    for( var i=0, tbl; tbl = tables[i]; ++i ){
    	var desc = getStringByXpath( param.descPath, tbl );
    	if ( desc.match( param.descMatch ) ){
    		result += fmt.row(
    			RegExp.$1, 
    			RegExp.$2, 
    			group, 
    			rarity, 
    			getLast( param.ccUrl( tbl ) ), 
    			getLast( param.ccIcon( tbl ) )
    		);
    	}
    }
    result += fmt.finish;
    
    var docNew = window.open().document;
    docNew.open('text/html; charset="UTF-8"').write(
    	formatType == 0 || formatType == 1 ?
    		htmlEscape(result).replace(/[\r\n]+/g, '<br>') :
    		result
    );
    docNew.close();
    
    /**
    	
    */
    function getLast(path) {
    	path.match( /([^\/]+)$/ );
    	return RegExp.$1;
    }
    
    /**
    	XPath で指定したイテレータを得る。
    */
    function getIteratorByXpath(xpath, context) {
    	return document.evaluate(xpath, context, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    }
    
    /**
    	XPath で指定した要素のテキスト値を得る。
    */
    function getStringByXpath(xpath, context) {
    	var sRet = "";
    	var nodeTmp = document.evaluate('string(' + xpath + ')', context, null, XPathResult.STRING_TYPE, null);
    	if (nodeTmp) {
    		sRet = nodeTmp.stringValue;
    	}
    	return sRet;
    }
    
    function htmlEscape(s) {
    	return s.replace(/[&<>"']/g, function(m){
    		return '&#x' + m.charCodeAt(0).toString(16) + ';'
    	});
    }
    
    })();
    
    // EOF