Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2025-10-21 10:49:30 +08:00
commit 8d9ca20b55
17 changed files with 35 additions and 18 deletions

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "بعد التمكين، تم عرض شريط التنقل في الكتل المضمنة؛ تم مجاهلة هذا الخيار عند شريط التنقل للكتل المضمنة في الكتل الخارقة ولا يظهر أبداً", "embedBlockBreadcrumbTip": "بعد التمكين، تم عرض شريط التنقل في الكتل المضمنة؛ تم مجاهلة هذا الخيار عند شريط التنقل للكتل المضمنة في الكتل الخارقة ولا يظهر أبداً",
"appearanceMode": "وضع المظهر", "appearanceMode": "وضع المظهر",
"editReadonly": "وضع القراءة فقط", "editReadonly": "وضع القراءة فقط",
"editReadonlyTip": "عند التمكين، سيكون المستند للقراءة فقط افتراضيًا", "editReadonlyTip": "عند التمكين، سيكون محرر المستندات للقراءة فقط افتراضيًا. لا يزال بإمكانك البحث واستبدال النص، وتعديل المحتوى عبر API",
"generateConflictDoc": "توليد مستندات التعارض عند ظهور تضاربات المزامنة", "generateConflictDoc": "توليد مستندات التعارض عند ظهور تضاربات المزامنة",
"generateConflictDocTip": "بعد التمكين، سيتم إنشاء مستندات التعارض عند حدوث تضاربات المزامنة، بحيث يمكن فتحها وعرضها مباشرة. سيتم تسجيل مستندات التعارض في [تاريخ البيانات] سواء تمكين هذا الخيار أو عدم تمكينه", "generateConflictDocTip": "بعد التمكين، سيتم إنشاء مستندات التعارض عند حدوث تضاربات المزامنة، بحيث يمكن فتحها وعرضها مباشرة. سيتم تسجيل مستندات التعارض في [تاريخ البيانات] سواء تمكين هذا الخيار أو عدم تمكينه",
"deleteOpConfirm": "⚠️ تأكيد عملية حذف", "deleteOpConfirm": "⚠️ تأكيد عملية حذف",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Nach der Aktivierung zeigen eingebettete Blöcke Breadcrumbs an, eingebettete Blöcke in Superblöcken ignorieren diese Option und zeigen niemals Breadcrumbs.", "embedBlockBreadcrumbTip": "Nach der Aktivierung zeigen eingebettete Blöcke Breadcrumbs an, eingebettete Blöcke in Superblöcken ignorieren diese Option und zeigen niemals Breadcrumbs.",
"appearanceMode": "Darstellungsmodus", "appearanceMode": "Darstellungsmodus",
"editReadonly": "Schreibgeschützter Modus", "editReadonly": "Schreibgeschützter Modus",
"editReadonlyTip": "Nach der Aktivierung ist das Dokument standardmäßig schreibgeschützt.", "editReadonlyTip": "Nach der Aktivierung ist der Dokumenteditor standardmäßig schreibgeschützt. Textsuche und -ersetzung sowie API-Änderungen sind weiterhin möglich.",
"generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.", "generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.",
"generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die [Datenhistorie] wird das Konfliktdokument aufzeichnen.", "generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die [Datenhistorie] wird das Konfliktdokument aufzeichnen.",
"deleteOpConfirm": "⚠️ Bestätigung der Löschoperation", "deleteOpConfirm": "⚠️ Bestätigung der Löschoperation",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "When enabled, embed blocks will display breadcrumbs, embed blocks in super blocks ignore this option and never show breadcrumbs", "embedBlockBreadcrumbTip": "When enabled, embed blocks will display breadcrumbs, embed blocks in super blocks ignore this option and never show breadcrumbs",
"appearanceMode": "Appearance Mode", "appearanceMode": "Appearance Mode",
"editReadonly": "Read-only mode", "editReadonly": "Read-only mode",
"editReadonlyTip": "When enabled, the document will be read-only by default", "editReadonlyTip": "When enabled, the document editor will be read-only by default. You can still search and replace text, modify content via API",
"generateConflictDoc": "Generate conflict documentation when syncing conflicts", "generateConflictDoc": "Generate conflict documentation when syncing conflicts",
"generateConflictDocTip": "When enabled, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document", "generateConflictDocTip": "When enabled, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document",
"deleteOpConfirm": "⚠️ Delete operation confirmation", "deleteOpConfirm": "⚠️ Delete operation confirmation",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Después de habilitar los bloques incrustados, se mostrarán migas de pan, incrustar bloques en superbloques ignora esta opción y nunca muestra migas de pan", "embedBlockBreadcrumbTip": "Después de habilitar los bloques incrustados, se mostrarán migas de pan, incrustar bloques en superbloques ignora esta opción y nunca muestra migas de pan",
"appearanceMode": "Modo de apariencia", "appearanceMode": "Modo de apariencia",
"editReadonly": "Modo de solo lectura", "editReadonly": "Modo de solo lectura",
"editReadonlyTip": "Después de habilitarlo, el documento será de solo lectura por defecto", "editReadonlyTip": "Después de habilitarlo, el editor de documentos será de solo lectura por defecto. Aún puedes buscar y reemplazar texto, modificar contenido a través de la API",
"generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos", "generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
"generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto", "generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto",
"deleteOpConfirm": "⚠️ Confirmación de operación de eliminación", "deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Après avoir activé l'intégration, les blocs afficheront le fil d'Ariane, intégrer des blocs dans des super blocs ignorent cette option et n'affichent jamais le fil d'Ariane", "embedBlockBreadcrumbTip": "Après avoir activé l'intégration, les blocs afficheront le fil d'Ariane, intégrer des blocs dans des super blocs ignorent cette option et n'affichent jamais le fil d'Ariane",
"appearanceMode": "Mode d'apparence", "appearanceMode": "Mode d'apparence",
"editReadonly": "Mode lecture seule", "editReadonly": "Mode lecture seule",
"editReadonlyTip": "Lorsqu'il est activé, le document sera en lecture seule par défaut", "editReadonlyTip": "Lorsqu'il est activé, l'éditeur de document sera en lecture seule par défaut. Vous pouvez toujours rechercher et remplacer du texte, modifier le contenu via l'API",
"generateConflictDoc": "Générer une documentation sur les conflits lors de la synchronisation des conflits", "generateConflictDoc": "Générer une documentation sur les conflits lors de la synchronisation des conflits",
"generateConflictDocTip": "Lorsqu'il est activé, un document de conflit sera généré lorsqu'un conflit de synchronisation se produit, afin qu'il puisse être ouvert et visualisé directement. Qu'il soit activé ou non, l'historique des données enregistrera le document de conflit", "generateConflictDocTip": "Lorsqu'il est activé, un document de conflit sera généré lorsqu'un conflit de synchronisation se produit, afin qu'il puisse être ouvert et visualisé directement. Qu'il soit activé ou non, l'historique des données enregistrera le document de conflit",
"deleteOpConfirm": "⚠️ Supprimer la confirmation de l'opération", "deleteOpConfirm": "⚠️ Supprimer la confirmation de l'opération",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "לאחר הפעולה, בלוקים מוטמעים יראו נתיב, בלוקים מוטמעים בבלוקים עליוניים מתעלמים מהאפשרות הזו ולא יראו נתיבים", "embedBlockBreadcrumbTip": "לאחר הפעולה, בלוקים מוטמעים יראו נתיב, בלוקים מוטמעים בבלוקים עליוניים מתעלמים מהאפשרות הזו ולא יראו נתיבים",
"appearanceMode": "מצב מראה", "appearanceMode": "מצב מראה",
"editReadonly": "מצב קריאה בלבד", "editReadonly": "מצב קריאה בלבד",
"editReadonlyTip": "כאשר מופעל, המסמך יהיה לקריאה בלבד כברירת מחדל", "editReadonlyTip": "כאשר מופעל, עורך המסמכים יהיה לקריאה בלבד כברירת מחדל. עדיין ניתן לחפש ולהחליף טקסט, לשנות תוכן דרך API",
"generateConflictDoc": "צור תיעוד שהוקסם כאשר נוצרו סכסוכים", "generateConflictDoc": "צור תיעוד שהוקסם כאשר נוצרו סכסוכים",
"generateConflictDocTip": "לאחר ההפעלה, תיעוד סכסוך ייווצר כאשר מתהווה סכסוך סנכרון, כך שהוא יכול להיפתח ולהיות נצפה ישירות. בין אם מופעל ובין אם לא, היסטוריית הנתונים תקלוט את תיעוד הסכסוך", "generateConflictDocTip": "לאחר ההפעלה, תיעוד סכסוך ייווצר כאשר מתהווה סכסוך סנכרון, כך שהוא יכול להיפתח ולהיות נצפה ישירות. בין אם מופעל ובין אם לא, היסטוריית הנתונים תקלוט את תיעוד הסכסוך",
"deleteOpConfirm": "⚠️ אישור פעולה מחיקה", "deleteOpConfirm": "⚠️ אישור פעולה מחיקה",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Dopo l'abilitazione, i blocchi incorporati mostreranno i breadcrumb. I blocchi incorporati nei super blocchi ignorano questa opzione e non mostreranno mai breadcrumb", "embedBlockBreadcrumbTip": "Dopo l'abilitazione, i blocchi incorporati mostreranno i breadcrumb. I blocchi incorporati nei super blocchi ignorano questa opzione e non mostreranno mai breadcrumb",
"appearanceMode": "Modalità aspetto", "appearanceMode": "Modalità aspetto",
"editReadonly": "Modalità di sola lettura", "editReadonly": "Modalità di sola lettura",
"editReadonlyTip": "Quando abilitato, il documento sarà in sola lettura per impostazione predefinita", "editReadonlyTip": "Quando abilitato, l'editor di documenti sarà in sola lettura per impostazione predefinita. Puoi ancora cercare e sostituire testo, modificare contenuti tramite API",
"generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione", "generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione",
"generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la [Cronologia dati] registrerà il documento di conflitto", "generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la [Cronologia dati] registrerà il documento di conflitto",
"deleteOpConfirm": "⚠️ Conferma operazione di eliminazione", "deleteOpConfirm": "⚠️ Conferma operazione di eliminazione",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "埋め込みブロックにパンくずリストを表示します<br>この設定にかかわらずスーパーブロック内の埋め込みブロックは常にパンくずリストが表示されません", "embedBlockBreadcrumbTip": "埋め込みブロックにパンくずリストを表示します<br>この設定にかかわらずスーパーブロック内の埋め込みブロックは常にパンくずリストが表示されません",
"appearanceMode": "表示モード", "appearanceMode": "表示モード",
"editReadonly": "読み取り専用モード", "editReadonly": "読み取り専用モード",
"editReadonlyTip": "有効にすると、ドキュメントはデフォルトで読み取り専用になります", "editReadonlyTip": "有効にすると、ドキュメントエディターはデフォルトで読み取り専用になります。テキストの検索・置換や API による内容の変更は可能です",
"generateConflictDoc": "同期の競合時に競合ドキュメントを生成する", "generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
"generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます", "generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます",
"deleteOpConfirm": "⚠️ 削除操作の確認", "deleteOpConfirm": "⚠️ 削除操作の確認",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Po włączeniu wbudowane bloki będą wyświetlać okruszki, wbudowane bloki w super blokach ignorują tę opcję i nigdy nie pokazują okruszków", "embedBlockBreadcrumbTip": "Po włączeniu wbudowane bloki będą wyświetlać okruszki, wbudowane bloki w super blokach ignorują tę opcję i nigdy nie pokazują okruszków",
"appearanceMode": "Tryb wyglądu", "appearanceMode": "Tryb wyglądu",
"editReadonly": "Tryb tylko do odczytu", "editReadonly": "Tryb tylko do odczytu",
"editReadonlyTip": "Po włączeniu dokument będzie domyślnie tylko do odczytu", "editReadonlyTip": "Po włączeniu edytor dokumentów będzie domyślnie tylko do odczytu. Nadal można wyszukiwać i zastępować tekst, modyfikować zawartość przez API",
"generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów", "generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów",
"generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, [Historia danych] zarejestruje dokument konfliktowy", "generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, [Historia danych] zarejestruje dokument konfliktowy",
"deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia", "deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "Quando ativado, blocos incorporados exibirão navegação estrutural, blocos incorporados em super blocos ignoram esta opção e nunca mostram navegação estrutural", "embedBlockBreadcrumbTip": "Quando ativado, blocos incorporados exibirão navegação estrutural, blocos incorporados em super blocos ignoram esta opção e nunca mostram navegação estrutural",
"appearanceMode": "Modo de Aparência", "appearanceMode": "Modo de Aparência",
"editReadonly": "Modo somente leitura", "editReadonly": "Modo somente leitura",
"editReadonlyTip": "Quando ativado, o documento ficará somente leitura por padrão", "editReadonlyTip": "Quando ativado, o editor de documentos ficará somente leitura por padrão. Ainda é possível buscar e substituir texto, modificar conteúdo via API",
"generateConflictDoc": "Gerar documentação de conflito quando houver conflitos de sincronização", "generateConflictDoc": "Gerar documentação de conflito quando houver conflitos de sincronização",
"generateConflictDocTip": "Quando ativado, um documento de conflito será gerado quando ocorrer um conflito de sincronização, para que possa ser aberto e visualizado diretamente. Independentemente de estar ativado ou não, o [Histórico de Dados] registrará o documento de conflito", "generateConflictDocTip": "Quando ativado, um documento de conflito será gerado quando ocorrer um conflito de sincronização, para que possa ser aberto e visualizado diretamente. Independentemente de estar ativado ou não, o [Histórico de Dados] registrará o documento de conflito",
"deleteOpConfirm": "⚠️ Confirmação de operação de exclusão", "deleteOpConfirm": "⚠️ Confirmação de operação de exclusão",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "После включения вложенные блоки будут отображать крошки, вложенные блоки в супер блоках игнорируют эту опцию и никогда не показывают крошки", "embedBlockBreadcrumbTip": "После включения вложенные блоки будут отображать крошки, вложенные блоки в супер блоках игнорируют эту опцию и никогда не показывают крошки",
"appearanceMode": "Режим внешнего вида", "appearanceMode": "Режим внешнего вида",
"editReadonly": "Режим только для чтения", "editReadonly": "Режим только для чтения",
"editReadonlyTip": "После включения документ будет по умолчанию только для чтения", "editReadonlyTip": "После включения редактор документов будет по умолчанию только для чтения. По-прежнему можно искать и заменять текст, изменять содержимое через API",
"generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации", "generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации",
"generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, [История данных] зарегистрирует документ конфликта", "generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, [История данных] зарегистрирует документ конфликта",
"deleteOpConfirm": "⚠️ Подтверждение операции удаления", "deleteOpConfirm": "⚠️ Подтверждение операции удаления",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "啟用後嵌入塊將顯示導覽路徑,在超級塊中的嵌入塊忽略該選項,始終不顯示導覽路徑", "embedBlockBreadcrumbTip": "啟用後嵌入塊將顯示導覽路徑,在超級塊中的嵌入塊忽略該選項,始終不顯示導覽路徑",
"appearanceMode": "外觀模式", "appearanceMode": "外觀模式",
"editReadonly": "只讀模式", "editReadonly": "只讀模式",
"editReadonlyTip": "啟用後文檔將預設鎖定編輯", "editReadonlyTip": "啟用後文檔編輯器將預設鎖定編輯。仍然能夠搜尋替換文字、透過 API 修改內容",
"generateConflictDoc": "同步衝突時生成衝突文檔", "generateConflictDoc": "同步衝突時生成衝突文檔",
"generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔", "generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔",
"deleteOpConfirm": "⚠️ Delete operation confirmation", "deleteOpConfirm": "⚠️ Delete operation confirmation",

View file

@ -586,7 +586,7 @@
"embedBlockBreadcrumbTip": "启用后嵌入块将显示面包屑,在超级块中的嵌入块忽略该选项,始终不显示面包屑", "embedBlockBreadcrumbTip": "启用后嵌入块将显示面包屑,在超级块中的嵌入块忽略该选项,始终不显示面包屑",
"appearanceMode": "外观模式", "appearanceMode": "外观模式",
"editReadonly": "只读模式", "editReadonly": "只读模式",
"editReadonlyTip": "启用后文档将默认锁定编辑", "editReadonlyTip": "启用后文档编辑器将默认锁定编辑。仍然能够搜索替换文本、通过 API 修改内容",
"generateConflictDoc": "同步冲突时生成冲突文档", "generateConflictDoc": "同步冲突时生成冲突文档",
"generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档", "generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档",
"deleteOpConfirm": "⚠️ 删除操作确认", "deleteOpConfirm": "⚠️ 删除操作确认",

View file

@ -758,7 +758,7 @@ export const exportMd = (id: string) => {
id: "exportPDF", id: "exportPDF",
label: window.siyuan.languages.print, label: window.siyuan.languages.print,
icon: "iconPDF", icon: "iconPDF",
ignore: !isInAndroid(), ignore: !isInAndroid() && !isInHarmony(),
click: () => { click: () => {
const msId = showMessage(window.siyuan.languages.exporting); const msId = showMessage(window.siyuan.languages.exporting);
const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF]; const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF];
@ -768,7 +768,12 @@ export const exportMd = (id: string) => {
merge: localData.mergeSubdocs, merge: localData.mergeSubdocs,
}, async response => { }, async response => {
const html = await onExport(response, undefined, {type: "pdf", id}); 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(() => { setTimeout(() => {
hideMessage(msId); hideMessage(msId);
}, 3000); }, 3000);

View file

@ -11,7 +11,7 @@ import {getThemeMode, setInlineStyle} from "../../util/assets";
import {fetchPost, fetchSyncPost} from "../../util/fetch"; import {fetchPost, fetchSyncPost} from "../../util/fetch";
import {Dialog} from "../../dialog"; import {Dialog} from "../../dialog";
import {replaceLocalPath} from "../../editor/rename"; import {replaceLocalPath} from "../../editor/rename";
import {isInAndroid, setStorageVal} from "../util/compatibility"; import {getScreenWidth, isInAndroid, isInHarmony, setStorageVal} from "../util/compatibility";
import {getFrontend} from "../../util/functions"; import {getFrontend} from "../../util/functions";
const getPluginStyle = async () => { const getPluginStyle = async () => {
@ -669,7 +669,8 @@ export const onExport = async (data: IWebSocketData, filePath: string, exportOpt
if (!isDefault) { if (!isDefault) {
themeStyle = `<link rel="stylesheet" type="text/css" id="themeStyle" href="${servePath}appearance/themes/${themeName}/theme.css?${Constants.SIYUAN_VERSION}"/>`; themeStyle = `<link rel="stylesheet" type="text/css" id="themeStyle" href="${servePath}appearance/themes/${themeName}/theme.css?${Constants.SIYUAN_VERSION}"/>`;
} }
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 = `<!DOCTYPE html> const html = `<!DOCTYPE html>
<html lang="${window.siyuan.config.appearance.lang}" data-theme-mode="${getThemeMode()}" data-light-theme="${window.siyuan.config.appearance.themeLight}" data-dark-theme="${window.siyuan.config.appearance.themeDark}"> <html lang="${window.siyuan.config.appearance.lang}" data-theme-mode="${getThemeMode()}" data-light-theme="${window.siyuan.config.appearance.themeLight}" data-dark-theme="${window.siyuan.config.appearance.themeDark}">
<head> <head>
@ -694,7 +695,7 @@ export const onExport = async (data: IWebSocketData, filePath: string, exportOpt
</head> </head>
<body> <body>
<div class="${["htmlmd", "word"].includes(exportOption.type) ? "b3-typography" : "protyle-wysiwyg" + (window.siyuan.config.editor.displayBookmarkIcon ? " protyle-wysiwyg--attr" : "")}" <div class="${["htmlmd", "word"].includes(exportOption.type) ? "b3-typography" : "protyle-wysiwyg" + (window.siyuan.config.editor.displayBookmarkIcon ? " protyle-wysiwyg--attr" : "")}"
style="${isInAndroid() ? "margin: 0 16px;" : "max-width: 800px;margin: 0 auto;"}" id="preview">${data.data.content}</div> style="${isInAndroid() || isInHarmony() ? "margin: 0 16px;" : "max-width: 800px;margin: 0 auto;"}" id="preview">${data.data.content}</div>
<script src="${servePath}/appearance/icons/${window.siyuan.config.appearance.icon}/icon.js?v=${Constants.SIYUAN_VERSION}"></script> <script src="${servePath}/appearance/icons/${window.siyuan.config.appearance.icon}/icon.js?v=${Constants.SIYUAN_VERSION}"></script>
<script src="${servePath}/stage/build/export/protyle-method.js?v=${Constants.SIYUAN_VERSION}"></script> <script src="${servePath}/stage/build/export/protyle-method.js?v=${Constants.SIYUAN_VERSION}"></script>
<script src="${servePath}/stage/protyle/js/lute/lute.min.js?v=${Constants.SIYUAN_VERSION}"></script> <script src="${servePath}/stage/protyle/js/lute/lute.min.js?v=${Constants.SIYUAN_VERSION}"></script>

View file

@ -291,6 +291,15 @@ export const isWin11 = async () => {
return false; return false;
}; };
export const getScreenWidth = () => {
if (isInAndroid()) {
return window.JSAndroid.getScreenWidthPx();
} else if (isInHarmony()) {
return window.JSHarmony.getScreenWidthPx();
}
return window.outerWidth;
}
export const isWindows = () => { export const isWindows = () => {
return navigator.platform.toUpperCase().indexOf("WIN") > -1; return navigator.platform.toUpperCase().indexOf("WIN") > -1;
}; };

View file

@ -257,6 +257,8 @@ interface Window {
readClipboard(): string readClipboard(): string
readHTMLClipboard(): string readHTMLClipboard(): string
returnDesktop(): void returnDesktop(): void
print(html: string): void
getScreenWidthPx(): number
}; };
Protyle: import("../protyle/method").default; Protyle: import("../protyle/method").default;