Skip to content
This repository was archived by the owner on Nov 1, 2017. It is now read-only.

Commit 66ddf95

Browse files
committed
Merge pull request #36 from github/31-quoted-task-lists
Support task lists within block quotes
2 parents 0a37f25 + 3834435 commit 66ddf95

File tree

2 files changed

+269
-1
lines changed

2 files changed

+269
-1
lines changed

app/assets/javascripts/task_list.coffee

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ completePattern = ///
115115
# Useful when you need iterate over all items.
116116
itemPattern = ///
117117
^
118-
(?:\s*[-+*]|(?:\d+\.))? # optional list prefix
118+
(?: # optional prefix, consisting of
119+
\s* # optional leading whitespace
120+
(?:>\s*)* # zero or more blockquotes
121+
(?:[-+*]|(?:\d+\.)) # list item indicator
122+
)?
119123
\s* # optional whitespace prefix
120124
( # checkbox
121125
#{escapePattern(complete)}|

test/unit/test_updates.coffee

Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,170 @@ module "TaskList updates",
2828
class: 'task-list-item-checkbox'
2929
disabled: true
3030
checked: false
31+
32+
@blockquote = $ '<blockquote>'
33+
34+
@quotedList = $ '<ul>', class: 'task-list'
35+
36+
@quotedCompleteItem = $ '<li>', class: 'task-list-item'
37+
@quotedCompleteCheckbox = $ '<input>',
38+
type: 'checkbox'
39+
class: 'task-list-item-checkbox'
40+
disabled: true
41+
checked: true
42+
43+
@quotedIncompleteItem = $ '<li>', class: 'task-list-item'
44+
@quotedIncompleteCheckbox = $ '<input>',
45+
type: 'checkbox'
46+
class: 'task-list-item-checkbox'
47+
disabled: true
48+
checked: false
49+
50+
@innerBlockquote = $ '<blockquote>'
51+
52+
@innerList = $ '<ul>', class: 'task-list'
53+
54+
@innerCompleteItem = $ '<li>', class: 'task-list-item'
55+
@innerCompleteCheckbox = $ '<input>',
56+
type: 'checkbox'
57+
class: 'task-list-item-checkbox'
58+
disabled: true
59+
checked: true
60+
61+
@innerIncompleteItem = $ '<li>', class: 'task-list-item'
62+
@innerIncompleteCheckbox = $ '<input>',
63+
type: 'checkbox'
64+
class: 'task-list-item-checkbox'
65+
disabled: true
66+
checked: false
67+
68+
@orderedList = $ '<ol>', class: 'task-list'
69+
70+
@orderedCompleteItem = $ '<li>', class: 'task-list-item'
71+
@orderedCompleteCheckbox = $ '<input>',
72+
type: 'checkbox'
73+
class: 'task-list-item-checkbox'
74+
disabled: true
75+
checked: true
76+
77+
@orderedIncompleteItem = $ '<li>', class: 'task-list-item'
78+
@orderedIncompleteCheckbox = $ '<input>',
79+
type: 'checkbox'
80+
class: 'task-list-item-checkbox'
81+
disabled: true
82+
checked: false
3183

3284
@field = $ '<textarea>', class: 'js-task-list-field', text: """
3385
- [x] complete
3486
- [ ] incomplete
3587
- [#{@nbsp}] incompleteNBSP
88+
> - [x] quoted complete
89+
> - [ ] quoted incomplete
90+
>> - [x] inner complete
91+
> > - [ ] inner incomplete
92+
> 0. [x] ordered complete
93+
> 0. [ ] ordered incomplete
3694
"""
3795

3896
@changes =
3997
toComplete: """
4098
- [ ] complete
4199
- [ ] incomplete
42100
- [#{@nbsp}] incompleteNBSP
101+
> - [x] quoted complete
102+
> - [ ] quoted incomplete
103+
>> - [x] inner complete
104+
> > - [ ] inner incomplete
105+
> 0. [x] ordered complete
106+
> 0. [ ] ordered incomplete
107+
"""
108+
toQuotedComplete: """
109+
- [x] complete
110+
- [ ] incomplete
111+
- [#{@nbsp}] incompleteNBSP
112+
> - [ ] quoted complete
113+
> - [ ] quoted incomplete
114+
>> - [x] inner complete
115+
> > - [ ] inner incomplete
116+
> 0. [x] ordered complete
117+
> 0. [ ] ordered incomplete
118+
"""
119+
toInnerComplete: """
120+
- [x] complete
121+
- [ ] incomplete
122+
- [#{@nbsp}] incompleteNBSP
123+
> - [x] quoted complete
124+
> - [ ] quoted incomplete
125+
>> - [ ] inner complete
126+
> > - [ ] inner incomplete
127+
> 0. [x] ordered complete
128+
> 0. [ ] ordered incomplete
129+
"""
130+
toOrderedComplete: """
131+
- [x] complete
132+
- [ ] incomplete
133+
- [#{@nbsp}] incompleteNBSP
134+
> - [x] quoted complete
135+
> - [ ] quoted incomplete
136+
>> - [x] inner complete
137+
> > - [ ] inner incomplete
138+
> 0. [ ] ordered complete
139+
> 0. [ ] ordered incomplete
43140
"""
44141
toIncomplete: """
45142
- [x] complete
46143
- [x] incomplete
47144
- [#{@nbsp}] incompleteNBSP
145+
> - [x] quoted complete
146+
> - [ ] quoted incomplete
147+
>> - [x] inner complete
148+
> > - [ ] inner incomplete
149+
> 0. [x] ordered complete
150+
> 0. [ ] ordered incomplete
151+
"""
152+
toQuotedIncomplete: """
153+
- [x] complete
154+
- [ ] incomplete
155+
- [#{@nbsp}] incompleteNBSP
156+
> - [x] quoted complete
157+
> - [x] quoted incomplete
158+
>> - [x] inner complete
159+
> > - [ ] inner incomplete
160+
> 0. [x] ordered complete
161+
> 0. [ ] ordered incomplete
162+
"""
163+
toInnerIncomplete: """
164+
- [x] complete
165+
- [ ] incomplete
166+
- [#{@nbsp}] incompleteNBSP
167+
> - [x] quoted complete
168+
> - [ ] quoted incomplete
169+
>> - [x] inner complete
170+
> > - [x] inner incomplete
171+
> 0. [x] ordered complete
172+
> 0. [ ] ordered incomplete
173+
"""
174+
toOrderedIncomplete: """
175+
- [x] complete
176+
- [ ] incomplete
177+
- [#{@nbsp}] incompleteNBSP
178+
> - [x] quoted complete
179+
> - [ ] quoted incomplete
180+
>> - [x] inner complete
181+
> > - [ ] inner incomplete
182+
> 0. [x] ordered complete
183+
> 0. [x] ordered incomplete
48184
"""
49185
toIncompleteNBSP: """
50186
- [x] complete
51187
- [ ] incomplete
52188
- [x] incompleteNBSP
189+
> - [x] quoted complete
190+
> - [ ] quoted incomplete
191+
>> - [x] inner complete
192+
> > - [ ] inner incomplete
193+
> 0. [x] ordered complete
194+
> 0. [ ] ordered incomplete
53195
"""
54196

55197
@completeItem.append @completeCheckbox
@@ -67,6 +209,43 @@ module "TaskList updates",
67209
@container.append @list
68210
@container.append @field
69211

212+
@quotedCompleteItem.append @quotedCompleteCheckbox
213+
@quotedList.append @quotedCompleteItem
214+
@quotedCompleteItem.expectedIndex = 4
215+
216+
@quotedIncompleteItem.append @quotedIncompleteCheckbox
217+
@quotedList.append @quotedIncompleteItem
218+
@quotedIncompleteItem.expectedIndex = 5
219+
220+
@blockquote.append @quotedList
221+
222+
@innerCompleteItem.append @innerCompleteCheckbox
223+
@innerList.append @innerCompleteItem
224+
@innerCompleteItem.expectedIndex = 6
225+
226+
@innerIncompleteItem.append @innerIncompleteCheckbox
227+
@innerList.append @innerIncompleteItem
228+
@innerIncompleteItem.expectedIndex = 7
229+
230+
@innerBlockquote.append @innerList
231+
@innerBlockquote.append @innerField
232+
233+
@blockquote.append @innerBlockquote
234+
235+
@container.append @blockquote
236+
237+
@orderedCompleteItem.append @orderedCompleteCheckbox
238+
@orderedList.append @orderedCompleteItem
239+
@orderedCompleteItem.expectedIndex = 8
240+
241+
@orderedIncompleteItem.append @orderedIncompleteCheckbox
242+
@orderedList.append @orderedIncompleteItem
243+
@orderedIncompleteItem.expectedIndex = 9
244+
245+
@container.append @orderedList
246+
247+
@blockquote.append @field
248+
70249
$('#qunit-fixture').append(@container)
71250
@container.taskList()
72251

@@ -115,3 +294,88 @@ asyncTest "updates the source for items with non-breaking spaces", ->
115294
, 20
116295

117296
@incompleteNBSPCheckbox.click()
297+
298+
asyncTest "updates the source of a quoted item, marking the incomplete item as complete", ->
299+
expect 3
300+
301+
@field.on 'tasklist:changed', (event, index, checked) =>
302+
ok checked
303+
equal index, @quotedIncompleteItem.expectedIndex
304+
equal @field.val(), @changes.toQuotedIncomplete
305+
306+
setTimeout ->
307+
start()
308+
, 20
309+
310+
@quotedIncompleteCheckbox.click()
311+
312+
asyncTest "updates the source of a quoted item, marking the complete item as incomplete", ->
313+
expect 3
314+
315+
@field.on 'tasklist:changed', (event, index, checked) =>
316+
ok !checked
317+
equal index, @quotedCompleteItem.expectedIndex
318+
equal @field.val(), @changes.toQuotedComplete
319+
320+
setTimeout ->
321+
start()
322+
, 20
323+
324+
@quotedCompleteCheckbox.click()
325+
326+
asyncTest "updates the source of a quoted quoted item, marking the incomplete item as complete", ->
327+
expect 3
328+
329+
@field.on 'tasklist:changed', (event, index, checked) =>
330+
ok checked
331+
equal index, @innerIncompleteItem.expectedIndex
332+
equal @field.val(), @changes.toInnerIncomplete
333+
334+
setTimeout ->
335+
start()
336+
, 20
337+
338+
@innerIncompleteCheckbox.click()
339+
340+
asyncTest "updates the source of a quoted quoted item, marking the complete item as incomplete", ->
341+
expect 3
342+
343+
@field.on 'tasklist:changed', (event, index, checked) =>
344+
ok !checked
345+
equal index, @innerCompleteItem.expectedIndex
346+
equal @field.val(), @changes.toInnerComplete
347+
348+
setTimeout ->
349+
start()
350+
, 20
351+
352+
@innerCompleteCheckbox.click()
353+
354+
asyncTest "updates the source of an ordered list item, marking the incomplete item as complete", ->
355+
expect 3
356+
357+
@field.on 'tasklist:changed', (event, index, checked) =>
358+
ok checked
359+
equal index, @orderedIncompleteItem.expectedIndex
360+
equal @field.val(), @changes.toOrderedIncomplete
361+
362+
setTimeout ->
363+
start()
364+
, 20
365+
366+
@orderedIncompleteCheckbox.click()
367+
368+
asyncTest "updates the source of an ordered list item, marking the complete item as incomplete", ->
369+
expect 3
370+
371+
@field.on 'tasklist:changed', (event, index, checked) =>
372+
ok !checked
373+
equal index, @orderedCompleteItem.expectedIndex
374+
equal @field.val(), @changes.toOrderedComplete
375+
376+
setTimeout ->
377+
start()
378+
, 20
379+
380+
@orderedCompleteCheckbox.click()
381+

0 commit comments

Comments
 (0)