91 lines
2.2 KiB
TypeScript
91 lines
2.2 KiB
TypeScript
interface UrlRegistryVariable {
|
|
name: string;
|
|
value: string;
|
|
}
|
|
|
|
interface UrlRegistryEntryQuery {
|
|
name: string;
|
|
value: string;
|
|
}
|
|
|
|
interface UrlRegistryEntry {
|
|
name: string;
|
|
path: string;
|
|
query: UrlRegistryEntryQuery[];
|
|
fragment: string;
|
|
}
|
|
|
|
let urlRegistryTable: UrlRegistryEntry[] = [];
|
|
|
|
function getRawUrlRegistry(): UrlRegistryEntry[]
|
|
{
|
|
const urlListElement: HTMLElement = document.getElementById('js-urls-list') as HTMLElement;
|
|
|
|
if (!urlListElement)
|
|
return null;
|
|
|
|
return JSON.parse(urlListElement.textContent) as UrlRegistryEntry[];
|
|
}
|
|
|
|
function urlRegistryInit(): void
|
|
{
|
|
urlRegistryTable = getRawUrlRegistry();
|
|
}
|
|
|
|
function urlFormat(name: string, vars: UrlRegistryVariable[] = []): string
|
|
{
|
|
const entry: UrlRegistryEntry = urlRegistryTable.find(x => x.name == name);
|
|
|
|
if (!entry || !entry.path) {
|
|
return '';
|
|
}
|
|
|
|
const splitUrl: string[] = entry.path.split('/');
|
|
|
|
for (let i = 0; i < splitUrl.length; i++) {
|
|
splitUrl[i] = urlVariable(splitUrl[i], vars);
|
|
}
|
|
|
|
let url: string = splitUrl.join('/');
|
|
|
|
if (entry.query) {
|
|
url += '?';
|
|
|
|
for (let i = 0; i < entry.query.length; i++) {
|
|
const query: UrlRegistryEntryQuery = entry.query[i],
|
|
value: string = urlVariable(query.value, vars);
|
|
|
|
if (!value || (query.name === 'page' && parseInt(value) < 2)) {
|
|
continue;
|
|
}
|
|
|
|
url += `${query.name}=${value}&`;
|
|
}
|
|
|
|
url = url.replace(/^[\?\&]+|[\?\&]+$/g, '');
|
|
}
|
|
|
|
if (entry.fragment) {
|
|
url += ('#' + urlVariable(entry.fragment, vars)).replace(/[\#]+$/g, '');
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
function urlVariable(value: string, vars: UrlRegistryVariable[]): string
|
|
{
|
|
if (value[0] === '<' && value.slice(-1) === '>') {
|
|
const urvar: UrlRegistryVariable = vars.find(x => x.name == value.slice(1, -1));
|
|
return urvar ? urvar.value : '';
|
|
}
|
|
|
|
if (value[0] === '[' && value.slice(-1) === ']') {
|
|
return ''; // not sure if there's a proper substitute for this, should probably resolve these in url_list
|
|
}
|
|
|
|
if (value[0] === '{' && value.slice(-1) === '}') {
|
|
return getCSRFToken(value.slice(1, -1));
|
|
}
|
|
|
|
return value;
|
|
}
|