UNPKG

osbtools

Version:

A set of tools for working with osu! storyboards

108 lines (107 loc) 4.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const enums_1 = require("../types/enums"); const parsers_1 = require("../utils/parsers"); const sbEmptyElement_1 = __importDefault(require("./sbEmptyElement")); const layerData = (title) => ({ title, elements: [] }); class Storyboard { #elements = []; #layers = { [enums_1.ESbLayer.Background]: layerData("//Storyboard Layer 0 (Background)"), [enums_1.ESbLayer.Fail]: layerData("//Storyboard Layer 1 (Fail)"), [enums_1.ESbLayer.Pass]: layerData("//Storyboard Layer 2 (Pass)"), [enums_1.ESbLayer.Foreground]: layerData("//Storyboard Layer 3 (Foreground)"), [enums_1.ESbLayer.Overlay]: layerData("//Storyboard Layer 4 (Overlay)"), [enums_1.ESbLayer.Sound]: layerData("//Storyboard Sound Samples") }; constructor(osb) { if (!osb) return; this.parse(osb, false); } addElement(element) { this.#elements.push(element); this.#layers[element.getData().layer].elements.push(element); return this; } parse(osb, createNew = true) { const sb = new Storyboard(); let currentPropertyType = null; let currentPropertyTrimmedLine = null; let currentGroupElement = new sbEmptyElement_1.default(); let currentElement = null; const lines = osb.split("\n"); lines.forEach((line, index) => { if (line.startsWith("//") || line.startsWith("[")) return; const isElementTitle = line.startsWith(enums_1.ESbElementType.Sprite) || line.startsWith(enums_1.ESbElementType.Animation) || line.startsWith(enums_1.ESbElementType.Sample); if (isElementTitle) { currentElement = null; } const isElementProperty = line.startsWith(" "); const isElementPropertyGroup = line.startsWith(" "); if (currentElement) { const trimmedLine = line.trim(); const type = trimmedLine.substring(0, trimmedLine[1] !== "," ? 2 : 1); if (isElementProperty && !isElementPropertyGroup) { currentPropertyType = type; currentPropertyTrimmedLine = trimmedLine; (0, parsers_1.parseElementProperty)(trimmedLine, type, currentElement); } else if (isElementPropertyGroup) { const isLastElementPropertyGroup = (typeof lines[index + 1] === "string" && !lines[index + 1].startsWith(" ")) || !lines[index + 1]; (0, parsers_1.parseElementProperty)(trimmedLine, type, currentGroupElement); if (isLastElementPropertyGroup && currentPropertyType && currentPropertyTrimmedLine) { (0, parsers_1.parseElementGroupProperty)(currentPropertyTrimmedLine, currentPropertyType, currentElement, currentGroupElement); currentGroupElement = new sbEmptyElement_1.default(); } } } (0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Sprite, (element) => { currentElement = element; }); (0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Animation, (element) => { currentElement = element; }); (0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Sample, (element) => { currentElement = element; }); if (currentElement && isElementTitle) { if (!createNew) this.addElement(currentElement); else sb.addElement(currentElement); } }); if (createNew) return sb; } getElements() { return this.#elements; } getElement(index) { return this.#elements[index] || null; } getLayers() { return this.#layers; } toString() { return [ "[Events]", "//Background and Video events", ...Object.entries(this.getLayers()).map(([, layerData]) => { const { title, elements } = layerData ?? {}; return [title, ...elements.map((element) => element.toString())].join("\n"); }) ].join("\n"); } } exports.default = Storyboard;