Fix: Encoding < and > in markdown urls (#15400)
Co-authored-by: fisker Cheung <lionkay@gmail.com>
This commit is contained in:
1 parent
91fc4fc981
commit
d4d4b185e0
5 files changed
+136
-1
No files matched your search
@@ -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 -->
|
||||
foo->bar>)
|
||||
|
||||
<!-- Prettier stable -->
|
||||
foo->bar>)
|
||||
|
||||
<!-- Prettier main -->
|
||||
foo-%3Ebar>)
|
||||
```
|
||||
@@ -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" ||
|
||||
|
||||
@@ -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)
|
||||
foo->bar)
|
||||

|
||||

|
||||

|
||||

|
||||
[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)
|
||||
foo-%3Ebar>)
|
||||

|
||||

|
||||

|
||||
 [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)
|
||||
foo->bar)
|
||||

|
||||

|
||||

|
||||

|
||||
[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)
|
||||
foo-%3Ebar>)
|
||||

|
||||

|
||||

|
||||
 [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"]
|
||||
|
||||
@@ -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)
|
||||
foo->bar)
|
||||

|
||||

|
||||

|
||||

|
||||
[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
|
||||
Reference in new issue
Block a user