Skip to content

Commit e485745

Browse files
committed
Fix GFM tables to require a non-pipe in header row
Related-to: GH-20.
1 parent b910e37 commit e485745

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

src/construct/gfm_table.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ pub fn head_row_start(tokenizer: &mut Tokenizer) -> State {
312312
Some(b'|') => State::Retry(StateName::GfmTableHeadRowBreak),
313313
_ => {
314314
tokenizer.tokenize_state.seen = true;
315+
// Count the first character, that isn’t a pipe, double.
316+
tokenizer.tokenize_state.size_b += 1;
315317
State::Retry(StateName::GfmTableHeadRowBreak)
316318
}
317319
}
@@ -332,22 +334,34 @@ pub fn head_row_break(tokenizer: &mut Tokenizer) -> State {
332334
None => {
333335
tokenizer.tokenize_state.seen = false;
334336
tokenizer.tokenize_state.size = 0;
337+
tokenizer.tokenize_state.size_b = 0;
335338
State::Nok
336339
}
337340
Some(b'\n') => {
338-
// Feel free to interrupt:
339-
tokenizer.interrupt = true;
340-
tokenizer.exit(Name::GfmTableRow);
341-
tokenizer.enter(Name::LineEnding);
342-
tokenizer.consume();
343-
tokenizer.exit(Name::LineEnding);
344-
State::Next(StateName::GfmTableHeadDelimiterStart)
341+
// If anything other than one pipe (ignoring whitespace) was used, it’s fine.
342+
if tokenizer.tokenize_state.size_b > 1 {
343+
tokenizer.tokenize_state.size_b = 0;
344+
// Feel free to interrupt:
345+
tokenizer.interrupt = true;
346+
tokenizer.exit(Name::GfmTableRow);
347+
tokenizer.enter(Name::LineEnding);
348+
tokenizer.consume();
349+
tokenizer.exit(Name::LineEnding);
350+
State::Next(StateName::GfmTableHeadDelimiterStart)
351+
} else {
352+
tokenizer.tokenize_state.seen = false;
353+
tokenizer.tokenize_state.size = 0;
354+
tokenizer.tokenize_state.size_b = 0;
355+
State::Nok
356+
}
345357
}
346358
Some(b'\t' | b' ') => {
347359
tokenizer.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok);
348360
State::Retry(space_or_tab(tokenizer))
349361
}
350362
_ => {
363+
tokenizer.tokenize_state.size_b += 1;
364+
351365
// Whether a delimiter was seen.
352366
if tokenizer.tokenize_state.seen {
353367
tokenizer.tokenize_state.seen = false;

tests/gfm_table.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,24 @@ fn gfm_table() -> Result<(), String> {
129129
"should support empty body cells"
130130
);
131131

132+
assert_eq!(
133+
to_html_with_options(":\n|-|\n|a|\n\nb\n|-|\n|c|\n\n|\n|-|\n|d|\n\n|\n|-|\n|e|\n\n|:\n|-|\n|f|\n\n||\n|-|\n|g|\n\n| |\n|-|\n|h|\n", &Options::gfm())?,
134+
"<table>\n<thead>\n<tr>\n<th>:</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>a</td>\n</tr>\n</tbody>\n</table>\n<table>\n<thead>\n<tr>\n<th>b</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>c</td>\n</tr>\n</tbody>\n</table>\n<p>|\n|-|\n|d|</p>\n<p>|\n|-|\n|e|</p>\n<table>\n<thead>\n<tr>\n<th>:</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>f</td>\n</tr>\n</tbody>\n</table>\n<table>\n<thead>\n<tr>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>g</td>\n</tr>\n</tbody>\n</table>\n<table>\n<thead>\n<tr>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>h</td>\n</tr>\n</tbody>\n</table>\n",
135+
"should need any character other than a single pipe in the header row"
136+
);
137+
138+
assert_eq!(
139+
to_html_with_options("a\n|-\n\nb\n||\n\nc\n|-|\n\nd\n|:|\n\ne\n| |\n\nf\n| -|\n\ng\n|- |\n", &Options::gfm())?,
140+
"<table>\n<thead>\n<tr>\n<th>a</th>\n</tr>\n</thead>\n</table>\n<p>b\n||</p>\n<table>\n<thead>\n<tr>\n<th>c</th>\n</tr>\n</thead>\n</table>\n<p>d\n|:|</p>\n<p>e\n| |</p>\n<table>\n<thead>\n<tr>\n<th>f</th>\n</tr>\n</thead>\n</table>\n<table>\n<thead>\n<tr>\n<th>g</th>\n</tr>\n</thead>\n</table>\n",
141+
"should need a dash in the delimimter row"
142+
);
143+
144+
assert_eq!(
145+
to_html_with_options("|\n|", &Options::gfm())?,
146+
"<p>|\n|</p>",
147+
"should need something"
148+
);
149+
132150
assert_eq!(
133151
to_html_with_options("| a |\n| - |\n- b", &Options::gfm())?,
134152
"<table>\n<thead>\n<tr>\n<th>a</th>\n</tr>\n</thead>\n</table>\n<ul>\n<li>b</li>\n</ul>",

0 commit comments

Comments
 (0)