Skip to content

Commit 4ac8eaa

Browse files
authored
Fix Markdown docs with source-like syntax (#1673)
1 parent 7687beb commit 4ac8eaa

3 files changed

Lines changed: 51 additions & 4 deletions

File tree

crates/core/src/source.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ impl Source {
4949
}
5050

5151
pub fn push_str(&mut self, src: &str) {
52+
self.push_str_impl(src, true);
53+
}
54+
55+
/// Appends literal text with the current indentation without interpreting
56+
/// braces or line comments as source syntax.
57+
pub fn push_str_literal(&mut self, src: &str) {
58+
self.push_str_impl(src, false);
59+
}
60+
61+
fn push_str_impl(&mut self, src: &str, interpret_syntax: bool) {
5262
let lines = src.lines().collect::<Vec<_>>();
5363
for (i, line) in lines.iter().enumerate() {
5464
if !self.continuing_line {
@@ -61,11 +71,11 @@ impl Source {
6171
}
6272

6373
let trimmed = line.trim();
64-
if trimmed.starts_with("//") {
74+
if interpret_syntax && trimmed.starts_with("//") {
6575
self.in_line_comment = true;
6676
}
6777

68-
if !self.in_line_comment {
78+
if interpret_syntax && !self.in_line_comment {
6979
if trimmed.starts_with('}') && self.s.ends_with(" ") {
7080
self.s.pop();
7181
self.s.pop();
@@ -76,7 +86,7 @@ impl Source {
7686
} else {
7787
line.trim_start()
7888
});
79-
if !self.in_line_comment {
89+
if interpret_syntax && !self.in_line_comment {
8090
if trimmed.ends_with('{') {
8191
self.indent += 1;
8292
}
@@ -219,4 +229,13 @@ mod tests {
219229
);
220230
assert_eq!(s.s, "function() {\n x\n}");
221231
}
232+
233+
#[test]
234+
fn literal_text_does_not_change_indentation() {
235+
let mut s = Source::default();
236+
s.indent(1);
237+
s.push_str_literal("}\n{");
238+
s.deindent(1);
239+
assert_eq!(s.s, " }\n {");
240+
}
222241
}

crates/markdown/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ impl InterfaceGenerator<'_> {
444444
None => "\n",
445445
};
446446
for line in docs.lines() {
447-
self.push_str(line.trim());
447+
self.r#gen.src.push_str_literal(line.trim());
448448
self.push_str("\n");
449449
}
450450
}

crates/markdown/tests/codegen.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use wit_bindgen_core::{Files, wit_parser::Resolve};
2+
3+
#[test]
4+
fn doc_line_starting_with_closing_brace() {
5+
const WIT: &str = r#"
6+
package a:b;
7+
8+
world w {
9+
export x: interface {
10+
record r {
11+
/// }
12+
f: u32,
13+
}
14+
}
15+
}
16+
"#;
17+
18+
let mut resolve = Resolve::default();
19+
let package = resolve.push_str("test.wit", WIT).unwrap();
20+
let world = resolve.select_world(&[package], Some("w")).unwrap();
21+
let mut files = Files::default();
22+
let mut generator = wit_bindgen_markdown::Opts::default().build();
23+
24+
generator.generate(&mut resolve, world, &mut files).unwrap();
25+
26+
let markdown = String::from_utf8(files.remove("w.md").unwrap()).unwrap();
27+
assert!(markdown.contains("\n <p>}\n"));
28+
}

0 commit comments

Comments
 (0)