From b24c06fbce88d9080fb6aa6ef8416101cf577d79 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Tue, 6 Jun 2023 11:19:24 +0800 Subject: [PATCH] :bug: The hyperlink in the changelog fails to jump to the browser to open https://github.com/siyuan-note/siyuan/issues/8458 --- app/electron/main.js | 25 ++++++++++++------------- kernel/api/system.go | 5 +++-- kernel/bazaar/package.go | 20 +------------------- kernel/util/lute.go | 30 +++++++++++++++++++++++++++++- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/app/electron/main.js b/app/electron/main.js index 4f4536c07..dd5847ca5 100644 --- a/app/electron/main.js +++ b/app/electron/main.js @@ -119,8 +119,10 @@ const exitApp = (port, errorWindowId) => { } }; +const localServer = "http://127.0.0.1" + const getServer = (port = kernelPort) => { - return "http://127.0.0.1:" + port; + return localServer + ":" + port; }; const sleep = (ms) => { @@ -359,16 +361,13 @@ const boot = () => { const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); // 当前页面链接使用浏览器打开 - currentWindow.webContents.on("will-navigate", (event, url) => { - if (event.sender) { - const currentURL = new URL(event.sender.getURL()); - if (url.startsWith(getServer(currentURL.port))) { - return; - } - - event.preventDefault(); - shell.openExternal(url); + currentWindow.webContents.on("will-navigate", (event) => { + const url = event.url; + event.preventDefault(); + if (url.startsWith(localServer)) { + return; } + shell.openExternal(url); }); currentWindow.on("close", (event) => { @@ -664,10 +663,10 @@ app.whenReady().then(() => { BrowserWindow.fromId(id).webContents.send("siyuan-export-close", id); }); ipcMain.on("siyuan-export-prevent", (event, id) => { - BrowserWindow.fromId(id).webContents.on("will-navigate", (event, url) => { - const currentURL = new URL(event.sender.getURL()); + BrowserWindow.fromId(id).webContents.on("will-navigate", (event) => { + const url = event.url; event.preventDefault(); - if (url.startsWith(getServer(currentURL.port))) { + if (url.startsWith(localServer)) { return; } shell.openExternal(url); diff --git a/kernel/api/system.go b/kernel/api/system.go index 66b5f3913..ef6b89019 100644 --- a/kernel/api/system.go +++ b/kernel/api/system.go @@ -66,10 +66,11 @@ func getChangelog(c *gin.Context) { model.Conf.ShowChangelog = false luteEngine := lute.New() - htmlContent := luteEngine.Markdown("", contentData) + htmlContent := luteEngine.MarkdownStr("", string(contentData)) + htmlContent = util.LinkTarget(htmlContent, "") data["show"] = true - data["html"] = gulu.Str.FromBytes(htmlContent) + data["html"] = htmlContent ret.Data = data } diff --git a/kernel/bazaar/package.go b/kernel/bazaar/package.go index cb9d2dc89..8ef2bf6d6 100644 --- a/kernel/bazaar/package.go +++ b/kernel/bazaar/package.go @@ -28,7 +28,6 @@ import ( "github.com/88250/gulu" "github.com/88250/lute" - "github.com/PuerkitoBio/goquery" "github.com/araddon/dateparse" "github.com/imroc/req/v3" "github.com/siyuan-note/filelock" @@ -517,24 +516,7 @@ func renderREADME(repoURL string, mdData []byte) (ret string, err error) { linkBase := "https://cdn.jsdelivr.net/gh/" + strings.TrimPrefix(repoURL, "https://github.com/") luteEngine.SetLinkBase(linkBase) ret = luteEngine.Md2HTML(string(mdData)) - doc, err := goquery.NewDocumentFromReader(strings.NewReader(ret)) - if nil != err { - logging.LogErrorf("parse HTML failed: %s", err) - return - } - - doc.Find("a").Each(func(i int, selection *goquery.Selection) { - if href, ok := selection.Attr("href"); ok { - if util.IsRelativePath(href) { - selection.SetAttr("href", linkBase+href) - } - - // The hyperlink in the marketplace package README fails to jump to the browser to open https://github.com/siyuan-note/siyuan/issues/8452 - selection.SetAttr("target", "_blank") - } - }) - - ret, _ = doc.Find("body").Html() + ret = util.LinkTarget(ret, linkBase) return } diff --git a/kernel/util/lute.go b/kernel/util/lute.go index 26aae3d9b..13ae6e0a7 100644 --- a/kernel/util/lute.go +++ b/kernel/util/lute.go @@ -16,7 +16,13 @@ package util -import "github.com/88250/lute" +import ( + "strings" + + "github.com/88250/lute" + "github.com/PuerkitoBio/goquery" + "github.com/siyuan-note/logging" +) func NewLute() (ret *lute.Lute) { ret = lute.New() @@ -62,3 +68,25 @@ func NewStdLute() (ret *lute.Lute) { ret.SetInlineMathAllowDigitAfterOpenMarker(true) // Formula parsing supports $ followed by numbers when importing Markdown https://github.com/siyuan-note/siyuan/issues/8362 return } + +func LinkTarget(htmlStr, linkBase string) (ret string) { + doc, err := goquery.NewDocumentFromReader(strings.NewReader(htmlStr)) + if nil != err { + logging.LogErrorf("parse HTML failed: %s", err) + return + } + + doc.Find("a").Each(func(i int, selection *goquery.Selection) { + if href, ok := selection.Attr("href"); ok { + if IsRelativePath(href) { + selection.SetAttr("href", linkBase+href) + } + + // The hyperlink in the marketplace package README fails to jump to the browser to open https://github.com/siyuan-note/siyuan/issues/8452 + selection.SetAttr("target", "_blank") + } + }) + + ret, _ = doc.Find("body").Html() + return +}