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

This commit is contained in:
Vanessa 2025-10-15 20:32:41 +08:00
commit 14effb402f
20 changed files with 174 additions and 41 deletions

View file

@ -7,17 +7,17 @@
## NPM dependencies
Install pnpm: `npm install -g pnpm@10.17.1`
Install pnpm: `npm install -g pnpm@10.18.3`
<details>
<summary>For China mainland</summary>
Set the Electron mirror environment variable and install Electron:
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.6.0 -D`
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.7.0 -D`
* Windows:
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.6.0 -D`
* `pnpm install electron@37.7.0 -D`
NPM mirror:
@ -27,7 +27,7 @@ NPM mirror:
Enter the app folder and execute:
* `pnpm install electron@37.6.0 -D`
* `pnpm install electron@37.7.0 -D`
* `pnpm run dev`
* `pnpm run start`

View file

@ -7,17 +7,17 @@
## NPM 依赖
安装 pnpm`npm install -g pnpm@10.17.1`
安装 pnpm`npm install -g pnpm@10.18.3`
<details>
<summary>适用于中国大陆</summary>
设置 Electron 镜像环境变量并安装 Electron
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.6.0 -D`
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.7.0 -D`
* Windows
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.6.0 -D`
* `pnpm install electron@37.7.0 -D`
NPM 镜像:
@ -27,7 +27,7 @@ NPM 镜像:
进入 app 文件夹执行:
* `pnpm install electron@37.6.0 -D`
* `pnpm install electron@37.7.0 -D`
* `pnpm run dev`
* `pnpm run start`

View file

@ -1,4 +1,14 @@
{
"foldAll": "طي الكل",
"expandSameLevelHeading": "توسيع العناوين من نفس المستوى",
"foldSameLevelHeading": "طي العناوين من نفس المستوى",
"expandChildHeading": "توسيع العناوين الفرعية",
"foldChildHeading": "طي العناوين الفرعية",
"addChildHeading": "إضافة عنوان فرعي",
"insertSameLevelHeadingBefore": "إدراج عنوان من نفس المستوى قبل",
"insertSameLevelHeadingAfter": "إدراج عنوان من نفس المستوى بعد",
"upgrade": "ترقية",
"downgrade": "خفض المستوى",
"clipboardPermissionDenied": "تم رفض إذن الحافظة. يرجى السماح بالوصول إلى الحافظة من شريط عنوان المتصفح ثم المحاولة مرة أخرى.",
"jumpTo": "انتقل إلى",
"vacuumDataIndex": "تحسين الفهرس",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Alle einklappen",
"expandSameLevelHeading": "Überschriften auf gleicher Ebene ausklappen",
"foldSameLevelHeading": "Überschriften auf gleicher Ebene einklappen",
"expandChildHeading": "Unterüberschriften ausklappen",
"foldChildHeading": "Unterüberschriften einklappen",
"addChildHeading": "Unterüberschrift hinzufügen",
"insertSameLevelHeadingBefore": "Überschrift auf gleicher Ebene davor einfügen",
"insertSameLevelHeadingAfter": "Überschrift auf gleicher Ebene danach einfügen",
"upgrade": "Aktualisieren",
"downgrade": "Herabstufen",
"clipboardPermissionDenied": "Zwischenablage-Berechtigung verweigert. Bitte erlauben Sie den Zugriff auf die Zwischenablage in der Adressleiste des Browsers und versuchen Sie es erneut.",
"jumpTo": "Springe zu",
"vacuumDataIndex": "Index optimieren",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Fold all",
"expandSameLevelHeading": "Expand same level heading",
"foldSameLevelHeading": "Fold same level heading",
"expandChildHeading": "Expand child heading",
"foldChildHeading": "Fold child heading",
"addChildHeading": "Add child heading",
"insertSameLevelHeadingBefore": "Insert same level heading before",
"insertSameLevelHeadingAfter": "Insert same level heading after",
"upgrade": "Upgrade",
"downgrade": "Downgrade",
"clipboardPermissionDenied": "Clipboard permission denied. Please allow clipboard access in the browser address bar and try again.",
"jumpTo": "Jump to",
"vacuumDataIndex": "Optimize Index",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Colapsar todo",
"expandSameLevelHeading": "Expandir títulos del mismo nivel",
"foldSameLevelHeading": "Colapsar títulos del mismo nivel",
"expandChildHeading": "Expandir subtítulos",
"foldChildHeading": "Colapsar subtítulos",
"addChildHeading": "Agregar subtítulo",
"insertSameLevelHeadingBefore": "Insertar título del mismo nivel antes",
"insertSameLevelHeadingAfter": "Insertar título del mismo nivel después",
"upgrade": "Actualizar",
"downgrade": "Degradar",
"clipboardPermissionDenied": "Permiso del portapapeles denegado. Permite el acceso al portapapeles en la barra de direcciones del navegador y vuelve a intentarlo.",
"jumpTo": "Ir a",
"vacuumDataIndex": "Optimizar índice",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Tout replier",
"expandSameLevelHeading": "Développer les titres du même niveau",
"foldSameLevelHeading": "Replier les titres du même niveau",
"expandChildHeading": "Développer les sous-titres",
"foldChildHeading": "Replier les sous-titres",
"addChildHeading": "Ajouter un sous-titre",
"insertSameLevelHeadingBefore": "Insérer un titre du même niveau avant",
"insertSameLevelHeadingAfter": "Insérer un titre du même niveau après",
"upgrade": "Mettre à niveau",
"downgrade": "Rétrograder",
"clipboardPermissionDenied": "Permission du presse-papiers refusée. Veuillez autoriser l'accès au presse-papiers dans la barre d'adresse du navigateur, puis réessayez.",
"jumpTo": "Aller à",
"vacuumDataIndex": "Optimiser l'index",

View file

@ -1,4 +1,14 @@
{
"foldAll": "קפל הכל",
"expandSameLevelHeading": "הרחב כותרות באותו רמה",
"foldSameLevelHeading": "קפל כותרות באותו רמה",
"expandChildHeading": "הרחב כותרות משנה",
"foldChildHeading": "קפל כותרות משנה",
"addChildHeading": "הוסף כותרת משנה",
"insertSameLevelHeadingBefore": "הוסף כותרת באותו רמה לפני",
"insertSameLevelHeadingAfter": "הוסף כותרת באותו רמה אחרי",
"upgrade": "שדרג",
"downgrade": "הורד רמה",
"clipboardPermissionDenied": "ההרשאה ללוח נדחתה. אפשר גישה ללוח משורת הכתובת בדפדפן ונסה שוב.",
"jumpTo": "קפוץ אל",
"vacuumDataIndex": "אופטימיזציית אינדקס",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Comprimi tutto",
"expandSameLevelHeading": "Espandi intestazioni dello stesso livello",
"foldSameLevelHeading": "Comprimi intestazioni dello stesso livello",
"expandChildHeading": "Espandi sottotitoli",
"foldChildHeading": "Comprimi sottotitoli",
"addChildHeading": "Aggiungi sottotitolo",
"insertSameLevelHeadingBefore": "Inserisci intestazione dello stesso livello prima",
"insertSameLevelHeadingAfter": "Inserisci intestazione dello stesso livello dopo",
"upgrade": "Aggiorna",
"downgrade": "Retrocedi",
"clipboardPermissionDenied": "Autorizzazione agli appunti negata. Consenti l'accesso agli appunti dalla barra degli indirizzi del browser e riprova.",
"jumpTo": "Vai a",
"vacuumDataIndex": "Ottimizza indice",
@ -977,9 +987,9 @@
"heading4": "Titolo 4",
"heading5": "Titolo 5",
"heading6": "Titolo 6",
"outlineExpandLevel": "展開レベル",
"expandAll": "すべて展開",
"outlineKeepCurrentExpand": "現在の見出しを展開し続ける",
"outlineExpandLevel": "Livello di espansione",
"expandAll": "Espandi tutto",
"outlineKeepCurrentExpand": "Mantieni espanso l'intestazione corrente",
"general": "Generale",
"list1": "Lista",
"element": "elemento",

View file

@ -1,4 +1,14 @@
{
"foldAll": "すべて折りたたむ",
"expandSameLevelHeading": "同じレベルの見出しを展開",
"foldSameLevelHeading": "同じレベルの見出しを折りたたむ",
"expandChildHeading": "子見出しを展開",
"foldChildHeading": "子見出しを折りたたむ",
"addChildHeading": "子見出しを追加",
"insertSameLevelHeadingBefore": "前に同じレベルの見出しを挿入",
"insertSameLevelHeadingAfter": "後に同じレベルの見出しを挿入",
"upgrade": "アップグレード",
"downgrade": "ダウングレード",
"clipboardPermissionDenied": "クリップボードの権限が拒否されました。ブラウザのアドレスバーでクリップボードへのアクセスを許可してから再試行してください。",
"jumpTo": "ジャンプ先",
"vacuumDataIndex": "インデックスの最適化",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Zwiń wszystko",
"expandSameLevelHeading": "Rozwiń nagłówki na tym samym poziomie",
"foldSameLevelHeading": "Zwiń nagłówki na tym samym poziomie",
"expandChildHeading": "Rozwiń nagłówki podrzędne",
"foldChildHeading": "Zwiń nagłówki podrzędne",
"addChildHeading": "Dodaj nagłówek podrzędny",
"insertSameLevelHeadingBefore": "Wstaw nagłówek na tym samym poziomie przed",
"insertSameLevelHeadingAfter": "Wstaw nagłówek na tym samym poziomie po",
"upgrade": "Aktualizuj",
"downgrade": "Degraduj",
"clipboardPermissionDenied": "Odmowa dostępu do schowka. Zezwól na dostęp do schowka w pasku adresu przeglądarki, a następnie spróbuj ponownie.",
"jumpTo": "Przejdź do",
"vacuumDataIndex": "Optymalizuj indeks",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Recolher tudo",
"expandSameLevelHeading": "Expandir títulos do mesmo nível",
"foldSameLevelHeading": "Recolher títulos do mesmo nível",
"expandChildHeading": "Expandir subtítulos",
"foldChildHeading": "Recolher subtítulos",
"addChildHeading": "Adicionar subtítulo",
"insertSameLevelHeadingBefore": "Inserir título do mesmo nível antes",
"insertSameLevelHeadingAfter": "Inserir título do mesmo nível depois",
"upgrade": "Atualizar",
"downgrade": "Rebaixar",
"clipboardPermissionDenied": "Permissão da área de transferência negada. Permita o acesso à área de transferência na barra de endereço do navegador e tente novamente.",
"jumpTo": "Ir para",
"vacuumDataIndex": "Otimizar índice",

View file

@ -1,4 +1,14 @@
{
"foldAll": "Свернуть всё",
"expandSameLevelHeading": "Развернуть заголовки того же уровня",
"foldSameLevelHeading": "Свернуть заголовки того же уровня",
"expandChildHeading": "Развернуть дочерние заголовки",
"foldChildHeading": "Свернуть дочерние заголовки",
"addChildHeading": "Добавить дочерний заголовок",
"insertSameLevelHeadingBefore": "Вставить заголовок того же уровня перед",
"insertSameLevelHeadingAfter": "Вставить заголовок того же уровня после",
"upgrade": "Обновить",
"downgrade": "Понизить",
"clipboardPermissionDenied": "Доступ к буферу обмена отклонён. Разрешите доступ в адресной строке браузера и попробуйте снова.",
"jumpTo": "Перейти к",
"vacuumDataIndex": "Оптимизация индекса",

View file

@ -1,4 +1,14 @@
{
"foldAll": "全部摺疊",
"expandSameLevelHeading": "展開同級標題",
"foldSameLevelHeading": "摺疊同級標題",
"expandChildHeading": "展開子標題",
"foldChildHeading": "摺疊子標題",
"addChildHeading": "新增子標題",
"insertSameLevelHeadingBefore": "在前方插入同級標題",
"insertSameLevelHeadingAfter": "在後方插入同級標題",
"upgrade": "升級",
"downgrade": "降級",
"clipboardPermissionDenied": "剪貼簿權限被拒絕,請在瀏覽器地址欄允許訪問剪貼簿後再試",
"jumpTo": "跳轉到",
"vacuumDataIndex": "優化索引",

View file

@ -1,4 +1,14 @@
{
"foldAll": "全部折叠",
"expandSameLevelHeading": "展开同级标题",
"foldSameLevelHeading": "折叠同级标题",
"expandChildHeading": "展开子标题",
"foldChildHeading": "折叠子标题",
"addChildHeading": "添加子标题",
"insertSameLevelHeadingBefore": "在前方插入同级标题",
"insertSameLevelHeadingAfter": "在后方插入同级标题",
"upgrade": "升级",
"downgrade": "降级",
"clipboardPermissionDenied": "剪贴板权限被拒绝,请在浏览器地址栏允许访问剪贴板后再试",
"jumpTo": "跳转到",
"vacuumDataIndex": "优化索引",

View file

@ -4,7 +4,7 @@
"description": "Refactor your thinking",
"homepage": "https://b3log.org/siyuan",
"main": "./electron/main.js",
"packageManager": "pnpm@10.17.1",
"packageManager": "pnpm@10.18.3",
"scripts": {
"lint": "eslint . --fix --cache",
"dev": "webpack --mode development",
@ -57,7 +57,7 @@
"clean-webpack-plugin": "^4.0.0",
"css-loader": "^7.1.2",
"dayjs": "^1.11.5",
"electron": "37.6.0",
"electron": "37.7.0",
"electron-builder": "26.0.12",
"encoding": "^0.1.13",
"esbuild-loader": "^3.0.1",

22
app/pnpm-lock.yaml generated
View file

@ -10,7 +10,7 @@ importers:
dependencies:
'@electron/remote':
specifier: ^2.1.3
version: 2.1.3(electron@37.6.0)
version: 2.1.3(electron@37.7.0)
devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.1
@ -40,8 +40,8 @@ importers:
specifier: ^1.11.5
version: 1.11.18
electron:
specifier: 37.6.0
version: 37.6.0
specifier: 37.7.0
version: 37.7.0
electron-builder:
specifier: 26.0.12
version: 26.0.12(electron-builder-squirrel-windows@26.0.12)
@ -446,36 +446,42 @@ packages:
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm-musl@2.5.1':
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [musl]
'@parcel/watcher-linux-arm64-glibc@2.5.1':
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm64-musl@2.5.1':
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@parcel/watcher-linux-x64-glibc@2.5.1':
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-x64-musl@2.5.1':
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
'@parcel/watcher-win32-arm64@2.5.1':
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
@ -1192,8 +1198,8 @@ packages:
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
engines: {node: '>=8.0.0'}
electron@37.6.0:
resolution: {integrity: sha512-8AANcn6irYQ7cTAJRY7r0CovWckcGCHUniQecyGhw/jJ25vWwitVhF97skF+EyDztiEI6YBoF0G6tx1s37bO3g==}
electron@37.7.0:
resolution: {integrity: sha512-LBzvfrS0aalynOsnC11AD7zeoU8eOois090mzLpQM3K8yZ2N04i2ZW9qmHOTFLrXlKvrwRc7EbyQf1u8XHMl6Q==}
engines: {node: '>= 12.20.55'}
hasBin: true
@ -2862,9 +2868,9 @@ snapshots:
- bluebird
- supports-color
'@electron/remote@2.1.3(electron@37.6.0)':
'@electron/remote@2.1.3(electron@37.7.0)':
dependencies:
electron: 37.6.0
electron: 37.7.0
'@electron/universal@2.0.1':
dependencies:
@ -4007,7 +4013,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
electron@37.6.0:
electron@37.7.0:
dependencies:
'@electron/get': 2.0.3
'@types/node': 22.18.1

View file

@ -522,9 +522,11 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS
historyDir := matches[0]
avJSONPath := filepath.Join(historyDir, "storage", "av", avID+".json")
if !gulu.File.IsExist(avJSONPath) {
logging.LogWarnf("attribute view [%s] not found in history data [%s], use current data instead", avID, historyDir)
avJSONPath = filepath.Join(util.DataDir, "storage", "av", avID+".json")
}
if !gulu.File.IsExist(avJSONPath) {
logging.LogWarnf("attribute view [%s] not found in current data", avID)
attrView = av.NewAttributeView(avID)
} else {
data, readErr := os.ReadFile(avJSONPath)

View file

@ -1548,16 +1548,7 @@ func removeDoc(box *Box, p string, luteEngine *lute.Lute) {
return
}
// 关联的属性视图也要复制到历史中 https://github.com/siyuan-note/siyuan/issues/9567
avNodes := tree.Root.ChildrenByType(ast.NodeAttributeView)
for _, avNode := range avNodes {
srcAvPath := filepath.Join(util.DataDir, "storage", "av", avNode.AttributeViewID+".json")
destAvPath := filepath.Join(historyDir, "storage", "av", avNode.AttributeViewID+".json")
if copyErr := filelock.Copy(srcAvPath, destAvPath); nil != copyErr {
logging.LogErrorf("copy av [%s] failed: %s", srcAvPath, copyErr)
}
}
generateAvHistory(tree, historyDir)
copyDocAssetsToDataAssets(box.ID, p)
removeIDs := treenode.RootChildIDs(tree.ID)

View file

@ -259,7 +259,6 @@ func RollbackDocHistory(boxID, historyPath string) (err error) {
}
historyDir = filepath.Join(util.HistoryDir, historyDir)
// 恢复包含的的属性视图 https://github.com/siyuan-note/siyuan/issues/9567
avNodes := tree.Root.ChildrenByType(ast.NodeAttributeView)
for _, avNode := range avNodes {
srcAvPath := filepath.Join(historyDir, "storage", "av", avNode.AttributeViewID+".json")
@ -652,15 +651,7 @@ func (box *Box) generateDocHistory0() {
if nil != loadErr {
logging.LogErrorf("load tree [%s] failed: %s", file, loadErr)
} else {
// 关联的属性视图也要复制到历史中 https://github.com/siyuan-note/siyuan/issues/9567
avNodes := tree.Root.ChildrenByType(ast.NodeAttributeView)
for _, avNode := range avNodes {
srcAvPath := filepath.Join(util.DataDir, "storage", "av", avNode.AttributeViewID+".json")
destAvPath := filepath.Join(historyDir, "storage", "av", avNode.AttributeViewID+".json")
if copyErr := filelock.Copy(srcAvPath, destAvPath); nil != copyErr {
logging.LogErrorf("copy av [%s] failed: %s", srcAvPath, copyErr)
}
}
generateAvHistory(tree, historyDir)
}
}
}
@ -789,9 +780,22 @@ func generateOpTypeHistory(tree *parse.Tree, opType string) {
return
}
generateAvHistory(tree, historyDir)
indexHistoryDir(filepath.Base(historyDir), util.NewLute())
}
func generateAvHistory(tree *parse.Tree, historyDir string) {
avNodes := tree.Root.ChildrenByType(ast.NodeAttributeView)
for _, avNode := range avNodes {
srcAvPath := filepath.Join(util.DataDir, "storage", "av", avNode.AttributeViewID+".json")
destAvPath := filepath.Join(historyDir, "storage", "av", avNode.AttributeViewID+".json")
if copyErr := filelock.Copy(srcAvPath, destAvPath); nil != copyErr {
logging.LogErrorf("copy av [%s] failed: %s", srcAvPath, copyErr)
}
}
}
func GetHistoryDir(suffix string) (ret string, err error) {
return getHistoryDir(suffix, time.Now())
}