rdflib
Version:
an RDF library for node.js. Suitable for client and server side.
215 lines (207 loc) • 4.62 kB
text/typescript
/*
* Implements URI-specific functions
*
* See RFC 2386
*
* See also:
* http://www.w3.org/2005/10/ajaw/uri.js
* http://www.w3.org/2000/10/swap/uripath.py
*
*/
var alert = alert || console.log
import RDFlibNamedNode from './named-node'
/**
* Gets the document part of an URI
* @param uri The URI
*/
export function docpart(uri: string): string {
var i: number
i = uri.indexOf('#')
if (i < 0) {
return uri
} else {
return uri.slice(0, i)
}
}
/**
* Gets the document part of an URI as a named node
* @param x - The URI
*/
export function document(x: string): RDFlibNamedNode {
return new RDFlibNamedNode(docpart(x))
}
/**
* Gets the hostname in an URI
* @param u The URI
*/
export function hostpart(u: string): string {
var m = /[^\/]*\/\/([^\/]*)\//.exec(u)
if (m) {
return m[1]
} else {
return ''
}
}
/**
* Joins an URI with a base
* @param given - The relative part
* @param base - The base URI
*/
export function join(given: string, base: string): string {
var baseColon, baseScheme, baseSingle
var colon, lastSlash, path
var baseHash = base.indexOf('#')
if (baseHash > 0) {
base = base.slice(0, baseHash)
}
if (given.length === 0) {
return base
}
if (given.indexOf('#') === 0) {
return base + given
}
colon = given.indexOf(':')
if (colon >= 0) {
return given
}
baseColon = base.indexOf(':')
if (base.length === 0) {
return given
}
if (baseColon < 0) {
alert('Invalid base: ' + base + ' in join with given: ' + given)
return given
}
baseScheme = base.slice(0, +baseColon + 1 || 9e9)
if (given.indexOf('//') === 0) {
return baseScheme + given
}
if (base.indexOf('//', baseColon) === baseColon + 1) {
baseSingle = base.indexOf('/', baseColon + 3)
if (baseSingle < 0) {
if (base.length - baseColon - 3 > 0) {
return base + '/' + given
} else {
return baseScheme + given
}
}
} else {
baseSingle = base.indexOf('/', baseColon + 1)
if (baseSingle < 0) {
if (base.length - baseColon - 1 > 0) {
return base + '/' + given
} else {
return baseScheme + given
}
}
}
if (given.indexOf('/') === 0) {
return base.slice(0, baseSingle) + given
}
path = base.slice(baseSingle)
lastSlash = path.lastIndexOf('/')
if (lastSlash < 0) {
return baseScheme + given
}
if (lastSlash >= 0 && lastSlash < path.length - 1) {
path = path.slice(0, +lastSlash + 1 || 9e9)
}
path += given
while (path.match(/[^\/]*\/\.\.\//)) {
path = path.replace(/[^\/]*\/\.\.\//, '')
}
path = path.replace(/\.\//g, '')
path = path.replace(/\/\.$/, '/')
return base.slice(0, baseSingle) + path
}
/**
* Gets the protocol part of an URI
* @param uri The URI
*/
export function protocol(uri: string): string | null {
const i = uri.indexOf(':')
if (i < 0) {
return null
} else {
return uri.slice(0, i)
}
}
/**
* Gets a relative uri
* @param base The base URI
* @param uri The absolute URI
*/
export function refTo(base: string, uri: string): string {
var c: string,
i: number,
k: number,
l: number,
len: number,
len1: number,
n: number,
o: number,
p: number,
q: number,
ref: string,
ref1: number,
s: string
var commonHost = new RegExp('^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$')
if (!base) {
return uri
}
if (base === uri) {
return ''
}
for (i = o = 0, len = uri.length; o < len; i = ++o) {
const c = uri[i]
if (c !== base[i]) {
break
}
}
if (base.slice(0, i).match(commonHost)) {
k = uri.indexOf('//')
if (k < 0) {
k = -2
}
l = uri.indexOf('/', k + 2)
if (uri[l + 1] !== '/' && base[l + 1] !== '/' && uri.slice(0, l) === base.slice(0, l)) {
return uri.slice(l)
}
}
if (uri[i] === '#' && base.length === i) {
return uri.slice(i)
}
while (i > 0 && uri[i - 1] !== '/') {
i--
}
if (i < 3) {
return uri
}
if (base.indexOf('//', i - 2) > 0 || uri.indexOf('//', i - 2) > 0) {
return uri
}
if (base.indexOf(':', i) > 0) {
return uri
}
n = 0
ref = base.slice(i)
for (p = 0, len1 = ref.length; p < len1; p++) {
c = ref[p]
if (c === '/') {
n++
}
}
if (n === 0 && i < uri.length && uri[i] === '#') {
return './' + uri.slice(i)
}
if (n === 0 && i === uri.length) {
return './'
}
s = ''
if (n > 0) {
for (q = 1, ref1 = n; ref1 >= 1 ? q <= ref1 : q >= ref1; ref1 >= 1 ? ++q : --q) {
s += '../'
}
}
return s + uri.slice(i)
}