Skip to content

Commit 934ecc4

Browse files
authored
fix: multiple titles/urls doesn't work properly (#349)
* refactor: extract buildTemplate for testing * test: add test for buildTemplate * fix: buildTemplate * chore(build): eslint-disable
1 parent 8c3d4c1 commit 934ecc4

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

src/options/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from "react";
22
import ReactDOM from "react-dom/client";
33
import { Options } from "./Options";
44

5+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
56
ReactDOM.createRoot(document.getElementById("root")!).render(
67
<React.StrictMode>
78
<Options />

src/popup/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ chrome.tabs.query(queryInfo, function (tabs) {
1616
const url = tab.url || "";
1717
copyToClipboard(options.format, title, escapeBrackets(url));
1818

19+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1920
ReactDOM.createRoot(document.getElementById("root")!).render(
2021
<React.StrictMode>
2122
<Popup title={title} url={escapeBrackets(url)} />

src/util.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
escapeTabsAndNewLines,
33
unescapeTabsAndNewLines,
44
escapeBrackets,
5+
buildTemplate,
56
} from "./util";
67
import { describe, test, expect } from "vitest";
78

@@ -39,3 +40,31 @@ describe("escapeBrackets", () => {
3940
expect(escapeBrackets(arg)).toBe(expected);
4041
});
4142
});
43+
44+
describe("buildTemplate", () => {
45+
test.each([
46+
{
47+
template: "[${title}](${url})",
48+
title: "dummy title",
49+
url: "https://example.com",
50+
expected: "[dummy title](https://example.com)",
51+
},
52+
// multiple titles
53+
// ref. #348
54+
{
55+
template: "${title} - [${title}](${url})",
56+
title: "dummy title",
57+
url: "https://example.com",
58+
expected: "dummy title - [dummy title](https://example.com)",
59+
},
60+
// multiple urls
61+
{
62+
template: "${url} - [${title}](${url})",
63+
title: "dummy title",
64+
url: "https://example.com",
65+
expected: "https://example.com - [dummy title](https://example.com)",
66+
},
67+
])("build templates", ({ template, title, url, expected }) => {
68+
expect(buildTemplate(template, title, url)).toBe(expected);
69+
});
70+
});

src/util.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ export function escapeBrackets(str: string) {
1414
.replace(/\]/g, escape);
1515
}
1616

17+
export function buildTemplate(template: string, title: string, url: string) {
18+
return template.replaceAll("${title}", title).replaceAll("${url}", url);
19+
}
20+
1721
export function copyToClipboard(template: string, title: string, url: string) {
1822
console.log("copyToClipboard", template, title, url);
1923

20-
const textToCopy = template.replace("${title}", title).replace("${url}", url);
24+
const textToCopy = buildTemplate(template, title, url);
2125

2226
const listener = (event: any) => {
2327
event.clipboardData.setData("text/plain", `${textToCopy}`);

0 commit comments

Comments
 (0)