diff --git a/README.md b/README.md
index 3d9f9883..bd2c497e 100644
--- a/README.md
+++ b/README.md
@@ -53,7 +53,14 @@ You can manually include the Markdown processor by setting the `processor` optio
Each fenced code block inside a Markdown document has a virtual filename appended to the Markdown file's path.
-The virtual filename's extension will match the fenced code block's syntax tag, so for example, ```js
code blocks in README.md
would match README.md/*.js
.
+The virtual filename's extension will match the fenced code block's syntax tag, except for the following:
+
+* `javascript` and `ecmascript` are mapped to `js`
+* `typescript` is mapped to `ts`
+* `markdown` is mapped to `md`
+
+For example, ```` ```js ```` code blocks in `README.md` would match `README.md/*.js` and ```` ```typescript ```` in `CONTRIBUTING.md` would match `CONTRIBUTING.md/*.ts`.
+
You can use glob patterns for these virtual filenames to customize configuration for code blocks without affecting regular code.
For more information on configuring processors, refer to the [ESLint documentation](https://eslint.org/docs/user-guide/configuring#specifying-processor).
diff --git a/eslint.config.js b/eslint.config.js
index dc073903..4234697c 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -41,7 +41,13 @@ module.exports = [
},
rules: {
"lines-around-comment": "off",
- "n/no-missing-import": "off"
+ "n/no-missing-import": "off",
+ "no-var": "off",
+ "padding-line-between-statements": "off",
+ "no-console": "off",
+ "no-alert": "off",
+ "eslint-comments/require-description": "off",
+ "jsdoc/require-jsdoc": "off"
}
}
];
diff --git a/lib/processor.js b/lib/processor.js
index 4cf6a71f..433e7509 100644
--- a/lib/processor.js
+++ b/lib/processor.js
@@ -235,6 +235,13 @@ function getBlockRangeMap(text, node, comments) {
return rangeMap;
}
+const languageToFileExtension = {
+ javascript: "js",
+ ecmascript: "js",
+ typescript: "ts",
+ markdown: "md"
+};
+
/**
* Extracts lintable code blocks from Markdown text.
* @param {string} text The text of the file.
@@ -295,14 +302,19 @@ function preprocess(text, filename) {
}
});
- return blocks.map((block, index) => ({
- filename: `${index}.${block.lang.trim().split(" ")[0]}`,
- text: [
- ...block.comments,
- block.value,
- ""
- ].join("\n")
- }));
+ return blocks.map((block, index) => {
+ const [language] = block.lang.trim().split(" ");
+ const fileExtension = Object.hasOwn(languageToFileExtension, language) ? languageToFileExtension[language] : language;
+
+ return {
+ filename: `${index}.${fileExtension}`,
+ text: [
+ ...block.comments,
+ block.value,
+ ""
+ ].join("\n")
+ };
+ });
}
/**
diff --git a/tests/lib/processor.js b/tests/lib/processor.js
index 629c448e..9c87a3d5 100644
--- a/tests/lib/processor.js
+++ b/tests/lib/processor.js
@@ -115,7 +115,7 @@ describe("processor", () => {
"```js",
"backticks",
"```",
- "~~~javascript",
+ "~~~js",
"tildes",
"~~~"
].join("\n");
@@ -124,7 +124,7 @@ describe("processor", () => {
assert.strictEqual(blocks.length, 2);
assert.strictEqual(blocks[0].filename, "0.js");
assert.strictEqual(blocks[0].text, "backticks\n");
- assert.strictEqual(blocks[1].filename, "1.javascript");
+ assert.strictEqual(blocks[1].filename, "1.js");
assert.strictEqual(blocks[1].text, "tildes\n");
});
@@ -255,7 +255,7 @@ describe("processor", () => {
const blocks = processor.preprocess(code);
assert.strictEqual(blocks.length, 1);
- assert.strictEqual(blocks[0].filename, "0.javascript");
+ assert.strictEqual(blocks[0].filename, "0.js");
});
it("should find code fences with node info string", () => {
@@ -330,6 +330,18 @@ describe("processor", () => {
assert.strictEqual(blocks[0].filename, "0.js");
});
+ it("should translate the language to its file extension with leading whitespace and trailing characters", () => {
+ const code = [
+ "``` javascript CUSTOM",
+ "var answer = 6 * 7;",
+ "```"
+ ].join("\n");
+ const blocks = processor.preprocess(code);
+
+ assert.strictEqual(blocks.length, 1);
+ assert.strictEqual(blocks[0].filename, "0.js");
+ });
+
it("should find code fences not surrounded by blank lines", () => {
const code = [
"",
@@ -408,7 +420,7 @@ describe("processor", () => {
"var answer = 6 * 7;",
"```",
"",
- "```javascript",
+ "```js",
"console.log(answer);",
"```",
"",
@@ -419,7 +431,7 @@ describe("processor", () => {
assert.strictEqual(blocks.length, 2);
assert.strictEqual(blocks[0].filename, "0.js");
assert.strictEqual(blocks[0].text, "var answer = 6 * 7;\n");
- assert.strictEqual(blocks[1].filename, "1.javascript");
+ assert.strictEqual(blocks[1].filename, "1.js");
assert.strictEqual(blocks[1].text, "console.log(answer);\n");
});