diff --git a/api_test/main.c b/api_test/main.c index 62006eaa9..7f8b6ab29 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -1004,13 +1004,19 @@ static void source_pos(test_batch_runner *runner) { "> Sure.\n" ">\n" "> 2. Yes, okay.\n" - "> ![ok](hi \"yes\")\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" @@ -1052,6 +1058,16 @@ static void source_pos(test_batch_runner *runner) { " \n" " \n" " \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); @@ -1062,13 +1078,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 +1094,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/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') diff --git a/src/inlines.c b/src/inlines.c index c21430bde..0ce0ca8c0 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; } @@ -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: