pub mod slides;
pub mod lilypond;
pub mod abc;
pub mod text;
use crate::song::{Song, SongPartType};
pub(crate) struct LyricsBlock {
pub label: String,
pub lines: Vec<String>,
}
pub(crate) fn readable_lyrics_blocks(song: &Song) -> Vec<LyricsBlock> {
let mut blocks = Vec::new();
let mut verse_number = 1u32;
for part in song.parts() {
for content in &part.contents {
if !content.content_type.is_lyrics() {
continue;
}
let lines: Vec<String> = slides::lyrics_for_reading(&content.content)
.lines()
.map(|line| line.trim().to_string())
.filter(|line| !line.is_empty())
.collect();
if lines.is_empty() {
continue;
}
let label = match part.part_type {
SongPartType::Verse => {
let label = format!("{}.", verse_number);
verse_number += 1;
label
}
SongPartType::Refrain | SongPartType::Chorus => "Refrain".to_string(),
other => {
let name = other.as_str();
let mut chars = name.chars();
match chars.next() {
Some(first) => first.to_uppercase().collect::<String>() + chars.as_str(),
None => name.to_string(),
}
}
};
blocks.push(LyricsBlock { label, lines });
}
}
blocks
}