use super::prelude::*;
use crate::tree::{AnchorTarget, LinkLabel};
use std::borrow::Cow;
use wikidot_normalize::normalize;
pub const RULE_LINK_ANCHOR: Rule = Rule {
name: "link-anchor",
try_consume_fn,
};
fn try_consume_fn<'p, 'r, 't>(
log: &slog::Logger,
parser: &'p mut Parser<'r, 't>,
) -> ParseResult<'r, 't, Elements<'t>> {
debug!(log, "Trying to create a single-bracket anchor link");
check_step(parser, Token::LeftBracketAnchor)?;
let url = collect_text(
log,
parser,
RULE_LINK_ANCHOR,
&[ParseCondition::current(Token::Whitespace)],
&[
ParseCondition::current(Token::RightBracket),
ParseCondition::current(Token::ParagraphBreak),
ParseCondition::current(Token::LineBreak),
],
None,
)?;
let url = if url.is_empty() {
Cow::Borrowed("javascript:;")
} else {
let mut url = str!(url);
normalize(&mut url);
url.insert(0, '#');
Cow::Owned(url)
};
let label = collect_text(
log,
parser,
RULE_LINK_ANCHOR,
&[ParseCondition::current(Token::RightBracket)],
&[
ParseCondition::current(Token::ParagraphBreak),
ParseCondition::current(Token::LineBreak),
],
None,
)?;
debug!(
log,
"Retrieved label for link, now build element";
"label" => label,
);
let label = label.trim();
let element = Element::Link {
url,
label: LinkLabel::Text(cow!(label)),
target: AnchorTarget::Same,
};
ok!(element)
}