making songs almost almost work

This commit is contained in:
Chris Cochrun 2024-12-06 09:24:56 -06:00
parent 9bd657f139
commit 717968a178
2 changed files with 111 additions and 33 deletions

View file

@ -27,7 +27,13 @@ pub enum TextAlignment {
impl From<Value> for TextAlignment { impl From<Value> for TextAlignment {
fn from(value: Value) -> Self { fn from(value: Value) -> Self {
if value == Value::Symbol("middle-center".into()) { Self::from(&value)
}
}
impl From<&Value> for TextAlignment {
fn from(value: &Value) -> Self {
if value == &Value::Symbol("center".into()) {
Self::MiddleCenter Self::MiddleCenter
} else { } else {
Self::TopCenter Self::TopCenter

View file

@ -1,4 +1,4 @@
use std::{collections::HashMap, path::PathBuf}; use std::{collections::HashMap, fmt::Display, path::PathBuf};
use cosmic::{executor, iced::Executor}; use cosmic::{executor, iced::Executor};
use crisp::types::{Keyword, Symbol, Value}; use crisp::types::{Keyword, Symbol, Value};
@ -124,7 +124,6 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
let background = let background =
if let Some(background) = list.get(background_position) { if let Some(background) = list.get(background_position) {
dbg!(&background);
Some(slide::lisp_to_background(background)) Some(slide::lisp_to_background(background))
} else { } else {
None None
@ -146,22 +145,39 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
None None
}; };
const DEFAULT_CCLI_LOCATION: usize = 1; const DEFAULT_AUDIO_LOCATION: usize = 1;
let ccli_position = if let Some(ccli) = list let audio_position = if let Some(audio) = list
.iter() .iter()
.position(|v| v == &Value::Keyword(Keyword::from("ccli"))) .position(|v| v == &Value::Keyword(Keyword::from("audio")))
{ {
ccli + 1 audio + 1
} else { } else {
DEFAULT_CCLI_LOCATION DEFAULT_AUDIO_LOCATION
}; };
let ccli = if let Some(ccli) = list.get(ccli_position) { let audio = if let Some(audio) = list.get(audio_position) {
Some(i32::from(ccli).to_string()) Some(PathBuf::from(String::from(audio)))
} else { } else {
None None
}; };
const DEFAULT_CCLI_LOCATION: usize = 1;
let ccli = if let Some(ccli) = list
.iter()
.position(|v| v == &Value::Keyword(Keyword::from("ccli")))
{
let pos = ccli + 1;
list.get(pos).map(|c| i32::from(c).to_string())
} else {
None
};
// let ccli = if let Some(ccli) = list.get(ccli_position) {
// Some(i32::from(ccli).to_string())
// } else {
// None
// };
const DEFAULT_FONT_LOCATION: usize = 1; const DEFAULT_FONT_LOCATION: usize = 1;
let font_position = if let Some(font) = list let font_position = if let Some(font) = list
.iter() .iter()
@ -211,6 +227,24 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
String::from("song") String::from("song")
}; };
const DEFAULT_TEXT_ALIGNMENT_LOCATION: usize = 1;
let text_alignment_position = if let Some(text_alignment) =
list.iter().position(|v| {
v == &Value::Keyword(Keyword::from("text-alignment"))
}) {
text_alignment + 1
} else {
DEFAULT_TEXT_ALIGNMENT_LOCATION
};
let text_alignment = if let Some(text_alignment) =
list.get(text_alignment_position)
{
Some(TextAlignment::from(text_alignment))
} else {
Some(TextAlignment::TopCenter)
};
const DEFAULT_VERSE_ORDER_LOCATION: usize = 1; const DEFAULT_VERSE_ORDER_LOCATION: usize = 1;
let verse_order_position = if let Some(verse_order) = let verse_order_position = if let Some(verse_order) =
list.iter().position(|v| { list.iter().position(|v| {
@ -226,7 +260,7 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
match verse_order { match verse_order {
Value::List(vals) => Some( Value::List(vals) => Some(
vals.into_iter() vals.into_iter()
.map(|v| String::from(v)) .map(|v| String::from(v).to_uppercase())
.collect::<Vec<String>>(), .collect::<Vec<String>>(),
), ),
_ => None, _ => None,
@ -243,6 +277,7 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
text.contains("v1") text.contains("v1")
|| text.contains("text") || text.contains("text")
|| text.contains("c1") || text.contains("c1")
|| text.contains("i1")
} }
_ => false, _ => false,
} && match &inner[1] { } && match &inner[1] {
@ -261,42 +296,77 @@ fn lisp_to_song(list: Vec<Value>) -> Song {
let mut lyrics = vec![]; let mut lyrics = vec![];
for element in lyric_elements { if let Some(ref verse_order) = verse_order {
let Value::List(lyric) = element else { for verse in verse_order {
continue; for element in lyric_elements {
}; let Value::List(lyric) = element else {
let Value::Symbol(Symbol(verse)) = &lyric[0] else { continue;
continue; };
}; let Value::Symbol(Symbol(lyric_verse)) = &lyric[0]
else {
continue;
};
let lyric = format!("{}{}", String::from(&lyric[1]), "\n"); let lyric = String::from(&lyric[1]);
let Some(ref verse_order) = verse_order else {
println!("{lyric}");
let verse_title = match lyric_verse.as_str() {
"i1" => r#"\n\nIntro 1\n"#,
"i2" => r#"\n\nIntro 1\n"#,
"v1" => r#"\n\nVerse 1\n"#,
"v2" => r#"\n\nVerse 2\n"#,
"v3" => r#"\n\nVerse 3\n"#,
"v4" => r#"\n\nVerse 4\n"#,
"v5" => r#"\n\nVerse 5\n"#,
"c1" => r#"\n\nChorus 1\n"#,
"c2" => r#"\n\nChorus 2\n"#,
"c3" => r#"\n\nChorus 3\n"#,
"c4" => r#"\n\nChorus 4\n"#,
"b1" => r#"\n\nBridge 1\n"#,
"b2" => r#"\n\nBridge 2\n"#,
"e1" => r#"\n\nEnding 1\n"#,
"e2" => r#"\n\nEnding 2\n"#,
"o1" => r#"\n\nOther 1\n"#,
"o2" => r#"\n\nOther 2\n"#,
_ => "",
};
let lyric = format!("{verse_title}{lyric}");
println!("{lyric}");
if &lyric_verse.to_uppercase() == verse {
lyrics.push(lyric);
}
}
}
} else {
for element in lyric_elements {
let Value::List(lyric) = element else {
continue;
};
let lyric =
format!("{}{}", String::from(&lyric[1]), "\n");
lyrics.push(lyric); lyrics.push(lyric);
continue; }
};
let Some(verse_pos) =
verse_order.iter().position(|v| v == verse)
else {
error!("Should be a verse here");
continue;
};
lyrics.insert(verse_pos, lyric);
} }
let lyrics = lyrics.iter().flat_map(|s| s.chars()).collect(); let lyrics: String =
lyrics.iter().flat_map(|s| s.chars()).collect();
let lyrics = lyrics.replace(r#"\"#, "\\");
let lyrics = lyrics.trim_start_matches("\\n\\n").to_string();
Song { Song {
id: 0, id: DEFAULT_SONG_ID,
title, title,
lyrics: Some(lyrics), lyrics: Some(lyrics),
author, author,
audio,
ccli, ccli,
verse_order, verse_order,
background, background,
font, font,
font_size, font_size,
text_alignment,
..Default::default() ..Default::default()
} }
} }
@ -592,6 +662,8 @@ You saved my soul"
let value = test_lisp_song(); let value = test_lisp_song();
let song = Song::from(value); let song = Song::from(value);
let test_song = test_song(); let test_song = test_song();
println!("{}", test_song.lyrics.clone().unwrap());
println!("{}", song.lyrics.clone().unwrap());
assert_eq!(test_song, song); assert_eq!(test_song, song);
} }
} }