use crate::converter::main_helpers::trim_trailing_whitespace;
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,
};
if ctx.convert_as_inline {
let children = tag.children();
{
for child_handle in children.top().iter() {
walk_node(child_handle, parser, output, options, ctx, depth + 1, dom_ctx);
}
}
return;
}
let content_start_pos = output.len();
let is_table_continuation =
ctx.in_table_cell && !output.is_empty() && !output.ends_with('|') && !output.ends_with("<br>");
let is_list_continuation = ctx.in_list_item
&& !output.is_empty()
&& !output.ends_with("* ")
&& !output.ends_with("- ")
&& !output.ends_with(". ");
let needs_leading_sep = !ctx.in_table_cell
&& !ctx.in_list_item
&& !ctx.convert_as_inline
&& !output.is_empty()
&& !output.ends_with("\n\n");
if is_table_continuation {
trim_trailing_whitespace(output);
if options.br_in_tables {
output.push_str("<br>");
} else {
use crate::options::NewlineStyle;
match options.newline_style {
NewlineStyle::Spaces => output.push_str(" \n"),
NewlineStyle::Backslash => output.push_str("\\\n"),
}
}
} else if is_list_continuation {
add_list_continuation_indent(output, ctx.list_depth, false, options);
} else if needs_leading_sep {
trim_trailing_whitespace(output);
output.push_str("\n\n");
}
let children = tag.children();
{
for child_handle in children.top().iter() {
walk_node(child_handle, parser, output, options, ctx, depth + 1, dom_ctx);
}
}
let has_content = output.len() > content_start_pos;
if has_content {
if content_start_pos == 0 && output.starts_with('\n') && !output.starts_with("\n\n") {
output.remove(0);
}
trim_trailing_whitespace(output);
if ctx.in_table_cell {
} else if ctx.in_list_item {
if is_list_continuation {
if !output.ends_with('\n') {
output.push('\n');
}
} else if !output.ends_with("\n\n") {
if output.ends_with('\n') {
output.push('\n');
} else {
output.push_str("\n\n");
}
}
} else if !ctx.in_list_item && !ctx.convert_as_inline {
if output.ends_with("\n\n") {
} else if output.ends_with('\n') {
output.push('\n');
} else {
output.push_str("\n\n");
}
}
}
}
fn add_list_continuation_indent(
output: &mut String,
list_depth: usize,
_block_level: bool,
_options: &ConversionOptions,
) {
if !output.ends_with('\n') {
output.push('\n');
}
for _ in 0..list_depth {
output.push_str(" ");
}
}