${window.siyuan.languages.workspaceList}
diff --git a/app/src/protyle/breadcrumb/index.ts b/app/src/protyle/breadcrumb/index.ts
index bb8b1605bc3..13949e08b29 100644
--- a/app/src/protyle/breadcrumb/index.ts
+++ b/app/src/protyle/breadcrumb/index.ts
@@ -28,7 +28,7 @@ import {Menu} from "../../plugin/Menu";
import {getNoContainerElement} from "../wysiwyg/getBlock";
import {openTitleMenu} from "../header/openTitleMenu";
import {emitOpenMenu} from "../../plugin/EventBus";
-import {isInAndroid, isIPad, isMac, updateHotkeyTip} from "../util/compatibility";
+import {isInAndroid, isInHarmony, isIPad, isMac, updateHotkeyTip} from "../util/compatibility";
import {resize} from "../util/resize";
import {listIndent, listOutdent} from "../wysiwyg/list";
import {improveBreadcrumbAppearance} from "../wysiwyg/renderBacklink";
@@ -44,7 +44,7 @@ export class Breadcrumb {
element.className = "protyle-breadcrumb";
let padHTML = "";
/// #if BROWSER && !MOBILE
- if (isIPad() || isInAndroid()) {
+ if (isIPad() || isInAndroid() || isInHarmony()) {
padHTML = `
@@ -295,7 +295,7 @@ ${padHTML}
window.siyuan.menus.menu.remove();
});
window.siyuan.menus.menu.append(uploadMenu);
- if (!isInAndroid()) {
+ if (!isInAndroid() && !isInHarmony()) {
window.siyuan.menus.menu.append(new MenuItem({
id: this.mediaRecorder?.isRecording ? "endRecord" : "startRecord",
current: this.mediaRecorder && this.mediaRecorder.isRecording,
diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts
index 592ce3ba322..81579332c61 100644
--- a/app/src/protyle/gutter/index.ts
+++ b/app/src/protyle/gutter/index.ts
@@ -3,7 +3,8 @@ import {
hasClosestByClassName,
hasClosestByMatchTag,
hasClosestByTag,
- hasTopClosestByClassName, isInEmbedBlock
+ hasTopClosestByClassName,
+ isInEmbedBlock
} from "../util/hasClosest";
import {getIconByType} from "../../editor/getIcon";
import {enterBack, iframeMenu, setFold, tableMenu, videoMenu, zoomOut} from "../../menus/protyle";
@@ -12,6 +13,7 @@ import {copySubMenu, openAttr, openFileAttr, openWechatNotify} from "../../menus
import {
copyPlainText,
isInAndroid,
+ isInHarmony,
isMac,
isOnlyMeta,
openByMobile,
@@ -21,7 +23,8 @@ import {
import {
transaction,
turnsIntoOneTransaction,
- turnsIntoTransaction, turnsOneInto,
+ turnsIntoTransaction,
+ turnsOneInto,
updateBatchTransaction,
updateTransaction
} from "../wysiwyg/transaction";
@@ -33,13 +36,7 @@ import {blockRender} from "../render/blockRender";
import {getContenteditableElement, getTopAloneElement, isNotEditBlock} from "../wysiwyg/getBlock";
import * as dayjs from "dayjs";
import {fetchPost} from "../../util/fetch";
-import {
- cancelSB,
- genEmptyElement,
- getLangByType,
- insertEmptyBlock,
- jumpToParent,
-} from "../../block/util";
+import {cancelSB, genEmptyElement, getLangByType, insertEmptyBlock, jumpToParent,} from "../../block/util";
import {countBlockWord} from "../../layout/status";
import {Constants} from "../../constants";
import {mathRender} from "../render/mathRender";
@@ -1656,7 +1653,7 @@ export class Gutter {
label: `${window.siyuan.languages.copy} ${window.siyuan.languages.headings1}`,
click() {
fetchPost("/api/block/getHeadingChildrenDOM", {id}, (response) => {
- if (isInAndroid()) {
+ if (isInAndroid() || isInHarmony()) {
window.JSAndroid.writeHTMLClipboard(protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
} else {
writeText(response.data + Constants.ZWSP);
@@ -1670,7 +1667,7 @@ export class Gutter {
label: `${window.siyuan.languages.cut} ${window.siyuan.languages.headings1}`,
click() {
fetchPost("/api/block/getHeadingChildrenDOM", {id}, (response) => {
- if (isInAndroid()) {
+ if (isInAndroid() || isInHarmony()) {
window.JSAndroid.writeHTMLClipboard(protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
} else {
writeText(response.data + Constants.ZWSP);
diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts
index e0f641a9af6..b00cd516303 100644
--- a/app/src/protyle/util/compatibility.ts
+++ b/app/src/protyle/util/compatibility.ts
@@ -21,7 +21,7 @@ export const openByMobile = (uri: string) => {
window.webkit.messageHandlers.openLink.postMessage("https://" + uri);
}
}
- } else if (isInAndroid()) {
+ } else if (isInAndroid() || isInHarmony()) {
window.JSAndroid.openExternal(uri);
} else {
window.open(uri);
@@ -29,7 +29,7 @@ export const openByMobile = (uri: string) => {
};
export const readText = () => {
- if (isInAndroid()) {
+ if (isInAndroid() || isInHarmony()) {
return window.JSAndroid.readClipboard();
}
return navigator.clipboard.readText();
@@ -42,7 +42,7 @@ export const writeText = (text: string) => {
}
try {
// navigator.clipboard.writeText 抛出异常不进入 catch,这里需要先处理移动端复制
- if (isInAndroid()) {
+ if (isInAndroid() || isInHarmony()) {
window.JSAndroid.writeClipboard(text);
return;
}
@@ -54,7 +54,7 @@ export const writeText = (text: string) => {
} catch (e) {
if (isInIOS()) {
window.webkit.messageHandlers.setClipboard.postMessage(text);
- } else if (isInAndroid()) {
+ } else if (isInAndroid() || isInHarmony()) {
window.JSAndroid.writeClipboard(text);
} else {
const textElement = document.createElement("textarea");
@@ -136,6 +136,10 @@ export const isInIOS = () => {
return window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers;
};
+export const isInHarmony = () => {
+ return window.siyuan.config.system.container === "harmony";
+}
+
// Mac,Windows 快捷键展示
export const updateHotkeyTip = (hotkey: string) => {
if (isMac()) {
diff --git a/app/src/types/config.d.ts b/app/src/types/config.d.ts
index 421be973c33..7ffb602a203 100644
--- a/app/src/types/config.d.ts
+++ b/app/src/types/config.d.ts
@@ -1540,9 +1540,10 @@ declare namespace Config {
* - `docker`: Docker container
* - `android`: Android device
* - `ios`: iOS device
+ * - `harmony`: HarmonyOS device
* - `std`: Desktop Electron environment
*/
- export type TSystemContainer = "docker" | "android" | "ios" | "std";
+ export type TSystemContainer = "docker" | "android" | "ios" | "harmony" | "std";
/**
* SiYuan Network proxy configuration
diff --git a/app/src/util/assets.ts b/app/src/util/assets.ts
index d2ffad69437..50bd82d6b1a 100644
--- a/app/src/util/assets.ts
+++ b/app/src/util/assets.ts
@@ -7,7 +7,7 @@ import {exportLayout} from "../layout/util";
/// #endif
import {fetchPost} from "./fetch";
import {appearance} from "../config/appearance";
-import {isInAndroid, isInIOS} from "../protyle/util/compatibility";
+import {isInAndroid, isInHarmony, isInIOS} from "../protyle/util/compatibility";
const loadThirdIcon = (iconURL: string, data: Config.IAppearance) => {
addScript(iconURL, "iconDefaultScript").then(() => {
@@ -329,7 +329,7 @@ const rgba2hex = (rgba: string) => {
};
const updateMobileTheme = (OSTheme: string) => {
- if (isInIOS() || isInAndroid()) {
+ if (isInIOS() || isInAndroid() || isInHarmony()) {
setTimeout(() => {
const backgroundColor = rgba2hex(getComputedStyle(document.body).getPropertyValue("--b3-theme-background").trim());
let mode = window.siyuan.config.appearance.mode;
@@ -342,7 +342,7 @@ const updateMobileTheme = (OSTheme: string) => {
}
if (isInIOS()) {
window.webkit.messageHandlers.changeStatusBar.postMessage((backgroundColor || (mode === 0 ? "#fff" : "#1e1e1e")) + " " + mode);
- } else if (isInAndroid()) {
+ } else if (isInAndroid() || isInHarmony()) {
window.JSAndroid.changeStatusBarColor(backgroundColor, mode);
}
}, 500); // 移动端需要加载完才可以获取到颜色
diff --git a/app/src/util/functions.ts b/app/src/util/functions.ts
index 555a8418b8d..843e28ba951 100644
--- a/app/src/util/functions.ts
+++ b/app/src/util/functions.ts
@@ -2,9 +2,9 @@ export const isMobile = () => {
return document.getElementById("sidebar") ? true : false;
};
-// "windows" | "linux" | "darwin" | "docker" | "android" | "ios"
+// "windows" | "linux" | "darwin" | "docker" | "android" | "ios" | "harmony"
export const getBackend = () => {
- if (["docker", "ios", "android"].includes(window.siyuan.config.system.container)) {
+ if (["docker", "ios", "android", "harmony"].includes(window.siyuan.config.system.container)) {
return window.siyuan.config.system.container;
} else {
return window.siyuan.config.system.os;