mirror of
https://github.com/mfontanini/presenterm.git
synced 2025-05-05 15:32:58 +00:00
fix: allow interleaved spans and variables in footer
This commit is contained in:
parent
725312e71c
commit
b25fa12b82
@ -178,10 +178,9 @@ impl FooterLine {
|
|||||||
palette: &ColorPalette,
|
palette: &ColorPalette,
|
||||||
) -> Result<Self, InvalidFooterTemplateError> {
|
) -> Result<Self, InvalidFooterTemplateError> {
|
||||||
use FooterTemplateChunk::*;
|
use FooterTemplateChunk::*;
|
||||||
let mut line = Line::default();
|
|
||||||
let FooterVariables { current_slide, total_slides, author, title, sub_title, event, location, date } = vars;
|
let FooterVariables { current_slide, total_slides, author, title, sub_title, event, location, date } = vars;
|
||||||
let arena = Arena::default();
|
let arena = Arena::default();
|
||||||
let parser = MarkdownParser::new(&arena);
|
let mut reassembled = String::new();
|
||||||
for chunk in template.0 {
|
for chunk in template.0 {
|
||||||
let raw_text = match chunk {
|
let raw_text = match chunk {
|
||||||
CurrentSlide => Cow::Owned(current_slide.to_string()),
|
CurrentSlide => Cow::Owned(current_slide.to_string()),
|
||||||
@ -199,20 +198,22 @@ impl FooterLine {
|
|||||||
if raw_text.lines().count() != 1 {
|
if raw_text.lines().count() != 1 {
|
||||||
return Err(InvalidFooterTemplateError::NoNewlines);
|
return Err(InvalidFooterTemplateError::NoNewlines);
|
||||||
}
|
}
|
||||||
let starting_length = raw_text.len();
|
reassembled.push_str(&raw_text);
|
||||||
let raw_text = raw_text.trim_start();
|
}
|
||||||
|
// Inline parsing loses leading/trailing whitespaces so re-add them ourselves
|
||||||
|
let starting_length = reassembled.len();
|
||||||
|
let raw_text = reassembled.trim_start();
|
||||||
let left_whitespace = starting_length - raw_text.len();
|
let left_whitespace = starting_length - raw_text.len();
|
||||||
let raw_text = raw_text.trim_end();
|
let raw_text = raw_text.trim_end();
|
||||||
let right_whitespace = starting_length - raw_text.len() - left_whitespace;
|
let right_whitespace = starting_length - raw_text.len() - left_whitespace;
|
||||||
let inlines = parser.parse_inlines(raw_text)?;
|
let parser = MarkdownParser::new(&arena);
|
||||||
let mut contents = inlines.resolve(palette)?;
|
let inlines = parser.parse_inlines(&reassembled)?;
|
||||||
|
let mut line = inlines.resolve(palette)?;
|
||||||
if left_whitespace != 0 {
|
if left_whitespace != 0 {
|
||||||
contents.0.insert(0, " ".repeat(left_whitespace).into());
|
line.0.insert(0, " ".repeat(left_whitespace).into());
|
||||||
}
|
}
|
||||||
if right_whitespace != 0 {
|
if right_whitespace != 0 {
|
||||||
contents.0.push(" ".repeat(right_whitespace).into());
|
line.0.push(" ".repeat(right_whitespace).into());
|
||||||
}
|
|
||||||
line.0.extend(contents.0);
|
|
||||||
}
|
}
|
||||||
line.apply_style(style);
|
line.apply_style(style);
|
||||||
Ok(Self(line))
|
Ok(Self(line))
|
||||||
@ -320,4 +321,25 @@ mod tests {
|
|||||||
let template = FooterTemplate(vec![chunk]);
|
let template = FooterTemplate(vec![chunk]);
|
||||||
FooterLine::new(template, &Default::default(), &VARIABLES, &PALETTE).expect_err("render succeeded");
|
FooterLine::new(template, &Default::default(), &VARIABLES, &PALETTE).expect_err("render succeeded");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn interleaved_spans() {
|
||||||
|
let chunks = vec![
|
||||||
|
FooterTemplateChunk::Literal("<span style=\"color: palette:red\">".into()),
|
||||||
|
FooterTemplateChunk::CurrentSlide,
|
||||||
|
FooterTemplateChunk::Literal(" / ".into()),
|
||||||
|
FooterTemplateChunk::TotalSlides,
|
||||||
|
FooterTemplateChunk::Literal("</span>".into()),
|
||||||
|
FooterTemplateChunk::Literal("<span style=\"color: green\">".into()),
|
||||||
|
FooterTemplateChunk::Title,
|
||||||
|
FooterTemplateChunk::Literal("</span>".into()),
|
||||||
|
];
|
||||||
|
let template = FooterTemplate(chunks);
|
||||||
|
let line = FooterLine::new(template, &Default::default(), &VARIABLES, &PALETTE).expect("render failed");
|
||||||
|
let expected = &[
|
||||||
|
Text::new("1 / 5", TextStyle::default().fg_color(Color::new(255, 0, 0))),
|
||||||
|
Text::new("hi", TextStyle::default().fg_color(Color::Green)),
|
||||||
|
];
|
||||||
|
assert_eq!(line.0.0, expected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user