From 624347b00c1d2edd15107068e222892c0cda9355 Mon Sep 17 00:00:00 2001 From: endiliey Date: Fri, 20 Jul 2018 18:30:58 +0800 Subject: [PATCH 1/6] Don't replace any relative links to static assets in a fenced code block --- docs/api-doc-markdown.md | 2 + docs/assets/docusaurus.png | Bin 0 -> 5142 bytes lib/server/__tests__/__fixtures__/doc1.md | 12 ++- lib/server/__tests__/__fixtures__/doc2.md | 13 +++- .../__tests__/__snapshots__/docs.test.js.snap | 70 +++++++++++++++++- lib/server/__tests__/docs.test.js | 25 ++++++- lib/server/docs.js | 18 +++-- 7 files changed, 129 insertions(+), 11 deletions(-) create mode 100644 docs/assets/docusaurus.png diff --git a/docs/api-doc-markdown.md b/docs/api-doc-markdown.md index c0087f84dea0..4f6bdbe6ebf4 100644 --- a/docs/api-doc-markdown.md +++ b/docs/api-doc-markdown.md @@ -105,6 +105,8 @@ Example: ![alt-text](assets/doc-image.png) ``` +![alt-text](assets/docusaurus.png) + ### Generating Table of Contents You can make an auto-generated list of links, which can be useful as a table of contents for API docs. diff --git a/docs/assets/docusaurus.png b/docs/assets/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/lib/server/__tests__/__fixtures__/doc1.md b/lib/server/__tests__/__fixtures__/doc1.md index 3320c42f0efa..6dbc4c070673 100644 --- a/lib/server/__tests__/__fixtures__/doc1.md +++ b/lib/server/__tests__/__fixtures__/doc1.md @@ -3,4 +3,14 @@ id: doc1 title: Document 1 --- -Docusaurus is the best :) \ No newline at end of file +Docusaurus is the best :) + +![image1](assets/image1.png) + +```js +console.log("Docusaurus"); +``` + +![image2](assets/image2.jpg) +![image3](assets/image3.gif) + diff --git a/lib/server/__tests__/__fixtures__/doc2.md b/lib/server/__tests__/__fixtures__/doc2.md index 7224307a9349..8219f750852f 100644 --- a/lib/server/__tests__/__fixtures__/doc2.md +++ b/lib/server/__tests__/__fixtures__/doc2.md @@ -15,4 +15,15 @@ title: Document 2 ## Repeating Docs - [doc1](doc1.md) -- [doc2](./doc2.md) \ No newline at end of file +- [doc2](./doc2.md) + +## Do not replace this +```md +![image1](assets/image1.png) +``` + +```js +const doc1 = foo(); +console.log("[image2](assets/image2.jpg)"); +const testStr = `![image3](assets/image3.gif)`; +``` \ No newline at end of file diff --git a/lib/server/__tests__/__snapshots__/docs.test.js.snap b/lib/server/__tests__/__snapshots__/docs.test.js.snap index c7c9123421f7..354022a1e718 100644 --- a/lib/server/__tests__/__snapshots__/docs.test.js.snap +++ b/lib/server/__tests__/__snapshots__/docs.test.js.snap @@ -2,7 +2,18 @@ exports[`mdToHtmlify transform nothing 1`] = ` " -Docusaurus is the best :)" +Docusaurus is the best :) + +![image1](assets/image1.png) + +\`\`\`js +console.log(\\"Docusaurus\\"); +\`\`\` + +![image2](assets/image2.jpg) +![image3](assets/image3.gif) + +" `; exports[`mdToHtmlify transform to correct link 1`] = ` @@ -19,5 +30,60 @@ exports[`mdToHtmlify transform to correct link 1`] = ` ## Repeating Docs - [doc1](/docs/en/next/doc1) -- [doc2](/docs/en/next/doc2)" +- [doc2](/docs/en/next/doc2) + +## Do not replace this +\`\`\`md +![image1](assets/image1.png) +\`\`\` + +\`\`\`js +const doc1 = foo(); +console.log(\\"[image2](assets/image2.jpg)\\"); +const testStr = \`![image3](assets/image3.gif)\`; +\`\`\`" +`; + +exports[`replaceAssetsLink does not transform document without valid assets link 1`] = ` +" +### Existing Docs + +- [doc1](doc1.md) +- [doc2](./doc2.md) + +### Non-existing Docs + +- [hahaha](hahaha.md) + +## Repeating Docs + +- [doc1](doc1.md) +- [doc2](./doc2.md) + +## Do not replace this +\`\`\`md +![image1](assets/image1.png) +\`\`\` + +\`\`\`js +const doc1 = foo(); +console.log(\\"[image2](assets/image2.jpg)\\"); +const testStr = \`![image3](assets/image3.gif)\`; +\`\`\`" +`; + +exports[`replaceAssetsLink transform document with valid assets link 1`] = ` +" +Docusaurus is the best :) + +![image1](/docs/assets/image1.png) + +\`\`\`js +console.log(\\"Docusaurus\\"); +\`\`\` + +![image2](/docs/assets/image2.jpg) +![image3](/docs/assets/image3.gif) + +" `; diff --git a/lib/server/__tests__/docs.test.js b/lib/server/__tests__/docs.test.js index eb3cbee9c5c8..9fb32ff3fb82 100644 --- a/lib/server/__tests__/docs.test.js +++ b/lib/server/__tests__/docs.test.js @@ -49,9 +49,10 @@ const doc2 = fs.readFileSync( 'utf8' ); +const rawContent1 = metadataUtils.extractMetadata(doc1).rawContent; +const rawContent2 = metadataUtils.extractMetadata(doc2).rawContent; + describe('mdToHtmlify', () => { - const rawContent1 = metadataUtils.extractMetadata(doc1).rawContent; - const rawContent2 = metadataUtils.extractMetadata(doc2).rawContent; const mdToHtml = metadataUtils.mdToHtml(Metadata, '/'); test('transform nothing', () => { @@ -129,6 +130,26 @@ describe('getFile', () => { }); }); +describe('replaceAssetsLink', () => { + test('transform document with valid assets link', () => { + const content1 = docs.replaceAssetsLink(rawContent1); + expect(content1).toMatchSnapshot(); + expect(content1).toContain('![image1](/docs/assets/image1.png)'); + expect(content1).toContain('![image2](/docs/assets/image2.jpg)'); + expect(content1).toContain('![image3](/docs/assets/image3.gif)'); + expect(content1).not.toEqual(rawContent1); + }); + + test('does not transform document without valid assets link', () => { + const content2 = docs.replaceAssetsLink(rawContent2); + expect(content2).toMatchSnapshot(); + expect(content2).not.toContain('![image1](/docs/assets/image1.png)'); + expect(content2).not.toContain('![image2](/docs/assets/image2.jpg)'); + expect(content2).not.toContain('![image3](/docs/assets/image3.gif)'); + expect(content2).toEqual(rawContent2); + }); +}); + afterAll(() => { process.chdir(originalCwd); }); diff --git a/lib/server/docs.js b/lib/server/docs.js index 896d3e1ec994..3255ae031b11 100644 --- a/lib/server/docs.js +++ b/lib/server/docs.js @@ -69,6 +69,16 @@ function mdToHtmlify(oldContent, mdToHtml, metadata) { return content; } +function replaceAssetsLink(oldContent) { + return oldContent.replace( + /(^`{3}(?:[\S]+)\n[\s\S]*?)?(?:\]\(assets\/)([\s\S]*?`{3})?/gm, + (match, fenceBlockStart, fenceBlockEnd) => + fenceBlockStart && fenceBlockEnd + ? match + : match.replace(/\]\(assets\//g, `](${siteConfig.baseUrl}docs/assets/`) + ); +} + function getComponent(rawContent, mdToHtml, metadata) { // generate table of contents let content = insertTOC(rawContent); @@ -76,11 +86,8 @@ function getComponent(rawContent, mdToHtml, metadata) { // replace any links to markdown files to their website html links content = mdToHtmlify(content, mdToHtml, metadata); - // replace any relative links to static assets to absolute links - content = content.replace( - /\]\(assets\//g, - `](${siteConfig.baseUrl}docs/assets/` - ); + // replace any relative links to static assets (not in fenced code blocks) to absolute links + content = replaceAssetsLink(content); const DocsLayout = require('../core/DocsLayout.js'); return ( @@ -97,4 +104,5 @@ module.exports = { getComponent, getFile, mdToHtmlify, + replaceAssetsLink, }; From 6b73b789b0ccdecdbb615d68fabf51cd203c70d6 Mon Sep 17 00:00:00 2001 From: endiliey Date: Fri, 20 Jul 2018 20:54:53 +0800 Subject: [PATCH 2/6] revert unintended docs change --- docs/api-doc-markdown.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/api-doc-markdown.md b/docs/api-doc-markdown.md index 4f6bdbe6ebf4..c0087f84dea0 100644 --- a/docs/api-doc-markdown.md +++ b/docs/api-doc-markdown.md @@ -105,8 +105,6 @@ Example: ![alt-text](assets/doc-image.png) ``` -![alt-text](assets/docusaurus.png) - ### Generating Table of Contents You can make an auto-generated list of links, which can be useful as a table of contents for API docs. From dd2591fe43cdf3962a315601e31c0edab057a939 Mon Sep 17 00:00:00 2001 From: endiliey Date: Fri, 20 Jul 2018 21:17:22 +0800 Subject: [PATCH 3/6] improve regex --- lib/server/docs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/server/docs.js b/lib/server/docs.js index 3255ae031b11..b4fccaaa3004 100644 --- a/lib/server/docs.js +++ b/lib/server/docs.js @@ -71,7 +71,7 @@ function mdToHtmlify(oldContent, mdToHtml, metadata) { function replaceAssetsLink(oldContent) { return oldContent.replace( - /(^`{3}(?:[\S]+)\n[\s\S]*?)?(?:\]\(assets\/)([\s\S]*?`{3})?/gm, + /(^`{3}(?:[\S]+)\n[\s\S]*?)?(?:\]\(assets\/)([\s\S]*?\n`{3})?/gm, (match, fenceBlockStart, fenceBlockEnd) => fenceBlockStart && fenceBlockEnd ? match From 49ab2a454df3005c097cb810bcdc39440a795c69 Mon Sep 17 00:00:00 2001 From: endiliey Date: Fri, 20 Jul 2018 22:29:12 +0800 Subject: [PATCH 4/6] remove test file :sob --- docs/assets/docusaurus.png | Bin 5142 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/assets/docusaurus.png diff --git a/docs/assets/docusaurus.png b/docs/assets/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 F{0H{b<4^zq From 4b28ab88e03818dd9e2911aa579b021449c993e8 Mon Sep 17 00:00:00 2001 From: endiliey Date: Sat, 21 Jul 2018 19:59:35 +0800 Subject: [PATCH 5/6] stronger regex test for replace assets --- lib/server/__tests__/__fixtures__/doc1.md | 5 +++++ lib/server/__tests__/__snapshots__/docs.test.js.snap | 12 ++++++++++-- lib/server/__tests__/docs.test.js | 5 +++++ lib/server/docs.js | 11 +++++++---- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/server/__tests__/__fixtures__/doc1.md b/lib/server/__tests__/__fixtures__/doc1.md index 6dbc4c070673..544689cab74f 100644 --- a/lib/server/__tests__/__fixtures__/doc1.md +++ b/lib/server/__tests__/__fixtures__/doc1.md @@ -14,3 +14,8 @@ console.log("Docusaurus"); ![image2](assets/image2.jpg) ![image3](assets/image3.gif) +Don't replace the one below +```md + +![image4](assets/image4.bmp) +``` \ No newline at end of file diff --git a/lib/server/__tests__/__snapshots__/docs.test.js.snap b/lib/server/__tests__/__snapshots__/docs.test.js.snap index 354022a1e718..50cf8f40c95a 100644 --- a/lib/server/__tests__/__snapshots__/docs.test.js.snap +++ b/lib/server/__tests__/__snapshots__/docs.test.js.snap @@ -13,7 +13,11 @@ console.log(\\"Docusaurus\\"); ![image2](assets/image2.jpg) ![image3](assets/image3.gif) -" +Don't replace the one below +\`\`\`md + +![image4](assets/image4.bmp) +\`\`\`" `; exports[`mdToHtmlify transform to correct link 1`] = ` @@ -85,5 +89,9 @@ console.log(\\"Docusaurus\\"); ![image2](/docs/assets/image2.jpg) ![image3](/docs/assets/image3.gif) -" +Don't replace the one below +\`\`\`md + +![image4](assets/image4.bmp) +\`\`\`" `; diff --git a/lib/server/__tests__/docs.test.js b/lib/server/__tests__/docs.test.js index 9fb32ff3fb82..19ec0e7c1a11 100644 --- a/lib/server/__tests__/docs.test.js +++ b/lib/server/__tests__/docs.test.js @@ -137,6 +137,11 @@ describe('replaceAssetsLink', () => { expect(content1).toContain('![image1](/docs/assets/image1.png)'); expect(content1).toContain('![image2](/docs/assets/image2.jpg)'); expect(content1).toContain('![image3](/docs/assets/image3.gif)'); + expect(content1).toContain('![image4](assets/image4.bmp)'); + expect(content1).not.toContain('![image1](assets/image1.png)'); + expect(content1).not.toContain('![image2](assets/image2.jpg)'); + expect(content1).not.toContain('![image3](assets/image3.gif)'); + expect(content1).not.toContain('![image4](/docs/assets/image4.bmp)'); expect(content1).not.toEqual(rawContent1); }); diff --git a/lib/server/docs.js b/lib/server/docs.js index b4fccaaa3004..c304d5878c96 100644 --- a/lib/server/docs.js +++ b/lib/server/docs.js @@ -71,11 +71,14 @@ function mdToHtmlify(oldContent, mdToHtml, metadata) { function replaceAssetsLink(oldContent) { return oldContent.replace( - /(^`{3}(?:[\S]+)\n[\s\S]*?)?(?:\]\(assets\/)([\s\S]*?\n`{3})?/gm, - (match, fenceBlockStart, fenceBlockEnd) => - fenceBlockStart && fenceBlockEnd + /(?:\]\(assets\/)([\S\s]*?`{3}([\S]+)?)?/gm, + (match, m2, m3) => { + const fenceBlock = m2 && !m3; + const ans = fenceBlock ? match - : match.replace(/\]\(assets\//g, `](${siteConfig.baseUrl}docs/assets/`) + : match.replace(/\]\(assets\//g, `](${siteConfig.baseUrl}docs/assets/`); + return ans; + } ); } From a0405459676e15aa1b4cd2eec714ff5346e3b15e Mon Sep 17 00:00:00 2001 From: endiliey Date: Sat, 21 Jul 2018 21:45:35 +0800 Subject: [PATCH 6/6] super simplify solution --- lib/server/docs.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/server/docs.js b/lib/server/docs.js index c304d5878c96..2ab0bae25a40 100644 --- a/lib/server/docs.js +++ b/lib/server/docs.js @@ -70,16 +70,16 @@ function mdToHtmlify(oldContent, mdToHtml, metadata) { } function replaceAssetsLink(oldContent) { - return oldContent.replace( - /(?:\]\(assets\/)([\S\s]*?`{3}([\S]+)?)?/gm, - (match, m2, m3) => { - const fenceBlock = m2 && !m3; - const ans = fenceBlock - ? match - : match.replace(/\]\(assets\//g, `](${siteConfig.baseUrl}docs/assets/`); - return ans; + let fencedBlock = false; + const lines = oldContent.split('\n').map(line => { + if (line.trim().startsWith('```')) { + fencedBlock = !fencedBlock; } - ); + return fencedBlock + ? line + : line.replace(/\]\(assets\//g, `](${siteConfig.baseUrl}docs/assets/`); + }); + return lines.join('\n'); } function getComponent(rawContent, mdToHtml, metadata) {