Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
96d513ec48
19 changed files with 71 additions and 41 deletions
2
app/stage/protyle/js/lute/lute.min.js
vendored
2
app/stage/protyle/js/lute/lute.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -9,7 +9,7 @@ require (
|
|||
github.com/88250/clipboard v0.1.5
|
||||
github.com/88250/epub v0.0.0-20230830085737-c19055cd1f48
|
||||
github.com/88250/gulu v1.2.3-0.20240324024901-3c1bb82cba30
|
||||
github.com/88250/lute v1.7.7-0.20240408145140-e18ac30cb9f0
|
||||
github.com/88250/lute v1.7.7-0.20240411163909-bafd08a11269
|
||||
github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c
|
||||
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1
|
||||
github.com/ClarkThan/ahocorasick v0.0.0-20231011042242-30d1ef1347f4
|
||||
|
|
|
@ -10,8 +10,8 @@ github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950 h1:Pa5hMiBceT
|
|||
github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/88250/gulu v1.2.3-0.20240324024901-3c1bb82cba30 h1:IeE4DVRWnVpcbMj7gGZoSMiBWs3h/ihiyOmualS1Mas=
|
||||
github.com/88250/gulu v1.2.3-0.20240324024901-3c1bb82cba30/go.mod h1:MUfzyfmbPrRDZLqxc7aPrVYveatTHRfoUa5TynPS0i8=
|
||||
github.com/88250/lute v1.7.7-0.20240408145140-e18ac30cb9f0 h1:6kBdaikgEvit+d9f/EfKHu8KDOQDq9l00qtfOnchy4A=
|
||||
github.com/88250/lute v1.7.7-0.20240408145140-e18ac30cb9f0/go.mod h1:VDAzL8b+oCh+e3NAlmwwLzC53ten0rZlS8NboB7ljtk=
|
||||
github.com/88250/lute v1.7.7-0.20240411163909-bafd08a11269 h1:hKChDrTYwMmorNb8E16cEFvYEb9qP2Qa001SocS7L/8=
|
||||
github.com/88250/lute v1.7.7-0.20240411163909-bafd08a11269/go.mod h1:VDAzL8b+oCh+e3NAlmwwLzC53ten0rZlS8NboB7ljtk=
|
||||
github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c h1:Dl/8S9iLyPMTElnWIBxmjaLiWrkI5P4a21ivwAn5pU0=
|
||||
github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c/go.mod h1:S5YT38L/GCjVjmB4PB84PymA1qfopjEhfhTNQilLpv4=
|
||||
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 h1:48T899JQDwyyRu9yXHePYlPdHtpJfrJEUGBMH3SMBWY=
|
||||
|
|
|
@ -235,7 +235,7 @@ func NetImg2LocalAssets(rootID, originalURL string) (err error) {
|
|||
})
|
||||
if 0 < files {
|
||||
util.PushUpdateMsg(msgId, Conf.Language(113), 7000)
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(120), files), 5000)
|
||||
|
@ -422,7 +422,7 @@ func NetAssets2LocalAssets(rootID string) (err error) {
|
|||
|
||||
if 0 < files {
|
||||
util.PushUpdateMsg(msgId, Conf.Language(113), 7000)
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(120), files), 5000)
|
||||
|
|
|
@ -1609,7 +1609,7 @@ func (tx *Transaction) doRemoveAttrViewView(operation *Operation) (ret *TxErr) {
|
|||
}
|
||||
|
||||
for _, tree := range trees {
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -205,7 +205,7 @@ func TransferBlockRef(fromID, toID string, refIDs []string) (err error) {
|
|||
}
|
||||
}
|
||||
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -317,11 +317,11 @@ func SwapBlockRef(refID, defID string, includeChildren bool) (err error) {
|
|||
}
|
||||
refPivot.Unlink()
|
||||
|
||||
if err = indexWriteJSONQueue(refTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(refTree); nil != err {
|
||||
return
|
||||
}
|
||||
if !sameTree {
|
||||
if err = indexWriteJSONQueue(defTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(defTree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ func SetBlockReminder(id string, timed string) (err error) {
|
|||
node.SetIALAttr(attrName, timed)
|
||||
util.PushMsg(fmt.Sprintf(Conf.Language(101), time.UnixMilli(timedMills).Format("2006-01-02 15:04")), 5000)
|
||||
}
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
IncSync()
|
||||
|
@ -143,7 +143,7 @@ func BatchSetBlockAttrs(blockAttrs []map[string]interface{}) (err error) {
|
|||
}
|
||||
|
||||
for _, tree := range trees {
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -180,7 +180,7 @@ func setNodeAttrs(node *ast.Node, tree *parse.Tree, nameValues map[string]string
|
|||
return
|
||||
}
|
||||
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -279,7 +279,7 @@ func ResetBlockAttrs(id string, nameValues map[string]string) (err error) {
|
|||
updateRefTextRenameDoc(tree)
|
||||
}
|
||||
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
IncSync()
|
||||
|
|
|
@ -64,7 +64,7 @@ func RemoveBookmark(bookmark string) (err error) {
|
|||
}
|
||||
|
||||
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
util.ClearPushProgress(100)
|
||||
return
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ func RenameBookmark(oldBookmark, newBookmark string) (err error) {
|
|||
}
|
||||
|
||||
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
util.ClearPushProgress(100)
|
||||
return
|
||||
}
|
||||
|
|
|
@ -295,7 +295,7 @@ func Export2Liandi(id string) (err error) {
|
|||
articleId = result.Data.(string)
|
||||
tree, _ = LoadTreeByBlockID(id) // 这里必须重新加载,因为前面导出时已经修改了树结构
|
||||
tree.Root.SetIALAttr(liandiArticleIdAttrName, articleId)
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1065,7 +1065,7 @@ func loadNodesByMode(node *ast.Node, inputIndex, mode, size int, isDoc, isHeadin
|
|||
return
|
||||
}
|
||||
|
||||
func writeJSONQueue(tree *parse.Tree) (err error) {
|
||||
func writeTreeUpsertQueue(tree *parse.Tree) (err error) {
|
||||
if err = filesys.WriteTree(tree); nil != err {
|
||||
return
|
||||
}
|
||||
|
@ -1073,9 +1073,22 @@ func writeJSONQueue(tree *parse.Tree) (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func indexWriteJSONQueue(tree *parse.Tree) (err error) {
|
||||
func writeTreeIndexQueue(tree *parse.Tree) (err error) {
|
||||
if err = filesys.WriteTree(tree); nil != err {
|
||||
return
|
||||
}
|
||||
sql.IndexTreeQueue(tree)
|
||||
return
|
||||
}
|
||||
|
||||
func indexWriteTreeIndexQueue(tree *parse.Tree) (err error) {
|
||||
treenode.IndexBlockTree(tree)
|
||||
return writeJSONQueue(tree)
|
||||
return writeTreeIndexQueue(tree)
|
||||
}
|
||||
|
||||
func indexWriteTreeUpsertQueue(tree *parse.Tree) (err error) {
|
||||
treenode.IndexBlockTree(tree)
|
||||
return writeTreeUpsertQueue(tree)
|
||||
}
|
||||
|
||||
func renameWriteJSONQueue(tree *parse.Tree) (err error) {
|
||||
|
@ -1181,7 +1194,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
|
|||
date := time.Now().Format("20060102")
|
||||
if tree.Root.IALAttr("custom-dailynote-"+date) == "" {
|
||||
tree.Root.SetIALAttr("custom-dailynote-"+date, date)
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -1232,7 +1245,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
|
|||
}
|
||||
|
||||
tree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -1249,7 +1262,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
|
|||
p = tree.Path
|
||||
date := time.Now().Format("20060102")
|
||||
tree.Root.SetIALAttr("custom-dailynote-"+date, date)
|
||||
if err = indexWriteJSONQueue(tree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ func AutoSpace(rootID string) (err error) {
|
|||
newTree.Path = tree.Path
|
||||
newTree.HPath = tree.HPath
|
||||
newTree.Box = tree.Box
|
||||
err = writeJSONQueue(newTree)
|
||||
err = writeTreeUpsertQueue(newTree)
|
||||
if nil != err {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -256,7 +256,7 @@ func Doc2Heading(srcID, targetID string, after bool) (srcTreeBox, srcTreePath st
|
|||
targetTree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
|
||||
treenode.RemoveBlockTreesByRootID(srcTree.ID)
|
||||
treenode.RemoveBlockTreesByRootID(targetTree.ID)
|
||||
err = indexWriteJSONQueue(targetTree)
|
||||
err = indexWriteTreeUpsertQueue(targetTree)
|
||||
IncSync()
|
||||
RefreshBacklink(srcTree.ID)
|
||||
RefreshBacklink(targetTree.ID)
|
||||
|
@ -355,7 +355,7 @@ func Heading2Doc(srcHeadingID, targetBoxID, targetPath string) (srcRootBlockID,
|
|||
srcTree.Root.AppendChild(treenode.NewParagraph())
|
||||
}
|
||||
treenode.RemoveBlockTreesByRootID(srcTree.ID)
|
||||
if err = indexWriteJSONQueue(srcTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(srcTree); nil != err {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
|
@ -363,7 +363,7 @@ func Heading2Doc(srcHeadingID, targetBoxID, targetPath string) (srcRootBlockID,
|
|||
newTree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
|
||||
newTree.Root.Spec = "1"
|
||||
box.addMinSort(path.Dir(newTargetPath), newTree.ID)
|
||||
if err = indexWriteJSONQueue(newTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(newTree); nil != err {
|
||||
return "", "", err
|
||||
}
|
||||
IncSync()
|
||||
|
|
|
@ -549,7 +549,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) {
|
|||
}
|
||||
|
||||
treenode.IndexBlockTree(tree)
|
||||
sql.UpsertTreeQueue(tree)
|
||||
sql.IndexTreeQueue(tree)
|
||||
}
|
||||
|
||||
IncSync()
|
||||
|
@ -894,7 +894,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
|
|||
buildBlockRefInText()
|
||||
|
||||
for i, tree := range importTrees {
|
||||
indexWriteJSONQueue(tree)
|
||||
indexWriteTreeIndexQueue(tree)
|
||||
if 0 == i%4 {
|
||||
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(66), fmt.Sprintf("%d/%d ", i, len(importTrees))+tree.HPath))
|
||||
}
|
||||
|
|
|
@ -481,7 +481,7 @@ func reindexTree0(tree *parse.Tree, i, size int) {
|
|||
if "" == updated {
|
||||
updated = util.TimeFromID(tree.Root.ID)
|
||||
tree.Root.SetIALAttr("updated", updated)
|
||||
indexWriteJSONQueue(tree)
|
||||
indexWriteTreeUpsertQueue(tree)
|
||||
} else {
|
||||
treenode.IndexBlockTree(tree)
|
||||
sql.IndexTreeQueue(tree)
|
||||
|
|
|
@ -97,7 +97,7 @@ func ListItem2Doc(srcListItemID, targetBoxID, targetPath string) (srcRootBlockID
|
|||
srcTree.Root.AppendChild(treenode.NewParagraph())
|
||||
}
|
||||
treenode.RemoveBlockTreesByRootID(srcTree.ID)
|
||||
if err = indexWriteJSONQueue(srcTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(srcTree); nil != err {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ func ListItem2Doc(srcListItemID, targetBoxID, targetPath string) (srcRootBlockID
|
|||
newTree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
|
||||
newTree.Root.Spec = "1"
|
||||
box.addMinSort(path.Dir(newTargetPath), newTree.ID)
|
||||
if err = indexWriteJSONQueue(newTree); nil != err {
|
||||
if err = indexWriteTreeUpsertQueue(newTree); nil != err {
|
||||
return "", "", err
|
||||
}
|
||||
IncSync()
|
||||
|
|
|
@ -726,7 +726,7 @@ func FindReplace(keyword, replacement string, replaceTypes map[string]bool, ids
|
|||
return ast.WalkContinue
|
||||
})
|
||||
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -93,7 +93,7 @@ func RemoveTag(label string) (err error) {
|
|||
n.Unlink()
|
||||
}
|
||||
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
util.ClearPushProgress(100)
|
||||
return
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ func RenameTag(oldLabel, newLabel string) (err error) {
|
|||
}
|
||||
}
|
||||
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
util.ClearPushProgress(100)
|
||||
return
|
||||
}
|
||||
|
|
|
@ -1309,7 +1309,7 @@ func (tx *Transaction) begin() (err error) {
|
|||
|
||||
func (tx *Transaction) commit() (err error) {
|
||||
for _, tree := range tx.trees {
|
||||
if err = writeJSONQueue(tree); nil != err {
|
||||
if err = writeTreeUpsertQueue(tree); nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -1474,7 +1474,7 @@ func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees m
|
|||
|
||||
// 3. 保存变更
|
||||
for _, tree := range changedRefTree {
|
||||
indexWriteJSONQueue(tree)
|
||||
indexWriteTreeUpsertQueue(tree)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ import (
|
|||
"regexp"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -981,19 +982,35 @@ func deleteBlocksByIDs(tx *sql.Tx, ids []string) (err error) {
|
|||
ftsIDs = append(ftsIDs, "\""+id+"\"")
|
||||
}
|
||||
|
||||
stmt := "DELETE FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")"
|
||||
var rowIDs []string
|
||||
stmt := "SELECT ROWID FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")"
|
||||
rows, err := tx.Query(stmt)
|
||||
if nil != err {
|
||||
logging.LogErrorf("query block rowIDs failed: %s", err)
|
||||
return
|
||||
}
|
||||
for rows.Next() {
|
||||
var rowID int64
|
||||
if err = rows.Scan(&rowID); nil != err {
|
||||
logging.LogErrorf("scan block rowID failed: %s", err)
|
||||
rows.Close()
|
||||
return
|
||||
}
|
||||
rowIDs = append(rowIDs, strconv.FormatInt(rowID, 10))
|
||||
}
|
||||
rows.Close()
|
||||
stmt = "DELETE FROM blocks WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
|
||||
if err = execStmtTx(tx, stmt); nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
ftsIDsMatch := strings.Join(ftsIDs, " OR ")
|
||||
stmt = "DELETE FROM blocks_fts WHERE ROWID IN (SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + ftsIDsMatch + ")')"
|
||||
stmt = "DELETE FROM blocks_fts WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
|
||||
if err = execStmtTx(tx, stmt); nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
if !caseSensitive {
|
||||
stmt = "DELETE FROM blocks_fts_case_insensitive WHERE ROWID IN (SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + ftsIDsMatch + ")')"
|
||||
stmt = "DELETE FROM blocks_fts_case_insensitive WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
|
||||
if err = execStmtTx(tx, stmt); nil != err {
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue