官方不支持自定义排序下对某个目录中的笔记重新排序,而我正好有这个需求,就写了个简单的脚本,现分享出来供有同样需求的童鞋参考。希望加入节点排序和快速跳转功能 - 链滴 (ld246.com)
原理很简单,笔记目录下的 .siyuan/sort.json
文件记录着当前笔记的排序信息,脚本读取目标目录下的文档信息,按文档名排序后生成排序信息再写入到该文件中,保存前会进行备份,因为只动了 sort.json
文件,而这个文件只记录了排序信息,所以是安全的。
需要 python3 环境,默认按文档名称升序,如果需要降序,修改 reverseSort = True
可以在思源笔记中右键目标笔记 打开-打开文件位置
,然后在资源管理器中复制目录路径作为参数传递给脚本,例如:
python3 siyuanSort.py /Users/Documents/SiYuan/学习笔记/data/20231109104801-lxukl1l/20231109152730-3z6jzts
注意:要先退出思源笔记后再执行脚本排序,防止冲突
import json
import os
import re
import shutil
import sys
import time
# 笔记所在目录
if len(sys.argv) == 2:
targetDir = sys.argv[1]
else:
print("缺少参数:文档目录")
print(f"{sys.argv[0]} 待排序文档目录路径,如: /Users/Documents/SiYuan/学习笔记/data/20231109175954-au6a2mq")
sys.exit()
# 默认按首字母由小到大排序,若希望由大到小,改为True
reverseSort = False
targetDir = targetDir.rstrip(os.sep)
subDirRE = re.compile(r'^.+[\/]\d{14}-\S{7}$')
noteDirRE = re.compile(r'^(.+[\/]data[\/]\d{14}-\S{7})(.*)')
noteDir = None
g = noteDirRE.match(targetDir)
if g:
noteDir = g.group(1)
else:
raise Exception("无法匹配出笔记目录!")
sortFile = os.path.join(noteDir, ".siyuan", "sort.json")
sortJson = json.load(open(sortFile, 'r', encoding="utf-8"))
class itemObject:
def __init__(self, filePath) -> None:
itemJson = json.load(open(filePath, 'r'))
self.id = itemJson["Properties"]["id"]
self.title = itemJson["Properties"]["title"]
self.updatedTime = itemJson["Properties"]["updated"]
self.sortid = sortJson.get(self.id, -1)
print(filePath, self.id, self.title, self.sortid)
subDir = filePath[:-3]
if os.path.isdir(subDir) and subDirRE.match(subDir):
self.subDir = subDir
self.subDirObj = dirObject(subDir)
else:
self.subDir = None
self.subDirObj = None
class dirObject:
def __init__(self, dirPath) -> None:
self.dirPath = dirPath
self.itemDict = self.readDir()
def readDir(self):
itemDict = {}
for name in os.listdir(self.dirPath):
if name == ".DS_Store":
continue
itemPath = os.path.join(self.dirPath, name)
if os.path.isfile(itemPath):
if name.endswith(".sy"):
itemObj = itemObject(itemPath)
itemDict[itemObj.id] = itemObj
return itemDict
def sorted(self, reverse=False):
print("sort dir:", self.dirPath)
sortedItemID = sorted(self.itemDict.keys(), key=lambda x: self.itemDict[x].title, reverse=reverse)
sortedIDDict = {itemID: idx + 1 for idx, itemID in enumerate(sortedItemID)}
for _, itemObj in self.itemDict.items():
itemObj.sortid = sortedIDDict[itemObj.id]
def sortDirObj(dirObj):
if dirObj.dirPath == targetDir:
dirObj.sorted(reverseSort)
else:
for _, itemObj in dirObj.itemDict.items():
if itemObj.subDir is not None:
if itemObj.subDir == targetDir:
itemObj.subDirObj.sorted(reverseSort)
else:
sortDirObj(itemObj.subDirObj)
def saveSortID(dirObj, sortDict):
for _, itemObj in dirObj.itemDict.items():
if itemObj.sortid > 0:
sortDict[itemObj.id] = itemObj.sortid
if itemObj.subDirObj is not None:
saveSortID(itemObj.subDirObj, sortDict)
if __name__ == "__main__":
dirObj = dirObject(noteDir)
sortDirObj(dirObj)
sortJsonNew = {}
saveSortID(dirObj, sortJsonNew)
print(json.dumps(sortJsonNew))
shutil.move(sortFile, f"{sortFile}.{int(time.time())}")
with open(sortFile, 'w', encoding="utf-8") as fw:
fw.write(json.dumps(sortJsonNew))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于