官方不支持自定义排序下对某个目录中的笔记重新排序,而我正好有这个需求,就写了个简单的脚本,现分享出来供有同样需求的童鞋参考。希望加入节点排序和快速跳转功能 - 链滴 (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))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于