add-edb-ids: Also handle quests from Category:Missing quest EDB ID

This commit is contained in:
ewin 2025-08-02 20:09:51 -04:00
parent 3aa9a44cae
commit 8e89e05756
Signed by: erin
SSH key fingerprint: SHA256:swjoHhREbZPbWe+gyJNi24d4NAxJSyUIm3fpZj4z3wc
2 changed files with 25 additions and 15 deletions

View file

@ -3,25 +3,28 @@
import {regExpEscape} from '../util/regexp.js';
/**
* Creates a regular expression that matches a link to the named item and
* captures its EDB ID from the matched link's `href` attribute.
* 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 itemLinkRegExp = name => new RegExp(`<a href="/lodestone/playguide/db/item/(?<id>[a-z0-9]+)[^"]+"[^>]*>(?<name>${regExpEscape(name)})</a>`, 'i');
const edbEntryLinkRegExp = (type, name) => new RegExp(`<a href="/lodestone/playguide/db/${regExpEscape(type)}/(?<id>[a-z0-9]+)[^"]+"[^>]*>(?<name>${regExpEscape(name)})</a>`, 'i');
/**
* Gets the ID of the named item in Eorzea Database.
* Gets the ID of the Eorzea Database entry with the given type and name.
* @param {'item' | 'quest'} type
* @param {string} name
* @returns {Promise<string | null>}
*/
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, ' '))}`;
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 `<a>` in the HTML response whose text exactly matches the name
const match = body.match(itemLinkRegExp(name));
const match = body.match(edbEntryLinkRegExp(type, name));
// return the ID parsed from the URL in the `href` attribute
return match?.groups.id;
}