From 7a4d9072df7f7f71bc96fbab33a60cca780738ae Mon Sep 17 00:00:00 2001 From: quenousimporte Date: Wed, 19 Mar 2025 15:49:19 +0100 Subject: [PATCH] refactor --- jrpg.ts | 294 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 147 insertions(+), 147 deletions(-) diff --git a/jrpg.ts b/jrpg.ts index 9ee85f2..b99535f 100644 --- a/jrpg.ts +++ b/jrpg.ts @@ -1,147 +1,147 @@ -// deno -import { DOMParser } from 'https://deno.land/x/deno_dom/deno-dom-wasm.ts' - -function getdompareser(html) -{ - const parser = new DOMParser() - return parser.parseFromString(html, "text/html") -} - -function gettables(doc) -{ - return [...doc.getElementsByTagName("h2")].map(h2 => h2.id) -} - -function gettable(doc, table, notes) -{ - const result = [] - const items = [...doc.getElementById(table).nextSibling.nextSibling.nextSibling.firstChild.children[0].children] - const header = [...items.shift().children].map(h => h.textContent) - items.forEach(elt => { - const item = {} - const columns = [...elt.children] - header.forEach( (h,i) => - { - item[h] = columns[i].textContent - }) - if (item.Name) - { - const sup = parseInt(item.Name.split(" ").pop()) - if (!isNaN(sup)) - { - item.Notes = notes[sup - 1] - item.Name = item.Name.substr(0, item.Name.length - 2) - } - } - result.push(item) - }) - return result -} - -function getnotes(doc) -{ - const lastsup = [...doc.getElementsByTagName("sup")].pop() - if (!lastsup) - { - return [] - } - return lastsup.parentElement.textContent.split("\n") - .filter(i => i.length) - .map(i => i.substr(3).trim()) -} - -async function getpage(url) -{ - const result = {} - const response = await fetch(url) - const html = await response.text() - - const doc = getdompareser(html) - const notes = getnotes(doc) - const tables = gettables(doc) - tables.forEach(table => - { - result[table] = gettable(doc, table, notes) - }) - return result -} - -function format(equipment, exclude) -{ - const result = [] - - Object.keys(equipment).forEach(table => { - const columnsizes = {} - result.push(table.toUpperCase()) - const items = equipment[table] - - // exclude - items.forEach(item => { - exclude.forEach(name => { - delete item[name] - }) - }) - - // init sizes - items.forEach(item => - { - Object.keys(item).forEach(columnname => { - columnsizes[columnname] = columnsizes[columnname] || columnname.length - columnsizes[columnname] = Math.max(columnsizes[columnname], (item[columnname] || "").length) - }) - }) - - // write header - let line = "" - Object.keys(columnsizes).forEach(columnname => { - const size = columnsizes[columnname] - line += columnname + " ".repeat((Math.max(0, size - columnname.length))) + "|" - }) - result.push(line) - - // write lines - items.forEach(item => { - let line = "" - Object.keys(columnsizes).forEach(columnname => { - const size = columnsizes[columnname] - const value = (item[columnname] || "").replace("\n", " ") - line += value + " ".repeat(Math.max(0, size - value.length)) + "|" - }) - result.push(line) - }) - result.push(" ") - }) - - return result.join("\n") -} - -async function getdata(configname) -{ - const pages = configs[configname].pages - let result = {} - const root = "https://mikesrpgcenter.com" - for (const index in pages) - { - const page = pages[index] - const pagedata = await getpage([root, configname, page].join("/") + ".html") - result = {...result, ...pagedata} - } - return result -} - -function output(stringresult, configname) -{ - //console.log(stringresult) - Deno.writeTextFile(configname + ".txt", stringresult) -} - -const configs = { - ffantasy: { pages: ["weapons", "armor", "blackmagic", "whitemagic"], exclude: ["Found", "Sold", "Available", "Notes", "Cost", "Ni", "WM", "WW", "BM", "BW", "Th", "BB", "Ma"] }, - dw3: { pages: ["armor", "weapons"], exclude: [] }, -} - -for (const configname in configs) { - const data = await getdata(configname) - const stringresult = format(data, configs[configname].exclude) - output(stringresult, configname) -} +// deno +import { DOMParser } from 'https://deno.land/x/deno_dom/deno-dom-wasm.ts' + +function getdompareser(html) +{ + const parser = new DOMParser() + return parser.parseFromString(html, "text/html") +} + +function gettables(doc) +{ + return [...doc.getElementsByTagName("h2")].map(h2 => h2.id) +} + +function gettable(doc, table, notes) +{ + const result = [] + const items = [...doc.getElementById(table).nextSibling.nextSibling.nextSibling.firstChild.children[0].children] + const header = [...items.shift().children].map(h => h.textContent) + items.forEach(elt => { + const item = {} + const columns = [...elt.children] + header.forEach( (h,i) => + { + item[h] = columns[i].textContent + }) + if (item.Name) + { + const sup = parseInt(item.Name.split(" ").pop()) + if (!isNaN(sup)) + { + item.Notes = notes[sup - 1] + item.Name = item.Name.substr(0, item.Name.length - 2) + } + } + result.push(item) + }) + return result +} + +function getnotes(doc) +{ + const lastsup = [...doc.getElementsByTagName("sup")].pop() + if (!lastsup) + { + return [] + } + return lastsup.parentElement.textContent.split("\n") + .filter(i => i.length) + .map(i => i.substr(3).trim()) +} + +async function getpage(url) +{ + const result = {} + const response = await fetch(url) + const html = await response.text() + + const doc = getdompareser(html) + const notes = getnotes(doc) + const tables = gettables(doc) + tables.forEach(table => + { + result[table] = gettable(doc, table, notes) + }) + return result +} + +function format(equipment, exclude) +{ + const result = [] + + Object.keys(equipment).forEach(table => { + const columnsizes = {} + result.push(table.toUpperCase()) + const items = equipment[table] + + // exclude + items.forEach(item => { + exclude.forEach(name => { + delete item[name] + }) + }) + + // init sizes + items.forEach(item => + { + Object.keys(item).forEach(columnname => { + columnsizes[columnname] = columnsizes[columnname] || columnname.length + columnsizes[columnname] = Math.max(columnsizes[columnname], (item[columnname] || "").length) + }) + }) + + // write header + let line = "" + Object.keys(columnsizes).forEach(columnname => { + const size = columnsizes[columnname] + line += columnname + " ".repeat((Math.max(0, size - columnname.length))) + "|" + }) + result.push(line) + + // write lines + items.forEach(item => { + let line = "" + Object.keys(columnsizes).forEach(columnname => { + const size = columnsizes[columnname] + const value = (item[columnname] || "").replace("\n", " ") + line += value + " ".repeat(Math.max(0, size - value.length)) + "|" + }) + result.push(line) + }) + result.push(" ") + }) + + return result.join("\n") +} + +async function getdata(configname) +{ + const pages = configs[configname].pages + let result = {} + const root = "https://mikesrpgcenter.com" + for (const index in pages) + { + const page = pages[index] + const pagedata = await getpage([root, configname, page].join("/") + ".html") + result = {...result, ...pagedata} + } + return result +} + +function output(stringresult, configname) +{ + //console.log(stringresult) + Deno.writeTextFile(configname + ".txt", stringresult) +} + +const configs = { + ffantasy: { pages: ["weapons", "armor", "blackmagic", "whitemagic"], exclude: ["Found", "Sold", "Available", "Notes", "Cost", "Ni", "WM", "WW", "BM", "BW", "Th", "BB", "Ma"] }, + dw3: { pages: ["armor", "weapons"], exclude: [] }, +} + +for (const configname in configs) { + const data = await getdata(configname) + const stringresult = format(data, configs[configname].exclude) + output(stringresult, configname) +}