fix: #870 list parse error (#964)

* fix: #870 list parse error

* remove semiclon

* add more comments

* rename isTaskListItem to isTaskList
This commit is contained in:
Ran Luo 2019-04-27 23:16:38 +08:00 committed by Felix Häusler
parent c20cdc6213
commit 372fe02f23
2 changed files with 37 additions and 24 deletions

View File

@ -50,8 +50,8 @@ class App {
})
contents.on('will-navigate', event => {
console.warn('Prevented opening a link.')
event.preventDefault();
});
event.preventDefault()
})
contents.on('new-window', (event, url) => {
console.warn('Prevented opening a new window.')
event.preventDefault()

View File

@ -233,6 +233,7 @@ Lexer.prototype.token = function (src, top) {
let next = false
let prevNext = true
let listItemIndices = []
let isTaskList = false
// Get each top-level item.
cap = cap[0].match(this.rules.item)
@ -241,9 +242,8 @@ Lexer.prototype.token = function (src, top) {
for (; i < l; i++) {
const itemWithBullet = cap[i]
let isTaskListItem = false
item = itemWithBullet
let newIsTaskListItem = false
// Remove the list item's bullet
// so it is seen as the next token.
space = item.length
@ -254,15 +254,38 @@ Lexer.prototype.token = function (src, top) {
return ''
})
// Changing the bullet or ordered list delimiter starts a new list (CommonMark 264 and 265)
// - unordered, unordered --> bull !== newBull --> new list (e.g "-" --> "*")
// - ordered, ordered --> lastChar !== lastChar --> new list (e.g "." --> ")")
// - else --> new list (e.g. ordered --> unordered)
const newIsOrdered = bull.length > 1 && /\d{1,9}/.test(newBull)
if (i !== 0 &&
((!isOrdered && !newIsOrdered && bull !== newBull) ||
(isOrdered && newIsOrdered && bull.slice(-1) !== newBull.slice(-1)) ||
((isOrdered && !newIsOrdered) || (!isOrdered && newIsOrdered)))) {
if (!newIsOrdered && this.options.gfm) {
checked = this.rules.checkbox.exec(item)
if (checked) {
checked = checked[1] === 'x' || checked[1] === 'X'
item = item.replace(this.rules.checkbox, '')
newIsTaskListItem = true
} else {
checked = undefined
}
}
if (i === 0) {
isTaskList = newIsTaskListItem
} else if (
// Changing the bullet or ordered list delimiter starts a new list (CommonMark 264 and 265)
// - unordered, unordered --> bull !== newBull --> new list (e.g "-" --> "*")
// - ordered, ordered --> lastChar !== lastChar --> new list (e.g "." --> ")")
// - else --> new list (e.g. ordered --> unordered)
i !== 0 &&
(
(!isOrdered && !newIsOrdered && bull !== newBull) ||
(isOrdered && newIsOrdered && bull.slice(-1) !== newBull.slice(-1)) ||
(isOrdered !== newIsOrdered) ||
// Changing to/from task list item from/to bullet, starts a new list(work for marktext issue #870)
// Because we distinguish between task list and bullet list in Mark Text,
// the parsing here is somewhat different from the commonmark Spec,
// and the task list needs to be a separate list.
(isTaskList !== newIsTaskListItem)
)
) {
this.tokens.push({
type: 'list_end'
})
@ -270,6 +293,7 @@ Lexer.prototype.token = function (src, top) {
// Start a new list
bull = newBull
isOrdered = newIsOrdered
isTaskList = newIsTaskListItem
this.tokens.push({
type: 'list_start',
ordered: isOrdered,
@ -278,17 +302,6 @@ Lexer.prototype.token = function (src, top) {
})
}
if (!isOrdered && this.options.gfm) {
checked = this.rules.checkbox.exec(item)
if (checked) {
checked = checked[1] === 'x' || checked[1] === 'X'
item = item.replace(this.rules.checkbox, '')
isTaskListItem = true
} else {
checked = undefined
}
}
// Outdent whatever the
// list item contains. Hacky.
if (~item.indexOf('\n ')) {
@ -342,7 +355,7 @@ Lexer.prototype.token = function (src, top) {
const isOrderedListItem = /\d/.test(bull)
this.tokens.push({
checked: checked,
listItemType: bull.length > 1 ? 'order' : (isTaskListItem ? 'task' : 'bullet'),
listItemType: bull.length > 1 ? 'order' : (isTaskList ? 'task' : 'bullet'),
bulletMarkerOrDelimiter: isOrderedListItem ? bull.slice(-1) : bull.charAt(0),
type: loose ? 'loose_item_start' : 'list_item_start'
})