// ==UserScript==
// @id ChineseMarketStall@UncleKang
// @name [wod]小市场(团商利器)Ver 1.2
// @description 面向团商,康叔对Tomy的MarketStall做了修改,使之支持中文。作用是分类整理物品,并形成论坛BBCode
// @namespace UncleKang
// @version 1.2
// @include http://*.world-of-dungeons.*/wod/spiel/hero//csvexport.php*
// @include http://*.world-of-dungeons.*/wod/spiel/hero/items.php*
// ==/UserScript==
(function() {
//-----------------------------------------------------------------------------
// auxiliary functions
//-----------------------------------------------------------------------------
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
Array.prototype.contains = function (element) {
for (var i = 0; i < this.length; i++) {
if (this[i] == element) {
return true;
}
}
return false;
}
// Usage: dump(object)
function dump(object, pad){
var indent = '\t';
if (!pad) pad = '';
var out = '';
if (object == undefined) {
out += "undefined";
} else if (object.constructor == Array) {
out += '[\n';
for (var i = 0; i < object.length; ++i) {
out += pad + indent + '[' + i + '] = ' + dump(object[i], pad + indent) + '\n';
}
out += pad + ']';
} else if (object.constructor == Object || typeof object == 'object') {
out += '{\n';
for (var i in object) {
if (typeof object[i] != 'function')
out += pad + indent + i + ': ' + dump(object[i], pad + indent) + '\n';
}
out += pad + '}';
} else {
out += object;
}
return out;
}
function DebugMsg(Data)
{
if (DEBUG)
alert(dump(Data));
}
//-----------------------------------------------------------------------------
// "global" variables
//-----------------------------------------------------------------------------
var DEBUG = true;
var VER = "1.2";
var TempWeaponType;
var ConsumablesType;
var globalVars = {
"en" : {
titleConsumable: "Consumables"
, titleTreasury: "Treasury"
, linkMarket: "market"
, copyright: "Created with Market Stall"
, order: [
"head", "face", "ears", "neck", "torso", "cloak",
"gloves", "arms", "legs", "feet", "ring",
"right hand", "left hand", "both hands", "either hand",
"belt", "pocket", "medal", "unequipable"
]
}
, "cn" : {
titleConsumable: "消耗品"
, titleTreasury: "装备"
, linkMarket: "市场"
, copyright: "由康叔小卖部工具生成,祝快乐生活每一天!"
, order: [
"头", "眼镜", "耳", "颈", "身体", "披风", "肩膀",
"手", "臂", "腿", "脚", "戒指",
"右手", "左手", "双手", "单手",
"腰带", "口袋", "勋章", "不可装备", "不可装备物品"
]
}
, "fr" : {
titleConsumable: "Consommables"
, titleTreasury: "Trésors"
, linkMarket: "marché"
, copyright: "Créé avec Market Stall"
, order: [
"tete", "visage", "oreilles", "cou", "torse", "cape",
"gants", "bras", "jambes", "pied", "anneau",
"main droite", "main gauche", "les deux mains", "d'une main",
"ceinture", "sac", "décoration", "Non équipable"
]
}
, "de" : {
titleConsumable: "Verbrauchsmaterial"
, titleTreasury: "Treasury"
, linkMarket: "markt"
, copyright: "Erstellt mit Market Stall"
, order: [
"Kopf", "Ohren", "Brille", "Halskette", "Torso", "Gürtel",
"Umhang", "Schultern", "Arme", "Handschuhe", "Beide Hände",
"Waffenhand", "Schildhand", "Einhändig", "Beine", "Füße",
"Orden", "Tasche", "Ring", "Nicht tragbar"
]
}
, "it" : {
titleConsumable: "Materiale di consumo"
, titleTreasury: "Tesoro"
, linkMarket: "mercato"
, copyright: "Creato con Market Stall"
, order: [
"testa", "orecchie", "viso", "collo", "torace", "cinta", "mantello",
"braccia", "guanti", "due mani", "mano destra", "mano sinistra",
"una mano", "gambe", "piedi", "medaglie", "tasche", "anelli",
"non equipaggiabile"
]
}
, "es" : {
titleConsumable: "Materiales consumibles"
, titleTreasury: "Tesoro"
, linkMarket: "mercado"
, copyright: "Creado con el Market Stall"
, order: [
"Cabeza", "Rostro", "Oídos", "Collar", "Torso", "Capa", "Guantes",
"Brazos", "Piernas", "Pies", "Companero", "Anillo", "Mano derecha",
"Mano izquierda", "Las dos manos", "Izqu. o derecha", "Condecoración",
"Cinturón", "Bolso", "No equipable"
]
}
, "pl" : {
titleConsumable: "Materialy eksploatacyjne"
, titleTreasury: "Skarbu"
, linkMarket: "rynek"
, copyright: "Stworzony z Market Stall"
, order: [
"head", "face", "ears", "neck", "torso", "cloak",
"gloves", "arms", "legs", "feet", "ring",
"right hand", "left hand", "both hands", "either hand",
"belt", "pocket", "medal", "unequipable"
]
}
, "hr" : {
titleConsumable: "Potrosni materijal"
, titleTreasury: "Trezor"
, linkMarket: "pijaca"
, copyright: "Napravljeno sa Market Stall-om"
, order: [
"Glava", "Uši", "Naočale", "Lančić", "Torzo", "Pojas",
"Ogrtač", "Ruke", "Rukavice", "Obje ruke", "Ruka za oružje",
"Ruka za štit", "Jednoruk", "Noge", "Stopala", "Medalja", "Torba",
"Prsten", "Ne može se nositi"
]
}
};
// init local vars
var localVars = globalVars["en"];
//-----------------------------------------------------------------------------
// "initialization" functions
//-----------------------------------------------------------------------------
function Main()
{
if (/\/wod\/spiel\/hero\/\/csvexport.php?.*&is_tomy=1/.test(document.URL)) {
var match = new RegExp("&tomy_lang=([^&]+)", "g").exec(document.URL);
localVars = globalVars[match ? match[1] : "en"];
// alert(JSON.stringify(localVars));
var Pre = document.body.removeChild(document.body.firstChild);
var items = ParseTreasure( Pre.innerHTML );
var newPre = document.createElement("pre");
newPre.innerHTML = ConvertToBB(items);
document.body.appendChild(newPre);
} else if (/\/wod\/spiel\/hero\/items.php/.test(document.URL)) {
var meta = document.querySelector("meta[http-equiv='Content-Language']");
var lang = meta ? meta.getAttribute("content") : "en";
if (!globalVars.hasOwnProperty(lang)) lang = "en";
localVars = globalVars[lang];
// alert(JSON.stringify(localVars));
var allA = document.getElementsByTagName("a");
for (var i = 0; i < allA.length; ++i) {
var link = allA[i];
if (link.textContent.trim() == "csv" && /csvexport.php/.test(link.getAttribute("href")) ) {
var newA = document.createElement("a");
if ( link.hasAttribute("onclick") ){
newA.setAttribute("onclick", link.getAttribute("onclick").replace("&IS_POPUP=1", "&IS_POPUP=1&is_tomy=1&tomy_lang=" + lang));
};
newA.setAttribute("href", link.getAttribute("href").replace("&IS_POPUP=1", "&IS_POPUP=1&is_tomy=1&tomy_lang=" + lang));
newA.setAttribute("target", link.getAttribute("target"));
newA.innerHTML = localVars.linkMarket;
link.parentNode.appendChild(newA);
}
}
}
}
//-----------------------------------------------------------------------------
// "functionality" functions
//-----------------------------------------------------------------------------
function ParseTreasure(text)
{
var ret = new Object();
ret.Treasury = new Object();
ret.Consumables = new Object();
var lines = text.split("\n");
for (var i = 1; i < lines.length; ++i) {
var data = lines[i].split(";");
if (data.length < 8) continue;
for (var j = 0; j < data.length; ++j) {
data[j] = data[j].substring(1, data[j].length - 1);
}
var tmpData = {Name:data[0], Count:parseInt(data[1]),ClassType:((data[5].split(","))[0]),FullClassType:data[5], Unique:data[6], Grafting:""};
// var tmpData = {Name:data[0], Count:parseInt(data[1]),ClassType:data[5], Unique:data[6], Grafting:""};
if (data.length > 9) tmpData.Grafting = data[9];
var ccount = data[2];
var place = data[4];
if (ccount.length > 0) {
// consumables
if (!ret.Consumables.hasOwnProperty(place)) ret.Consumables[place] = new Array();
var count = ccount.split("/");
tmpData.MaxCCount = parseInt(count[1]);
tmpData.CCount = parseInt(count[0]) * tmpData.Count;
var found = false;
for (var j = 0; j < ret.Consumables[place].length; ++j) {
if (tmpData.Name == ret.Consumables[place][j].Name && tmpData.MaxCCount == ret.Consumables[place][j].MaxCCount && tmpData.Grafting == ret.Consumables[place][j].Grafting) {
ret.Consumables[place][j].Count += tmpData.Count;
ret.Consumables[place][j].CCount += tmpData.CCount;
found = true;
break;
}
}
if (!found) {
ret.Consumables[place].push(tmpData);
}
} else {
// treasury
if (!ret.Treasury.hasOwnProperty(place)) ret.Treasury[place] = new Array();
var hitpoints = data[3].split("/");
if (hitpoints.length < 2) {
tmpData.MaxHitpoints = undefined;
tmpData.Hitpoints = undefined;
} else {
tmpData.MaxHitpoints = parseInt(hitpoints[1]);
tmpData.Hitpoints = parseInt(hitpoints[0]);
}
var found = false;
for (var j = 0; j < ret.Treasury[place].length; ++j) {
if (tmpData.Name == ret.Treasury[place][j].Name && tmpData.Hitpoints == ret.Treasury[place][j].Hitpoints && tmpData.MaxHitpoints == ret.Treasury[place][j].MaxHitpoints && tmpData.Grafting == ret.Treasury[place][j].Grafting) {
ret.Treasury[place][j].Count += tmpData.Count;
found = true;
break;
}
}
if (!found) {
ret.Treasury[place].push(tmpData);
}
}
}
return ret;
}
function ConvertToBB(items)
{
var lastSize = 0;
var totalRet = "\r\n[size=20]" + localVars.titleTreasury + "[/size]" + "\r\n[url=http://userscripts.org/scripts/show/105123][size=9]" + localVars.copyright + " v" + VER + "[/size][/url]\r\n";
for (var k = 0; k < localVars.order.length; ++k) {
var ret = "";
var i = localVars.order[k];
if (!items.Treasury.hasOwnProperty(i)) continue;
var count = 0;
for (var j = 0; j < items.Treasury[i].length; ++j)
count += items.Treasury[i][j].Count;
ret += "\r\n\r\n[size=15][color=orange][b]" + i + "[/b][/color][/size] -> [i]" + count + "[/i]";
//if(i=="右手")
TempWeaponType=new Array();
for(var j=0;j< items.Treasury[i].length; ++j)
{
if(!TempWeaponType.contains(items.Treasury[i][j].ClassType))
{
TempWeaponType.push(items.Treasury[i][j].ClassType);
}
}
for(var lhy=0;lhy< TempWeaponType.length; ++lhy)
{
ret += "\r\n\t[size=12][color=palegreen][b]"+TempWeaponType[lhy]+"[/b][/color][/size]";
ret +="\r\n[table border=1]\r\n\t";
for(var j=0;j<items.Treasury[i].length; ++j)
{
if(items.Treasury[i][j].ClassType==TempWeaponType[lhy])
{
ret +="[tr]"
+ "[td]"
+ items.Treasury[i][j].Count +"x "
+ "[item: " + items.Treasury[i][j].Name + "] ";
if (items.Treasury[i][j].Grafting.length > 0) {
for (var l = 0; l < items.Treasury[i][j].Grafting.length; ++l)
ret += ":g" + items.Treasury[i][j].Grafting[l] + ":";
ret += " ";
}
ret +="[/td][td]";
ret += (items.Treasury[i][j].Unique.length > 0 ? "[color=lime]" + items.Treasury[i][j].Unique + "[/color] " : "");
ret +="[/td][td]";
// ret += (items.Treasury[i][j].MaxHitpoints != items.Treasury[i][j].Hitpoints ? "[color=tomato](" + items.Treasury[i][j].Hitpoints + "/" + items.Treasury[i][j].MaxHitpoints + ")[/color] " : "");
ret +="[color=tomato](" + items.Treasury[i][j].Hitpoints + "/" + items.Treasury[i][j].MaxHitpoints + ")[/color] "
ret +="[/td][td]";
ret +="[color=gold]"+items.Treasury[i][j].FullClassType+"[/color]";
ret +="[/td]";
ret +="[/tr]";
}
}
ret +="\r\n[/table]";
}
if (lastSize + ret.length > 65000) {
totalRet += "\r\n\r\n====================================================================================================\r\n" + "\r\n[url=http://userscripts.org/scripts/show/105123][size=9]" + localVars.copyright + " v" + VER + "[/size][/url]";
totalRet += ret;
lastSize = ret.length;
} else {
totalRet += ret;
lastSize += ret.length;
}
}
totalRet += "\r\n\r\n====================================================================================================\r\n";
var lastSize = 0;
totalRet += "\r\n\r\n\r\n\r\n[size=20]" + localVars.titleConsumable + "[/size]" + "\r\n[url=http://userscripts.org/scripts/show/105123][size=9]" + localVars.copyright + " v" + VER + "[/size][/url]\r\n";
for (var k = 0; k < localVars.order.length; ++k) {
var ret = "";
var i = localVars.order[k];
if (!items.Consumables.hasOwnProperty(i)) continue;
var count = 0;
for (var j = 0; j < items.Consumables[i].length; ++j)
count += items.Consumables[i][j].Count;
ret += "\r\n\r\n[size=15][color=orange][b]" + i + "[/b][/color][/size] -> [i]" + count + "[/i]";
if(true)
{
ConsumablesType=new Array();
for(var j=0;j< items.Consumables[i].length; ++j)
{
if(!ConsumablesType.contains(items.Consumables[i][j].FullClassType))
{
ConsumablesType.push(items.Consumables[i][j].FullClassType);
}
}
for(var lhy=0;lhy< ConsumablesType.length; ++lhy)
{
ret += "\r\n\t[size=12][color=palegreen][b]"+ConsumablesType[lhy]+"[/b][/color][/size]";
ret +="\r\n[table border=1]\r\n\t";
for(var j=0;j<items.Consumables[i].length; ++j)
{
if(items.Consumables[i][j].FullClassType==ConsumablesType[lhy])
{
ret +="[tr][td]"
+ "\r\n\t"
+ items.Consumables[i][j].Count +"x "
+ "[item: " + items.Consumables[i][j].Name + "] "
if (items.Consumables[i][j].Grafting.length > 0) {
for (var l = 0; l < items.Consumables[i][j].Grafting.length; ++l)
ret += ":g" + items.Consumables[i][j].Grafting[l] + ":";
ret += " ";
}
ret +="[/td][td]";
ret += "[color=tomato](" + items.Consumables[i][j].CCount + "/" + items.Consumables[i][j].Count * items.Consumables[i][j].MaxCCount + "/~" + Math.floor(items.Consumables[i][j].CCount / items.Consumables[i][j].Count) + ")[/color]";
ret +="[/td][/tr]"
}
}
ret +="\r\n[/table]";
}
}
if (lastSize + ret.length > 65000) {
totalRet += "\r\n\r\n====================================================================================================\r\n" + "\r\n[url=http://userscripts.org/scripts/show/93164][size=9]" + localVars.copyright + " v" + VER + "[/size][/url]";
totalRet += ret;
lastSize = ret.length;
} else {
totalRet += ret;
lastSize += ret.length;
}
}
return totalRet;
}
//-----------------------------------------------------------------------------
// "main"
//-----------------------------------------------------------------------------
try {Main();} catch(e) {alert("Main(): " + e);}
})();