graph-rdfa-processor
Version:
Green turtle GraphRdfaProcessor extracted and available as a commonJS module
274 lines (215 loc) • 9.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
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; }
var URIResolver =
/*#__PURE__*/
function () {
function URIResolver() {
_classCallCheck(this, URIResolver);
}
_createClass(URIResolver, [{
key: "parseURI",
value: function parseURI(uri) {
var match = URIResolver.SCHEME.exec(uri);
if (!match) {
throw new Error("Bad URI value, no scheme: " + uri);
}
var parsed = {
spec: uri
};
parsed.scheme = match[0].substring(0, match[0].length - 1);
parsed.schemeSpecificPart = parsed.spec.substring(match[0].length);
if (parsed.schemeSpecificPart.charAt(0) == '/' && parsed.schemeSpecificPart.charAt(1) == '/') {
this.parseGeneric(parsed);
} else {
parsed.isGeneric = false;
}
parsed.normalize = function () {
if (!this.isGeneric) {
return;
}
if (this.segments.length == 0) {
return;
} // edge case of ending in "/."
if (this.path.length > 1 && this.path.substring(this.path.length - 2) == "/.") {
this.path = this.path.substring(0, this.path.length - 1);
this.segments.splice(this.segments.length - 1, 1);
this.schemeSpecificPart = "//" + this.authority + this.path;
if (typeof this.query != "undefined") {
this.schemeSpecificPart += "?" + this.query;
}
if (typeof this.fragment != "undefined") {
this.schemeSpecificPart += "#" + this.fragment;
}
this.spec = this.scheme + ":" + this.schemeSpecificPart;
return;
}
var end = this.path.charAt(this.path.length - 1);
if (end != "/") {
end = "";
}
for (var i = 0; i < this.segments.length; i++) {
if (i > 0 && this.segments[i] == "..") {
this.segments.splice(i - 1, 2);
i -= 2;
}
if (this.segments[i] == ".") {
this.segments.splice(i, 1);
i--;
}
}
this.path = this.segments.length == 0 ? "/" : "/" + this.segments.join("/") + end;
this.schemeSpecificPart = "//" + this.authority + this.path;
if (typeof this.query != "undefined") {
this.schemeSpecificPart += "?" + this.query;
}
if (typeof this.fragment != "undefined") {
this.schemeSpecificPart += "#" + this.fragment;
}
this.spec = this.scheme + ":" + this.schemeSpecificPart;
};
parsed.resolve = function (href) {
if (!href) {
return this.spec;
}
if (href.charAt(0) == '#') {
var lastHash = this.spec.lastIndexOf('#');
return lastHash < 0 ? this.spec + href : this.spec.substring(0, lastHash) + href;
}
if (!this.isGeneric) {
throw new Error("Cannot resolve uri against non-generic URI: " + this.spec);
}
var colon = href.indexOf(':');
if (href.charAt(0) == '/') {
return this.scheme + "://" + this.authority + href;
} else if (href.charAt(0) == '.' && href.charAt(1) == '/') {
if (this.path.charAt(this.path.length - 1) == '/') {
return this.scheme + "://" + this.authority + this.path + href.substring(2);
} else {
var last = this.path.lastIndexOf('/');
return this.scheme + "://" + this.authority + this.path.substring(0, last) + href.substring(1);
}
} else if (URIResolver.SCHEME.test(href)) {
return href;
} else if (href.charAt(0) == "?") {
return this.scheme + "://" + this.authority + this.path + href;
} else {
if (this.path.charAt(this.path.length - 1) == '/') {
return this.scheme + "://" + this.authority + this.path + href;
} else {
var last = this.path.lastIndexOf('/');
return this.scheme + "://" + this.authority + this.path.substring(0, last + 1) + href;
}
}
};
parsed.relativeTo = function (otherURI) {
if (otherURI.scheme != this.scheme) {
return this.spec;
}
if (!this.isGeneric) {
throw new Error("A non generic URI cannot be made relative: " + this.spec);
}
if (!otherURI.isGeneric) {
throw new Error("Cannot make a relative URI against a non-generic URI: " + otherURI.spec);
}
if (otherURI.authority != this.authority) {
return this.spec;
}
var i = 0;
for (; i < this.segments.length && i < otherURI.segments.length; i++) {
if (this.segments[i] != otherURI.segments[i]) {
//alert(this.path+" different from "+otherURI.path+" at '"+this.segments[i]+"' vs '"+otherURI.segments[i]+"'");
var offset = otherURI.path.charAt(otherURI.path.length - 1) == '/' ? 0 : -1;
var relative = "";
for (var j = i; j < otherURI.segments.length + offset; j++) {
relative += "../";
}
for (var j = i; j < this.segments.length; j++) {
relative += this.segments[j];
if (j + 1 < this.segments.length) {
relative += "/";
}
}
if (this.path.charAt(this.path.length - 1) == '/') {
relative += "/";
}
return relative;
}
}
if (this.segments.length == otherURI.segments.length) {
return this.hash ? this.hash : this.query ? this.query : "";
} else if (i < this.segments.length) {
var relative = "";
for (var j = i; j < this.segments.length; j++) {
relative += this.segments[j];
if (j + 1 < this.segments.length) {
relative += "/";
}
}
if (this.path.charAt(this.path.length - 1) == '/') {
relative += "/";
}
return relative;
} else {
throw new Error("Cannot calculate a relative URI for " + this.spec + " against " + otherURI.spec);
}
};
return parsed;
}
}, {
key: "parseGeneric",
value: function parseGeneric(parsed) {
if (parsed.schemeSpecificPart.charAt(0) != '/' || parsed.schemeSpecificPart.charAt(1) != '/') {
throw new Error("Generic URI values should start with '//':" + parsed.spec);
}
var work = parsed.schemeSpecificPart.substring(2);
var pathStart = work.indexOf("/");
parsed.authority = pathStart < 0 ? work : work.substring(0, pathStart);
parsed.path = pathStart < 0 ? "" : work.substring(pathStart);
var hash = parsed.path.indexOf('#');
if (hash >= 0) {
parsed.fragment = parsed.path.substring(hash + 1);
parsed.path = parsed.path.substring(0, hash);
}
var questionMark = parsed.path.indexOf('?');
if (questionMark >= 0) {
parsed.query = parsed.path.substring(questionMark + 1);
parsed.path = parsed.path.substring(0, questionMark);
}
if (parsed.path == "/" || parsed.path == "") {
parsed.segments = [];
} else {
parsed.segments = parsed.path.split(/\//);
if (parsed.segments.length > 0 && parsed.segments[0] == '' && parsed.path.length > 1 && parsed.path.charAt(1) != '/') {
// empty segment at the start, remove it
parsed.segments.shift();
}
if (parsed.segments.length > 0 && parsed.path.length > 0 && parsed.path.charAt(parsed.path.length - 1) == '/' && parsed.segments[parsed.segments.length - 1] == '') {
// we may have an empty the end
// check to see if it is legimate
if (parsed.path.length > 1 && parsed.path.charAt(parsed.path.length - 2) != '/') {
parsed.segments.pop();
}
} // check for non-escaped characters
for (var i = 0; i < parsed.segments.length; i++) {
var check = parsed.segments[i].split(/%[A-Za-z0-9][A-Za-z0-9]|[\ud800-\udfff][\ud800-\udfff]|[A-Za-z0-9\-\._~!$&'()*+,;=@:\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+/);
for (var j = 0; j < check.length; j++) {
if (check[j].length > 0) {
throw new Error("Unecaped character " + check[j].charAt(0) + " (" + check[j].charCodeAt(0) + ") in URI " + parsed.spec);
}
}
}
}
parsed.isGeneric = true;
}
}]);
return URIResolver;
}();
exports.default = URIResolver;
URIResolver.SCHEME = /^[A-Za-z][A-Za-z0-9\+\-\.]*\:/;
module.exports = exports.default;