use super::*;
pub(super) fn survey_chapter(
chapter: &Chapter,
chapter_id: ChapterId,
source_path: &str,
ctx: &mut ExportContext,
) {
let _fragment_id = ctx.begin_chapter_survey(chapter_id, source_path);
survey_node(chapter, chapter.root(), ctx);
ctx.end_chapter_survey();
}
pub(super) fn survey_node(chapter: &Chapter, node_id: NodeId, ctx: &mut ExportContext) {
let node = match chapter.node(node_id) {
Some(n) => n,
None => return,
};
if node.role == Role::Root {
for child in chapter.children(node_id) {
survey_node(chapter, child, ctx);
}
return;
}
ctx.record_position(node_id);
if let Some(src) = chapter.semantics.src(node_id) {
ctx.resource_registry.register(src, &mut ctx.symbols);
}
if !node.text.is_empty() {
let text = chapter.text(node.text);
ctx.advance_text_offset(text.len());
}
for child in chapter.children(node_id) {
survey_node(chapter, child, ctx);
}
}
pub(super) fn register_link_targets(
book: &Book,
spine_info: &[(ChapterId, String)],
resolved: &ResolvedLinks,
ctx: &mut ExportContext,
) -> io::Result<()> {
for (chapter_id, _) in spine_info {
let Ok(chapter) = book.load_chapter_cached(*chapter_id) else {
continue;
};
register_chapter_link_targets(&chapter, *chapter_id, resolved, ctx);
}
Ok(())
}
pub(super) fn register_chapter_link_targets(
chapter: &Chapter,
chapter_id: ChapterId,
resolved: &ResolvedLinks,
ctx: &mut ExportContext,
) {
for node_id in chapter.iter_dfs() {
let Some(node) = chapter.node(node_id) else {
continue;
};
if node.role != Role::Link {
continue;
}
let Some(href) = chapter.semantics.href(node_id) else {
continue;
};
let source = GlobalNodeId::new(chapter_id, node_id);
if let Some(target) = resolved.get(source) {
match target {
AnchorTarget::Internal(target_node) => {
ctx.anchor_registry
.register_internal_target(*target_node, href);
}
AnchorTarget::Chapter(target_chapter) => {
ctx.anchor_registry
.register_chapter_target(*target_chapter, href);
}
AnchorTarget::External(url) => {
ctx.anchor_registry.register_external(url);
}
}
}
}
}