mirror of
https://github.com/marktext/marktext.git
synced 2025-05-08 03:11:55 +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 => {
|
contents.on('will-navigate', event => {
|
||||||
console.warn('Prevented opening a link.')
|
console.warn('Prevented opening a link.')
|
||||||
event.preventDefault();
|
event.preventDefault()
|
||||||
});
|
})
|
||||||
contents.on('new-window', (event, url) => {
|
contents.on('new-window', (event, url) => {
|
||||||
console.warn('Prevented opening a new window.')
|
console.warn('Prevented opening a new window.')
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
@ -233,6 +233,7 @@ Lexer.prototype.token = function (src, top) {
|
|||||||
let next = false
|
let next = false
|
||||||
let prevNext = true
|
let prevNext = true
|
||||||
let listItemIndices = []
|
let listItemIndices = []
|
||||||
|
let isTaskList = false
|
||||||
|
|
||||||
// Get each top-level item.
|
// Get each top-level item.
|
||||||
cap = cap[0].match(this.rules.item)
|
cap = cap[0].match(this.rules.item)
|
||||||
@ -241,9 +242,8 @@ Lexer.prototype.token = function (src, top) {
|
|||||||
|
|
||||||
for (; i < l; i++) {
|
for (; i < l; i++) {
|
||||||
const itemWithBullet = cap[i]
|
const itemWithBullet = cap[i]
|
||||||
let isTaskListItem = false
|
|
||||||
item = itemWithBullet
|
item = itemWithBullet
|
||||||
|
let newIsTaskListItem = false
|
||||||
// Remove the list item's bullet
|
// Remove the list item's bullet
|
||||||
// so it is seen as the next token.
|
// so it is seen as the next token.
|
||||||
space = item.length
|
space = item.length
|
||||||
@ -254,15 +254,38 @@ Lexer.prototype.token = function (src, top) {
|
|||||||
return ''
|
return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const newIsOrdered = bull.length > 1 && /\d{1,9}/.test(newBull)
|
||||||
|
|
||||||
|
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)
|
// Changing the bullet or ordered list delimiter starts a new list (CommonMark 264 and 265)
|
||||||
// - unordered, unordered --> bull !== newBull --> new list (e.g "-" --> "*")
|
// - unordered, unordered --> bull !== newBull --> new list (e.g "-" --> "*")
|
||||||
// - ordered, ordered --> lastChar !== lastChar --> new list (e.g "." --> ")")
|
// - ordered, ordered --> lastChar !== lastChar --> new list (e.g "." --> ")")
|
||||||
// - else --> new list (e.g. ordered --> unordered)
|
// - else --> new list (e.g. ordered --> unordered)
|
||||||
const newIsOrdered = bull.length > 1 && /\d{1,9}/.test(newBull)
|
i !== 0 &&
|
||||||
if (i !== 0 &&
|
(
|
||||||
((!isOrdered && !newIsOrdered && bull !== newBull) ||
|
(!isOrdered && !newIsOrdered && bull !== newBull) ||
|
||||||
(isOrdered && newIsOrdered && bull.slice(-1) !== newBull.slice(-1)) ||
|
(isOrdered && newIsOrdered && bull.slice(-1) !== newBull.slice(-1)) ||
|
||||||
((isOrdered && !newIsOrdered) || (!isOrdered && newIsOrdered)))) {
|
(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({
|
this.tokens.push({
|
||||||
type: 'list_end'
|
type: 'list_end'
|
||||||
})
|
})
|
||||||
@ -270,6 +293,7 @@ Lexer.prototype.token = function (src, top) {
|
|||||||
// Start a new list
|
// Start a new list
|
||||||
bull = newBull
|
bull = newBull
|
||||||
isOrdered = newIsOrdered
|
isOrdered = newIsOrdered
|
||||||
|
isTaskList = newIsTaskListItem
|
||||||
this.tokens.push({
|
this.tokens.push({
|
||||||
type: 'list_start',
|
type: 'list_start',
|
||||||
ordered: isOrdered,
|
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
|
// Outdent whatever the
|
||||||
// list item contains. Hacky.
|
// list item contains. Hacky.
|
||||||
if (~item.indexOf('\n ')) {
|
if (~item.indexOf('\n ')) {
|
||||||
@ -342,7 +355,7 @@ Lexer.prototype.token = function (src, top) {
|
|||||||
const isOrderedListItem = /\d/.test(bull)
|
const isOrderedListItem = /\d/.test(bull)
|
||||||
this.tokens.push({
|
this.tokens.push({
|
||||||
checked: checked,
|
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),
|
bulletMarkerOrDelimiter: isOrderedListItem ? bull.slice(-1) : bull.charAt(0),
|
||||||
type: loose ? 'loose_item_start' : 'list_item_start'
|
type: loose ? 'loose_item_start' : 'list_item_start'
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user