summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2016-02-05 22:57:48 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2016-02-05 22:57:48 -0800
commitbc0b49fd61d8628d114d94f348ba925d58c41048 (patch)
treefcb593c0f6a002d40254e4cc71e3870839e0600f
parentc351c72220406d3e934049808ecd09e599487a85 (diff)
Properly handle partially consumed tab.
E.g. in ``` - foo <TAB><TAB>bar ``` we should consume two spaces from the second tab, including two spaces in the code block.
-rw-r--r--src/blocks.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/blocks.c b/src/blocks.c
index 424257c..30e5be6 100644
--- a/src/blocks.c
+++ b/src/blocks.c
@@ -125,8 +125,19 @@ static inline bool accepts_lines(cmark_node_type block_type) {
block_type == CMARK_NODE_CODE_BLOCK);
}
-static void add_line(cmark_node *node, cmark_chunk *ch, bufsize_t offset) {
+static void add_line(cmark_node *node, cmark_chunk *ch, bufsize_t offset,
+ cmark_parser *parser) {
+ int chars_to_tab;
+ int i;
assert(node->open);
+ if (parser->partially_consumed_tab) {
+ offset += 1; // skip over tab
+ // add space characters:
+ chars_to_tab = TAB_STOP - (parser->column % TAB_STOP);
+ for (i = 0; i < chars_to_tab; i++) {
+ cmark_strbuf_putc(&node->string_content, ' ');
+ }
+ }
cmark_strbuf_put(&node->string_content, ch->data + offset, ch->len - offset);
}
@@ -922,7 +933,7 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
parser->current->type == CMARK_NODE_PARAGRAPH &&
cmark_strbuf_len(&parser->current->string_content) > 0) {
- add_line(parser->current, &input, parser->offset);
+ add_line(parser->current, &input, parser->offset, parser);
} else { // not a lazy continuation
@@ -934,11 +945,11 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
if (container->type == CMARK_NODE_CODE_BLOCK) {
- add_line(container, &input, parser->offset);
+ add_line(container, &input, parser->offset, parser);
} else if (container->type == CMARK_NODE_HTML_BLOCK) {
- add_line(container, &input, parser->offset);
+ add_line(container, &input, parser->offset, parser);
int matches_end_condition;
switch (container->as.html_block_type) {
@@ -987,13 +998,13 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
container->as.heading.setext == false) {
chop_trailing_hashtags(&input);
}
- add_line(container, &input, parser->first_nonspace);
+ add_line(container, &input, parser->first_nonspace, parser);
} else {
// create paragraph container for line
container = add_child(parser, container, CMARK_NODE_PARAGRAPH,
parser->first_nonspace + 1);
- add_line(container, &input, parser->first_nonspace);
+ add_line(container, &input, parser->first_nonspace, parser);
}
parser->current = container;