export interface LogEntry { render: () => HTMLElement[]; } export class LogLines implements LogEntry { lines: string[] constructor (...lines: string[]) { this.lines = lines } render (): HTMLElement[] { return this.lines.map(line => { const div = document.createElement("div") div.innerText = line return div }) } } export enum FormatOpt { Damage = "log-damage" } export class FormatText implements LogEntry { constructor (private line: string, private opt: FormatOpt) { } render (): HTMLElement[] { const span = document.createElement("span") span.innerText = this.line span.classList.add(this.opt) return [span] } } export class LogLine implements LogEntry { private parts: Array constructor (...parts: Array) { this.parts = parts } render (): HTMLElement[] { const span = document.createElement("span") this.parts.forEach(part => { if (typeof part === "string") { const partSpan = document.createElement("span") partSpan.innerText = part span.appendChild(partSpan) } else { (part as LogEntry).render().forEach(logPart => { span.appendChild(logPart) }) } }) return [span] } } export class FAElem implements LogEntry { constructor (private name: string) { } render (): HTMLElement[] { const i = document.createElement("i") this.name.split(" ").map(cls => i.classList.add(cls)) return [i] } } export class CompositeLog implements LogEntry { entries: LogEntry[] constructor (...entries: LogEntry[]) { this.entries = entries } render (): HTMLElement[] { return this.entries.flatMap(e => e.render()) } }