Skip to content

Commit d25825d

Browse files
committed
update style
1 parent 3dc276e commit d25825d

6 files changed

Lines changed: 280 additions & 154 deletions

File tree

crates/emmylua_doc_cli/src/html_generator/mod.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ pub fn generate_html(
6969
nav.types.push(NavItem {
7070
name: format!("{} {}", doc.kind, doc.name),
7171
href: filename.clone(),
72+
kind: doc.kind.clone(),
73+
kind_letter: String::new(),
74+
short_name: doc.name.clone(),
7275
active: false,
7376
});
7477
pages.push((filename, doc));
@@ -88,6 +91,9 @@ pub fn generate_html(
8891
nav.modules.push(NavItem {
8992
name: doc.name.clone(),
9093
href: filename.clone(),
94+
kind: "module".to_string(),
95+
kind_letter: String::new(),
96+
short_name: doc.name.clone(),
9197
active: false,
9298
});
9399
pages.push((filename, doc));
@@ -104,13 +110,17 @@ pub fn generate_html(
104110
nav.globals.push(NavItem {
105111
name: doc.name.clone(),
106112
href: filename.clone(),
113+
kind: "global".to_string(),
114+
kind_letter: String::new(),
115+
short_name: doc.name.clone(),
107116
active: false,
108117
});
109118
pages.push((filename, doc));
110119
}
111120
}
112121

113122
sort_nav(&mut nav);
123+
fill_kind_letters(&mut nav);
114124

115125
// Render item pages (in subdirectories -> "../" prefix).
116126
for (filename, mut doc) in pages {
@@ -214,6 +224,23 @@ fn sort_nav(nav: &mut NavModel) {
214224
nav.globals.sort_by(|a, b| a.name.cmp(&b.name));
215225
}
216226

227+
/// Fills the `kind_letter` badge field on every nav item.
228+
fn fill_kind_letters(nav: &mut NavModel) {
229+
for item in nav
230+
.types
231+
.iter_mut()
232+
.chain(nav.modules.iter_mut())
233+
.chain(nav.globals.iter_mut())
234+
{
235+
item.kind_letter = item
236+
.kind
237+
.chars()
238+
.next()
239+
.map(|c| c.to_ascii_uppercase().to_string())
240+
.unwrap_or_default();
241+
}
242+
}
243+
217244
/// Marks the nav entry matching the current page as active.
218245
fn mark_active(nav: &mut NavModel, kind: &str, name: &str) {
219246
let target = match kind {
@@ -256,8 +283,14 @@ fn build_groups(items: &[NavItem]) -> Vec<NavGroup> {
256283
.into_iter()
257284
.map(|(letter, group_items)| {
258285
let open = group_items.iter().any(|item| item.active);
286+
let anchor = if letter == "#" {
287+
"num".to_string()
288+
} else {
289+
letter.clone()
290+
};
259291
NavGroup {
260292
letter,
293+
anchor,
261294
open,
262295
items: group_items,
263296
}

crates/emmylua_doc_cli/src/html_generator/types.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@ use super::render::html_escape;
88
pub struct NavItem {
99
pub name: String,
1010
pub href: String,
11+
/// Item kind for types (`class` / `enum` / `alias`), empty for
12+
/// modules/globals. Used for the small colored badge in listings.
13+
#[serde(default)]
14+
pub kind: String,
15+
/// Uppercase first letter of `kind` (`C` / `E` / `A`), empty when `kind`
16+
/// is empty. Shown on the badge next to the item in listings.
17+
#[serde(default)]
18+
pub kind_letter: String,
19+
/// Display name without the kind prefix. Used by index page listings.
20+
#[serde(default)]
21+
pub short_name: String,
1122
/// Whether this entry corresponds to the current page.
1223
#[serde(default)]
1324
pub active: bool,
@@ -19,6 +30,9 @@ pub struct NavItem {
1930
pub struct NavGroup {
2031
/// The leading character, or `#` for non-alphabetic names.
2132
pub letter: String,
33+
/// URL-safe anchor id for the group (letters map to themselves, `#` to `num`).
34+
#[serde(default)]
35+
pub anchor: String,
2236
/// Whether the group should start expanded (contains the active item).
2337
pub open: bool,
2438
pub items: Vec<NavItem>,
@@ -76,9 +90,16 @@ pub struct HtmlParam {
7690
/// A documented member (method or field).
7791
#[derive(Debug, Serialize, Default)]
7892
pub struct HtmlMember {
93+
/// Full name including the owner prefix (e.g. `buffer.put`); used as the
94+
/// in-page anchor id so deep links stay unique.
7995
pub name: String,
96+
/// Bare member name (e.g. `put`); shown in the TOC, rustdoc-style.
97+
pub short_name: String,
8098
/// Rendered `<pre>` code block.
8199
pub display: String,
100+
/// First paragraph of the description (rendered markdown); shown in the
101+
/// collapsed member header as a one-line summary.
102+
pub summary: Option<String>,
82103
pub description: Option<String>,
83104
pub deprecated: Option<String>,
84105
pub see: Option<String>,
@@ -136,10 +157,23 @@ impl HtmlMember {
136157
display: String,
137158
property: crate::markdown_generator::markdown_types::Property,
138159
) -> HtmlMember {
160+
let short_name = name.rsplit('.').next().unwrap_or(&name).to_string();
161+
let description = property.description.map(|s| render_markdown(&s));
162+
// The summary is the rendered first paragraph of the description.
163+
let summary = description.as_deref().and_then(|html| {
164+
let end = html.find("</p>").map(|i| i + 4).unwrap_or(0);
165+
if end > 0 {
166+
Some(html[..end].to_string())
167+
} else {
168+
None
169+
}
170+
});
139171
HtmlMember {
140172
name,
173+
short_name,
141174
display,
142-
description: property.description.map(|s| render_markdown(&s)),
175+
summary,
176+
description,
143177
deprecated: property.deprecated.map(|s| html_escape(&s)),
144178
see: property.see.map(|s| render_markdown(&s)),
145179
other: property.other.map(|s| render_markdown(&s)),
Lines changed: 29 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,36 @@
11
{% extends "base.html" %}
2+
{% import "macros.html" as macros %}
23
{% block title %}{{ site_name }}{% endblock title %}
34
{% block content %}
4-
<h1 class="item-title">{{ site_name }}</h1>
5-
<p class="lead">Documentation generated from EmmyLua annotations.</p>
6-
7-
<div class="stat-cards">
8-
{% if nav.types | length > 0 %}
9-
<a class="stat-card" href="#types">
10-
<span class="stat-num">{{ nav.types | length }}</span>
11-
<span class="stat-label">Types</span>
12-
</a>
13-
{% endif %}
14-
{% if nav.modules | length > 0 %}
15-
<a class="stat-card" href="#modules">
16-
<span class="stat-num">{{ nav.modules | length }}</span>
17-
<span class="stat-label">Modules</span>
18-
</a>
19-
{% endif %}
20-
{% if nav.globals | length > 0 %}
21-
<a class="stat-card" href="#globals">
22-
<span class="stat-num">{{ nav.globals | length }}</span>
23-
<span class="stat-label">Globals</span>
24-
</a>
25-
{% endif %}
26-
</div>
27-
28-
{% if nav.type_groups %}
29-
<section class="section" id="types">
30-
<h2>Types</h2>
31-
<div class="index-groups">
32-
{% for group in nav.type_groups %}
33-
<div class="index-group">
34-
<div class="index-letter">{{ group.letter }}</div>
35-
<ul class="index-list">
36-
{% for item in group.items %}
37-
<li><a href="{{ item.href }}">{{ item.name }}</a></li>
38-
{% endfor %}
39-
</ul>
40-
</div>
41-
{% endfor %}
5+
<header class="hero">
6+
<h1 class="hero-title">{{ site_name }}</h1>
7+
<p class="hero-lead">Documentation generated from EmmyLua annotations.</p>
8+
<div class="hero-search-hint">
9+
Press <kbd>/</kbd> or <kbd>Ctrl</kbd>+<kbd>K</kbd> to search, or browse below.
4210
</div>
43-
</section>
44-
{% endif %}
45-
46-
{% if nav.module_groups %}
47-
<section class="section" id="modules">
48-
<h2>Modules</h2>
49-
<div class="index-groups">
50-
{% for group in nav.module_groups %}
51-
<div class="index-group">
52-
<div class="index-letter">{{ group.letter }}</div>
53-
<ul class="index-list">
54-
{% for item in group.items %}
55-
<li><a href="{{ item.href }}">{{ item.name }}</a></li>
56-
{% endfor %}
57-
</ul>
58-
</div>
59-
{% endfor %}
11+
<div class="stat-cards">
12+
{% if nav.types | length > 0 %}
13+
<a class="stat-card" href="#types">
14+
<span class="stat-num">{{ nav.types | length }}</span>
15+
<span class="stat-label">Types</span>
16+
</a>
17+
{% endif %}
18+
{% if nav.modules | length > 0 %}
19+
<a class="stat-card" href="#modules">
20+
<span class="stat-num">{{ nav.modules | length }}</span>
21+
<span class="stat-label">Modules</span>
22+
</a>
23+
{% endif %}
24+
{% if nav.globals | length > 0 %}
25+
<a class="stat-card" href="#globals">
26+
<span class="stat-num">{{ nav.globals | length }}</span>
27+
<span class="stat-label">Globals</span>
28+
</a>
29+
{% endif %}
6030
</div>
61-
</section>
62-
{% endif %}
31+
</header>
6332

64-
{% if nav.global_groups %}
65-
<section class="section" id="globals">
66-
<h2>Globals</h2>
67-
<div class="index-groups">
68-
{% for group in nav.global_groups %}
69-
<div class="index-group">
70-
<div class="index-letter">{{ group.letter }}</div>
71-
<ul class="index-list">
72-
{% for item in group.items %}
73-
<li><a href="{{ item.href }}">{{ item.name }}</a></li>
74-
{% endfor %}
75-
</ul>
76-
</div>
77-
{% endfor %}
78-
</div>
79-
</section>
80-
{% endif %}
33+
{{ macros::index_section(id="types", title="Types", groups=nav.type_groups) }}
34+
{{ macros::index_section(id="modules", title="Modules", groups=nav.module_groups) }}
35+
{{ macros::index_section(id="globals", title="Globals", groups=nav.global_groups) }}
8136
{% endblock content %}

crates/emmylua_doc_cli/template/html/item.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ <h2><a class="section-link" href="#fields">Fields</a><span class="section-count"
4848
{% if doc.methods %}
4949
<li><a href="#methods">Methods</a></li>
5050
{% for m in doc.methods %}
51-
<li class="toc-sub"><a href="#{{ m.name }}">{{ m.name }}</a></li>
51+
<li class="toc-sub"><a href="#{{ m.name }}">{{ m.short_name }}</a></li>
5252
{% endfor %}
5353
{% endif %}
5454
{% if doc.fields %}
5555
<li><a href="#fields">Fields</a></li>
5656
{% for f in doc.fields %}
57-
<li class="toc-sub"><a href="#{{ f.name }}">{{ f.name }}</a></li>
57+
<li class="toc-sub"><a href="#{{ f.name }}">{{ f.short_name }}</a></li>
5858
{% endfor %}
5959
{% endif %}
6060
</ul>

crates/emmylua_doc_cli/template/html/macros.html

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
{% macro member(m) %}
2-
<details class="member{% if m.deprecated %} is-deprecated{% endif %}" id="{{ m.name }}">
3-
<summary class="member-head">
4-
<span class="group-caret" aria-hidden="true"></span>
2+
<div class="member{% if m.deprecated %} is-deprecated{% endif %}" id="{{ m.name }}">
3+
<div class="member-head">
54
<span class="member-signature">{{ m.display | safe }}</span>
6-
{% if m.deprecated %}<span class="deprecated-badge deprecated-dot" title="Deprecated"></span>{% endif %}
7-
</summary>
5+
{% if m.deprecated %}<span class="deprecated-badge">Deprecated</span>{% endif %}
6+
</div>
87
<div class="member-body">
98
{% if m.description %}<div class="docblock">{{ m.description }}</div>{% endif %}
109
{% if m.overloads %}
@@ -41,9 +40,38 @@
4140
</dl>
4241
</div>
4342
{% endif %}
44-
{% if m.deprecated %}<div class="deprecated"><span class="deprecated-badge">Deprecated</span>{{ m.deprecated }}</div>{% endif %}
43+
{% if m.deprecated %}<div class="deprecated">{{ m.deprecated }}</div>{% endif %}
4544
{% if m.see %}<div class="see">See: {{ m.see }}</div>{% endif %}
4645
{% if m.other %}<div class="other">{{ m.other }}</div>{% endif %}
4746
</div>
48-
</details>
47+
</div>
48+
{% endmacro %}
49+
50+
{% macro index_section(id, title, groups) %}
51+
{% if groups %}
52+
<section class="section" id="{{ id }}">
53+
<h2><a class="section-link" href="#{{ id }}">{{ title }}</a></h2>
54+
<nav class="letter-bar" aria-label="Jump to letter">
55+
{% for group in groups %}
56+
<a href="#{{ id }}-{{ group.anchor }}">{{ group.letter }}</a>
57+
{% endfor %}
58+
</nav>
59+
<div class="index-groups">
60+
{% for group in groups %}
61+
<div class="index-group" id="{{ id }}-{{ group.anchor }}">
62+
<div class="index-letter">{{ group.letter }}</div>
63+
<ul class="index-list">
64+
{% for item in group.items %}
65+
<li>
66+
<a href="{{ item.href }}">{% if item.kind_letter %}<span class="kind-badge kind-{{ item.kind }}"
67+
aria-hidden="true">{{ item.kind_letter
68+
}}</span>{% endif %}{{ item.short_name }}</a>
69+
</li>
70+
{% endfor %}
71+
</ul>
72+
</div>
73+
{% endfor %}
74+
</div>
75+
</section>
76+
{% endif %}
4977
{% endmacro %}

0 commit comments

Comments
 (0)