// ==UserScript== // @name ハースストーン海外サイト日本語カード化 // @namespace hearthstonejapaneseconverter // @description 海外のハースストーンサイトのカード名を英語から日本語にします // @version 1.0 // @include http://www.hearthpwn.com/* // @include http://www.icy-veins.com/* // @include http://www.hearthstonetopdeck.com/* // @include http://www.hearthstonetopdecks.com/* // @include http://www.liquidhearth.com/* // @include http://www.heartharena.com/* // @include http://www.arenavalue.com/class/* // @include https://docs.google.com/spreadsheets/d/1PM8jptHcItFM_3BNDbtzeea4Yc_vF87R8EECa0kdASU* // @include https://docs.google.com/spreadsheet/pub?key=0AsKyuF-D-OHadEJQYjlPbzByclBXZUNZcE1PcXdydXc* // @include https://docs.google.com/spreadsheets/d/1BZp5ASUI5GJLNBDW0EhHCjmQlk3ZGjBpRaQ5Rax1WHs/* // @include https://tempostorm.com/hearthstone/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @require https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=19641 // @grant none // @downloadURL none // ==/UserScript== var HRSJPC = HRSJPC || { }; HRSJPC.alst = { 'hearthpwn.com': [ 'body', { path: 'cards/', getnodes: { tag: 'h2' } }, { path: 'decks', getnodes: { tag: 'option' },special:function(rt){ var d1 = document.getElementById("filter-contains-card"); var d2 = document.getElementById("finlter-not-contains-card"); var drot = [d1,d2]; ; drot.forEach(function(el,i,arra){ ; HRSJPC.gm.sortSelect(el); }); } }, { path: 'decks', special: function (rt) { var d = document.getElementById('dynamic-filters'); var m = d.nextElementSibling; var list = HRSJPC.gm.olist(); var tm = m.innerHTML; for (var l in list) { tm = tm.replace(new RegExp(l, 'ig'), list[l]); } m.innerHTML = tm; window.eval(tm); } } ], 'www.icy-veins.com': 'body', 'hearthstonetopdecks.com': [ { root: '#main', getnodes: { class: 'card-name' } }, { path: 'cards/', root: '#main', getnodes: { class: 'entry-title' } }, { path: 'card-category/', root: '#main', getnodes: { tag: 'h2' } }, '#main' ], 'www.hearthstonetopdeck.com': { path: 'deck/', getnodes: { class: 'cardname' }, regex: /^\d\s(.+)$/ }, 'www.liquidhearth.com': 'body', 'tempostorm.com/hearthstone': [ { path: /decks|meta-snapshot|deck-builder/, special: function (rt) { waitForKeyElements('.tech-card-body', single); waitForKeyElements('.db-deck-card-name', single); waitForKeyElements('div.list-card', single); waitForKeyElements('.deck-list', roop2); var target = rt.querySelector('.deck-list'); if(!target){ return; } var observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (mutation.type == 'childList') { ; roop2(mutation.target); } }); }); var config = { childList: true } observer.observe(target, config); function roop2(tobj) { HRSJPC.gm.link(HRSJPC.gm.hcards, tobj, { getnodes: { 'class': 'list-card' } }); } function single(tobj) { for (var i = 0; i < tobj.length; i++) { var txnode = HRSJPC.gm.textnodeextract(tobj[i]); if (!txnode) { continue; } var tx = txnode.nodeValue.trim(); ; var m = HRSJPC.gm.wordmatch(HRSJPC.gm.hcards,tx); if (m) { txnode.nodeValue = m; } } } } } ], 'www.heartharena.com': { root: 'body#tier-list', getnodes: { tag: 'dt' } }, 'www.arenavalue.com': [ { root: '#home > div:nth-child(1) > div:nth-child(1)', getnodes: { tag: 'option' },special:function(rt){ var sec = rt.getElementsByTagName("select"); for(var i = 0 ;i= 0) { ; this.googlelink(); return; } /* if(document.URL.indexOf("docs.google.com")>= 0){ var ct = GM_getValue("hearthstone",0); ; if(ct === 0){ GM_deleteValue("hearthstone"); return; }else{ GM_setValue("hearthstone",--ct); } ; googlelink(); return; } if(document.URL.indexOf("www.liquidhearth.com/guides/arena-tier-list") >= 0){ var f = document.getElementsByTagName("iframe"); ct = 0; for(var i = 0;i=0)){ ct ++; } } GM_setValue("hearthstone",ct); } */ var fnc = function (obj) { var robj = document.querySelector(obj.root); console.log('hearth fnc root:' + obj.root + ' getnodes ' + (function(){for(var i in obj.getnodes){return i + " " + obj.getnodes[i];}})() + ' url :' + document.URL); if (robj) { if(obj.getnodes) { var tcd; if(obj.pwords){ tcd = HRSJPC.gm.pwords; }else{ tcd = HRSJPC.gm.hcards; } HRSJPC.gm.link(tcd, robj, obj.getnodes, obj.regex); ; } if(obj.special){ ; obj.special(robj); } } else { ; } } function foreachones(element, index, array) { if (typeof element == 'string') { //string var em = { }; em.root = element; em.getnodes = { tag: 'a' }; element = em; } else { if (!('root' in element)) { element.root = 'body'; } if ('special' in element) { element.special = element.special.bind(element); } if (element.path) { var skip = false; if (typeof element.path == 'string') { skip = window.location.pathname.indexOf(element.path) >= 0; } else if (typeof element.path == 'object') { skip = window.location.pathname.match(element.path) ? true : false; } if (!skip) { ; return; } } } if (window.top != window.self && !element.inner) { ; return; } if (element.delay) { ; var ov = function (e) { if (document.readyState == 'complete') { ; fnc(element); } }; document.addEventListener('readystatechange', ov, false); //document.onreadystatechange = ov; } else { fnc(element); } } var u; var url = document.URL; function hr() { for (var al in HRSJPC.alst) { if (url.indexOf(al) >= 0) { u = HRSJPC.alst[al]; ; if (!Array.isArray(u)) { u = [ u ]; } u.forEach(foreachones); break; } } //for end } hr(); console.timeEnd('hearth'); }, link: function (list, root, getnodes, regex, strict) { var docs; if (typeof getnodes == 'function') { docs = getnodes(root); } else if (typeof getnodes == 'object') { if ('tag' in getnodes) { docs = root.getElementsByTagName(getnodes.tag); } else if ('class' in getnodes) { docs = root.getElementsByClassName(getnodes.class); }else{ ; } } else { //singleモード docs = [ root ]; return; } if (docs.length === 0) { return; } ; var regf = regex ? true : false; var tx, bn, m, rga; for (var i = 0; i < docs.length; i++) { tx = this.textnodeextract(docs[i]); if (tx) { if(regf) { rga = regex.exec(tx.extracttext); //; bn = rga[1]; if (!bn) { ; return; } }else { bn = tx.extracttext; //; } ; m = this.wordmatch(list,bn,!strict); ; if (m) { if (!regf) { tx.nodeValue = m; } else { tx.nodeValue = tx.nodeValue.replace(bn, m); } } } } }, googlelink: function () { var rg = /([^*‡†]+)/; this.link(this.hcards, document, { tag: 'td' }, rg,true); }, trim: function (c) { return c.replace(/^\s+|\s+$/g, ''); }, wordmatch: function (list,target,loose) { if(loose){ var re = /[:\s’\'-]/g; var rm; target = target.toLowerCase().replace(re,""); for(var r in list){ rm = r.toLowerCase().replace(re,""); if(rm === target){ return list[r]; } } }else{ return list[target.replace('’', '\'').replace(': ', ':')]; } }, textnodeextract: function (dt) { if (!dt.hasChildNodes) { return; } for (var j = 0; j < dt.childNodes.length; j++) { var nd = dt.childNodes[j]; if (nd.nodeType === 3) { var f = this.trim(nd.nodeValue); dt.childNodes[j].extracttext = f; if (f.length > 2 && f.length < 50) { return dt.childNodes[j]; } } else if (nd.nodeType === 1 && nd.hasChildNodes) { var r = this.textnodeextract(nd); if (r) { return r; } } } },sortSelect:function(selElem){ var tmpAry = new Array(); for (var i=0;i 0) { selElem.options[0] = null; } for (var i=0;i