misuzu/assets/typescript/UrlRegistry.ts

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;
}