UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

103 lines (100 loc) 3.45 kB
import { LinkType } from "ssg-api"; import path from "path"; import { glob } from "glob"; export class Chapter { constructor(parentContext, startFileName) { this.startFileName = startFileName; this.subs = []; this.context = parentContext.clone(); } async scan() { this.context.read(this.startFileName); const dir = path.dirname(this.context.file.name); const fileName = path.basename(this.context.file.name); const subFileNames = await glob(path.join(dir, "*/", fileName)); this.subs = []; for (const subFileName of subFileNames) { const subChapter = new Chapter(this.context, subFileName); this.subs.push(subChapter); await subChapter.scan(); } } toString(prefix = "- ") { const file = this.context.file; return `${prefix + file.name}: "${file.title}", meta=${JSON.stringify(file.meta)}, links=${JSON.stringify(file.links)} ${this.subs.map(subFile => subFile.toString(" " + prefix)).join("")}`; } async update(parent) { const file = this.context.file; const meta = file.meta; const links = file.links; if (parent) { const parentFile = parent.context.file; const parentMeta = parentFile.meta; meta.author = parentMeta.author; meta.copyright = parentMeta.copyright; links.contents = { type: LinkType.contents, url: path.join("/", parentFile.name), text: parentFile.title }; links.start = parentFile.links.start; } else { links.start = { type: LinkType.start, url: path.join("/", this.startFileName), text: file.title }; } let prev; for (const sub of this.subs) { const subFile = sub.context.file; if (prev) { prev.context.file.links.next = { type: LinkType.next, url: path.join("/", subFile.name), text: subFile.title }; } sub.context.file.links.prev = prev ? { type: LinkType.prev, url: path.join("/", prev.context.file.name), text: prev.context.file.title } : undefined; await sub.update(this); prev = sub; } } } /* const args = new CLI().getArgs(); const startFileName = args.start; const context = new RR0ContextImpl('fr', new TimeContext({ year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit' } )); const file = HtmlFileContents.read(context, startFileName); const startFileNames = [file.name]; const variants = file.lang.variants; for (const variant of variants) { const parsed = path.parse(startFileName); const variantFileName = path.join(parsed.dir, `${parsed.name}_${variant}${parsed.ext}`); startFileNames.push(variantFileName); } for (const startFileName of startFileNames) { const chapter = new Chapter(context as unknown as HtmlRR0Context, startFileName); chapter.scan().then(async () => { console.log('*** Before:\n', chapter.toString()); await chapter.update(); console.log('\n*** After:\n', chapter.toString()); }).catch(e => { console.error(e); }); } */