diff options
| -rw-r--r-- | app/directory.ts | 28 | ||||
| -rw-r--r-- | app/wikiparser.mjs | 15 |
2 files changed, 27 insertions, 16 deletions
diff --git a/app/directory.ts b/app/directory.ts index a38b5a0..c5c42e7 100644 --- a/app/directory.ts +++ b/app/directory.ts @@ -34,13 +34,27 @@ export class PageDirectory { pages.forEach(page => { page = page.replace('.wiki', '').replace('/', ':').replace(/[^a-z0-9:]/gi, '_').toLowerCase(); - this.pages[page] = this.buildPage(page); + this.pages[page] = { + standardName: page, + buildTime: 0, + metadata: {} + } + }); + + // Build templates first + Object.keys(this.pages).forEach(name => { + if (name.includes('Template:')) { + this.pages[name] = this.buildPage(name); + } }); const primaryPages = []; - Object.entries(this.pages).forEach(([_, page]) => { - if (page.metadata.includeInNavbar) { - primaryPages.push(page); + Object.keys(this.pages).forEach(name => { + if (!name.includes('Template:')) { + this.pages[name] = this.buildPage(name); + } + if (this.pages[name].metadata.includeInNavbar) { + primaryPages.push(this.pages[name]); } }); @@ -148,7 +162,7 @@ export class PageDirectory { } catch { return undefined; } - const result = parse(data); + const result = parse(this, data); const title = result.metadata.displayTitle ?? name const content = `${result.metadata.notitle ? '' : `<h1>${title}</h1>`}${result.html}`; @@ -193,8 +207,8 @@ export class PageDirectory { } export type Page = { - html: string; - raw: string; + html?: string; + raw?: string; standardName: string, buildTime: number; metadata: PageMetadata; diff --git a/app/wikiparser.mjs b/app/wikiparser.mjs index a74b216..519100b 100644 --- a/app/wikiparser.mjs +++ b/app/wikiparser.mjs @@ -29,7 +29,7 @@ const re = (regex, flag = 'mgi') => { const r = String.raw; const arg = r`\s*([^|}]+?)\s*`; -export function parse(data) { +export function parse(directory, data) { const vars = {}; const metadata = {}; let nowikis = []; @@ -117,19 +117,16 @@ export function parse(data) { // Templates: {{template}} .replace(re(r`{{ \s* ([^#}|]+?) (\|[^}]+)? }} (?!})`), (_, title, params = '') => { if (/{{/.test(params)) return _; - const page = 'Template:' + title.trim().replace(/ /g, '_'); + const page = title.includes(':') ? title : `Template:${title}` // Retrieve template content - let content = ''; - try { - content = fs.readFileSync(page + '.wiki', 'utf8' ); - } - catch { - return `<a class="internal-link redlink" title="${title}" href="${page}">${title}</a>`; + let content = directory.get(page); + if (!content) { + return `<a class="internal-link redlink" title="${title}" href="${page}">Template:${title}</a>`; } // Remove non-template sections - content = content + content = content.raw .replace(/<noinclude>.*?<\/noinclude>/gs, '') .replace(/.*<(includeonly|onlyinclude)>|<\/(includeonly|onlyinclude)>.*/gs, ''); |
