@bahulneel/rdflib
Version:
an RDF library for node.js. Suitable for client and server side.
112 lines (89 loc) • 3.35 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.jsonldObjectToTerm = jsonldObjectToTerm;
exports.default = jsonldParser;
var _jsonld = _interopRequireDefault(require("jsonld"));
var _utils = require("./utils");
/**
* Parses json-ld formatted JS objects to a rdf Term.
* @param kb - The DataFactory to use.
* @param obj - The json-ld object to process.
* @return {Literal|NamedNode|BlankNode|Collection}
*/
function jsonldObjectToTerm(kb, obj) {
if (typeof obj === 'string') {
return kb.rdfFactory.literal(obj);
}
if (Object.prototype.hasOwnProperty.call(obj, '@list')) {
if (kb.rdfFactory.supports["COLLECTIONS"] === true) {
return listToCollection(kb, obj['@list']);
}
return listToStatements(kb, obj);
}
if (Object.prototype.hasOwnProperty.call(obj, '@id')) {
return kb.rdfFactory.namedNode(obj['@id']);
}
if (Object.prototype.hasOwnProperty.call(obj, '@language')) {
return kb.rdfFactory.literal(obj['@value'], obj['@language']);
}
if (Object.prototype.hasOwnProperty.call(obj, '@type')) {
return kb.rdfFactory.literal(obj['@value'], kb.rdfFactory.namedNode(obj['@type']));
}
if (Object.prototype.hasOwnProperty.call(obj, '@value')) {
return kb.rdfFactory.literal(obj['@value']);
}
return kb.rdfFactory.literal(obj);
}
/**
* Adds the statements in a json-ld list object to {kb}.
*/
function listToStatements(kb, obj) {
var listId = obj['@id'] ? kb.rdfFactory.namedNode(obj['@id']) : kb.rdfFactory.blankNode();
var items = obj['@list'].map(function (listItem) {
return jsonldObjectToTerm(kb, listItem);
});
var statements = (0, _utils.arrayToStatements)(kb.rdfFactory, listId, items);
kb.addAll(statements);
return listId;
}
function listToCollection(kb, obj) {
if (!Array.isArray(obj)) {
throw new TypeError("Object must be an array");
}
return kb.rdfFactory.collection(obj.map(function (o) {
return jsonldObjectToTerm(kb, o);
}));
}
/**
* Takes a json-ld formatted string {str} and adds its statements to {kb}.
*
* Ensure that {kb.rdfFactory} is a DataFactory.
*/
function jsonldParser(str, kb, base, callback) {
var baseString = base && Object.prototype.hasOwnProperty.call(base, 'termType') ? base.value : base;
return _jsonld.default.flatten(JSON.parse(str), null, {
base: baseString
}).then(function (flattened) {
return flattened.reduce(function (store, flatResource) {
var id = flatResource['@id'] ? kb.rdfFactory.namedNode(flatResource['@id']) : kb.rdfFactory.blankNode();
for (var _i = 0, _Object$keys = Object.keys(flatResource); _i < _Object$keys.length; _i++) {
var property = _Object$keys[_i];
if (property === '@id') {
continue;
}
var value = flatResource[property];
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
kb.addStatement(kb.rdfFactory.quad(id, kb.rdfFactory.namedNode(property), jsonldObjectToTerm(kb, value[i])));
}
} else {
kb.addStatement(kb.rdfFactory.quad(id, kb.rdfFactory.namedNode(property), jsonldObjectToTerm(kb, value)));
}
}
return kb;
}, kb);
}).then(callback).catch(callback);
}