misuzu/assets/typescript/UrlRegistry.ts

88 lines
2.2 KiB
TypeScript
Raw Normal View History

interface UrlRegistryVariable {
name: string;
value: string | number;
}
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[] {
const urlListElement: HTMLElement = document.getElementById('js-urls-list') as HTMLElement;
2019-06-10 17:04:53 +00:00
if(!urlListElement)
return null;
return JSON.parse(urlListElement.textContent) as UrlRegistryEntry[];
}
2019-06-10 17:04:53 +00:00
function urlRegistryInit(): void {
urlRegistryTable = getRawUrlRegistry();
}
2019-06-10 17:04:53 +00:00
function urlFormat(name: string, vars: UrlRegistryVariable[] = []): string {
const entry: UrlRegistryEntry = urlRegistryTable.find(x => x.name == name);
2019-06-10 17:04:53 +00:00
if(!entry || !entry.path) {
return '';
}
const splitUrl: string[] = entry.path.split('/');
2019-06-10 17:04:53 +00:00
for(let i = 0; i < splitUrl.length; i++) {
splitUrl[i] = urlVariable(splitUrl[i], vars);
}
let url: string = splitUrl.join('/');
2019-06-10 17:04:53 +00:00
if(entry.query) {
url += '?';
2019-06-10 17:04:53 +00:00
for(let i = 0; i < entry.query.length; i++) {
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)) {
continue;
}
url += `${query.name}=${value}&`;
}
url = url.replace(/^[\?\&]+|[\?\&]+$/g, '');
}
2019-06-10 17:04:53 +00:00
if(entry.fragment) {
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) === '>') {
const urvar: UrlRegistryVariable = vars.find(x => x.name == value.slice(1, -1));
return urvar ? urvar.value.toString() : '';
}
2019-06-10 17:04:53 +00:00
if(value[0] === '[' && value.slice(-1) === ']') {
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();
}
return value;
}