diff --git a/app/src/boot/onGetConfig.ts b/app/src/boot/onGetConfig.ts index c5fafe9b8..68782731e 100644 --- a/app/src/boot/onGetConfig.ts +++ b/app/src/boot/onGetConfig.ts @@ -136,9 +136,6 @@ export const onGetConfig = (isStart: boolean) => { try { JSONToLayout(isStart); openChangelog(); - if (window.JSAndroid) { - window.openFileByURL(window.JSAndroid.getBlockURL()); - } } catch (e) { resetLayout(); } diff --git a/app/src/index.ts b/app/src/index.ts index 20ad3eed6..699a06902 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -178,11 +178,14 @@ class App { } new App(); + window.openFileByURL = (openURL) => { if (openURL && isSYProtocol(openURL)) { + const isZoomIn = getSearch("focus", openURL) === "1" openFileById({ id: getIdFromSYProtocol(openURL), - action: getSearch("focus", openURL) === "1" ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT] + action: isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT], + zoomIn: isZoomIn }); return true; } diff --git a/app/src/layout/util.ts b/app/src/layout/util.ts index d4d752f63..7d29edc90 100644 --- a/app/src/layout/util.ts +++ b/app/src/layout/util.ts @@ -32,7 +32,7 @@ import {getSearch, isWindow} from "../util/functions"; import {setTabPosition} from "../window/setHeader"; /// #endif import {showMessage} from "../dialog/message"; -import {getIdFromSYProtocol, isSYProtocol} from "../util/pathName"; +import {getIdZoomInByPath} from "../util/pathName"; export const setPanelFocus = (element: Element) => { if (element.classList.contains("layout__tab--active") || element.classList.contains("layout__wnd--active")) { @@ -369,38 +369,15 @@ export const JSONToLayout = (isStart: boolean) => { } }); } + const idZoomIn = getIdZoomInByPath(); - // TODO PWA 捕获 siyuan:// - const searchParams = new URLSearchParams(window.location.search); - const url = searchParams.get("url"); - - const isWebSiyuanUrl = /^web\+siyuan:\/\/blocks\/\d{14}-\w{7}/.test(url); - if (isSYProtocol(url) || isWebSiyuanUrl) { - searchParams.delete("url"); - switch (true) { - case isSYProtocol(url): - searchParams.set("id", getIdFromSYProtocol(url)); - break; - case isWebSiyuanUrl: - searchParams.set("id", url.substring(20, 20 + 22)); - break; - } - - const focus = getSearch("focus", url); - if (focus) { - searchParams.set("focus", focus); - } - } - - // 支持通过 URL 查询字符串参数 `id` 和 `focus` 跳转到 Web 端指定块 https://github.com/siyuan-note/siyuan/pull/7086 - const openId = searchParams.get("id"); - if (openId) { - // 启动时 layout 中有该文档,该文档还原会在此之后,因此需有延迟 + // 启动时 layout 中有该文档,该文档还原会在此之后,因此需有延迟 + if (idZoomIn.id) { setTimeout(() => { openFileById({ - id: openId, - action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT], - zoomIn: searchParams.get("focus") === "1" + id: idZoomIn.id, + action: idZoomIn.isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT], + zoomIn: idZoomIn.isZoomIn }); }, Constants.TIMEOUT_BLOCKLOAD); } diff --git a/app/src/mobile/util/initFramework.ts b/app/src/mobile/util/initFramework.ts index f29093f4a..b442688b2 100644 --- a/app/src/mobile/util/initFramework.ts +++ b/app/src/mobile/util/initFramework.ts @@ -7,7 +7,7 @@ import {fetchPost} from "../../util/fetch"; import {setInlineStyle} from "../../util/assets"; import {renderSnippet} from "../../config/util/snippets"; import {setEmpty} from "./setEmpty"; -import {getOpenNotebookCount} from "../../util/pathName"; +import {getIdZoomInByPath, getOpenNotebookCount} from "../../util/pathName"; import {popMenu} from "../menu"; import {MobileFiles} from "./MobileFiles"; import {MobileOutline} from "./MobileOutline"; @@ -140,10 +140,10 @@ export const initFramework = () => { if (window.JSAndroid && window.openFileByURL(window.JSAndroid.getBlockURL())) { return; } - const openId = getSearch("id"); - if (openId) { - openMobileFileById(openId, - getSearch("focus") === "1" ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]); + const idZoomIn = getIdZoomInByPath(); + if (idZoomIn.id) { + openMobileFileById(idZoomIn.id, + idZoomIn.isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]); return; } const localDoc = window.siyuan.storage[Constants.LOCAL_DOCINFO]; diff --git a/app/src/util/pathName.ts b/app/src/util/pathName.ts index f56c03242..44991a44f 100644 --- a/app/src/util/pathName.ts +++ b/app/src/util/pathName.ts @@ -2,12 +2,35 @@ import * as path from "path"; import {fetchPost} from "./fetch"; import {Dialog} from "../dialog"; import {escapeHtml} from "./escape"; -import {isMobile} from "./functions"; +import {getSearch, isMobile} from "./functions"; import {focusByRange} from "../protyle/util/selection"; import {unicode2Emoji} from "../emoji"; import {Constants} from "../constants"; import {showMessage} from "../dialog/message"; +export const getIdZoomInByPath = () => { + const searchParams = new URLSearchParams(window.location.search); + const PWAURL = searchParams.get("url"); + let id = ""; + let isZoomIn = false; + if (/^web\+siyuan:\/\/blocks\/\d{14}-\w{7}/.test(PWAURL)) { + // PWA 捕获 web+siyuan://blocks/20221031001313-rk7sd0e?focus=1 + id = PWAURL.substring(20, 20 + 22) + isZoomIn = getSearch("focus", PWAURL) === "1"; + } else if (window.JSAndroid) { + // PAD 通过思源协议打开 + const SYURL = window.JSAndroid.getBlockURL(); + id = getIdFromSYProtocol(SYURL); + isZoomIn = getSearch("focus", SYURL) === "1" + } else { + // 支持通过 URL 查询字符串参数 `id` 和 `focus` 跳转到 Web 端指定块 https://github.com/siyuan-note/siyuan/pull/7086 + id = searchParams.get("id"); + isZoomIn = searchParams.get("focus") === "1"; + } + return { + id, isZoomIn + } +} export const isSYProtocol = (url: string) => { return /^siyuan:\/\/blocks\/\d{14}-\w{7}/.test(url); };