use std::borrow::Cow;
use super::prelude::*;
use crate::tree::{AnchorTarget, FileSource, FloatAlignment, LinkLocation};
pub const BLOCK_IMAGE: BlockRule = BlockRule {
name: "block-image",
accepts_names: &["image", "=image", "<image", ">image", "f<image", "f>image"],
accepts_star: false,
accepts_score: false,
accepts_newlines: false,
parse_fn,
};
fn parse_fn<'r, 't>(
parser: &mut Parser<'r, 't>,
name: &'t str,
flag_star: bool,
flag_score: bool,
in_head: bool,
) -> ParseResult<'r, 't, Elements<'t>> {
debug!("Parsing image block (name {name}, in-head {in_head})");
assert!(!flag_star, "Image doesn't allow star flag");
assert!(!flag_score, "Image doesn't allow score flag");
assert_block_name(&BLOCK_IMAGE, name);
let (source, mut arguments) = parser.get_head_name_map(&BLOCK_IMAGE, in_head)?;
let (link, target) = match arguments.get("link") {
Some(link_arg) => {
let (parsing_link, target) = match link_arg {
Cow::Borrowed(s) => {
let (s, target) = match s.strip_prefix("*") {
Some(s) => (s, Some(AnchorTarget::NewTab)),
None => (s, None),
};
(Cow::Borrowed(s.trim_start()), target)
}
Cow::Owned(s) => {
let (s, target) = match s.strip_prefix("*") {
Some(s) => (s, Some(AnchorTarget::NewTab)),
None => (s.as_str(), None),
};
(Cow::Owned(s.trim_start().to_owned()), target)
}
};
(Some(LinkLocation::parse(parsing_link)), target)
}
None => (None, None),
};
let alignment = FloatAlignment::parse(name);
let source = match FileSource::parse(source) {
Some(source) => source,
None => return Err(parser.make_err(ParseErrorKind::BlockMalformedArguments)),
};
let element = Element::Image {
source,
link,
alignment,
attributes: arguments.to_attribute_map(parser.settings()),
target,
};
ok!(element)
}