UNPKG

pg-rdf-to-json

Version:

Transforms RDF files from rdf-files.tar.bz2 provided by Project Gutenberg into JS/JSON objects.

106 lines 7.59 kB
import { XMLParser } from "fast-xml-parser"; import { relators } from './input-schemas/relators.js'; /** * Sends the first character of the passed string to upper case. */ function capitalize(str) { return str.charAt(0).toUpperCase() + str.substring(1); } /** * Sends the first character of the passed string to lower case. */ function lowerFirstChar(str) { return str.charAt(0).toLowerCase() + str.substring(1); } /** * Returns null. Used to instruct `XMLParser` to not parse tag or attribute * values. */ function returnNull() { return null; } const tagNameMatcher = /^(?<ns>\w+):(?<name>\w+)$/; const attrNameMatcher = /^@_(?<ns>\w+):(?<name>\w+)$/; export function getParser() { const tagNameMap = new Map(); const attrNameMap = new Map(); const arrays = new Set([ 'rdf.ebook.subject', 'rdf.ebook.files', 'rdf.ebook.files.file.format', 'rdf.ebook.files.file.extent', 'rdf.ebook.files.file.modified', 'rdf.ebook.description', 'rdf.ebook.language', 'rdf.ebook.alternative', 'rdf.ebook.bookshelf', 'rdf.ebook.marc901', 'rdf.ebook.marc508', ]); const tagNameTransforms = new Map([ [ 'rdf:RDF', 'rdf' ], [ 'rdf:RDF.pgterms:ebook.rdf:about', 'id' ], [ 'rdf:RDF.pgterms:ebook.dcterms:hasFormat', 'files' ], ]); for (const [relator] of relators) { addAgentField(`rdf:RDF.pgterms:ebook.marcrel:${relator}`); } addAgentField('rdf:RDF.pgterms:ebook.dcterms:creator'); function addAgentField(originalPath) { const matches = originalPath.match(/:(?<name>\w+)$/); if (!matches || !matches.groups) { throw new Error('no matches'); } arrays.add(`rdf.ebook.${matches.groups.name}`); arrays.add(`rdf.ebook.${matches.groups.name}.agent.alias`); arrays.add(`rdf.ebook.${matches.groups.name}.agent.webpage`); } return new XMLParser({ alwaysCreateTextNode: true, ignoreDeclaration: true, trimValues: true, isArray(tagName, jPath, isLeafNode, isAttribute) { return arrays.has(jPath); }, ignoreAttributes(attrName, jPath) { return attrName.startsWith('xmlns:'); }, transformAttributeName(attrName) { const matches = attrNameMatcher.exec(attrName); if (matches === null || !matches.groups) { return attrName; } const namespace = attrNameMap.get(matches.groups.name); if (tagNameMap.has(matches.groups.name)) { return `attr${capitalize(matches.groups.name)}`; } if (!namespace) { attrNameMap.set(matches.groups.name, matches.groups.ns); } else if (namespace !== matches.groups.ns) { return `${matches.groups.ns}${capitalize(matches.groups.name)}`; } return lowerFirstChar(matches.groups.name); }, tagValueProcessor: returnNull, attributeValueProcessor: returnNull, updateTag(tagName, jPath, attrs) { const matches = tagNameMatcher.exec(tagName); if (matches !== null && matches.groups) { return tagNameTransforms.get(jPath) || lowerFirstChar(matches.groups.name); } return tagName; }, }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXZEOztHQUVHO0FBQ0gsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFVBQVU7SUFDakIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsMkJBQTJCLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQUcsNkJBQTZCLENBQUM7QUFFdEQsTUFBTSxVQUFVLFNBQVM7SUFDdkIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbEQsTUFBTSxXQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDckIsbUJBQW1CO1FBQ25CLGlCQUFpQjtRQUNqQiw2QkFBNkI7UUFDN0IsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQix1QkFBdUI7UUFDdkIsb0JBQW9CO1FBQ3BCLHVCQUF1QjtRQUN2QixxQkFBcUI7UUFDckIsbUJBQW1CO1FBQ25CLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFF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