From 8a24d567839a3d04cb17a71b947eafb49888944f Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Wed, 2 Mar 2022 19:14:53 +0800 Subject: [PATCH] fix(mdx-loader): allow image paths to be URL encoded (#6792) --- .../transformImage/__tests__/__fixtures__/img.md | 2 ++ .../__tests__/__fixtures__/static2/img2 copy.png | Bin 0 -> 4728 bytes .../__tests__/__snapshots__/index.test.ts.snap | 2 ++ .../src/remark/transformImage/index.ts | 5 ++++- .../__tests__/__fixtures__/asset (2).pdf | 0 .../__tests__/__fixtures__/asset.md | 2 ++ .../__tests__/__snapshots__/index.test.ts.snap | 2 ++ .../src/remark/transformLinks/index.ts | 5 ++++- .../_dogfooding/_docs tests/tests/img-tests.mdx | 2 ++ .../_docs tests/tests/img/oss_logo (2).png | Bin 0 -> 4728 bytes 10 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/static2/img2 copy.png create mode 100644 packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset (2).pdf create mode 100644 website/_dogfooding/_docs tests/tests/img/oss_logo (2).png diff --git a/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/img.md b/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/img.md index e57e4c2948..9690775449 100644 --- a/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/img.md +++ b/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/img.md @@ -8,6 +8,8 @@ ![img from second static folder](./static2/img2.png) +![img with URL encoded chars](./static2/img2%20copy.png) + ![img](./static/img.png 'Title') ![img](/img.png) ![img with "quotes"](./static/img.png ''Quoted' title') diff --git a/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/static2/img2 copy.png b/packages/docusaurus-mdx-loader/src/remark/transformImage/__tests__/__fixtures__/static2/img2 copy.png new file mode 100644 index 0000000000000000000000000000000000000000..81923fc56250f9ccb038dd1c605e772846100290 GIT binary patch literal 4728 zcmV-;5{K=HP)35VHbPD=^(Y6;?`BW{RiQ%nD4e zz)Gtoa`RM1E>wqJfut3LUcr@Dz*lGxjUfO8N&QjAcMeakuZSN4m=8090pR6%j$@-c zn6v=I0PX=i1Bhp%eg+2zhrPl(HUV@8lL){Nz=ibF1AyUd)L*%7a&R~^0_YAVAqoDa z;k7r?2F9+d930Mo0J?*TPlA6_BH0UoWH#!juFD)88b|=l&W{!9zQ8kp(D3^c5rOj$ zI5_M8pAKl}FR*sZJ3j$%rFrEQK%`Rb zyMswUrh+MLJR9|=t{WX3PKW?V-5=77t->4D9{$84uO8*qHuwkP*{Hv8-RavsuBRH-ebdz zyCil0;HtMpgrN&7J}!m;0{ZV5>$s4nA)*H)2jdSx08J7ui#-NMBPk7hHmGcnG<2+` z*!XO&>F=f?VVdScgZsjc04&w(liamu*kveiD%*}j0Kd!hnIiy40K3Ac0s+bl!vBnQ z`0h#C)})R2WdEyh0}3l9qH}O?J^%|9dS^>)-W&m`zX9Ga=`G1doaPuADyC%y7CiHsx``N-51R0FRW%zhr*43Iu;l@5*&v zSW6i`iH^&0NPYuZ|0el1SPu_u- zci;i|O5~%$J%Ee|r49+KW}|)tpra}4qQ*ct6p9Ae6$zT^J9;$eFH4kHl;+Bk1Rf3M z-<@G5Z_#f$GxdVT$GCtr?+x1St)b0|+J-yKqY4_)Q3ycB!)(;|>&EVTbNJpIQ^SCH z1Mn^HAjmry=beq}m3J`BI|#{EeARUHPj8OYo7c0MXQTdNHtL5&I𝔗HFrw#yn8{ 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 1`] = ` {\\"img/node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/node_modules/file-loader/dist/cjs.js!./static2/img2.png\\").default} width=\\"256\\" height=\\"82\\" /> +{\\"img/node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/node_modules/file-loader/dist/cjs.js!./static2/img2 copy.png\\").default} width=\\"256\\" height=\\"82\\" /> + {\\"img\\"}/node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/node_modules/file-loader/dist/cjs.js!./static/img.png\\").default} title=\\"Title\\" width=\\"200\\" height=\\"200\\" /> {\\"img\\"}/node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/node_modules/file-loader/dist/cjs.js!./static/img.png\\").default} width=\\"200\\" height=\\"200\\" /> {\\"img/node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/node_modules/file-loader/dist/cjs.js!./static/img.png\\").default} title=\\"'Quoted' title\\" width=\\"200\\" height=\\"200\\" /> diff --git a/packages/docusaurus-mdx-loader/src/remark/transformImage/index.ts b/packages/docusaurus-mdx-loader/src/remark/transformImage/index.ts index 75e150564e..bcc37f6335 100644 --- a/packages/docusaurus-mdx-loader/src/remark/transformImage/index.ts +++ b/packages/docusaurus-mdx-loader/src/remark/transformImage/index.ts @@ -121,7 +121,10 @@ async function getImageAbsolutePath( return imageFilePath; } // relative paths are resolved against the source file's folder - const imageFilePath = path.join(path.dirname(filePath), imagePath); + const imageFilePath = path.join( + path.dirname(filePath), + decodeURIComponent(imagePath), + ); await ensureImageFileExist(imageFilePath, filePath); return imageFilePath; } diff --git a/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset (2).pdf b/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset (2).pdf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset.md b/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset.md index a3808267d2..407c853eb1 100644 --- a/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset.md +++ b/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__fixtures__/asset.md @@ -4,6 +4,8 @@ [asset](./asset.pdf) +[asset with URL encoded chars](./asset%20%282%29.pdf) + [asset with hash](./asset.pdf#page=2) [asset](asset.pdf 'Title') diff --git a/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__snapshots__/index.test.ts.snap index e64a76c275..1c27e176dc 100644 --- a/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-mdx-loader/src/remark/transformLinks/__tests__/__snapshots__/index.test.ts.snap @@ -16,6 +16,8 @@ exports[`transformAsset plugin transform md links to 1`] = ` /node_modules/file-loader/dist/cjs.js?name=assets/files/[name]-[contenthash].[ext]!./asset.pdf').default}>asset +/node_modules/file-loader/dist/cjs.js?name=assets/files/[name]-[contenthash].[ext]!./asset (2).pdf').default}>asset with URL encoded chars + /node_modules/file-loader/dist/cjs.js?name=assets/files/[name]-[contenthash].[ext]!./asset.pdf').default + '#page=2'}>asset with hash /node_modules/file-loader/dist/cjs.js?name=assets/files/[name]-[contenthash].[ext]!./asset.pdf').default} title=\\"Title\\">asset diff --git a/packages/docusaurus-mdx-loader/src/remark/transformLinks/index.ts b/packages/docusaurus-mdx-loader/src/remark/transformLinks/index.ts index 586f945c94..b1e7d1467e 100644 --- a/packages/docusaurus-mdx-loader/src/remark/transformLinks/index.ts +++ b/packages/docusaurus-mdx-loader/src/remark/transformLinks/index.ts @@ -130,7 +130,10 @@ async function processLinkNode(node: Link, context: Context) { return; } - const assetPath = await getAssetAbsolutePath(parsedUrl.pathname, context); + const assetPath = await getAssetAbsolutePath( + decodeURIComponent(parsedUrl.pathname), + context, + ); if (assetPath) { toAssetRequireNode(node, assetPath, context.filePath); } diff --git a/website/_dogfooding/_docs tests/tests/img-tests.mdx b/website/_dogfooding/_docs tests/tests/img-tests.mdx index dec07b7927..bddaf87634 100644 --- a/website/_dogfooding/_docs tests/tests/img-tests.mdx +++ b/website/_dogfooding/_docs tests/tests/img-tests.mdx @@ -10,6 +10,8 @@ import docusaurusImport from '@site/static/img/docusaurus.png'; export const docusaurusRequire = require('@site/static/img/docusaurus.png'); +![URL encoded image](./img/oss_logo%20%282%29.png) + ## Regular images diff --git a/website/_dogfooding/_docs tests/tests/img/oss_logo (2).png b/website/_dogfooding/_docs tests/tests/img/oss_logo (2).png new file mode 100644 index 0000000000000000000000000000000000000000..81923fc56250f9ccb038dd1c605e772846100290 GIT binary patch literal 4728 zcmV-;5{K=HP)35VHbPD=^(Y6;?`BW{RiQ%nD4e zz)Gtoa`RM1E>wqJfut3LUcr@Dz*lGxjUfO8N&QjAcMeakuZSN4m=8090pR6%j$@-c zn6v=I0PX=i1Bhp%eg+2zhrPl(HUV@8lL){Nz=ibF1AyUd)L*%7a&R~^0_YAVAqoDa z;k7r?2F9+d930Mo0J?*TPlA6_BH0UoWH#!juFD)88b|=l&W{!9zQ8kp(D3^c5rOj$ zI5_M8pAKl}FR*sZJ3j$%rFrEQK%`Rb zyMswUrh+MLJR9|=t{WX3PKW?V-5=77t->4D9{$84uO8*qHuwkP*{Hv8-RavsuBRH-ebdz zyCil0;HtMpgrN&7J}!m;0{ZV5>$s4nA)*H)2jdSx08J7ui#-NMBPk7hHmGcnG<2+` z*!XO&>F=f?VVdScgZsjc04&w(liamu*kveiD%*}j0Kd!hnIiy40K3Ac0s+bl!vBnQ z`0h#C)})R2WdEyh0}3l9qH}O?J^%|9dS^>)-W&m`zX9Ga=`G1doaPuADyC%y7CiHsx``N-51R0FRW%zhr*43Iu;l@5*&v zSW6i`iH^&0NPYuZ|0el1SPu_u- zci;i|O5~%$J%Ee|r49+KW}|)tpra}4qQ*ct6p9Ae6$zT^J9;$eFH4kHl;+Bk1Rf3M z-<@G5Z_#f$GxdVT$GCtr?+x1St)b0|+J-yKqY4_)Q3ycB!)(;|>&EVTbNJpIQ^SCH z1Mn^HAjmry=beq}m3J`BI|#{EeARUHPj8OYo7c0MXQTdNHtL5&I𝔗HFrw#yn8{ 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