diff --git a/packages/remark-wiki-link/src/lib/fromMarkdown.ts b/packages/remark-wiki-link/src/lib/fromMarkdown.ts index 5b5f7b9c..e91d237e 100644 --- a/packages/remark-wiki-link/src/lib/fromMarkdown.ts +++ b/packages/remark-wiki-link/src/lib/fromMarkdown.ts @@ -110,6 +110,7 @@ function fromMarkdown(opts: FromMarkdownOptions = {}) { ? "/" + possibleWikiLinkPermalinks[0] : possibleWikiLinkPermalinks[0]) || ""; + const isExternal = /^https?:\/\//.test(link); wikiLink.data.exists = !!matchingPermalink; wikiLink.data.permalink = link; @@ -130,7 +131,7 @@ function fromMarkdown(opts: FromMarkdownOptions = {}) { wikiLink.data.hName = "a"; wikiLink.data.hProperties = { className: classNames + " " + "transclusion", - href: hrefTemplate(link) + headingId, + href: hrefTemplate(link) + headingId }; wikiLink.data.hChildren = [{ type: "text", value: displayName }]; @@ -163,7 +164,11 @@ function fromMarkdown(opts: FromMarkdownOptions = {}) { wikiLink.data.hProperties = { className: classNames, href: hrefTemplate(link) + headingId, + target: "_blank", }; + if(isExternal){ + wikiLink.data.hProperties.target = "_blank"; // Open in a new tab + } wikiLink.data.hChildren = [{ type: "text", value: displayName }]; } } diff --git a/packages/remark-wiki-link/src/lib/html.ts b/packages/remark-wiki-link/src/lib/html.ts index 1058652f..ce7460d6 100644 --- a/packages/remark-wiki-link/src/lib/html.ts +++ b/packages/remark-wiki-link/src/lib/html.ts @@ -96,6 +96,9 @@ function html(opts: HtmlOptions = {}) { : possibleWikiLinkPermalinks[0]) || ""; + const isExternal = /^https?:\/\//.test(link); + const openInNewTab = isExternal ? 'target="_blank"' : ''; + // remove leading # if the target is a heading on the same page const displayName = alias || target.replace(/^#/, ""); // replace spaces with dashes and lowercase headings diff --git a/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts b/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts index 663b885c..9b173f4a 100644 --- a/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts +++ b/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts @@ -331,4 +331,14 @@ describe("micromark-extension-wiki-link", () => { expect(serialized).toBe(`
`); }); }) + + describe("External links", () => { + test("parses an external link that opens in a new tab", () => { + const serialized = micromark("[google](https://www.google.com/)", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], + }); + expect(serialized).toBe(``); + }); + }) });