szurubooru/client/js/util/uri.js

100 lines
2.7 KiB
JavaScript

"use strict";
function formatApiLink(...values) {
let parts = [];
for (let value of values) {
if (value.constructor === Object) {
// assert this is the last piece
let variableParts = [];
for (let key of Object.keys(value)) {
if (value[key]) {
variableParts.push(
key + "=" + encodeURIComponent(value[key].toString())
);
}
}
if (variableParts.length) {
parts.push("?" + variableParts.join("&"));
}
break;
} else {
parts.push(encodeURIComponent(value.toString()));
}
}
return "/" + parts.join("/");
}
function escapeParam(text) {
return encodeURIComponent(text);
}
function unescapeParam(text) {
return decodeURIComponent(text);
}
function formatClientLink(...values) {
let parts = [];
for (let value of values) {
if (value.constructor === Object) {
// assert this is the last piece
let variableParts = [];
for (let key of Object.keys(value)) {
if (value[key]) {
variableParts.push(
key + "=" + escapeParam(value[key].toString())
);
}
}
if (variableParts.length) {
parts.push(variableParts.join(";"));
}
break;
} else {
parts.push(escapeParam(value.toString()));
}
}
return parts.join("/");
}
function extractHostname(url) {
// https://stackoverflow.com/a/23945027
return url
.split("/")
[url.indexOf("//") > -1 ? 2 : 0].split(":")[0]
.split("?")[0];
}
function extractRootDomain(url) {
// https://stackoverflow.com/a/23945027
let domain = extractHostname(url);
let splitArr = domain.split(".");
let arrLen = splitArr.length;
// if there is a subdomain
if (arrLen > 2) {
domain = splitArr[arrLen - 2] + "." + splitArr[arrLen - 1];
// check to see if it's using a Country Code Top Level Domain (ccTLD) (i.e. ".me.uk")
if (
splitArr[arrLen - 2].length === 2 &&
splitArr[arrLen - 1].length === 2
) {
// this is using a ccTLD
domain = splitArr[arrLen - 3] + "." + domain;
}
}
return domain;
}
function escapeColons(text) {
return text.replace(new RegExp(":", "g"), "\\:");
}
module.exports = {
formatClientLink: formatClientLink,
formatApiLink: formatApiLink,
escapeColons: escapeColons,
escapeParam: escapeParam,
unescapeParam: unescapeParam,
extractHostname: extractHostname,
extractRootDomain: extractRootDomain,
};