Skip to content

Commit 697b803

Browse files
authored
feat(html): show method and properties of classes under classes on symbol overview pages (#635)
1 parent 93f4ce3 commit 697b803

21 files changed

+330
-109
lines changed

src/html/comrak_adapters.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,25 +315,34 @@ impl HeadingToCAdapter {
315315
let mut toc_content = vec!["<ul>".to_string()];
316316
let mut current_level = toc.iter().map(|entry| entry.level).min().unwrap();
317317

318+
let mut level_diff = 0;
318319
for entry in toc {
319320
match current_level.cmp(&entry.level) {
320321
Ordering::Equal => {}
321322
Ordering::Less => {
323+
level_diff += 1;
322324
toc_content.push(r#"<li><ul>"#.to_string());
323325
current_level = entry.level;
324326
}
325327
Ordering::Greater => {
328+
level_diff -= 1;
326329
toc_content.push("</ul></li>".to_string());
327330
current_level = entry.level;
328331
}
329332
}
330333

331334
toc_content.push(format!(
332335
r##"<li><a href="#{}" title="{}">{}</a></li>"##,
333-
entry.anchor, entry.content, entry.content
336+
entry.anchor,
337+
html_escape::encode_double_quoted_attribute(&entry.content),
338+
entry.content
334339
));
335340
}
336341

342+
for _ in 0..level_diff {
343+
toc_content.push("</ul></li>".to_string());
344+
}
345+
337346
toc_content.push(String::from("</ul>"));
338347

339348
Some(toc_content.join(""))

src/html/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,7 @@ pub fn generate(
775775
}
776776
}
777777

778+
// Category pages
778779
if ctx.file_mode == FileMode::SingleDts {
779780
let categories =
780781
partition::partition_nodes_by_category(&all_doc_nodes, true);

src/html/pages.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use super::STYLESHEET_FILENAME;
2323

2424
use crate::html::usage::UsagesCtx;
2525
use crate::js_doc::JsDocTag;
26+
use crate::node::DocNodeDef;
2627
use crate::DocNode;
2728
use crate::DocNodeKind;
2829
use indexmap::IndexMap;
@@ -505,11 +506,9 @@ pub fn generate_symbol_pages_for_module(
505506
.iter()
506507
.any(|node| node.kind() == DocNodeKind::Class);
507508
for doc_node in doc_nodes {
508-
match doc_node.kind() {
509-
DocNodeKind::Class => {
510-
let class = doc_node.class_def().unwrap();
511-
512-
let method_nodes = class
509+
match &doc_node.def {
510+
DocNodeDef::Class { class_def } => {
511+
let method_nodes = class_def
513512
.methods
514513
.iter()
515514
.map(|method| {
@@ -530,7 +529,7 @@ pub fn generate_symbol_pages_for_module(
530529
drilldown_partitions
531530
.extend(partition::partition_nodes_by_name(&method_nodes, false));
532531

533-
let property_nodes = class
532+
let property_nodes = class_def
534533
.properties
535534
.iter()
536535
.map(|property| {
@@ -545,9 +544,8 @@ pub fn generate_symbol_pages_for_module(
545544
super::partition::partition_nodes_by_name(&property_nodes, false),
546545
);
547546
}
548-
DocNodeKind::Interface => {
549-
let interface = doc_node.interface_def().unwrap();
550-
let method_nodes = interface
547+
DocNodeDef::Interface { interface_def } => {
548+
let method_nodes = interface_def
551549
.methods
552550
.iter()
553551
.filter_map(|method| {
@@ -566,7 +564,7 @@ pub fn generate_symbol_pages_for_module(
566564
.extend(partition::partition_nodes_by_name(&method_nodes, false));
567565

568566
let property_nodes =
569-
interface
567+
interface_def
570568
.properties
571569
.iter()
572570
.filter_map(|property| {
@@ -584,11 +582,9 @@ pub fn generate_symbol_pages_for_module(
584582
drilldown_partitions
585583
.extend(partition::partition_nodes_by_name(&property_nodes, false));
586584
}
587-
DocNodeKind::TypeAlias => {
588-
let type_alias = doc_node.type_alias_def().unwrap();
589-
585+
DocNodeDef::TypeAlias { type_alias_def } => {
590586
if let Some(ts_type_literal) =
591-
type_alias.ts_type.type_literal.as_ref()
587+
type_alias_def.ts_type.type_literal.as_ref()
592588
{
593589
let method_nodes = ts_type_literal
594590
.methods
@@ -629,10 +625,8 @@ pub fn generate_symbol_pages_for_module(
629625
));
630626
}
631627
}
632-
DocNodeKind::Variable => {
633-
let variable = doc_node.variable_def().unwrap();
634-
635-
if let Some(ts_type_literal) = variable
628+
DocNodeDef::Variable { variable_def } => {
629+
if let Some(ts_type_literal) = variable_def
636630
.ts_type
637631
.as_ref()
638632
.and_then(|ts_type| ts_type.type_literal.as_ref())

src/html/render_context.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::html::util::NamespacedSymbols;
44
use crate::html::DocNodeWithContext;
55
use crate::html::GenerateCtx;
66
use crate::html::UrlResolveKind;
7-
use crate::DocNodeKind;
7+
use crate::node::DocNodeDef;
88
use deno_graph::ModuleSpecifier;
99
use std::collections::HashMap;
1010
use std::collections::HashSet;
@@ -340,8 +340,7 @@ fn get_current_imports(
340340
let mut imports = HashMap::new();
341341

342342
for doc_node in doc_nodes {
343-
if doc_node.kind() == DocNodeKind::Import {
344-
let import_def = doc_node.import_def().unwrap();
343+
if let DocNodeDef::Import { import_def } = &doc_node.def {
345344
// TODO: handle import aliasing
346345
if import_def.imported.as_deref() == Some(doc_node.get_name()) {
347346
imports.insert(doc_node.get_name().to_string(), import_def.src.clone());

src/html/symbols/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::html::DocNodeKindWithDrilldown;
77
use crate::html::DocNodeWithContext;
88
use crate::html::RenderContext;
99
use crate::js_doc::JsDocTag;
10+
use crate::node::DocNodeDef;
1011
use crate::DocNodeKind;
1112
use indexmap::IndexMap;
1213
use indexmap::IndexSet;
@@ -189,10 +190,8 @@ impl DocBlockSubtitleCtx {
189190
pub const TEMPLATE_INTERFACE: &'static str = "doc_block_subtitle_interface";
190191

191192
fn new(ctx: &RenderContext, doc_node: &DocNodeWithContext) -> Option<Self> {
192-
match doc_node.kind() {
193-
DocNodeKind::Class => {
194-
let class_def = doc_node.class_def().unwrap();
195-
193+
match &doc_node.def {
194+
DocNodeDef::Class { class_def } => {
196195
let current_type_params = class_def
197196
.type_params
198197
.iter()
@@ -230,9 +229,7 @@ impl DocBlockSubtitleCtx {
230229
extends: class_extends,
231230
})
232231
}
233-
DocNodeKind::Interface => {
234-
let interface_def = doc_node.interface_def().unwrap();
235-
232+
DocNodeDef::Interface { interface_def } => {
236233
if interface_def.extends.is_empty() {
237234
return None;
238235
}

0 commit comments

Comments
 (0)