@bahulneel/rdflib
Version:
an RDF library for node.js. Suitable for client and server side.
154 lines (131 loc) • 4.69 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = parse;
var _extendedTermFactory = _interopRequireDefault(require("./factories/extended-term-factory"));
var _jsonldparser = _interopRequireDefault(require("./jsonldparser"));
var _n = require("n3");
var _n3parser = _interopRequireDefault(require("./n3parser"));
var _rdfaparser = require("./rdfaparser");
var _rdfxmlparser = _interopRequireDefault(require("./rdfxmlparser"));
var _patchParser = _interopRequireDefault(require("./patch-parser"));
var Util = _interopRequireWildcard(require("./utils-js"));
var _types = require("./types");
// @ts-ignore is this injected?
// @@ Goal: remove this dependency
/**
* Parse a string and put the result into the graph kb.
* Normal method is sync.
* Unfortunately jsdonld is currently written to need to be called async.
* Hence the mess below with executeCallback.
* @param str - The input string to parse
* @param kb - The store to use
* @param base - The base URI to use
* @param contentType - The MIME content type string for the input
* @param callback - The callback to call when the data has been loaded
*/
function parse(str, kb, base, contentType, callback) {
contentType = contentType || _types.TurtleContentType;
contentType = contentType.split(';')[0];
try {
if (contentType === _types.N3ContentType || contentType === _types.TurtleContentType) {
var p = (0, _n3parser.default)(kb, kb, base, base, null, null, '', null);
p.loadBuf(str);
executeCallback();
} else if (contentType === _types.RDFXMLContentType) {
var parser = new _rdfxmlparser.default(kb);
parser.parse(Util.parseXML(str), base, kb.sym(base));
executeCallback();
} else if (contentType === _types.XHTMLContentType) {
(0, _rdfaparser.parseRDFaDOM)(Util.parseXML(str, {
contentType: _types.XHTMLContentType
}), kb, base);
executeCallback();
} else if (contentType === _types.HTMLContentType) {
(0, _rdfaparser.parseRDFaDOM)(Util.parseXML(str, {
contentType: _types.HTMLContentType
}), kb, base);
executeCallback();
} else if (contentType === _types.SPARQLUpdateContentType) {
// @@ we handle a subset
(0, _patchParser.default)(str, kb, base);
executeCallback();
} else if (contentType === _types.JSONLDContentType) {
(0, _jsonldparser.default)(str, kb, base, executeCallback);
} else if (contentType === _types.NQuadsContentType || contentType === _types.NQuadsAltContentType) {
var n3Parser = new _n.Parser({
factory: _extendedTermFactory.default
});
nquadCallback(null, str);
} else if (contentType === undefined) {
throw new Error("contentType is undefined");
} else {
throw new Error("Don't know how to parse " + contentType + ' yet');
}
} catch (e) {
executeErrorCallback(e);
}
parse.handled = {
'text/n3': true,
'text/turtle': true,
'application/rdf+xml': true,
'application/xhtml+xml': true,
'text/html': true,
'application/sparql-update': true,
'application/ld+json': true,
'application/nquads': true,
'application/n-quads': true
};
function executeCallback() {
if (callback) {
callback(null, kb);
} else {
return;
}
}
function executeErrorCallback(e) {
if ( // TODO: Always true, what is the right behavior
contentType !== _types.JSONLDContentType || // @ts-ignore always true?
contentType !== _types.NQuadsContentType || // @ts-ignore always true?
contentType !== _types.NQuadsAltContentType) {
if (callback) {
callback(e, kb);
} else {
var e2 = new Error('' + e + ' while trying to parse <' + base + '> as ' + contentType); //@ts-ignore .cause is not a default error property
e2.cause = e;
throw e2;
}
}
}
/*
function setJsonLdBase (doc, base) {
if (doc instanceof Array) {
return
}
if (!('@context' in doc)) {
doc['@context'] = {}
}
doc['@context']['@base'] = base
}
*/
function nquadCallback(err, nquads) {
if (err) {
callback(err, kb);
}
try {
n3Parser.parse(nquads, tripleCallback);
} catch (err) {
callback(err, kb);
}
}
function tripleCallback(err, triple) {
if (triple) {
kb.add(triple.subject, triple.predicate, triple.object, triple.graph);
} else {
callback(err, kb);
}
}
}