Properly identify task lists inside a blockquote

Updated the task list regex to understand blockquote
characters that can come before the task item marker
This commit is contained in:
Brett Walker 2019-07-19 11:37:35 -05:00
parent 2e56b13468
commit b1694896ff
4 changed files with 45 additions and 1 deletions

View file

@ -15,7 +15,8 @@ module Taskable
INCOMPLETE_PATTERN = /(\[[\s]\])/.freeze
ITEM_PATTERN = %r{
^
\s*(?:[-+*]|(?:\d+\.)) # list prefix required - task item has to be always in a list
(?:(?:>\s{0,4})*) # optional blockquote characters
\s*(?:[-+*]|(?:\d+\.)) # list prefix required - task item has to be always in a list
\s+ # whitespace prefix has to be always presented for a list item
(\[\s\]|\[[xX]\]) # checkbox
(\s.+) # followed by whitespace and some text.

View file

@ -0,0 +1,5 @@
---
title: Better support clickable tasklists inside blockquotes
merge_request: 30952
author:
type: fixed

View file

@ -114,6 +114,23 @@ describe TaskListToggleService do
expect(toggler.execute).to be_falsey
end
it 'properly handles tasks in a blockquote' do
markdown =
<<-EOT.strip_heredoc
> > * [ ] 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: 1)
expect(toggler.execute).to be_truthy
expect(toggler.updated_markdown.lines[0]).to eq "> > * [x] Task 1\n"
expect(toggler.updated_markdown_html).to include('disabled checked> Task 1')
end
it 'properly handles a GitLab blockquote' do
markdown =
<<-EOT.strip_heredoc

View file

@ -105,4 +105,25 @@ shared_examples 'a Taskable' do
expect(subject.task_status_short).to match('1 task')
end
end
describe 'with tasks in blockquotes' do
before do
subject.description = <<-EOT.strip_heredoc
> - [ ] Task a
> > - [x] Task a.1
>>>
1. [ ] Task 1
1. [x] Task 2
>>>
EOT
end
it 'returns the correct task status' do
expect(subject.task_status).to match('2 of')
expect(subject.task_status).to match('4 tasks completed')
expect(subject.task_status_short).to match('2/')
expect(subject.task_status_short).to match('4 tasks')
end
end
end