From bb88ba28ed04ca2c45bc6b43dcf09178b7efb0a3 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 12 Dec 2023 13:12:05 +0100 Subject: [PATCH] URI encode branch of images in markdown files Pushed-by: Florian Scholdei Co-authored-by: Florian Scholdei --- gradle/changelog/markdown_encode_branch.yaml | 2 + .../markdown/MarkdownImageRenderer.test.ts | 57 +++++++++++++++++++ .../src/markdown/MarkdownImageRenderer.tsx | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 gradle/changelog/markdown_encode_branch.yaml create mode 100644 scm-ui/ui-components/src/markdown/MarkdownImageRenderer.test.ts diff --git a/gradle/changelog/markdown_encode_branch.yaml b/gradle/changelog/markdown_encode_branch.yaml new file mode 100644 index 0000000000..fec6033c25 --- /dev/null +++ b/gradle/changelog/markdown_encode_branch.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: URI encode branch of images in markdown files diff --git a/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.test.ts b/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.test.ts new file mode 100644 index 0000000000..147c3088a2 --- /dev/null +++ b/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.test.ts @@ -0,0 +1,57 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import React from "react"; +import { createLocalLink } from "./MarkdownImageRenderer"; + +describe("createLocalLink tests", () => { + const revision = "revision"; + const basePath = `/repo/namespace/name/code/sources/${revision}/`; + const contentLink = "http://localhost:8081/scm/api/v2/repositories/namespace/name/content/{revision}/{path}"; + const currentPath = basePath + "README.md/"; + const link = "image.png"; + + it("should return link for internal scm repo link", () => { + const internalScmLink = "/repo/namespace/name/code/sources/develop/myImg.png"; + expect(createLocalLink(basePath, contentLink, revision, currentPath, internalScmLink)).toBe(internalScmLink); + }); + + it("should return modified contentLink for absolute link", () => { + expect(createLocalLink(basePath, contentLink, revision, currentPath, "/path/anotherImg.jpg")).toBe( + "http://localhost:8081/scm/api/v2/repositories/namespace/name/content/revision/path/anotherImg.jpg" + ); + }); + + it("should URI encode branch", () => { + expect( + createLocalLink( + "/repo/namespace/name/code/sources/feature/awesome/", + contentLink, + "feature/awesome", + currentPath, + link + ) + ).toContain("feature%2Fawesome"); + }); +}); diff --git a/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.tsx b/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.tsx index 6fd43b795c..d383bddde4 100644 --- a/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.tsx +++ b/scm-ui/ui-components/src/markdown/MarkdownImageRenderer.tsx @@ -42,7 +42,7 @@ export const createLocalLink = ( currentPath: string, link: string ) => { - const apiBasePath = contentLink.replace("{revision}", revision); + const apiBasePath = contentLink.replace("{revision}", encodeURIComponent(revision)); if (isInternalScmRepoLink(link)) { return link; }