From 949bcb1f8d9695171d0dc88461f6a16800ac57c9 Mon Sep 17 00:00:00 2001 From: Brett Walker Date: Wed, 3 Apr 2019 08:42:23 -0500 Subject: [PATCH] Fenced blockquotes to not change source line pos Replaces blockquote fences with \n, keeping the line numbering intact. --- ...ot-be-checked-if-a-blockquote-is-above.yml | 5 +++++ lib/banzai/filter/blockquote_fence_filter.rb | 4 +++- spec/fixtures/blockquote_fence_after.md | 16 ++++++++++++++ .../filter/blockquote_fence_filter_spec.rb | 2 +- spec/services/issues/build_service_spec.rb | 4 +++- .../services/task_list_toggle_service_spec.rb | 21 +++++++++++++++++++ 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/58717-checkbox-cannot-be-checked-if-a-blockquote-is-above.yml diff --git a/changelogs/unreleased/58717-checkbox-cannot-be-checked-if-a-blockquote-is-above.yml b/changelogs/unreleased/58717-checkbox-cannot-be-checked-if-a-blockquote-is-above.yml new file mode 100644 index 00000000000..9f5881966c7 --- /dev/null +++ b/changelogs/unreleased/58717-checkbox-cannot-be-checked-if-a-blockquote-is-above.yml @@ -0,0 +1,5 @@ +--- +title: Allow task lists that follow a blockquote to work correctly +merge_request: 26937 +author: +type: fixed diff --git a/lib/banzai/filter/blockquote_fence_filter.rb b/lib/banzai/filter/blockquote_fence_filter.rb index ad367cc5efe..8f5ad9981e5 100644 --- a/lib/banzai/filter/blockquote_fence_filter.rb +++ b/lib/banzai/filter/blockquote_fence_filter.rb @@ -42,7 +42,9 @@ module Banzai def call @text.gsub(REGEX) do if $~[:quote] - $~[:quote].gsub(/^/, "> ").gsub(/^> $/, ">") + # keep the same number of source lines/positions by replacing the + # fence lines with newlines + "\n" + $~[:quote].gsub(/^/, "> ").gsub(/^> $/, ">") + "\n" else $~[0] end diff --git a/spec/fixtures/blockquote_fence_after.md b/spec/fixtures/blockquote_fence_after.md index 2652a842c0e..555905bf07e 100644 --- a/spec/fixtures/blockquote_fence_after.md +++ b/spec/fixtures/blockquote_fence_after.md @@ -18,10 +18,13 @@ Double `>>>` inside code block: Blockquote outside code block: + > Quote + Code block inside blockquote: + > Quote > > ``` @@ -30,8 +33,10 @@ Code block inside blockquote: > > Quote + Single `>>>` inside code block inside blockquote: + > Quote > > ``` @@ -42,8 +47,10 @@ Single `>>>` inside code block inside blockquote: > > Quote + Double `>>>` inside code block inside blockquote: + > Quote > > ``` @@ -56,6 +63,7 @@ Double `>>>` inside code block inside blockquote: > > Quote + Single `>>>` inside HTML:
@@ -76,10 +84,13 @@ Double `>>>` inside HTML:
 
 Blockquote outside HTML:
 
+
 > Quote
 
+
 HTML inside blockquote:
 
+
 > Quote
 >
 > 
@@ -88,8 +99,10 @@ HTML inside blockquote:
 >
 > Quote
 
+
 Single `>>>` inside HTML inside blockquote:
 
+
 > Quote
 >
 > 
@@ -100,8 +113,10 @@ Single `>>>` inside HTML inside blockquote:
 >
 > Quote
 
+
 Double `>>>` inside HTML inside blockquote:
 
+
 > Quote
 >
 > 
@@ -113,3 +128,4 @@ Double `>>>` inside HTML inside blockquote:
 > 
> > Quote + diff --git a/spec/lib/banzai/filter/blockquote_fence_filter_spec.rb b/spec/lib/banzai/filter/blockquote_fence_filter_spec.rb index b645e49bd43..5b3f679084e 100644 --- a/spec/lib/banzai/filter/blockquote_fence_filter_spec.rb +++ b/spec/lib/banzai/filter/blockquote_fence_filter_spec.rb @@ -13,6 +13,6 @@ describe Banzai::Filter::BlockquoteFenceFilter do end it 'allows trailing whitespace on blockquote fence lines' do - expect(filter(">>> \ntest\n>>> ")).to eq("> test") + expect(filter(">>> \ntest\n>>> ")).to eq("\n> test\n") end end diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb index 86e58fe06b9..74f1e83b362 100644 --- a/spec/services/issues/build_service_spec.rb +++ b/spec/services/issues/build_service_spec.rb @@ -58,8 +58,10 @@ describe Issues::BuildService do "> That has a quote\n"\ ">>>\n" note_result = " > This is a string\n"\ + " > \n"\ " > > with a blockquote\n"\ - " > > > That has a quote\n" + " > > > That has a quote\n"\ + " > \n" discussion = create(:diff_note_on_merge_request, note: note_text).to_discussion expect(service.item_for_discussion(discussion)).to include(note_result) end diff --git a/spec/services/task_list_toggle_service_spec.rb b/spec/services/task_list_toggle_service_spec.rb index b1260cf740a..9adaee6481b 100644 --- a/spec/services/task_list_toggle_service_spec.rb +++ b/spec/services/task_list_toggle_service_spec.rb @@ -113,4 +113,25 @@ describe TaskListToggleService do expect(toggler.execute).to be_falsey end + + it 'properly handles a GitLab blockquote' do + markdown = + <<-EOT.strip_heredoc + >>> + gitlab blockquote + >>> + + * [ ] Task 1 + * [x] Task 2 + EOT + + markdown_html = Banzai::Pipeline::FullPipeline.call(markdown, project: nil)[:output].to_html + toggler = described_class.new(markdown, markdown_html, + toggle_as_checked: true, + line_source: '* [ ] Task 1', line_number: 5) + + expect(toggler.execute).to be_truthy + expect(toggler.updated_markdown.lines[4]).to eq "* [x] Task 1\n" + expect(toggler.updated_markdown_html).to include('disabled checked> Task 1') + end end