Skip to content

Commit 6d470a9

Browse files
Add a macro to improve code
1 parent d5b6c04 commit 6d470a9

File tree

1 file changed

+39
-117
lines changed

1 file changed

+39
-117
lines changed

src/librustdoc/html/markdown.rs

Lines changed: 39 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,25 @@ thread_local!(pub static PLAYGROUND: RefCell<Option<(Option<String>, String)>> =
104104
RefCell::new(None)
105105
});
106106

107+
macro_rules! event_loop_break {
108+
($parser:expr, $toc_builder:expr, $shorter:expr, $buf:expr, $($end_event:pat)|*) => {{
109+
while let Some(event) = $parser.next() {
110+
match event {
111+
$($end_event)|* => break,
112+
Event::Text(ref s) => {
113+
$buf.push_str(s);
114+
}
115+
Event::SoftBreak | Event::HardBreak if !$buf.is_empty() => {
116+
$buf.push(' ');
117+
}
118+
x => {
119+
looper($parser, &mut $buf, Some(x), $toc_builder, $shorter);
120+
}
121+
}
122+
}
123+
}}
124+
}
125+
107126
pub fn render(w: &mut fmt::Formatter,
108127
s: &str,
109128
print_toc: bool,
@@ -186,21 +205,10 @@ pub fn render(w: &mut fmt::Formatter,
186205
});
187206
}
188207

189-
fn header(parser: &mut Parser, level: i32, toc_builder: &mut Option<TocBuilder>,
190-
buffer: &mut String) {
208+
fn header(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
209+
shorter: MarkdownOutputStyle, level: i32) {
191210
let mut ret = String::new();
192-
while let Some(event) = parser.next() {
193-
match event {
194-
Event::End(Tag::Header(_)) => break,
195-
Event::Text(ref s) => {
196-
ret.push_str(s);
197-
}
198-
Event::SoftBreak | Event::HardBreak if !ret.is_empty() => {
199-
ret.push(' ');
200-
}
201-
_ => {}
202-
}
203-
}
211+
event_loop_break!(parser, toc_builder, shorter, ret, Event::End(Tag::Header(_)));
204212
ret = ret.trim_right().to_owned();
205213

206214
let id = ret.clone();
@@ -236,82 +244,35 @@ pub fn render(w: &mut fmt::Formatter,
236244
ret, lvl = level, id = id, sec = sec));
237245
}
238246

