From a71e95bf4f07e044eb3f335929d2adea74247a9e Mon Sep 17 00:00:00 2001 From: Minijackson Date: Sun, 22 Dec 2019 18:10:39 +0100 Subject: Fix TOC links for inline documentation --- src/generator/pandoc.rs | 64 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 22 deletions(-) (limited to 'src/generator') diff --git a/src/generator/pandoc.rs b/src/generator/pandoc.rs index 035acab..fe2e2f0 100644 --- a/src/generator/pandoc.rs +++ b/src/generator/pandoc.rs @@ -35,13 +35,7 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< let entity_kind = entity.kind; for (children_kind, children) in entity.children { - if config - .inlines - .get(&entity.language) - .and_then(|lang_inlines| lang_inlines.get(&entity_kind)) - .map(|children_inlines| children_inlines.contains(&children_kind)) - == Some(true) - { + if is_inline(config, entity.language, &entity_kind, &children_kind) { inline_children.insert(children_kind, children); } else { // By default, do not inline @@ -50,7 +44,7 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< } for (section_name, children) in &separate_children { - if let Some(members_list) = member_list(children) { + if let Some(members_list) = member_list(children, LinkType::External) { content.push(Block::Header( 2, Attr::null(), @@ -61,10 +55,10 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< } } - let mut embedded_documentation = Vec::new(); + let mut inline_documentation = Vec::new(); for (section_name, children) in inline_children { - if let Some(members_list) = member_list(&children) { + if let Some(members_list) = member_list(&children, LinkType::Anchor) { content.push(Block::Header( 2, Attr::null(), @@ -73,20 +67,20 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< content.push(members_list); - embedded_documentation.push(Block::Header( + inline_documentation.push(Block::Header( 2, Attr::null(), vec![Inline::Str(section_name.0 + " Documentation")], )); - for (_id, child) in children { - embedded_documentation.push(Block::Header( + for (id, child) in children { + inline_documentation.push(Block::Header( 3, - Attr::null(), + Attr(id.0, vec![], vec![]), vec![Inline::Code(Attr::null(), child.name)], )); - embedded_documentation.push(Block::Div( + inline_documentation.push(Block::Div( Attr(String::new(), vec![String::from("doc")], vec![]), vec![raw_markdown(child.documentation)], )); @@ -94,7 +88,7 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< } } - content.append(&mut embedded_documentation); + content.append(&mut inline_documentation); let leftovers = separate_children .into_iter() @@ -105,11 +99,25 @@ pub(crate) fn into_pandoc(entity: Entity, config: &Config) -> (Pandoc, BTreeMap< (Pandoc(meta, content), leftovers) } +fn is_inline( + config: &Config, + language: Language, + parent_kind: &EntityKind, + children_kind: &ChildrenKind, +) -> bool { + config + .inlines + .get(&language) + .and_then(|lang_inlines| lang_inlines.get(parent_kind)) + .map(|children_inlines| children_inlines.contains(children_kind)) + == Some(true) +} + fn str_block(content: String) -> Block { Block::Plain(vec![Inline::Str(content)]) } -fn entity_link(id: &EntityId, name: String) -> Inline { +fn entity_link(id: &EntityId, name: String, link_type: LinkType) -> Inline { use pandoc_types::definition::Target; use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS}; @@ -131,9 +139,12 @@ fn entity_link(id: &EntityId, name: String) -> Inline { Attr::null(), vec![Inline::Code(Attr::null(), name)], Target( - once("./") - .chain(utf8_percent_encode(&id.0, FRAGMENT)) - .collect(), + once(match link_type { + LinkType::External => "./", + LinkType::Anchor => "#", + }) + .chain(utf8_percent_encode(&id.0, FRAGMENT)) + .collect(), String::new(), ), ) @@ -144,12 +155,21 @@ fn raw_markdown(text: String) -> Block { Block::RawBlock(Format(String::from("markdown")), text) } -fn member_list<'a>(members: impl IntoIterator) -> Option { +#[derive(Debug, Clone, Copy)] +enum LinkType { + Anchor, + External, +} + +fn member_list<'a>( + members: impl IntoIterator, + link_type: LinkType, +) -> Option { let definitions: Vec<(Vec, Vec>)> = members .into_iter() .map(|(id, entity)| { ( - vec![entity_link(id, entity.name.clone())], + vec![entity_link(id, entity.name.clone(), link_type)], vec![vec![str_block(entity.brief_description.clone())]], ) }) -- cgit v1.2.3