use super::prelude::*;
use crate::tree::{
AnchorTarget, AttributeMap, Element, LinkLabel, LinkLocation, LinkType,
};
use crate::url::normalize_link;
pub fn render_anchor(
ctx: &mut HtmlContext,
elements: &[Element],
attributes: &AttributeMap,
target: Option<AnchorTarget>,
) {
debug!("Rendering anchor");
let target_value = match target {
Some(target) => target.html_attr(),
None => "",
};
ctx.html()
.a()
.attr(attr!(
"class" => "wj-anchor",
"target" => target_value; if target.is_some();;
attributes,
))
.contents(elements);
}
pub fn render_link(
ctx: &mut HtmlContext,
link: &LinkLocation,
extra: Option<&str>,
label: &LinkLabel,
target: Option<AnchorTarget>,
ltype: LinkType,
) {
debug!("Rendering link '{:?}' (type {})", link, ltype.name());
let handle = ctx.handle();
ctx.add_link(link);
let url = normalize_link(link, ctx.handle());
let target_value = match target {
Some(target) => target.html_attr(),
None => "",
};
let css_class = match link {
LinkLocation::Url(url) if url == "javascript:;" => "wj-link-anchor",
LinkLocation::Url(url) if url.starts_with('#') => "wj-link-anchor",
LinkLocation::Url(url) if url.starts_with('/') => "wj-link-internal",
LinkLocation::Url(_) => "wj-link-external",
LinkLocation::Page(page) => {
if ctx.page_exists(page) {
"wj-link-internal"
} else {
"wj-link-internal wj-link-missing"
}
}
};
let interwiki_class = if ltype == LinkType::Interwiki {
" wj-link-interwiki"
} else {
""
};
let site = ctx.info().site.as_ref().to_string();
let mut tag = ctx.html().a();
tag.attr(attr!(
"href" => &url extra.unwrap_or(""),
"target" => target_value; if target.is_some(),
"class" => "wj-link " css_class interwiki_class,
"data-link-type" => ltype.name(),
));
handle.get_link_label(&site, link, label, |label| {
tag.contents(label);
});
}