jsonld-rdfa-parser
Version:
A custom RDFa parser to be registered with jsonld.js registerRDFParser method
163 lines (139 loc) • 5.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // see ./browser/jsdom.js for browser version
// see ./browser/xmldom.js for browser version
exports.default = jsonldRdfaParser;
var _graphRdfaProcessor = require('graph-rdfa-processor');
var _graphRdfaProcessor2 = _interopRequireDefault(_graphRdfaProcessor);
var _jsdom = require('jsdom');
var _xmldom = require('xmldom');
var _isUrl = require('is-url');
var _isUrl2 = _interopRequireDefault(_isUrl);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
var RDF_XML_LITERAL = RDF + 'XMLLiteral';
var RDF_HTML_LITERAL = RDF + 'HTML';
var RDF_OBJECT = RDF + 'object';
var RDF_PLAIN_LITERAL = RDF + 'PlainLiteral';
var RDF_LANGSTRING = RDF + 'langString';
var XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';
/**
* @param data - a filePath, HTML string or URL
*/
function jsonldRdfaParser(data, callback) {
function process(node) {
var opts = void 0;
if (!node.baseURI || node.baseURI === 'about:blank') {
opts = { baseURI: 'http://localhost/' };
}
var dataset = void 0,
processingError = void 0;
try {
var graph = (0, _graphRdfaProcessor2.default)(node, opts);
dataset = processGraph(graph);
} catch (e) {
processingError = e;
}
callback(processingError, dataset);
}
if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && 'nodeType' in data) {
process(data);
} else if (typeof data === 'string') {
if ((0, _isUrl2.default)(data)) {
_jsdom.JSDOM.fromURL(data).then(function (dom) {
process(dom.window.document);
}).catch(callback);
} else if (/<[a-z][\s\S]*>/i.test(data)) {
process(new _jsdom.JSDOM(data).window.document);
} else {
_jsdom.JSDOM.fromFile(data).then(function (dom) {
process(dom.window.document);
}).catch(callback);
}
} else {
return callback(new Error('data must be a file path, HTML string, URL or a DOM element'));
}
}
/**
* This function is mostly taken from the jsonld.js lib but updated to
* the latest green-turtle API, and for support for HTML
*/
function processGraph(data) {
var dataset = {
'@default': []
};
var subjects = data.subjects,
htmlMapper = function htmlMapper(n) {
var div = n.ownerDocument.createElement('div');
div.appendChild(n.cloneNode(true));
return div.innerHTML;
};
Object.keys(subjects).forEach(function (subject) {
var predicates = subjects[subject].predicates;
Object.keys(predicates).forEach(function (predicate) {
// iterate over objects
var objects = predicates[predicate].objects;
for (var oi = 0; oi < objects.length; ++oi) {
var object = objects[oi];
// create RDF triple
var triple = {};
// add subject & predicate
triple.subject = {
type: subject.indexOf('_:') === 0 ? 'blank node' : 'IRI',
value: subject
};
triple.predicate = {
type: predicate.indexOf('_:') === 0 ? 'blank node' : 'IRI',
value: predicate
};
triple.object = {};
// serialize XML literal
var value = object.value;
// !!! TODO: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// The below actually most likely does NOT work.
// In most usage contexts this will be an HTML DOM, passing it to xmldom's XMLSerializer
// will cause it to call .toString() on all the nodes it finds — this only works inside
// xmldom.
if (object.type === RDF_XML_LITERAL) {
(function () {
// initialize XMLSerializer
var serializer = new _xmldom.XMLSerializer();
value = Array.from(object.value).map(function (n) {
return serializer.serializeToString(n);
}).join('');
triple.object.datatype = RDF_XML_LITERAL;
})();
}
// serialise HTML literal
else if (object.type === RDF_HTML_LITERAL) {
value = Array.from(object.value).map(htmlMapper).join('');
triple.object.datatype = RDF_HTML_LITERAL;
}
// object is an IRI
else if (object.type === RDF_OBJECT) {
if (object.value.indexOf('_:') === 0) triple.object.type = 'blank node';else triple.object.type = 'IRI';
} else {
// object is a literal
triple.object.type = 'literal';
if (object.type === RDF_PLAIN_LITERAL) {
if (object.language) {
triple.object.datatype = RDF_LANGSTRING;
triple.object.language = object.language;
} else {
triple.object.datatype = XSD_STRING;
}
} else {
triple.object.datatype = object.type;
}
}
triple.object.value = value;
// add triple to dataset in default graph
dataset['@default'].push(triple);
}
});
});
return dataset;
}
module.exports = exports['default'];