use super::{Element, ElementKind, ImagePlaceholder, string_display_width};
pub(super) fn detect_wikilinks(line: &str, content_vis: &mut [bool], elements: &mut Vec<Element>) {
for span in kimun_core::note::wikilink_char_spans(line) {
let overlaps = elements
.iter()
.any(|e| span.start >= e.start_char && span.end <= e.end_char);
if overlaps {
continue;
}
let close = span.end - 2;
for pos in [span.start, span.start + 1, close, close + 1] {
if pos < content_vis.len() {
content_vis[pos] = false;
}
}
elements.push(Element {
start_char: span.start,
end_char: span.end,
kind: ElementKind::WikiLink,
});
}
}
pub(super) fn detect_image_placeholders(
line: &str,
content_vis: &mut [bool],
elements: &mut Vec<Element>,
) -> Vec<ImagePlaceholder> {
use kimun_core::note::{LinkSpanKind, link_char_spans, link_target_filename};
let mut out = Vec::new();
for span in link_char_spans(line) {
if span.kind != LinkSpanKind::Image {
continue;
}
for vis in content_vis.iter_mut().take(span.end).skip(span.start) {
*vis = false;
}
elements.push(Element {
start_char: span.start,
end_char: span.end,
kind: ElementKind::Image,
});
let name = link_target_filename(&span.target);
let placeholder = if name.is_empty() {
"[image]".to_string()
} else {
format!("[{name}]")
};
let placeholder_width = string_display_width(&placeholder);
out.push(ImagePlaceholder {
start_char: span.start,
end_char: span.end,
placeholder,
placeholder_width,
});
}
out.sort_by_key(|p| p.start_char);
out
}