use super::{DocTarget, utf8::advance_char};
pub(super) fn replace_intradoc_links(s: &str, _target: DocTarget) -> String {
let mut out = String::with_capacity(s.len());
let bytes = s.as_bytes();
let mut i = 0;
while i < bytes.len() {
if i + 1 < bytes.len() && bytes[i] == b'[' && bytes[i + 1] == b'`' {
let search_start = i + 2;
let mut found = false;
let mut j = search_start;
while j + 1 < bytes.len() {
if bytes[j] == b'`' && bytes[j + 1] == b']' {
let inner = &s[search_start..j];
let converted = inner.replace("::", ".");
out.push('`');
out.push_str(&converted);
out.push('`');
i = j + 2;
found = true;
break;
}
j += 1;
}
if !found {
i = advance_char(s, &mut out, i);
}
} else {
i = advance_char(s, &mut out, i);
}
}
out
}
pub(crate) fn wrap_bare_bracket_references(s: &str) -> String {
let mut out = String::with_capacity(s.len());
let bytes = s.as_bytes();
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'[' {
if i + 1 < bytes.len() && bytes[i + 1] == b'`' {
let inner_start = i + 2;
let mut j = inner_start;
let mut found = false;
while j + 1 < bytes.len() {
if bytes[j] == b'`' && bytes[j + 1] == b']' {
let inner = &s[inner_start..j];
out.push('`');
out.push_str(&inner.replace("::", "."));
out.push('`');
i = j + 2;
found = true;
break;
}
j += 1;
}
if !found {
i = advance_char(s, &mut out, i);
}
} else {
let search_start = i + 1;
if let Some(close_pos) = bytes[search_start..].iter().position(|&b| b == b']') {
let bracket_end = search_start + close_pos;
let inner = &s[search_start..bracket_end].trim();
if is_identifier_like(inner) {
out.push('`');
out.push_str(&inner.replace("::", "."));
out.push('`');
i = bracket_end + 1;
} else {
i = advance_char(s, &mut out, i);
}
} else {
i = advance_char(s, &mut out, i);
}
}
} else {
i = advance_char(s, &mut out, i);
}
}
out
}
fn is_identifier_like(s: &str) -> bool {
let trimmed = s.trim();
if trimmed.is_empty() {
return false;
}
let first_char = trimmed.chars().next().unwrap();
if !first_char.is_alphabetic() && first_char != '_' {
return false;
}
trimmed
.chars()
.all(|c| c.is_alphanumeric() || c == '_' || c == ':' || c == '(' || c == ')' || c == '.')
}