// 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 getcategory(doc, category, notes) { const result = []; const items = [...doc.getElementById(category).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; }); item.Notes = "" 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) { return [] const lastsup = [...doc.getElementsByTagName("sup")].pop(); return lastsup.parentElement.textContent.split("\n") .filter(i => i.length) .map(i => i.substr(3)); } async function getpage(url, tables) { const result = {} const response = await fetch(root + url) const html = await response.text() const doc = getdompareser(html); const notes = getnotes(doc); tables.forEach(category => { result[category] = getcategory(doc, category, notes); }); return result } function output(equipment) { const result = [] const exclude = ["Found", "Sold", "Available", "Ft","Mr","Go"] // add unused classes/jobs // todo: fix footer notes // todo: invert available X mark // todo: remove a column if always empty 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) }) }) // header let line = "" Object.keys(columnsizes).forEach(columnname => { const size = columnsizes[columnname] line += columnname + " ".repeat((Math.max(0, size - columnname.length))) + "|" }) result.push(line) // 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(" ") }) console.log(result.join("\n")) } const root = "https://mikesrpgcenter.com" let equipment = {}; const dq3pages = [ { url: "/dw3/armor.html", tables: ["armor", "shields", "helmets"] }, { url: "/dw3/weapons.html", tables: ["weapons"] } ] const ff1pages = [ { url: "/ffantasy/weapons.html", tables: ["swords", "axes", "daggers", "staffs", "hammers", "nunchucks", "miscellaneous"] }, { url: "/ffantasy/armor.html", tables: ["armor", "braceletes", "shields", "helmets", "gauntlets"] }, { url: "/ffantasy/blackmagic.html", tables: ["black_magic"] }, { url: "/ffantasy/whitemagic.html", tables: ["white_magic"] } ] const pages = ff1pages for (const index in pages) { const page = pages[index] equipment = {...equipment, ...(await getpage(page.url, page.tables))} } output(equipment)