Skip to content

Commit 9e5980b

Browse files
committed
fix(local): handle text parameter as optional in local function
1 parent 4692a23 commit 9e5980b

5 files changed

Lines changed: 72 additions & 11 deletions

File tree

featured-demo/trees/0AFE.typst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#show: kodama
55

66
// Recommended font
7-
// #set text(font: "Inria Sans")
7+
#set text(font: "Inria Sans")
88

99
#metadata((
1010
"title": "Alice, from the Old French name Aalis", //

featured-demo/trees/_lib/kodama.typ

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,23 +101,26 @@
101101
/// -> string
102102
#let tex(raw-tex) = "$" + raw-tex.text + "$"
103103

104-
#let local(slug, text) = with-target-check((export-target) => {
104+
#let local(slug, text: none) = with-target-check((export-target) => {
105105
if export-target == "html" {
106106
html.elem(
107107
"span", // Make it an inline element. This is automatically removed by kodama.
108108
{
109-
let v = text
109+
let v = if text == none { none } else { text }
110110
let attrs = (slug: slug)
111111

112-
if type(text) != content {
112+
if text != none and type(text) != content {
113113
v = none
114114
attrs.insert("value", repri(text))
115115
}
116116

117117
html.elem("kodama-local", v, attrs: attrs)
118118
},
119119
)
120-
} else { underline(stroke: dotted-stroke, text) }
120+
} else {
121+
let label = if text == none { slug } else { text }
122+
underline(stroke: dotted-stroke, label)
123+
}
121124
})
122125

123126
#let embed(url, title, numbering: false, open: true, catalog: true, display-options: false) = {

featured-demo/trees/index.typst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@
1111
"taxon": "example", //
1212
"date": "October 12, 2025", //
1313
"author": "Anonymous",
14+
"0AFE": local("0AFE") // Alice
1415
))
1516

16-
#lorem(32) #local("./0AFF")[*Bob being linked*].
17+
#lorem(32) #local("./0AFF", text: [*Bob being linked*]).
1718

1819
#embed("./0AFE.typst", "Alice when embedded", numbering: true)
1920

2021
#lorem(48)
2122

2223
#subtree(slug: "0AFF", title: "Bob, subtree with slugs", taxon: "exegesis")[
23-
- #lorem(64) #local("0AFE", "Alice when being linked").
24+
- #lorem(64) #local("0AFE", text: "Alice when being linked").
2425
]
2526

2627
#subtree(title: "Christina, anonymous subtree", taxon: "exegesis")[

src/compiler/state.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,60 @@ mod tests {
523523
assert!(html.contains(r#"><span lang="zh">abc</span></a>"#));
524524
}
525525

526+
#[test]
527+
fn test_metadata_local_link_without_text_uses_target_title() {
528+
let mut shallows = HashMap::new();
529+
530+
let mut index_metadata = OrderedMap::new();
531+
index_metadata.insert(
532+
KEY_SLUG.to_string(),
533+
HTMLContent::Plain("index".to_string()),
534+
);
535+
index_metadata.insert(KEY_EXT.to_string(), HTMLContent::Plain("typst".to_string()));
536+
index_metadata.insert(
537+
"author".to_string(),
538+
HTMLContent::Lazy(vec![LazyContent::Local(LocalLink {
539+
url: "/kokic".to_string(),
540+
text: None,
541+
})]),
542+
);
543+
shallows.insert(
544+
Slug::new("index"),
545+
UnresolvedSection {
546+
metadata: HTMLMetaData(index_metadata),
547+
content: HTMLContent::Plain(String::new()),
548+
},
549+
);
550+
551+
let mut target_metadata = OrderedMap::new();
552+
target_metadata.insert(
553+
KEY_SLUG.to_string(),
554+
HTMLContent::Plain("kokic".to_string()),
555+
);
556+
target_metadata.insert(KEY_EXT.to_string(), HTMLContent::Plain("md".to_string()));
557+
target_metadata.insert(
558+
KEY_TITLE.to_string(),
559+
HTMLContent::Plain("Kokic".to_string()),
560+
);
561+
shallows.insert(
562+
Slug::new("kokic"),
563+
UnresolvedSection {
564+
metadata: HTMLMetaData(target_metadata),
565+
content: HTMLContent::Plain(String::new()),
566+
},
567+
);
568+
569+
let state = compile_all_without_missing_index_warning(&shallows).unwrap();
570+
let author = state
571+
.compiled()
572+
.get(&Slug::new("index"))
573+
.and_then(|section| section.metadata.get_str("author"))
574+
.expect("compiled author metadata");
575+
576+
assert!(author.contains(r#"class="link local""#));
577+
assert!(author.contains(">Kokic</a>"));
578+
}
579+
526580
#[test]
527581
fn test_compile_filters_internal_anonymous_sections_from_compiled_graph() {
528582
let mut shallows = HashMap::new();

src/include/kodama.typ

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,23 +101,26 @@
101101
/// -> string
102102
#let tex(raw-tex) = "$" + raw-tex.text + "$"
103103

104-
#let local(slug, text) = with-target-check((export-target) => {
104+
#let local(slug, text: none) = with-target-check((export-target) => {
105105
if export-target == "html" {
106106
html.elem(
107107
"span", // Make it an inline element. This is automatically removed by kodama.
108108
{
109-
let v = text
109+
let v = if text == none { none } else { text }
110110
let attrs = (slug: slug)
111111

112-
if type(text) != content {
112+
if text != none and type(text) != content {
113113
v = none
114114
attrs.insert("value", repri(text))
115115
}
116116

117117
html.elem("kodama-local", v, attrs: attrs)
118118
},
119119
)
120-
} else { underline(stroke: dotted-stroke, text) }
120+
} else {
121+
let label = if text == none { slug } else { text }
122+
underline(stroke: dotted-stroke, label)
123+
}
121124
})
122125

123126
#let embed(url, title, numbering: false, open: true, catalog: true, display-options: false) = {

0 commit comments

Comments
 (0)