use crate::options::ConversionOptions;
use tl::{NodeHandle, Parser};
type Context = crate::converter::Context;
type DomContext = crate::converter::DomContext;
pub fn handle(
node_handle: &NodeHandle,
parser: &Parser,
output: &mut String,
options: &ConversionOptions,
ctx: &Context,
depth: usize,
dom_ctx: &DomContext,
) {
use crate::converter::walk_node;
let Some(node) = node_handle.get(parser) else { return };
let tag = match node {
tl::Node::Tag(tag) => tag,
_ => return,
};
let len_before = output.len();
let had_trailing_space = output.ends_with(' ');
let children = tag.children();
{
for child_handle in children.top().iter() {
walk_node(child_handle, parser, output, options, ctx, depth + 1, dom_ctx);
}
}
let len_after = output.len();
if len_after > len_before {
let start_idx = if output.is_char_boundary(len_before) {
len_before
} else {
let capped = len_before.min(output.len());
output
.char_indices()
.map(|(idx, _)| idx)
.take_while(|idx| *idx <= capped)
.last()
.unwrap_or(capped)
};
let added_content = output[start_idx..].to_string();
let is_code_block =
added_content.starts_with(" ") || added_content.starts_with("```") || added_content.starts_with("~~~");
if added_content.trim().is_empty() && !is_code_block {
output.truncate(start_idx);
if !had_trailing_space && added_content.contains(' ') {
output.push(' ');
}
}
}
}