mirror of
https://github.com/marktext/marktext.git
synced 2025-05-04 04:40:37 +08:00
* fix: #870 list parse error * remove semiclon * add more comments * rename isTaskListItem to isTaskList
This commit is contained in:
parent
c20cdc6213
commit
372fe02f23
@ -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()
|
||||
|
@ -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'
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user