Add json-ld.ts
parent
395e2352b7
commit
4a73375cfb
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* Represents information contained in a JSON+LD tag.
|
||||
*/
|
||||
export type JSONLD = { [s: string]: string | JSONLD }
|
||||
|
||||
/**
|
||||
* Extracts and processes the JSON-LD values of the page.
|
||||
* @param {cheerio.Cheerio} body Page `body` selector
|
||||
* @returns {JSONLD[]} List of data obtained from the page
|
||||
*/
|
||||
export function getJSONLD(body: cheerio.Cheerio): JSONLD {
|
||||
shared.logger.trace("Extracting JSON-LD data...");
|
||||
|
||||
// Fetch the JSON-LD data
|
||||
const structuredDataElements = body.find(f95Selector.GT_JSONLD);
|
||||
|
||||
// Parse the data
|
||||
const values = structuredDataElements.map((idx, el) => parseJSONLD(el)).get();
|
||||
|
||||
// Merge the data and return a single value
|
||||
return mergeJSONLD(values);
|
||||
}
|
||||
|
||||
//#region Private methods
|
||||
/**
|
||||
* Merges multiple JSON+LD tags into one object.
|
||||
* @param data List of JSON+LD tags
|
||||
*/
|
||||
function mergeJSONLD(data: JSONLD[]): JSONLD {
|
||||
// Local variables
|
||||
let merged: JSONLD = {};
|
||||
|
||||
for (const value of data) {
|
||||
merged = Object.assign(merged, value);
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a JSON-LD element source code.
|
||||
*/
|
||||
function parseJSONLD(element: cheerio.Element): JSONLD {
|
||||
// Get the element HTML
|
||||
const html = cheerio.load(element).html().trim();
|
||||
|
||||
// Obtain the JSON-LD
|
||||
const data = html
|
||||
.replace("<script type=\"application/ld+json\">", "")
|
||||
.replace("</script>", "");
|
||||
|
||||
// Convert the string to an object
|
||||
return JSON.parse(data);
|
||||
}
|
||||
//#endregion Private methods
|
Loading…
Reference in New Issue