diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index 6331e227b..529adb772 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -389,11 +389,11 @@
"previous": "Previous",
"next": "Next",
"lockFile0": "Unable to access data",
- "lockFile1": "The data file has been locked by another program. (If a third-party sync disk is used, please check the sync status)",
- "lockFile2": "If the problem still occurs frequently in subsequent use, please report it via GitHub Issues, thank you!",
+ "lockFile1": "The data file has been locked by another program",
+ "lockFile2": "If the problem still occurs frequently in subsequent use, please report it via GitHub Issues",
"kernelFault0": "Kernel connection interrupted...",
- "kernelFault1": "If the dialog do not disappear automatically after 7 seconds, please close the window and restart.",
- "kernelFault2": "If the problem still occurs after restarting, please report it via GitHub Issues, thank you!",
+ "kernelFault1": "Please check if the network connection and kernel process is normal",
+ "kernelFault2": "If the problem still occurs after restarting, please report it via GitHub Issues",
"fontSize": "Font Size",
"fontSizeTip": "The default font size is 16px, this setting only affects the font size display in the editor",
"font1": "This setting only affects the font family display in the editor, choose Default to use the theme's font family",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index 87847f0fa..364e93c42 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -389,11 +389,11 @@
"previous": "Anterior",
"next": "Siguiente",
"lockFile0": "No se puede acceder a los datos",
- "lockFile1": "El archivo de datos ha sido bloqueado por otro programa. (Si se utiliza un disco de sincronización de terceros, compruebe el estado de la sincronización)",
- "lockFile2": "Si el problema sigue ocurriendo con frecuencia en el uso posterior, infórmelo a través de Problemas en GitHub, gracias!",
+ "lockFile1": "El archivo de datos ha sido bloqueado por otro programa",
+ "lockFile2": "Si el problema sigue ocurriendo con frecuencia en el uso posterior, infórmelo a través de Problemas en GitHub",
"kernelFault0": "Conexión del kernel interrumpida...",
- "kernelFault1": "Si el diálogo no desaparece automáticamente después de 7 segundos, por favor cierre la ventana y reinicie",
- "kernelFault2": "Si el problema sigue produciéndose después de reiniciar, comuníquelo a través de Problemas en GitHub, gracias!",
+ "kernelFault1": "Verifique si la conexión de red y los procesos del kernel son normales",
+ "kernelFault2": "Si el problema sigue produciéndose después de reiniciar, comuníquelo a través de Problemas en GitHub",
"fontSize": "Tamaño de la fuente",
"fontSizeTip": "El tamaño de la fuente por defecto es de 16px, este ajuste sólo afecta a la visualización del tamaño de la fuente en el editor",
"font1": "Este ajuste sólo afecta a la visualización de la familia de fuentes en el editor, elija Por defecto para utilizar la familia de fuentes del tema",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index da323acd0..76f766878 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -389,11 +389,11 @@
"previous": "Précédent",
"next": "Prochain",
"lockFile0": "Impossible d'accéder aux données",
- "lockFile1": "Le fichier de données a été verrouillé par un autre programme. (Si un disque de synchronisation tiers est utilisé, veuillez vérifier le statut de synchronisation).",
- "lockFile2": "Si le problème se produit encore fréquemment lors d'une utilisation ultérieure, veuillez le signaler via GitHub Issues, merci!",
+ "lockFile1": "Le fichier de données a été verrouillé par un autre programme",
+ "lockFile2": "Si le problème se produit encore fréquemment lors d'une utilisation ultérieure, veuillez le signaler via GitHub Issues",
"kernelFault0": "Connexion au noyau interrompue...",
- "kernelFault1": "Si le dialogue ne disparaît pas automatiquement après 7 secondes, veuillez fermer la fenêtre et redémarrer.",
- "kernelFault2": "Si le problème persiste après le redémarrage, veuillez le signaler via GitHub Issues, merci!",
+ "kernelFault1": "Veuillez vérifier si la connexion réseau et les processus du noyau sont normaux",
+ "kernelFault2": "Si le problème persiste après le redémarrage, veuillez le signaler via GitHub Issues",
"fontSize": "Taille de la police",
"fontSizeTip": "La taille de la police par défaut est de 16px, ce paramètre n'affecte que la taille de la police affichée dans l'éditeur.",
"font1": "Ce paramètre n'affecte que l'affichage de la famille de polices dans l'éditeur, choisissez Default pour utiliser la famille de polices du thème.",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index e4961aa18..55865b819 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -389,11 +389,11 @@
"previous": "上一個",
"next": "下一個",
"lockFile0": "無法存取資料",
- "lockFile1": "資料檔案已被其他程式鎖定。(如果使用了協力廠商同步碟,請檢查同步狀態)",
- "lockFile2": "如果後續使用仍然頻繁出現該問題,請通過GitHub Issues回饋,謝謝!",
+ "lockFile1": "資料檔案已被其他程式鎖定",
+ "lockFile2": "如果後續使用仍然頻繁出現該問題,請通過這裡反饋",
"kernelFault0": "kernel連接中斷...",
- "kernelFault1": "如果 7 秒後該對話方塊沒有自動消失,請關閉視窗後重新開機。",
- "kernelFault2": "如果重啟後仍然出現該問題,請通過GitHub Issues回饋,謝謝!",
+ "kernelFault1": "請檢查網絡連接和內核進程是否正常",
+ "kernelFault2": "如果重啟後仍然出現該問題,請通過這裡反饋",
"fontSize": "字型大小",
"fontSizeTip": "字型大小預設為 16px,該設置僅影響編輯器內字體大小顯示",
"font1": "該設置僅影響編輯器內字體顯示,選擇 預設 則使用主題自帶字體",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index 6e1a719fb..f0e3d42f1 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -389,11 +389,11 @@
"previous": "上一个",
"next": "下一个",
"lockFile0": "无法存取数据",
- "lockFile1": "数据文件已被其他程序锁定。(如果使用了第三方同步盘,请检查同步状态)",
- "lockFile2": "如果后续使用仍然频繁出现该问题,请通过社区进行反馈,谢谢!",
+ "lockFile1": "数据文件已被其他程序锁定",
+ "lockFile2": "如果后续使用仍然频繁出现该问题,请通过这里反馈",
"kernelFault0": "内核连接中断...",
- "kernelFault1": "如果 7 秒后该对话框没有自动消失,请关闭窗口后重新启动。",
- "kernelFault2": "如果重启后仍然出现该问题,请通过社区进行反馈,谢谢!",
+ "kernelFault1": "请检查网络连接和内核进程是否正常",
+ "kernelFault2": "如果重启后仍然出现该问题,请通过这里反馈",
"fontSize": "字号",
"fontSizeTip": "字号默认为 16px,该设置仅影响编辑器内字体大小显示",
"font1": "该设置仅影响编辑器内字体显示,选择 默认 则使用主题自带字体",
diff --git a/app/src/protyle/export/index.ts b/app/src/protyle/export/index.ts
index 9a9046edd..35c335334 100644
--- a/app/src/protyle/export/index.ts
+++ b/app/src/protyle/export/index.ts
@@ -1,7 +1,7 @@
import {hideMessage, showMessage} from "../../dialog/message";
import {Constants} from "../../constants";
/// #if !BROWSER
-import {OpenDialogReturnValue, ipcRenderer} from "electron";
+import {ipcRenderer, OpenDialogReturnValue} from "electron";
import {BrowserWindow, dialog} from "@electron/remote";
import * as fs from "fs";
import * as path from "path";
@@ -63,9 +63,7 @@ export const saveExport = (option: { type: string, id: string }) => {
/// #if !BROWSER
const destroyWin = (win: Electron.BrowserWindow) => {
- setTimeout(() => {
- win.destroy();
- }, 1000);
+ win.destroy();
};
const renderPDF = (id: string) => {
@@ -99,7 +97,12 @@ const renderPDF = (id: string) => {
title: window.siyuan.languages.export + " PDF",
properties: ["createDirectory", "openDirectory"],
}).then((result: OpenDialogReturnValue) => {
- if (!result.canceled) {
+ if (result.canceled) {
+ destroyWin(win);
+ return;
+ }
+
+ setTimeout(() => {
const msgId = showMessage(window.siyuan.languages.exporting, -1);
const filePath = result.filePaths[0].endsWith(ipcData.rootTitle) ? result.filePaths[0] : path.join(result.filePaths[0], replaceLocalPath(ipcData.rootTitle));
localStorage.setItem(Constants.LOCAL_EXPORTPDF, JSON.stringify(Object.assign(ipcData.pdfOptions, {removeAssets: ipcData.removeAssets})));
@@ -113,6 +116,7 @@ const renderPDF = (id: string) => {
}, () => {
const pdfFilePath = path.join(filePath, path.basename(filePath) + ".pdf");
fs.writeFileSync(pdfFilePath, pdfData);
+ destroyWin(win);
fetchPost("/api/export/addPDFOutline", {
id: ipcData.rootId,
path: pdfFilePath
@@ -142,18 +146,15 @@ const renderPDF = (id: string) => {
}
});
});
- destroyWin(win);
}).catch((error: string) => {
showMessage("Export PDF error:" + error, 0, "error", msgId);
destroyWin(win);
});
} catch (e) {
- showMessage("Export PDF error:" + e + ". Export HTML and use Chrome's printing function to convert to PDF", 0, "error", msgId);
+ showMessage("Export PDF failed: " + e, 0, "error", msgId);
destroyWin(win);
}
- } else {
- destroyWin(win);
- }
+ }, 200);
});
});
fetchPost("/api/export/exportPreviewHTML", {
diff --git a/app/src/util/fetch.ts b/app/src/util/fetch.ts
index a973efdb7..74d6068e4 100644
--- a/app/src/util/fetch.ts
+++ b/app/src/util/fetch.ts
@@ -36,7 +36,7 @@ export const fetchPost = (url: string, data?: any, cb?: (response: IWebSocketDat
}
}).catch((e) => {
console.warn("fetch post error", e);
- if (url === "/api/transactions" && e.message === "Failed to fetch") {
+ if (url === "/api/transactions" && (e.message === "Failed to fetch" || e.message === "Unexpected end of JSON input")) {
kernelError();
return;
}
diff --git a/kernel/model/assets.go b/kernel/model/assets.go
index 491b1b575..84943eace 100644
--- a/kernel/model/assets.go
+++ b/kernel/model/assets.go
@@ -195,6 +195,9 @@ func SearchAssetsByName(keyword string) (ret []*cache.Asset) {
func GetAssetAbsPath(relativePath string) (absPath string, err error) {
relativePath = strings.TrimSpace(relativePath)
+ if strings.Contains(relativePath, "?") {
+ relativePath = relativePath[:strings.Index(relativePath, "?")]
+ }
notebooks, err := ListNotebooks()
if nil != err {
err = errors.New(Conf.Language(0))
diff --git a/kernel/model/export.go b/kernel/model/export.go
index 3327d3b2b..e2be0f197 100644
--- a/kernel/model/export.go
+++ b/kernel/model/export.go
@@ -1083,6 +1083,11 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros bool) (ret *parse.T
if n.IsTextMarkType("inline-math") {
n.TextMarkInlineMathContent = strings.TrimSpace(n.TextMarkInlineMathContent)
return ast.WalkContinue
+ } else if n.IsTextMarkType("file-annotation-ref") {
+ refID := n.TextMarkFileAnnotationRefID
+ status := processFileAnnotationRef(refID, n)
+ unlinks = append(unlinks, n)
+ return status
}
case ast.NodeFileAnnotationRef:
refIDNode := n.ChildByType(ast.NodeFileAnnotationRefID)
@@ -1090,53 +1095,9 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros bool) (ret *parse.T
return ast.WalkSkipChildren
}
refID := refIDNode.TokensStr()
- p := refID[:strings.LastIndex(refID, "/")]
- absPath, err := GetAssetAbsPath(p)
- if nil != err {
- logging.LogWarnf("get assets abs path by rel path [%s] failed: %s", p, err)
- return ast.WalkSkipChildren
- }
- sya := absPath + ".sya"
- syaData, err := os.ReadFile(sya)
- if nil != err {
- logging.LogErrorf("read file [%s] failed: %s", sya, err)
- return ast.WalkSkipChildren
- }
- syaJSON := map[string]interface{}{}
- if err = gulu.JSON.UnmarshalJSON(syaData, &syaJSON); nil != err {
- logging.LogErrorf("unmarshal file [%s] failed: %s", sya, err)
- return ast.WalkSkipChildren
- }
- annotationID := refID[strings.LastIndex(refID, "/")+1:]
- annotationData := syaJSON[annotationID]
- if nil == annotationData {
- logging.LogErrorf("not found annotation [%s] in .sya", annotationID)
- return ast.WalkSkipChildren
- }
- pages := annotationData.(map[string]interface{})["pages"].([]interface{})
- page := int(pages[0].(map[string]interface{})["index"].(float64)) + 1
- pageStr := strconv.Itoa(page)
- refTextNode := n.ChildByType(ast.NodeFileAnnotationRefText)
- if nil == refTextNode {
- return ast.WalkSkipChildren
- }
- refText := refTextNode.TokensStr()
- ext := filepath.Ext(p)
- file := p[7:len(p)-23-len(ext)] + ext
- fileAnnotationRefLink := &ast.Node{Type: ast.NodeLink}
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenBracket})
- if 0 == Conf.Export.FileAnnotationRefMode {
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(file + " - p" + pageStr + " - " + refText)})
- } else {
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(refText)})
- }
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseBracket})
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenParen})
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkDest, Tokens: []byte(p + "?p=" + pageStr)})
- fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseParen})
- n.InsertBefore(fileAnnotationRefLink)
+ status := processFileAnnotationRef(refID, n)
unlinks = append(unlinks, n)
- return ast.WalkSkipChildren
+ return status
}
if !treenode.IsBlockRef(n) {
@@ -1498,3 +1459,58 @@ func exportRefTrees0(tree *parse.Tree, retTrees *map[string]*parse.Tree) {
return ast.WalkContinue
})
}
+
+func processFileAnnotationRef(refID string, n *ast.Node) ast.WalkStatus {
+ p := refID[:strings.LastIndex(refID, "/")]
+ absPath, err := GetAssetAbsPath(p)
+ if nil != err {
+ logging.LogWarnf("get assets abs path by rel path [%s] failed: %s", p, err)
+ return ast.WalkSkipChildren
+ }
+ sya := absPath + ".sya"
+ syaData, err := os.ReadFile(sya)
+ if nil != err {
+ logging.LogErrorf("read file [%s] failed: %s", sya, err)
+ return ast.WalkSkipChildren
+ }
+ syaJSON := map[string]interface{}{}
+ if err = gulu.JSON.UnmarshalJSON(syaData, &syaJSON); nil != err {
+ logging.LogErrorf("unmarshal file [%s] failed: %s", sya, err)
+ return ast.WalkSkipChildren
+ }
+ annotationID := refID[strings.LastIndex(refID, "/")+1:]
+ annotationData := syaJSON[annotationID]
+ if nil == annotationData {
+ logging.LogErrorf("not found annotation [%s] in .sya", annotationID)
+ return ast.WalkSkipChildren
+ }
+ pages := annotationData.(map[string]interface{})["pages"].([]interface{})
+ page := int(pages[0].(map[string]interface{})["index"].(float64)) + 1
+ pageStr := strconv.Itoa(page)
+
+ var refText string
+ if ast.NodeTextMark == n.Type {
+ refText = n.TextMarkTextContent
+ } else {
+ refTextNode := n.ChildByType(ast.NodeFileAnnotationRefText)
+ if nil == refTextNode {
+ return ast.WalkSkipChildren
+ }
+ refText = refTextNode.TokensStr()
+ }
+ ext := filepath.Ext(p)
+ file := p[7:len(p)-23-len(ext)] + ext
+ fileAnnotationRefLink := &ast.Node{Type: ast.NodeLink}
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenBracket})
+ if 0 == Conf.Export.FileAnnotationRefMode {
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(file + " - p" + pageStr + " - " + refText)})
+ } else {
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(refText)})
+ }
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseBracket})
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenParen})
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkDest, Tokens: []byte(p + "?p=" + pageStr)})
+ fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseParen})
+ n.InsertBefore(fileAnnotationRefLink)
+ return ast.WalkSkipChildren
+}