aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/directory.ts28
-rw-r--r--app/wikiparser.mjs15
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, '');