diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js index 6d1c481e..25ae54a5 100644 --- a/demo/markdownlint-browser.js +++ b/demo/markdownlint-browser.js @@ -4786,17 +4786,13 @@ module.exports = { -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var _require = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"), addErrorDetailIf = _require.addErrorDetailIf; -var _require2 = __webpack_require__(/*! ./cache */ "../lib/cache.js"), - flattenedLists = _require2.flattenedLists; +var _require2 = __webpack_require__(/*! ../helpers/micromark.cjs */ "../helpers/micromark.cjs"), + filterByTypes = _require2.filterByTypes; module.exports = { "names": ["MD030", "list-marker-space"], "description": "Spaces after list markers", @@ -4806,35 +4802,47 @@ module.exports = { var olSingle = Number(params.config.ol_single || 1); var ulMulti = Number(params.config.ul_multi || 1); var olMulti = Number(params.config.ol_multi || 1); - var _iterator = _createForOfIteratorHelper(flattenedLists()), + var lists = filterByTypes(params.parsers.micromark.tokens, ["listOrdered", "listUnordered"]); + var _iterator = _createForOfIteratorHelper(lists), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var list = _step.value; - var lineCount = list.lastLineIndex - list.open.map[0]; - var allSingle = lineCount === list.items.length; - var expectedSpaces = list.unordered ? allSingle ? ulSingle : ulMulti : allSingle ? olSingle : olMulti; - var _iterator2 = _createForOfIteratorHelper(list.items), + var ordered = list.type === "listOrdered"; + var listItemPrefixes = list.children.filter(function (token) { + return token.type === "listItemPrefix"; + }); + var allSingleLine = list.endLine - list.startLine + 1 === listItemPrefixes.length; + var expectedSpaces = ordered ? allSingleLine ? olSingle : olMulti : allSingleLine ? ulSingle : ulMulti; + var _iterator2 = _createForOfIteratorHelper(listItemPrefixes), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var line = item.line, - lineNumber = item.lineNumber; - var match = /^[\s>]*\S+(\s*)/.exec(line); - var _match = _slicedToArray(match, 2), - matchLength = _match[0]["length"], - actualSpaces = _match[1]["length"]; - if (matchLength < line.length) { - var fixInfo = null; - if (expectedSpaces !== actualSpaces) { - fixInfo = { - "editColumn": matchLength - actualSpaces + 1, + var listItemPrefix = _step2.value; + var range = [listItemPrefix.startColumn, listItemPrefix.endColumn - listItemPrefix.startColumn]; + var listItemPrefixWhitespaces = listItemPrefix.children.filter(function (token) { + return token.type === "listItemPrefixWhitespace"; + }); + var _iterator3 = _createForOfIteratorHelper(listItemPrefixWhitespaces), + _step3; + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var listItemPrefixWhitespace = _step3.value; + var endColumn = listItemPrefixWhitespace.endColumn, + startColumn = listItemPrefixWhitespace.startColumn, + startLine = listItemPrefixWhitespace.startLine; + var actualSpaces = endColumn - startColumn; + var fixInfo = { + "editColumn": startColumn, "deleteCount": actualSpaces, "insertText": "".padEnd(expectedSpaces) }; + addErrorDetailIf(onError, startLine, expectedSpaces, actualSpaces, null, null, range, fixInfo); } - addErrorDetailIf(onError, lineNumber, expectedSpaces, actualSpaces, null, null, [1, matchLength], fixInfo); + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); } } } catch (err) { diff --git a/lib/md030.js b/lib/md030.js index 2a9e453d..7eb1e229 100644 --- a/lib/md030.js +++ b/lib/md030.js @@ -3,7 +3,7 @@ "use strict"; const { addErrorDetailIf } = require("../helpers"); -const { flattenedLists } = require("./cache"); +const { filterByTypes } = require("../helpers/micromark.cjs"); module.exports = { "names": [ "MD030", "list-marker-space" ], @@ -14,33 +14,44 @@ module.exports = { const olSingle = Number(params.config.ol_single || 1); const ulMulti = Number(params.config.ul_multi || 1); const olMulti = Number(params.config.ol_multi || 1); - for (const list of flattenedLists()) { - const lineCount = list.lastLineIndex - list.open.map[0]; - const allSingle = lineCount === list.items.length; - const expectedSpaces = list.unordered ? - (allSingle ? ulSingle : ulMulti) : - (allSingle ? olSingle : olMulti); - for (const item of list.items) { - const { line, lineNumber } = item; - const match = /^[\s>]*\S+(\s*)/.exec(line); - const [ { "length": matchLength }, { "length": actualSpaces } ] = match; - if (matchLength < line.length) { - let fixInfo = null; - if (expectedSpaces !== actualSpaces) { - fixInfo = { - "editColumn": matchLength - actualSpaces + 1, - "deleteCount": actualSpaces, - "insertText": "".padEnd(expectedSpaces) - }; - } + const lists = filterByTypes( + params.parsers.micromark.tokens, + [ "listOrdered", "listUnordered" ] + ); + for (const list of lists) { + const ordered = (list.type === "listOrdered"); + const listItemPrefixes = + list.children.filter((token) => (token.type === "listItemPrefix")); + const allSingleLine = + (list.endLine - list.startLine + 1) === listItemPrefixes.length; + const expectedSpaces = ordered ? + (allSingleLine ? olSingle : olMulti) : + (allSingleLine ? ulSingle : ulMulti); + for (const listItemPrefix of listItemPrefixes) { + const range = [ + listItemPrefix.startColumn, + listItemPrefix.endColumn - listItemPrefix.startColumn + ]; + const listItemPrefixWhitespaces = listItemPrefix.children.filter( + (token) => (token.type === "listItemPrefixWhitespace") + ); + for (const listItemPrefixWhitespace of listItemPrefixWhitespaces) { + const { endColumn, startColumn, startLine } = + listItemPrefixWhitespace; + const actualSpaces = endColumn - startColumn; + const fixInfo = { + "editColumn": startColumn, + "deleteCount": actualSpaces, + "insertText": "".padEnd(expectedSpaces) + }; addErrorDetailIf( onError, - lineNumber, + startLine, expectedSpaces, actualSpaces, null, null, - [ 1, matchLength ], + range, fixInfo ); } diff --git a/test/snapshots/markdownlint-test-scenarios.js.md b/test/snapshots/markdownlint-test-scenarios.js.md index eafeaaf8..df950697 100644 --- a/test/snapshots/markdownlint-test-scenarios.js.md +++ b/test/snapshots/markdownlint-test-scenarios.js.md @@ -6969,8 +6969,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 4, + 2, + 3, ], fixInfo: { deleteCount: 2, @@ -29096,8 +29096,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 5, + 2, + 4, ], fixInfo: { deleteCount: 2, @@ -29116,8 +29116,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 4, + 2, + 3, ], fixInfo: { deleteCount: 2, @@ -29136,8 +29136,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 12, + 9, + 4, ], fixInfo: { deleteCount: 2, @@ -29156,8 +29156,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 10, + 8, + 3, ], fixInfo: { deleteCount: 2, @@ -29176,8 +29176,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 1; Actual: 2', errorRange: [ - 1, - 11, + 9, + 3, ], fixInfo: { deleteCount: 2, @@ -42056,8 +42056,8 @@ Generated by [AVA](https://avajs.dev). errorContext: null, errorDetail: 'Expected: 3; Actual: 1', errorRange: [ - 1, - 6, + 5, + 2, ], fixInfo: { deleteCount: 1, diff --git a/test/snapshots/markdownlint-test-scenarios.js.snap b/test/snapshots/markdownlint-test-scenarios.js.snap index dd6c0c0d..b541380b 100644 Binary files a/test/snapshots/markdownlint-test-scenarios.js.snap and b/test/snapshots/markdownlint-test-scenarios.js.snap differ