From 0c17eb50831362d53b420a4d7761be00d488efd5 Mon Sep 17 00:00:00 2001 From: Victoria Mitchell Date: Wed, 27 Jan 2021 13:15:43 -0700 Subject: [PATCH 1/3] apply block offsets for autolink source position info --- api_test/main.c | 11 +++++++++-- src/inlines.c | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/api_test/main.c b/api_test/main.c index 62006eaa9..bf9b4a765 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -1062,13 +1062,15 @@ static void source_pos_inlines(test_batch_runner *runner) { { static const char markdown[] = "*first*\n" - "second\n"; + "second\n" + "\n" + " "; cmark_node *doc = cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT); char *xml = cmark_render_xml(doc, CMARK_OPT_DEFAULT | CMARK_OPT_SOURCEPOS); STR_EQ(runner, xml, "\n" "\n" - "\n" + "\n" " \n" " \n" " first\n" @@ -1076,6 +1078,11 @@ static void source_pos_inlines(test_batch_runner *runner) { " \n" " second\n" " \n" + " \n" + " \n" + " http://example.com\n" + " \n" + " \n" "\n", "sourcepos are as expected"); free(xml); diff --git a/src/inlines.c b/src/inlines.c index c21430bde..120dd897c 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -150,8 +150,8 @@ static CMARK_INLINE cmark_node *make_autolink(subject *subj, link->as.link.url = cmark_clean_autolink(subj->mem, &url, is_email); link->as.link.title = cmark_chunk_literal(""); link->start_line = link->end_line = subj->line; - link->start_column = start_column + 1; - link->end_column = end_column + 1; + link->start_column = start_column + 1 + subj->column_offset + subj->block_offset; + link->end_column = end_column + 1 + subj->column_offset + subj->block_offset; cmark_node_append_child(link, make_str_with_entities(subj, start_column + 1, end_column - 1, &url)); return link; } From b1110b8a875c743d211f4131183c5847db1eb25e Mon Sep 17 00:00:00 2001 From: Victoria Mitchell Date: Wed, 27 Jan 2021 13:15:51 -0700 Subject: [PATCH 2/3] don't let blocks get end lines before their start lines --- api_test/main.c | 7 +++++-- src/blocks.c | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api_test/main.c b/api_test/main.c index bf9b4a765..8b187dc90 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -1004,13 +1004,14 @@ static void source_pos(test_batch_runner *runner) { "> Sure.\n" ">\n" "> 2. Yes, okay.\n" - "> ![ok](hi \"yes\")\n"; + "> ![ok](hi \"yes\")\n" + ""; cmark_node *doc = cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT); char *xml = cmark_render_xml(doc, CMARK_OPT_DEFAULT | CMARK_OPT_SOURCEPOS); STR_EQ(runner, xml, "\n" "\n" - "\n" + "\n" " \n" " Hi \n" " \n" @@ -1052,6 +1053,8 @@ static void source_pos(test_batch_runner *runner) { " \n" " \n" " \n" + " <!-- HTML Comment -->\n" + "\n" "\n", "sourcepos are as expected"); free(xml); diff --git a/src/blocks.c b/src/blocks.c index 53e882f19..5a8bcc1c6 100644 --- a/src/blocks.c +++ b/src/blocks.c @@ -289,7 +289,8 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) { b->end_column = parser->last_line_length; } else if (S_type(b) == CMARK_NODE_DOCUMENT || (S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) || - (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext)) { + (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext) || + (parser->line_number - 1 < b->end_line)) { b->end_line = parser->line_number; b->end_column = parser->curline.size; if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\n') From de9231decf3f106394e31edafec5903bb9424c04 Mon Sep 17 00:00:00 2001 From: Victoria Mitchell Date: Wed, 27 Jan 2021 13:15:53 -0700 Subject: [PATCH 3/3] properly set image/link sourcepos when spanning multiple lines --- api_test/main.c | 17 +++++++++++++++-- src/inlines.c | 3 ++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/api_test/main.c b/api_test/main.c index 8b187dc90..7f8b6ab29 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -1005,13 +1005,18 @@ static void source_pos(test_batch_runner *runner) { ">\n" "> 2. Yes, okay.\n" "> ![ok](hi \"yes\")\n" - ""; + "\n" + "\n" + "what happens if we spread a link [across multiple\n" + "lines][anchor]\n" + "\n" + "[anchor]: http://example.com\n"; cmark_node *doc = cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT); char *xml = cmark_render_xml(doc, CMARK_OPT_DEFAULT | CMARK_OPT_SOURCEPOS); STR_EQ(runner, xml, "\n" "\n" - "\n" + "\n" " \n" " Hi \n" " \n" @@ -1055,6 +1060,14 @@ static void source_pos(test_batch_runner *runner) { " \n" " <!-- HTML Comment -->\n" "\n" + " \n" + " what happens if we spread a link \n" + " \n" + " across multiple\n" + " \n" + " lines\n" + " \n" + " \n" "\n", "sourcepos are as expected"); free(xml); diff --git a/src/inlines.c b/src/inlines.c index 120dd897c..0ce0ca8c0 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -1163,8 +1163,9 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) { inl = make_simple(subj->mem, is_image ? CMARK_NODE_IMAGE : CMARK_NODE_LINK); inl->as.link.url = url; inl->as.link.title = title; - inl->start_line = inl->end_line = subj->line; + inl->start_line = opener->inl_text->start_line; inl->start_column = opener->inl_text->start_column; + inl->end_line = subj->line; inl->end_column = subj->pos + subj->column_offset + subj->block_offset; cmark_node_insert_before(opener->inl_text, inl); // Add link text: