Skip to content

Commit cdabd6f

Browse files
authored
Merge pull request #9 from nikarh/code
Added support for @code ... @endocde commands
2 parents 311cb31 + 6675833 commit cdabd6f

File tree

3 files changed

+234
-58
lines changed

3 files changed

+234
-58
lines changed

src/generator.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,22 @@ pub fn rustdoc(input: String) -> Result<String, ParseError> {
4242

4343
str
4444
}
45-
GrammarItem::Text(v) => if group_started {
46-
v.replacen("*", "", 1)
47-
} else {
48-
v
49-
},
45+
GrammarItem::Text(v) => {
46+
if group_started {
47+
v.replacen("*", "", 1)
48+
} else {
49+
v
50+
}
51+
}
5052
// See <https://stackoverflow.com/a/40354789>
5153
GrammarItem::GroupStart => {
5254
group_started = true;
5355
String::from("# ")
54-
},
56+
}
5557
GrammarItem::GroupEnd => {
5658
group_started = false;
57-
continue
58-
},
59+
continue;
60+
}
5961
};
6062
}
6163

@@ -171,6 +173,12 @@ fn generate_notation(
171173
"par" => String::from("# "),
172174
"details" | "pre" | "post" => String::from("\n\n"),
173175
"brief" | "short" => String::new(),
176+
"code" => {
177+
let lang = params.first().map(|p| p.as_str()).unwrap_or_default();
178+
let lang = lang.strip_prefix('.').unwrap_or(lang);
179+
format!("```{lang}")
180+
}
181+
"endcode" => String::from("```"),
174182
_ => String::new(),
175183
},
176184
(new_param, new_return, new_throw),
@@ -359,6 +367,22 @@ mod test {
359367
);
360368
}
361369

370+
#[test]
371+
fn code() {
372+
test_rustdoc!(
373+
"@code\nfn main() {\n test( [1] ); // @code @throw\n@endcode",
374+
"```\nfn main() {\n test( [1] ); // @code @throw\n```"
375+
);
376+
}
377+
378+
#[test]
379+
fn code_with_lang() {
380+
test_rustdoc!(
381+
"@code{.rs}\nfn main() {\n test( [1] ); // @code @throw\n@endcode",
382+
"```rs\nfn main() {\n test( [1] ); // @code @throw\n```"
383+
);
384+
}
385+
362386
#[test]
363387
fn can_parse_example() {
364388
let example = include_str!("../tests/assets/example-bindgen.rs");

src/lexer.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,22 @@ pub(crate) enum LexItem {
33
At(String),
44
Paren(char),
55
Word(String),
6-
Space,
6+
Whitespace(char),
77
NewLine,
88
}
99

10+
impl LexItem {
11+
pub(crate) fn push_to(&self, acc: &mut String) {
12+
match self {
13+
LexItem::At(s) => acc.push_str(s),
14+
LexItem::Paren(c) => acc.push(*c),
15+
LexItem::Word(s) => acc.push_str(s),
16+
LexItem::Whitespace(c) => acc.push(*c),
17+
LexItem::NewLine => acc.push('\n'),
18+
}
19+
}
20+
}
21+
1022
pub(crate) fn lex(input: String) -> Vec<LexItem> {
1123
let mut result = vec![];
1224

@@ -34,12 +46,8 @@ pub(crate) fn lex(input: String) -> Vec<LexItem> {
3446
'{' | '}' => {
3547
result.push(LexItem::Paren(c));
3648
}
37-
' ' => {
38-
if let Some(v) = result.last_mut() {
39-
if !matches!(v, LexItem::Space) {
40-
result.push(LexItem::Space);
41-
}
42-
}
49+
' ' | '\t' => {
50+
result.push(LexItem::Whitespace(c));
4351
}
4452
'\n' => {
4553
result.push(LexItem::NewLine);
@@ -72,9 +80,9 @@ mod test {
7280
vec![
7381
LexItem::At("@".into()),
7482
LexItem::Word("name".into()),
75-
LexItem::Space,
83+
LexItem::Whitespace(' '),
7684
LexItem::Word("Memory".into()),
77-
LexItem::Space,
85+
LexItem::Whitespace(' '),
7886
LexItem::Word("Management".into())
7987
]
8088
);
@@ -85,9 +93,9 @@ mod test {
8593
vec![
8694
LexItem::At("\\".into()),
8795
LexItem::Word("name".into()),
88-
LexItem::Space,
96+
LexItem::Whitespace(' '),
8997
LexItem::Word("Memory".into()),
90-
LexItem::Space,
98+
LexItem::Whitespace(' '),
9199
LexItem::Word("Management".into())
92100
]
93101
);
@@ -98,9 +106,9 @@ mod test {
98106
vec![
99107
LexItem::At("\\\\".into()),
100108
LexItem::Word("name".into()),
101-
LexItem::Space,
109+
LexItem::Whitespace(' '),
102110
LexItem::Word("Memory".into()),
103-
LexItem::Space,
111+
LexItem::Whitespace(' '),
104112
LexItem::Word("Management".into())
105113
]
106114
);
@@ -116,12 +124,12 @@ mod test {
116124
LexItem::Paren('{'),
117125
LexItem::NewLine,
118126
LexItem::Word("*".into()),
119-
LexItem::Space,
127+
LexItem::Whitespace(' '),
120128
LexItem::At("@".into()),
121129
LexItem::Word("name".into()),
122-
LexItem::Space,
130+
LexItem::Whitespace(' '),
123131
LexItem::Word("Memory".into()),
124-
LexItem::Space,
132+
LexItem::Whitespace(' '),
125133
LexItem::Word("Management".into()),
126134
LexItem::NewLine,
127135
LexItem::At("@".into()),

0 commit comments

Comments
 (0)