UNPKG

link-rdflib

Version:

an RDF library for node.js, patched for speed.

308 lines (244 loc) 10 kB
'use strict'; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var ClassOrder = require('./class-order'); var NamedNode = require('./named-node'); var Term = require('./term'); var XSD = require('./xsd'); var Literal = /*#__PURE__*/ function (_Term) { _inherits(Literal, _Term); function Literal(value, language, datatype) { var _this; _classCallCheck(this, Literal); _this = _possibleConstructorReturn(this, _getPrototypeOf(Literal).call(this)); _this.termType = Literal.termType; _this.value = value; if (language) { _this.lang = language; datatype = XSD.langString; } // If not specified, a literal has the implied XSD.string default datatype _this.datatype = datatype ? NamedNode.find(datatype) : XSD.string; var existing = Literal.findLiteralByValue(value, language, datatype); if (existing) { return _possibleConstructorReturn(_this, existing); } Literal.mem(_assertThisInitialized(_assertThisInitialized(_this))); return _this; } _createClass(Literal, [{ key: "copy", value: function copy() { return Literal.find(this.value, this.lang, this.datatype); } }, { key: Symbol.toPrimitive, value: function value(_) { if ([undefined, XSD.string, XSD.langString].includes(this.datatype)) { return this.value; } if (this.datatype === XSD.boolean) { return this.value === 'true' || this.value === '1'; } if ([XSD.date, XSD.dateTime, XSD.dateTimeStamp].includes(this.datatype)) { return new Date(this.value); } if ([XSD.decimal, XSD.double, XSD.integer, XSD.int, XSD.float, XSD.long].includes(this.datatype)) { return Number(this.value); } return undefined; } }, { key: "toNT", value: function toNT() { if (typeof this.value === 'number') { return this.toString(); } else if (typeof this.value !== 'string') { throw new Error('Value of RDF literal is not string or number: ' + this.value); } var str = this.value; str = str.replace(/\\/g, '\\\\'); str = str.replace(/\"/g, '\\"'); str = str.replace(/\n/g, '\\n'); str = '"' + str + '"'; if (this.language) { str += '@' + this.language; } else if (this.datatype !== XSD.string) { // Only add datatype if it's not a string str += '^^' + this.datatype.toCanonical(); } return str; } /** * Assigns an index number and adds a Literal instance to the indices * @private * @param lit The Literal instance to register * @return {Literal} The updated Literal instance */ }, { key: "language", get: function get() { return this.lang; }, set: function set(language) { this.lang = language || ''; } }], [{ key: "mem", value: function mem(lit) { if (lit.sI) { throw new Error("Literal ".concat(lit, " already registered")); } lit.sI = ++Term.termIndex; var dtIndex = (lit.datatype || require('./xsd').string).sI; if (!Term.litMap[dtIndex]) { Term.litMap[dtIndex] = []; } if (lit.language) { if (!Term.litMap[dtIndex][lit.value]) { Term.litMap[dtIndex][lit.value] = []; } Term.termMap[lit.sI] = Term.litMap[dtIndex][lit.value][lit.language] = lit; } else { Term.termMap[lit.sI] = Term.litMap[dtIndex][lit.value] = lit; } return lit; } /** @private */ }, { key: "findLiteralByValue", value: function findLiteralByValue(strValue) { var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; var datatype = arguments.length > 2 ? arguments[2] : undefined; var fromMap; // Language strings need an additional index layer if (lang) { var langStringIndex = require('./xsd').langString.sI; if (!Term.litMap[langStringIndex]) { Term.litMap[langStringIndex] = []; } if (!Term.litMap[langStringIndex][strValue]) { Term.litMap[langStringIndex][strValue] = []; } fromMap = Term.litMap[langStringIndex][strValue][lang]; } else { var dtIndex = (datatype || require('./xsd').string).sI; fromMap = Term.litMap[dtIndex] && Term.litMap[dtIndex][strValue]; } return fromMap; } /** * Retrieve or create a Literal by its datatype, value, and language * @param value {Object} The value of the literal * @param lang? {string} The language of the literal (will force datatype xsd:langString) * @param datatype? {NamedNode} The IRI of the datatype * @return {Literal} The resolved or created Literal */ }, { key: "find", value: function find(value) { var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; var datatype = arguments.length > 2 ? arguments[2] : undefined; var strValue = value.toString(); var existing = Literal.findLiteralByValue(strValue, lang, datatype); if (existing) { return existing; } return new Literal(strValue, lang, datatype); } /** * @method fromBoolean * @static * @param value {Boolean} * @return {Literal} */ }, { key: "fromBoolean", value: function fromBoolean(value) { var strValue = value ? '1' : '0'; return Literal.find(strValue, null, XSD.boolean); } /** * @method fromDate * @static * @param value {Date} * @return {Literal} */ }, { key: "fromDate", value: function fromDate(value) { if (!(value instanceof Date)) { throw new TypeError('Invalid argument to Literal.fromDate()'); } var d2 = function d2(x) { return ('' + (100 + x)).slice(1, 3); }; var date = '' + value.getUTCFullYear() + '-' + d2(value.getUTCMonth() + 1) + '-' + d2(value.getUTCDate()) + 'T' + d2(value.getUTCHours()) + ':' + d2(value.getUTCMinutes()) + ':' + d2(value.getUTCSeconds()) + 'Z'; return Literal.find(date, null, XSD.dateTime); } /** * @method fromNumber * @static * @param value {Number} * @return {Literal} */ }, { key: "fromNumber", value: function fromNumber(value) { if (typeof value !== 'number') { throw new TypeError('Invalid argument to Literal.fromNumber()'); } var datatype; var strValue = value.toString(); if (strValue.indexOf('e') < 0 && Math.abs(value) <= Number.MAX_SAFE_INTEGER) { datatype = Number.isInteger(value) ? XSD.integer : XSD.decimal; } else { datatype = XSD.double; } return Literal.find(strValue, null, datatype); } /** * @method fromValue * @param value * @return {Literal} */ }, { key: "fromValue", value: function fromValue(value) { if (typeof value === 'undefined' || value === null) { return value; } if (_typeof(value) === 'object' && value.termType) { // this is a Node instance return value; } switch (_typeof(value)) { case 'object': if (value instanceof Date) { return Literal.fromDate(value); } case 'boolean': return Literal.fromBoolean(value); case 'number': return Literal.fromNumber(value); case 'string': return Literal.find(value, null, XSD.string); } throw new Error("Can't make literal from " + value + ' of type ' + _typeof(value)); } }]); return Literal; }(Term); Literal.termType = 'Literal'; Literal.prototype.classOrder = ClassOrder['Literal']; Literal.prototype.datatype = XSD.string; Literal.prototype.lang = ''; Literal.prototype.isVar = 0; module.exports = Literal;