Fix: Encoding < and > in markdown urls (#15400)

Co-authored-by: fisker Cheung <lionkay@gmail.com>
This commit is contained in:
Vivek Joshiandfisker Cheung authored and GitHub committed 2023-10-02 18:00:02 +08:00
1 parent 91fc4fc981
commit d4d4b185e0
5 files changed
+136 -1

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
#### Encoding `<` and `>` in markdown urls (#15400 by @vivekjoshi556)
<!-- prettier-ignore -->
```md
<!-- Input -->
[link](https://www.google.fr/()foo->bar)
<!-- Prettier stable -->
[link](<https://www.google.fr/()foo->bar>)
<!-- Prettier main -->
[link](<https://www.google.fr/()foo-%3Ebar>)
```
<!-- prettier-ignore -->
```md
<!-- Input -->
![link](<https://www.google.fr/()foo->bar>)
<!-- Prettier stable -->
![link](<https://www.google.fr/()foo->bar>)
<!-- Prettier main -->
![link](<https://www.google.fr/()foo-%3Ebar>)
```
+10
View File
@@ -48,6 +48,16 @@ function clean(ast, newObj, parent) {
newObj.label = collapseWhiteSpace(ast.label);
}
if (
(ast.type === "link" || ast.type === "image") &&
ast.url &&
ast.url.includes("(")
) {
for (const character of "<>") {
newObj.url = ast.url.replaceAll(character, encodeURIComponent(character));
}
}
if (
(ast.type === "definition" ||
ast.type === "link" ||
+9 -1
View File
@@ -778,6 +778,13 @@ function shouldRemainTheSameContent(path) {
);
}
const encodeUrl = (url, characters) => {
for (const character of characters) {
url = url.replaceAll(character, encodeURIComponent(character));
}
return url;
};
/**
* @param {string} url
* @param {string[] | string} [dangerousCharOrChars]
@@ -790,8 +797,9 @@ function printUrl(url, dangerousCharOrChars = []) {
? dangerousCharOrChars
: [dangerousCharOrChars]),
];
return new RegExp(dangerousChars.map((x) => `\\${x}`).join("|")).test(url)
? `<${url}>`
? `<${encodeUrl(url, "<>")}>`
: url;
}
@@ -47,6 +47,83 @@ proseWrap: "always"
================================================================================
`;
exports[`encodedLink.md - {"proseWrap":"always","singleQuote":true} format 1`] = `
====================================options=====================================
parsers: ["markdown"]
printWidth: 80
proseWrap: "always"
singleQuote: true
| printWidth
=====================================input======================================
[link](https://www.google.fr/()foo->bar)
[link](https://www.google.fr/foo->bar)
[link](https://www.google.fr/foo-%3Ebar)
[link](https://www.google.fr/foo-<bar)
[link](https://www.google.fr/foo-%3Cbar)
![link](https://www.google.fr/()foo->bar)
![link](https://www.google.fr/foo->bar)
![link](https://www.google.fr/foo-%3Ebar)
![link](https://www.google.fr/foo-<bar)
![link](https://www.google.fr/foo-%3Cbar)
[link]: https://www.google.fr/()foo->bar
[link]: https://www.google.fr/foo->bar
[link]: https://www.google.fr/foo-%3Ebar
[link]: https://www.google.fr/foo-<bar
[link]: https://www.google.fr/foo-%3Cbar
=====================================output=====================================
[link](<https://www.google.fr/()foo-%3Ebar>)
[link](https://www.google.fr/foo->bar) [link](https://www.google.fr/foo-%3Ebar)
[link](https://www.google.fr/foo-<bar) [link](https://www.google.fr/foo-%3Cbar)
![link](<https://www.google.fr/()foo-%3Ebar>)
![link](https://www.google.fr/foo->bar)
![link](https://www.google.fr/foo-%3Ebar)
![link](https://www.google.fr/foo-<bar)
![link](https://www.google.fr/foo-%3Cbar) [link]:
https://www.google.fr/()foo->bar [link]: https://www.google.fr/foo->bar [link]:
https://www.google.fr/foo-%3Ebar [link]: https://www.google.fr/foo-<bar [link]:
https://www.google.fr/foo-%3Cbar
================================================================================
`;
exports[`encodedLink.md - {"proseWrap":"always"} format 1`] = `
====================================options=====================================
parsers: ["markdown"]
printWidth: 80
proseWrap: "always"
| printWidth
=====================================input======================================
[link](https://www.google.fr/()foo->bar)
[link](https://www.google.fr/foo->bar)
[link](https://www.google.fr/foo-%3Ebar)
[link](https://www.google.fr/foo-<bar)
[link](https://www.google.fr/foo-%3Cbar)
![link](https://www.google.fr/()foo->bar)
![link](https://www.google.fr/foo->bar)
![link](https://www.google.fr/foo-%3Ebar)
![link](https://www.google.fr/foo-<bar)
![link](https://www.google.fr/foo-%3Cbar)
[link]: https://www.google.fr/()foo->bar
[link]: https://www.google.fr/foo->bar
[link]: https://www.google.fr/foo-%3Ebar
[link]: https://www.google.fr/foo-<bar
[link]: https://www.google.fr/foo-%3Cbar
=====================================output=====================================
[link](<https://www.google.fr/()foo-%3Ebar>)
[link](https://www.google.fr/foo->bar) [link](https://www.google.fr/foo-%3Ebar)
[link](https://www.google.fr/foo-<bar) [link](https://www.google.fr/foo-%3Cbar)
![link](<https://www.google.fr/()foo-%3Ebar>)
![link](https://www.google.fr/foo->bar)
![link](https://www.google.fr/foo-%3Ebar)
![link](https://www.google.fr/foo-<bar)
![link](https://www.google.fr/foo-%3Cbar) [link]:
https://www.google.fr/()foo->bar [link]: https://www.google.fr/foo->bar [link]:
https://www.google.fr/foo-%3Ebar [link]: https://www.google.fr/foo-<bar [link]:
https://www.google.fr/foo-%3Cbar
================================================================================
`;
exports[`entity.md - {"proseWrap":"always","singleQuote":true} format 1`] = `
====================================options=====================================
parsers: ["markdown"]
+15
View File
@@ -0,0 +1,15 @@
[link](https://www.google.fr/()foo->bar)
[link](https://www.google.fr/foo->bar)
[link](https://www.google.fr/foo-%3Ebar)
[link](https://www.google.fr/foo-<bar)
[link](https://www.google.fr/foo-%3Cbar)
![link](https://www.google.fr/()foo->bar)
![link](https://www.google.fr/foo->bar)
![link](https://www.google.fr/foo-%3Ebar)
![link](https://www.google.fr/foo-<bar)
![link](https://www.google.fr/foo-%3Cbar)
[link]: https://www.google.fr/()foo->bar
[link]: https://www.google.fr/foo->bar
[link]: https://www.google.fr/foo-%3Ebar
[link]: https://www.google.fr/foo-<bar
[link]: https://www.google.fr/foo-%3Cbar