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