UNPKG

eslint-plugin-md

Version:

An ESLint plugin that allows you to lint markdown code in your *.md files.

73 lines (66 loc) 2.31 kB
const path = require('path') let mdOffsets = [] let nonMdBlocks = [] module.exports = { preprocess(text, filename) { let offset = 0 const mdOffsetsInner = [] const nonMdBlocksInner = [] // const ignoreMdRangesInner = [] const mdWithoutJs = text.replace(/```(\w+)\n([\s\S]*?)\n```\n/gim, (substr, lang, match, position) => { const replacement = '<!-- comment -->\n'.repeat(match.split('\n').length + 2) const oldOffset = offset offset += substr.length - replacement.length // ignoreMdRangesInner.push({ start: position, end: position + replacement.length }) mdOffsetsInner.push({ startFrom: position - oldOffset, offset }) nonMdBlocksInner.push({ lang, text: match + '\n', charOffset: position + ('```' + lang + '\n').length, lineOffset: text.slice(0, position).split('\n').length, }) return replacement }) mdOffsets = mdOffsetsInner.reverse() nonMdBlocks = nonMdBlocksInner const partName = (filename && path.basename(filename)) || 'file.md' const jsBlocksResult = nonMdBlocksInner.map(({ text, lang }, i) => ({ text, // eslint internal code appends this filename to real filename filename: `/../../${partName}.${lang}`, })) // console.log('JSBR', jsBlocksResult) return [mdWithoutJs, ...jsBlocksResult] }, postprocess(messageGroups, x) { const result = [] // console.log('MG', messageGroups) for (let i = 0; i < messageGroups.length; i++) { const mg = messageGroups[i] if (i === 0) { for (const m of mg) { if (m.fix && m.fix.range) { m.fix.range = m.fix.range.map(pos => { const mdOffset = mdOffsets.find(o => o.startFrom < pos) if (!mdOffset) return pos return pos + mdOffset.offset }) } } } else { // Javascript const { lineOffset, charOffset } = nonMdBlocks[i - 1] for (const m of mg) { if (m.fix && m.fix.range) { m.fix.range = m.fix.range.map(pos => pos + charOffset) } m.line += lineOffset m.endLine = m.endLine && m.endLine + lineOffset } } result.push(...mg) } return result }, supportsAutofix: true, }