239-
fn codespan(parser: &mut Parser, buffer: &mut String) {
247+
fn codespan(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
248+
shorter: MarkdownOutputStyle) {
240249
let mut content = String::new();
241-
while let Some(event) = parser.next() {
242-
match event {
243-
Event::End(Tag::Code) => break,
244-
Event::Text(ref s) => {
245-
content.push_str(s);
246-
}
247-
Event::SoftBreak | Event::HardBreak if !content.is_empty() => {
248-
content.push(' ');
249-
}
250-
_ => {}
251-
}
252-
}
253-
buffer.push_str(&format!("<code>{}</code>", Escape(&collapse_whitespace(content.trim_right()))));
250+
event_loop_break!(parser, toc_builder, shorter, content, Event::End(Tag::Code));
251+
buffer.push_str(&format!("<code>{}</code>",
252+
Escape(&collapse_whitespace(content.trim_right()))));
254253
}
255254

256255
fn link(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
257256
shorter: MarkdownOutputStyle, url: &str, mut title: String) {
258-
while let Some(event) = parser.next() {
259-
match event {
260-
Event::End(Tag::Link(_, _)) => break,
261-
Event::Text(ref s) => {
262-
title.push_str(s);
263-
}
264-
Event::SoftBreak | Event::HardBreak if !title.is_empty() => {
265-
title.push(' ');
266-
}
267-
x => {
268-
looper(parser, &mut title, Some(x), toc_builder, shorter);
269-
}
270-
}
271-
}
257+
event_loop_break!(parser, toc_builder, shorter, title, Event::End(Tag::Link(_, _)));
272258
buffer.push_str(&format!("<a href=\"{}\">{}</a>", url, title));
273259
}
274260

275261
fn paragraph(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
276262
shorter: MarkdownOutputStyle) {
277263
let mut content = String::new();
278-
while let Some(event) = parser.next() {
279-
match event {
280-
Event::End(Tag::Paragraph) => break,
281-
Event::Text(ref s) => {
282-
content.push_str(s);
283-
}
284-
Event::SoftBreak | Event::HardBreak if !content.is_empty() => {
285-
content.push(' ');
286-
}
287-
x => {
288-
looper(parser, &mut content, Some(x), toc_builder, shorter);
289-
}
290-
}
291-
}
264+
event_loop_break!(parser, toc_builder, shorter, content, Event::End(Tag::Paragraph));
292265
buffer.push_str(&format!("<p>{}</p>", content.trim_right()));
293266
}
294267

295268
fn cell(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
296269
shorter: MarkdownOutputStyle) {
297270
let mut content = String::new();
298-
while let Some(event) = parser.next() {
299-
match event {
300-
Event::End(Tag::TableHead) |
301-
Event::End(Tag::Table(_)) |
302-
Event::End(Tag::TableRow) |
303-
Event::End(Tag::TableCell) => break,
304-
Event::Text(ref s) => {
305-
content.push_str(s);
306-
}
307-
Event::SoftBreak | Event::HardBreak => {
308-
content.push(' ');
309-
}
310-
x => {
311-
looper(parser, &mut content, Some(x), toc_builder, shorter);
312-
}
313-
}
314-
}
271+
event_loop_break!(parser, toc_builder, shorter, content,
272+
Event::End(Tag::TableHead) |
273+
Event::End(Tag::Table(_)) |
274+
Event::End(Tag::TableRow) |
275+
Event::End(Tag::TableCell));
315276
buffer.push_str(&format!("<td>{}</td>", content.trim()));
316277
}
317278

@@ -381,20 +342,7 @@ pub fn render(w: &mut fmt::Formatter,
381342
fn blockquote(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
382343
shorter: MarkdownOutputStyle) {
383344
let mut content = String::new();
384-
while let Some(event) = parser.next() {
385-
match event {
386-
Event::End(Tag::BlockQuote) => break,
387-
Event::Text(ref s) => {
388-
content.push_str(s);
389-
}
390-
Event::SoftBreak | Event::HardBreak if !content.is_empty() => {
391-
content.push(' ');
392-
}
393-
x => {
394-
looper(parser, &mut content, Some(x), toc_builder, shorter);
395-
}
396-
}
397-
}
345+
event_loop_break!(parser, toc_builder, shorter, content, Event::End(Tag::BlockQuote));
398346
buffer.push_str(&format!("<blockquote>{}</blockquote>", content.trim_right()));
399347
}
400348

@@ -435,40 +383,14 @@ pub fn render(w: &mut fmt::Formatter,
435383
fn emphasis(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
436384
shorter: MarkdownOutputStyle) {
437385
let mut content = String::new();
438-
while let Some(event) = parser.next() {
439-
match event {
440-
Event::End(Tag::Emphasis) => break,
441-
Event::Text(ref s) => {
442-
content.push_str(s);
443-
}
444-
Event::SoftBreak | Event::HardBreak if !content.is_empty() => {
445-
content.push(' ');
446-
}
447-
x => {
448-
looper(parser, &mut content, Some(x), toc_builder, shorter);
449-
}
450-
}
451-
}
386+
event_loop_break!(parser, toc_builder, shorter, content, Event::End(Tag::Emphasis));
452387
buffer.push_str(&format!("<em>{}</em>", content));
453388
}
454389

455390
fn strong(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>,
456391
shorter: MarkdownOutputStyle) {
457392
let mut content = String::new();
458-
while let Some(event) = parser.next() {
459-
match event {
460-
Event::End(Tag::Strong) => break,
461-
Event::Text(ref s) => {
462-
content.push_str(s);
463-
}
464-
Event::SoftBreak | Event::HardBreak if !content.is_empty() => {
465-
content.push(' ');
466-
}
467-
x => {
468-
looper(parser, &mut content, Some(x), toc_builder, shorter);
469-
}
470-
}
471-
}
393+
event_loop_break!(parser, toc_builder, shorter, content, Event::End(Tag::Strong));
472394
buffer.push_str(&format!("<strong>{}</strong>", content));
473395
}
474396

@@ -480,10 +402,10 @@ pub fn render(w: &mut fmt::Formatter,
480402
block(parser, buffer, &*lang);
481403
}
482404
Event::Start(Tag::Header(level)) => {
483-
header(parser, level, toc_builder, buffer);
405+
header(parser, buffer, toc_builder, shorter, level);
484406
}
485407
Event::Start(Tag::Code) => {
486-
codespan(parser, buffer);
408+
codespan(parser, buffer, toc_builder, shorter);
487409
}
488410
Event::Start(Tag::Paragraph) => {
489411
paragraph(parser, buffer, toc_builder, shorter);

0 commit comments

Comments
 (0)