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
JavaScript
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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