From 8ea920ef91559f18fe776a27854cd9fbff430845 Mon Sep 17 00:00:00 2001 From: hikerpig Date: Mon, 2 Sep 2019 14:56:36 +0800 Subject: [PATCH] fix: Can't open external browser in Markdown Preview with external link containing '#', close #3213 --- browser/components/MarkdownPreview.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 50f073e5..7c747672 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -1033,17 +1033,21 @@ export default class MarkdownPreview extends React.Component { e.stopPropagation() const rawHref = e.target.getAttribute('href') - const parser = document.createElement('a') - parser.href = e.target.getAttribute('href') - const { href, hash } = parser - const linkHash = hash === '' ? rawHref : hash // needed because we're having special link formats that are removed by parser e.g. :line:10 - if (!rawHref) return // not checked href because parser will create file://... string for [empty link]() - const extractId = /(main.html)?#/ - const regexNoteInternalLink = new RegExp(`${extractId.source}(.+)`) - if (regexNoteInternalLink.test(linkHash)) { - const targetId = mdurl.encode(linkHash.replace(extractId, '')) + const parser = document.createElement('a') + parser.href = rawHref + const isStartWithHash = rawHref[0] === '#' + const { href, hash } = parser + + const maybeExternalLink = /https?:\/\//.test(rawHref) + const linkHash = (maybeExternalLink || hash === '') ? rawHref : hash // needed because we're having special link formats that are removed by parser e.g. :line:10 + + const extractIdRegex = /file:\/\/.*main.?\w*.html#/ // file://path/to/main(.development.)html + const regexNoteInternalLink = new RegExp(`${extractIdRegex.source}(.+)`) + if (isStartWithHash || regexNoteInternalLink.test(linkHash)) { + const extractedId = isStartWithHash ? linkHash.slice(1) : linkHash.replace(extractIdRegex, '') + const targetId = mdurl.encode(extractedId) const targetElement = this.refs.root.contentWindow.document.getElementById( targetId )