use super::prelude::*;
use crate::tree::{LinkLabel, LinkLocation, LinkType};
use std::borrow::Cow;
use wikidot_normalize::normalize;
pub const RULE_LINK_ANCHOR: Rule = Rule {
name: "link-anchor",
position: LineRequirement::Any,
try_consume_fn,
};
fn try_consume_fn<'r, 't>(
parser: &mut Parser<'r, 't>,
) -> ParseResult<'r, 't, Elements<'t>> {
debug!("Trying to create a single-bracket anchor link");
assert_step(parser, Token::LeftBracketAnchor)?;
let url = collect_text(
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(
parser,
RULE_LINK_ANCHOR,
&[ParseCondition::current(Token::RightBracket)],
&[
ParseCondition::current(Token::ParagraphBreak),
ParseCondition::current(Token::LineBreak),
],
None,
)?;
trace!("Retrieved label ('{label}') for link, building element");
let label = label.trim();
ok!(Element::Link {
ltype: LinkType::Anchor,
link: LinkLocation::Url(url),
label: LinkLabel::Text(cow!(label)),
target: None,
})
}