diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js index 5baa9821..0a10b417 100644 --- a/demo/markdownlint-browser.js +++ b/demo/markdownlint-browser.js @@ -3705,6 +3705,8 @@ module.exports = { // @ts-check const { addErrorContext, bareUrlRe, filterTokens } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); +const htmlLinkOpenRe = /^]/i; +const htmlLinkCloseRe = /^<\/a[\s>]/i; module.exports = { "names": ["MD034", "no-bare-urls"], "description": "Bare URL used", @@ -3712,6 +3714,7 @@ module.exports = { "function": function MD034(params, onError) { filterTokens(params, "inline", (token) => { let inLink = false; + let inInline = false; for (const child of token.children) { const { content, line, lineNumber, type } = child; let match = null; @@ -3721,14 +3724,19 @@ module.exports = { else if (type === "link_close") { inLink = false; } - else if ((type === "text") && !inLink) { + else if ((type === "html_inline") && htmlLinkOpenRe.test(content)) { + inInline = true; + } + else if ((type === "html_inline") && htmlLinkCloseRe.test(content)) { + inInline = false; + } + else if ((type === "text") && !inLink && !inInline) { while ((match = bareUrlRe.exec(content)) !== null) { const [bareUrl] = match; const matchIndex = match.index; const bareUrlLength = bareUrl.length; - // Allow "[https://example.com]" to avoid conflicts with - // MD011/no-reversed-links; allow quoting as another way - // of deliberately including a bare URL + // Allow "[LINK]" to avoid conflicts with MD011/no-reversed-links + // Allow quoting as a way of deliberately including a bare URL const leftChar = content[matchIndex - 1]; const rightChar = content[matchIndex + bareUrlLength]; if (!((leftChar === "[") && (rightChar === "]")) && diff --git a/lib/md034.js b/lib/md034.js index fd721a45..2c82cde9 100644 --- a/lib/md034.js +++ b/lib/md034.js @@ -4,6 +4,9 @@ const { addErrorContext, bareUrlRe, filterTokens } = require("../helpers"); +const htmlLinkOpenRe = /^]/i; +const htmlLinkCloseRe = /^<\/a[\s>]/i; + module.exports = { "names": [ "MD034", "no-bare-urls" ], "description": "Bare URL used", @@ -11,6 +14,7 @@ module.exports = { "function": function MD034(params, onError) { filterTokens(params, "inline", (token) => { let inLink = false; + let inInline = false; for (const child of token.children) { const { content, line, lineNumber, type } = child; let match = null; @@ -18,14 +22,17 @@ module.exports = { inLink = true; } else if (type === "link_close") { inLink = false; - } else if ((type === "text") && !inLink) { + } else if ((type === "html_inline") && htmlLinkOpenRe.test(content)) { + inInline = true; + } else if ((type === "html_inline") && htmlLinkCloseRe.test(content)) { + inInline = false; + } else if ((type === "text") && !inLink && !inInline) { while ((match = bareUrlRe.exec(content)) !== null) { const [ bareUrl ] = match; const matchIndex = match.index; const bareUrlLength = bareUrl.length; - // Allow "[https://example.com]" to avoid conflicts with - // MD011/no-reversed-links; allow quoting as another way - // of deliberately including a bare URL + // Allow "[LINK]" to avoid conflicts with MD011/no-reversed-links + // Allow quoting as a way of deliberately including a bare URL const leftChar = content[matchIndex - 1]; const rightChar = content[matchIndex + bareUrlLength]; if ( diff --git a/test/bare-urls.md b/test/bare-urls.md index 6938511d..dd65041b 100644 --- a/test/bare-urls.md +++ b/test/bare-urls.md @@ -11,3 +11,21 @@ For more, see https://example.com/info.htm. {MD034} Visit https://example.com, then refresh. {MD034} The site (https://example.com) is down. {MD034} + + + +Some documents use to link. + +Or to link. + +Or repeat the URL https://example.com. + +Or https://example.com/info.htm. + +This is allowed to avoid embedding angle brackets in HTML Text https://example.com. + +As is https://example.com/info.htm text. + +
Another violation: https://example.com. {MD034}
+ +
Another violation: https://example.com. {MD034}
diff --git a/test/snapshots/markdownlint-test-scenarios.js.md b/test/snapshots/markdownlint-test-scenarios.js.md index ef99d205..0ccdf5fe 100644 --- a/test/snapshots/markdownlint-test-scenarios.js.md +++ b/test/snapshots/markdownlint-test-scenarios.js.md @@ -2926,6 +2926,46 @@ Generated by [AVA](https://avajs.dev). 'no-bare-urls', ], }, + { + errorContext: 'https://example.com', + errorDetail: null, + errorRange: [ + 25, + 19, + ], + fixInfo: { + deleteCount: 19, + editColumn: 25, + insertText: '', + }, + lineNumber: 29, + ruleDescription: 'Bare URL used', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md034.md', + ruleNames: [ + 'MD034', + 'no-bare-urls', + ], + }, + { + errorContext: 'https://example.com', + errorDetail: null, + errorRange: [ + 26, + 19, + ], + fixInfo: { + deleteCount: 19, + editColumn: 26, + insertText: '', + }, + lineNumber: 31, + ruleDescription: 'Bare URL used', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md034.md', + ruleNames: [ + 'MD034', + 'no-bare-urls', + ], + }, ], fixed: `# Detailed Results Bare URLs␊ ␊ @@ -2940,6 +2980,24 @@ Generated by [AVA](https://avajs.dev). Visit , then refresh. {MD034}␊ ␊ The site () is down. {MD034}␊ + ␊ + ␊ + ␊ + Some documents use to link.␊ + ␊ + Or to link.␊ + ␊ + Or repeat the URL https://example.com.␊ + ␊ + Or https://example.com/info.htm.␊ + ␊ + This is allowed to avoid embedding angle brackets in HTML Text https://example.com.␊ + ␊ + As is https://example.com/info.htm text.␊ + ␊ +
Another violation: . {MD034}
␊ + ␊ +
Another violation: . {MD034}
␊ `, } diff --git a/test/snapshots/markdownlint-test-scenarios.js.snap b/test/snapshots/markdownlint-test-scenarios.js.snap index c567eb91..8ad7d68a 100644 Binary files a/test/snapshots/markdownlint-test-scenarios.js.snap and b/test/snapshots/markdownlint-test-scenarios.js.snap differ