use super::prelude::*;
pub const BLOCK_SPAN: BlockRule = BlockRule {
name: "block-span",
accepts_names: &["span", "span_"],
accepts_special: false,
accepts_newlines: false,
parse_fn,
};
fn parse_fn<'r, 't>(
log: &slog::Logger,
parser: &mut Parser<'r, 't>,
name: &'t str,
special: bool,
in_head: bool,
) -> ParseResult<'r, 't, Elements<'t>> {
debug!(
log,
"Parsing span block";
"in-head" => in_head,
"name" => name,
);
assert_eq!(special, false, "Span doesn't allow special variant");
assert_block_name(&BLOCK_SPAN, name);
let arguments = parser.get_head_map(&BLOCK_SPAN, in_head)?;
let strip_line_breaks = name.ends_with('_');
let (mut elements, exceptions) = parser.get_body_elements(&BLOCK_SPAN, false)?.into();
if strip_line_breaks {
while let Some(element) = elements.first() {
if !matches!(element, Element::LineBreak | Element::LineBreaks(_)) {
break;
}
elements.remove(0);
}
while let Some(element) = elements.last() {
if !matches!(element, Element::LineBreak | Element::LineBreaks(_)) {
break;
}
elements.pop();
}
}
let element = Element::StyledContainer(StyledContainer::new(
StyledContainerType::Span,
elements,
arguments.to_hash_map(),
));
ok!(element, exceptions)
}