fix(editor): make checklist indicator work again
This commit is contained in:
parent
4f2d7b3ce2
commit
22103626b8
@ -10,48 +10,56 @@ describe('Find checklists in text', () => {
|
|||||||
expect(checkboxes).toHaveLength(0)
|
expect(checkboxes).toHaveLength(0)
|
||||||
})
|
})
|
||||||
it('should find multiple checkboxes', () => {
|
it('should find multiple checkboxes', () => {
|
||||||
const text: string = `* [ ] Lorem Ipsum
|
const text: string = `
|
||||||
* [ ] Dolor sit amet
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
Here's some text in between
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
* [x] Dolor sit amet
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
- [ ] Dolor sit amet`
|
<div><p>Another task</p>
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>subtask</p></div>
|
||||||
|
</li>
|
||||||
|
<li data-checked="true" data-type="taskItem"><label><input type="checkbox"
|
||||||
|
checked="checked"><span></span></label>
|
||||||
|
<div><p>done</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
const checkboxes = findCheckboxesInText(text)
|
const checkboxes = findCheckboxesInText(text)
|
||||||
|
|
||||||
expect(checkboxes).toHaveLength(4)
|
expect(checkboxes).toHaveLength(4)
|
||||||
expect(checkboxes[0]).toBe(0)
|
expect(checkboxes[0]).toBe(32)
|
||||||
expect(checkboxes[1]).toBe(18)
|
expect(checkboxes[1]).toBe(163)
|
||||||
expect(checkboxes[2]).toBe(69)
|
expect(checkboxes[2]).toBe(321)
|
||||||
expect(checkboxes[3]).toBe(90)
|
expect(checkboxes[3]).toBe(464)
|
||||||
})
|
})
|
||||||
it('should find one checkbox with *', () => {
|
it('should find one unchecked checkbox', () => {
|
||||||
const text: string = '* [ ] Lorem Ipsum'
|
const text: string = `
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
const checkboxes = findCheckboxesInText(text)
|
const checkboxes = findCheckboxesInText(text)
|
||||||
|
|
||||||
expect(checkboxes).toHaveLength(1)
|
expect(checkboxes).toHaveLength(1)
|
||||||
expect(checkboxes[0]).toBe(0)
|
expect(checkboxes[0]).toBe(32)
|
||||||
})
|
})
|
||||||
it('should find one checkbox with -', () => {
|
it('should find one checked checkbox', () => {
|
||||||
const text: string = '- [ ] Lorem Ipsum'
|
const text: string = `
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="true" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
const checkboxes = findCheckboxesInText(text)
|
const checkboxes = findCheckboxesInText(text)
|
||||||
|
|
||||||
expect(checkboxes).toHaveLength(1)
|
expect(checkboxes).toHaveLength(1)
|
||||||
expect(checkboxes[0]).toBe(0)
|
expect(checkboxes[0]).toBe(32)
|
||||||
})
|
|
||||||
it('should find one checked checkbox with *', () => {
|
|
||||||
const text: string = '* [x] Lorem Ipsum'
|
|
||||||
const checkboxes = findCheckboxesInText(text)
|
|
||||||
|
|
||||||
expect(checkboxes).toHaveLength(1)
|
|
||||||
expect(checkboxes[0]).toBe(0)
|
|
||||||
})
|
|
||||||
it('should find one checked checkbox with -', () => {
|
|
||||||
const text: string = '- [x] Lorem Ipsum'
|
|
||||||
const checkboxes = findCheckboxesInText(text)
|
|
||||||
|
|
||||||
expect(checkboxes).toHaveLength(1)
|
|
||||||
expect(checkboxes[0]).toBe(0)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -63,32 +71,60 @@ describe('Get Checklist Statistics in a Text', () => {
|
|||||||
expect(stats.total).toBe(0)
|
expect(stats.total).toBe(0)
|
||||||
})
|
})
|
||||||
it('should find one checkbox', () => {
|
it('should find one checkbox', () => {
|
||||||
const text: string = '* [ ] Lorem Ipsum'
|
const text: string = `
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
const stats = getChecklistStatistics(text)
|
const stats = getChecklistStatistics(text)
|
||||||
|
|
||||||
expect(stats.total).toBe(1)
|
expect(stats.total).toBe(1)
|
||||||
expect(stats.checked).toBe(0)
|
expect(stats.checked).toBe(0)
|
||||||
})
|
})
|
||||||
it('should find one checked checkbox', () => {
|
it('should find one checked checkbox', () => {
|
||||||
const text: string = '* [x] Lorem Ipsum'
|
const text: string = `
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="true" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
const stats = getChecklistStatistics(text)
|
const stats = getChecklistStatistics(text)
|
||||||
|
|
||||||
expect(stats.total).toBe(1)
|
expect(stats.total).toBe(1)
|
||||||
expect(stats.checked).toBe(1)
|
expect(stats.checked).toBe(1)
|
||||||
})
|
})
|
||||||
it('should find multiple mixed and matched', () => {
|
it('should find multiple mixed and matched', () => {
|
||||||
const text: string = `* [ ] Lorem Ipsum
|
const text: string = `
|
||||||
* [ ] Dolor sit amet
|
<ul data-type="taskList">
|
||||||
* [x] Dolor sit amet
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
- [x] Dolor sit amet
|
<div><p>Task</p></div>
|
||||||
|
</li>
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>Another task</p>
|
||||||
|
<ul data-type="taskList">
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>subtask</p></div>
|
||||||
|
</li>
|
||||||
|
<li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label>
|
||||||
|
<div><p>subtask 2</p></div>
|
||||||
|
</li>
|
||||||
|
<li data-checked="true" data-type="taskItem"><label><input type="checkbox"
|
||||||
|
checked="checked"><span></span></label>
|
||||||
|
<div><p>done</p></div>
|
||||||
|
</li>
|
||||||
|
<li data-checked="true" data-type="taskItem"><label><input type="checkbox"
|
||||||
|
checked="checked"><span></span></label>
|
||||||
|
<div><p>also done</p></div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>`
|
||||||
|
|
||||||
Here's some text in between
|
|
||||||
|
|
||||||
* [x] Dolor sit amet
|
|
||||||
- [ ] Dolor sit amet`
|
|
||||||
const stats = getChecklistStatistics(text)
|
const stats = getChecklistStatistics(text)
|
||||||
|
|
||||||
expect(stats.total).toBe(6)
|
expect(stats.total).toBe(6)
|
||||||
expect(stats.checked).toBe(3)
|
expect(stats.checked).toBe(2)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
const checked = '[x]'
|
|
||||||
|
|
||||||
interface CheckboxStatistics {
|
interface CheckboxStatistics {
|
||||||
total: number
|
total: number
|
||||||
checked: number
|
checked: number
|
||||||
@ -11,7 +9,7 @@ interface MatchedCheckboxes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getCheckboxesInText = (text: string): MatchedCheckboxes => {
|
const getCheckboxesInText = (text: string): MatchedCheckboxes => {
|
||||||
const regex = /[*-] \[[ x]]/g
|
const regex = /data-checked="(true|false)"/g
|
||||||
let match
|
let match
|
||||||
const checkboxes: MatchedCheckboxes = {
|
const checkboxes: MatchedCheckboxes = {
|
||||||
checked: [],
|
checked: [],
|
||||||
@ -19,7 +17,7 @@ const getCheckboxesInText = (text: string): MatchedCheckboxes => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((match = regex.exec(text)) !== null) {
|
while ((match = regex.exec(text)) !== null) {
|
||||||
if (match[0].endsWith(checked)) {
|
if (match[1] === 'true') {
|
||||||
checkboxes.checked.push(match.index)
|
checkboxes.checked.push(match.index)
|
||||||
} else {
|
} else {
|
||||||
checkboxes.unchecked.push(match.index)
|
checkboxes.unchecked.push(match.index)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user