レア狐魂一覧CSV整形スクリプト に移行のため、更新終了。(2015-11-23)
狐魂一覧ページから、狐魂名, URL, 勢力を読み取って Wiki テーブル化するブックマークレット。
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