diff --git a/src/main/app.js b/src/main/app.js index 2bf8d018..62df583b 100644 --- a/src/main/app.js +++ b/src/main/app.js @@ -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() diff --git a/src/muya/lib/parser/marked/lexer.js b/src/muya/lib/parser/marked/lexer.js index 1fa7d503..e635cf85 100644 --- a/src/muya/lib/parser/marked/lexer.js +++ b/src/muya/lib/parser/marked/lexer.js @@ -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' })