use crate::span::Span;
use crate::syntax::ast::{Decl, Link, Node, TextNode, Value};
pub(super) fn caption_node(label: &TextNode) -> Node {
Node {
id: None,
ty: Some("caption".to_string()),
label: Some(label.clone()),
classes: Vec::new(),
style: Vec::new(),
style_span: None,
children: Vec::new(),
links: Vec::new(),
span: label.span,
}
}
pub(super) fn footnote_node(label: &TextNode) -> Node {
Node {
id: None,
ty: Some("footnote".to_string()),
label: Some(label.clone()),
classes: Vec::new(),
style: Vec::new(),
style_span: None,
children: Vec::new(),
links: Vec::new(),
span: label.span,
}
}
pub(super) fn symbol_decl(name: &str, span: Span) -> Decl {
Decl {
name: "symbol".to_string(),
groups: vec![vec![Value::Ident(name.to_string())]],
span,
}
}
pub(super) fn lower_link(w: &Link) -> Link {
let mut labels = Vec::new();
if let Some(head) = &w.label {
labels.push(head.clone());
}
labels.extend(w.labels.iter().cloned());
let mut style = w.style.clone();
let has_along = style.iter().any(|d| d.name == "along");
if !labels.is_empty() && !has_along {
let n = labels.len();
let fractions: Vec<Value> = (0..n)
.map(|i| {
let f = (i as f64 + 1.0) / (n as f64 + 1.0);
Value::Number((f * 100.0).round() / 100.0)
})
.collect();
style.insert(
0,
Decl {
name: "along".to_string(),
groups: vec![fractions],
span: w.span,
},
);
}
Link {
chain: w.chain.clone(),
op: w.op,
classes: w.classes.clone(),
style,
style_span: w.style_span,
label: None,
labels,
span: w.span,
}
}