lyrics-structure
Version:
Parse lyrics with bracketed sections into structured parts, with slide generation for presentations
52 lines (51 loc) • 1.75 kB
JavaScript
;
/**
* Splits text into natural sections based on text structure.
* Works with plain text without requiring markdown or special formatting.
* Empty lines are treated as natural separators between parts.
*
* @param text - The input text to be split into sections
* @param maxLines - Maximum number of lines to include in a single slide (default: 4)
* @returns An array of content sections
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSlideParts = void 0;
const lyrics_1 = require("./lyrics");
const isLineTooLong = (line) => line.length > 60;
const processContent = (content, maxLines) => {
const slides = [];
let currentSlide = [];
content.split('\n').forEach((line) => {
const trimmedLine = line.trim();
if (!trimmedLine) {
if (currentSlide.length > 0) {
slides.push(currentSlide.join('\n'));
currentSlide = [];
}
return;
}
if (currentSlide.length >= maxLines ||
(currentSlide.length >= 2 && currentSlide.filter(isLineTooLong).length >= 2)) {
slides.push(currentSlide.join('\n'));
currentSlide = [];
}
currentSlide.push(trimmedLine);
});
if (currentSlide.length > 0) {
slides.push(currentSlide.join('\n'));
}
return slides;
};
const getSlideParts = (text, maxLines = 4) => {
if (!text)
return [];
const partsText = (0, lyrics_1.getLyricsParts)(text).map((part) => part.content);
const result = [];
partsText.forEach((part) => {
if (part) {
result.push(...processContent(part, maxLines));
}
});
return result;
};
exports.getSlideParts = getSlideParts;