From 894049e97a7e542f800f4910409c543e0e78a4a0 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 20 Oct 2025 21:39:42 +0800 Subject: [PATCH] :art: Support calling system printing on HarmonyOS https://github.com/siyuan-note/siyuan/issues/16164 Signed-off-by: Daniel <845765@qq.com> --- app/src/menus/commonMenuItem.ts | 9 +++++++-- app/src/protyle/export/index.ts | 7 ++++--- app/src/protyle/util/compatibility.ts | 9 +++++++++ app/src/types/index.d.ts | 2 ++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 0a8ec60ed..01dde9225 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -758,7 +758,7 @@ export const exportMd = (id: string) => { id: "exportPDF", label: window.siyuan.languages.print, icon: "iconPDF", - ignore: !isInAndroid(), + ignore: !isInAndroid() && !isInHarmony(), click: () => { const msId = showMessage(window.siyuan.languages.exporting); const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF]; @@ -768,7 +768,12 @@ export const exportMd = (id: string) => { merge: localData.mergeSubdocs, }, async response => { const html = await onExport(response, undefined, {type: "pdf", id}); - window.JSAndroid.print(html); + if (isInAndroid()) { + window.JSAndroid.print(html); + } else if (isInHarmony()) { + window.JSHarmony.print(html); + } + setTimeout(() => { hideMessage(msId); }, 3000); diff --git a/app/src/protyle/export/index.ts b/app/src/protyle/export/index.ts index 0ffd20d39..0d74b7898 100644 --- a/app/src/protyle/export/index.ts +++ b/app/src/protyle/export/index.ts @@ -11,7 +11,7 @@ import {getThemeMode, setInlineStyle} from "../../util/assets"; import {fetchPost, fetchSyncPost} from "../../util/fetch"; import {Dialog} from "../../dialog"; import {replaceLocalPath} from "../../editor/rename"; -import {isInAndroid, setStorageVal} from "../util/compatibility"; +import {getScreenWidth, isInAndroid, isInHarmony, setStorageVal} from "../util/compatibility"; import {getFrontend} from "../../util/functions"; const getPluginStyle = async () => { @@ -669,7 +669,8 @@ export const onExport = async (data: IWebSocketData, filePath: string, exportOpt if (!isDefault) { themeStyle = ``; } - const minWidthHtml = isInAndroid() ? `document.body.style.minWidth = "${window.JSAndroid.getScreenWidthPx()}px"` : ""; + let screenWidth = getScreenWidth(); + const minWidthHtml = isInAndroid() || isInHarmony() ? `document.body.style.minWidth = "${screenWidth}px"` : ""; const html = ` @@ -694,7 +695,7 @@ export const onExport = async (data: IWebSocketData, filePath: string, exportOpt
${data.data.content}
+style="${isInAndroid() || isInHarmony() ? "margin: 0 16px;" : "max-width: 800px;margin: 0 auto;"}" id="preview">${data.data.content} diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts index 32bbefb84..c1bd8e015 100644 --- a/app/src/protyle/util/compatibility.ts +++ b/app/src/protyle/util/compatibility.ts @@ -291,6 +291,15 @@ export const isWin11 = async () => { return false; }; +export const getScreenWidth = () => { + if (isInAndroid()) { + return window.JSAndroid.getScreenWidthPx(); + } else if (isInHarmony()) { + return window.JSHarmony.getScreenWidthPx(); + } + return window.outerWidth; +} + export const isWindows = () => { return navigator.platform.toUpperCase().indexOf("WIN") > -1; }; diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index 7ab7becce..e38343147 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -257,6 +257,8 @@ interface Window { readClipboard(): string readHTMLClipboard(): string returnDesktop(): void + print(html: string): void + getScreenWidthPx(): number }; Protyle: import("../protyle/method").default;