diff --git a/lib/md034.js b/lib/md034.js index ad013ee8f..63fdd9f1a 100644 --- a/lib/md034.js +++ b/lib/md034.js @@ -2,27 +2,31 @@ "use strict"; -const { addErrorContext, bareUrlRe, filterTokens, rangeFromRegExp } = - require("../helpers"); +const { addErrorContext, bareUrlRe, filterTokens } = require("../helpers"); module.exports = { "names": [ "MD034", "no-bare-urls" ], "description": "Bare URL used", "tags": [ "links", "url" ], "function": function MD034(params, onError) { - filterTokens(params, "inline", function forToken(token) { + filterTokens(params, "inline", (token) => { let inLink = false; - token.children.forEach(function forChild(child) { + token.children.forEach((child) => { + const { content, line, lineNumber, type } = child; let match = null; - if (child.type === "link_open") { + if (type === "link_open") { inLink = true; - } else if (child.type === "link_close") { + } else if (type === "link_close") { inLink = false; - } else if ((child.type === "text") && - !inLink && - (match = bareUrlRe.exec(child.content))) { - addErrorContext(onError, child.lineNumber, match[0], null, - null, rangeFromRegExp(child.line, bareUrlRe)); + } else if ((type === "text") && !inLink && + (match = bareUrlRe.exec(content))) { + const [ bareUrl ] = match; + const index = line.indexOf(content); + const range = (index === -1) ? null : [ + line.indexOf(content) + match.index + 1, + bareUrl.length + ]; + addErrorContext(onError, lineNumber, bareUrl, null, null, range); } }); }); diff --git a/test/detailed-results-links.json b/test/detailed-results-links.json new file mode 100644 index 000000000..312ea0ac0 --- /dev/null +++ b/test/detailed-results-links.json @@ -0,0 +1,5 @@ +{ + "default": true, + "MD013": false, + "MD046": false +} diff --git a/test/detailed-results-links.md b/test/detailed-results-links.md new file mode 100644 index 000000000..502d2ecbb --- /dev/null +++ b/test/detailed-results-links.md @@ -0,0 +1,26 @@ +# Detailed Link Results + +Text https://example.com/ text + +Text text https://example.com/bare text + +Text https://example.com/bare text text + +Text `code https://example.com/code code` text https://example.com/ text + +> Text text https://example.com/bare text + +Text https://example.com/dir +text https://example.com/file.txt +text +text https://example.com/dir/dir/file?query=param + +```text +Code https://example.com/code?type=fence code +``` + + Code https://example.com/code?type=indent code + +Text more text https://example.com/same still more text done + +Text more \* text https://example.com/same more \[ text done diff --git a/test/detailed-results-links.results.json b/test/detailed-results-links.results.json new file mode 100644 index 000000000..1b0ac4b04 --- /dev/null +++ b/test/detailed-results-links.results.json @@ -0,0 +1,92 @@ +[ + { + "lineNumber": 3, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/", + "errorRange": [ 6, 20 ] + }, + { + "lineNumber": 5, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/bare", + "errorRange": [ 42, 24 ] + }, + { + "lineNumber": 7, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/bare", + "errorRange": [ 6, 24 ] + }, + { + "lineNumber": 9, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/", + "errorRange": [ 48, 20 ] + }, + { + "lineNumber": 11, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/bare", + "errorRange": [ 44, 24 ] + }, + { + "lineNumber": 13, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/dir", + "errorRange": [ 6, 23 ] + }, + { + "lineNumber": 14, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/file.txt", + "errorRange": [ 6, 28 ] + }, + { + "lineNumber": 16, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/dir/dir/fi...", + "errorRange": [ 6, 44 ] + }, + { + "lineNumber": 24, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/same", + "errorRange": [ 43, 24 ] + }, + { + "lineNumber": 26, + "ruleNames": [ "MD034", "no-bare-urls" ], + "ruleDescription": "Bare URL used", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md034", + "errorDetail": null, + "errorContext": "https://example.com/same", + "errorRange": null + } +]