import { Mwn } from "mwn"; import { VideoDescription } from "./main.ts"; function parseTemplate(description: string): Record { const u = new (new Mwn().Wikitext)(description) const r = u.parseTemplates({ namePredicate: (name) => name === "DanceWorkshopDescription", }) if (r.length < 1) { throw new Error("Could not find DanceWorkshopDescription") } if (r.length > 1) { console.warn("More than one DanceWorkshopDescription template found") } const p = r[0] const properties = p.parameters.map(v => ({ [v.name]: v.value })) return Object.assign({}, ...properties) } function parseBlock(header: string, text: string): string { const regex = new RegExp(`===\\s*${header}\\s*===\\s*(?(^\\s*[:*]+.*$\\s+)+)`, "m") const match = text.match(regex) if (!match) { throw new Error(`Could not find block ${header}`) } if (!match.groups) { throw new Error("Faulty regex") } return match.groups['content'].trim() } export function parseSummary(description: string, name: string): VideoDescription { const properties = parseTemplate(description) const b: Partial = {}; if (Object.hasOwn(properties, 'teachers')) { console.warn(`Page ${name} has old template usage [contains 'teachers' key]`) const t = properties['teachers'].split('&').map(item => item.trim()); b.teachers = t } else { b.teachers = [properties['leader'], properties['follower']].filter(v => v !== undefined) } b.location = properties['location'] b.date = properties['date'] b.level = properties['level'] b.event = properties['event'] || b.location if (!Object.hasOwn(properties, 'patterns')) { console.warn(`Page ${name} has old template usage [no 'patterns' key]`) b.patterns = parseBlock("Shown Patterns", description) } else { b.patterns = properties['patterns'] } if (!Object.hasOwn(properties, 'notes')) { console.warn(`Page ${name} has old template usage [no 'notes' key]`) b.notes = parseBlock("Notes", description) } else { b.notes = properties['notes'] } b.path = name const titleMatch = name.match(/File:WCS \w+ (?.+)\.[^.]+/) b.title = titleMatch?.groups ? titleMatch.groups['title'] : name return (b as VideoDescription) }