Still match against the full page title when parsing the results page to find the ID, just in case being less specific causes multiple items to be returned
32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
// Utilities for scraping data from the Lodestone
|
|
|
|
/**
|
|
* @see https://stackoverflow.com/a/6969486
|
|
* @param {string}
|
|
* @returns {string}
|
|
*/
|
|
const regExpEscape = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
|
|
/**
|
|
* Creates a regular expression that matches a link to the named item and
|
|
* captures its EDB ID from the matched link's `href` attribute.
|
|
* @param {string} name
|
|
* @returns {RegExp}
|
|
*/
|
|
const itemLinkRegExp = name => new RegExp(`<a href="/lodestone/playguide/db/item/(?<id>[a-z0-9]+)[^"]+"[^>]*>(?<name>${regExpEscape(name)})</a>`, 'i');
|
|
|
|
/**
|
|
* Gets the ID of the named item in Eorzea Database.
|
|
* @param {string} name
|
|
* @returns {Promise<string | undefined>}
|
|
*/
|
|
export async function findItemEDBID (name) {
|
|
// execute a search for the item's name
|
|
const searchURL = `https://na.finalfantasyxiv.com/lodestone/playguide/db/item/?q=${encodeURIComponent(name.replace(/\([^)]+\)|&/g, ' '))}`;
|
|
const response = await fetch(searchURL);
|
|
const body = await response.text();
|
|
// find an `<a>` in the HTML response whose text exactly matches the name
|
|
const match = body.match(itemLinkRegExp(name));
|
|
// return the ID parsed from the URL in the `href` attribute
|
|
return match?.groups.id;
|
|
}
|