// Utilities for scraping data from the Lodestone import {regExpEscape} from '../util/regexp.js'; /** * Creates a regular expression that matches a link to the database entry of the * given type and name, and captures its EDB ID from the matched link's `href` * attribute. * @param {'item' | 'quest'} type * @param {string} name * @returns {RegExp} */ const edbEntryLinkRegExp = (type, name) => new RegExp(`]*>(?${regExpEscape(name)})`, 'i'); /** * Gets the ID of the Eorzea Database entry with the given type and name. * @param {'item' | 'quest'} type * @param {string} name * @returns {Promise} */ export async function findEDBEntryID (type, name) { // execute a search for the entry's name and type const searchURL = `https://na.finalfantasyxiv.com/lodestone/playguide/db/${type}/?q=${encodeURIComponent(name.replace(/\([^)]+\)|[&-]/g, ' '))}`; const response = await fetch(searchURL); const body = await response.text(); // find an `` in the HTML response whose text exactly matches the name const match = body.match(edbEntryLinkRegExp(type, name)); // return the ID parsed from the URL in the `href` attribute return match?.groups.id; }