Sfoglia il codice sorgente

:bug: Repeat replace content when find replace hits doc title https://github.com/siyuan-note/siyuan/issues/8641

Daniel 2 anni fa
parent
commit
395d0ae1df
1 ha cambiato i file con 77 aggiunte e 75 eliminazioni
  1. 77 75
      kernel/model/search.go

+ 77 - 75
kernel/model/search.go

@@ -294,99 +294,101 @@ func FindReplace(keyword, replacement string, ids []string, paths, boxes []strin
 			continue
 		}
 
-		ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus {
-			if !entering {
-				return ast.WalkContinue
-			}
-
-			switch n.Type {
-			case ast.NodeDocument:
-				title := n.IALAttr("title")
-				if 0 == method {
-					if strings.Contains(title, keyword) {
-						renameRootTitles[n.ID] = strings.ReplaceAll(title, keyword, replacement)
-						renameRoots = append(renameRoots, n)
-					}
-				} else if 3 == method {
-					if nil != r && r.MatchString(title) {
-						renameRootTitles[n.ID] = r.ReplaceAllString(title, replacement)
-						renameRoots = append(renameRoots, n)
-					}
+		if ast.NodeDocument == node.Type {
+			title := node.IALAttr("title")
+			if 0 == method {
+				if strings.Contains(title, keyword) {
+					renameRootTitles[node.ID] = strings.ReplaceAll(title, keyword, replacement)
+					renameRoots = append(renameRoots, node)
 				}
-			case ast.NodeText, ast.NodeLinkDest, ast.NodeLinkText, ast.NodeLinkTitle, ast.NodeCodeBlockCode, ast.NodeMathBlockContent:
-				if 0 == method {
-					if bytes.Contains(n.Tokens, []byte(keyword)) {
-						n.Tokens = bytes.ReplaceAll(n.Tokens, []byte(keyword), []byte(replacement))
-					}
-				} else if 3 == method {
-					if nil != r && r.MatchString(string(n.Tokens)) {
-						n.Tokens = []byte(r.ReplaceAllString(string(n.Tokens), replacement))
-					}
+			} else if 3 == method {
+				if nil != r && r.MatchString(title) {
+					renameRootTitles[node.ID] = r.ReplaceAllString(title, replacement)
+					renameRoots = append(renameRoots, node)
+				}
+			}
+		} else {
+			ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus {
+				if !entering {
+					return ast.WalkContinue
 				}
-			case ast.NodeTextMark:
-				if n.IsTextMarkType("code") {
+
+				switch n.Type {
+				case ast.NodeText, ast.NodeLinkDest, ast.NodeLinkText, ast.NodeLinkTitle, ast.NodeCodeBlockCode, ast.NodeMathBlockContent:
 					if 0 == method {
-						if strings.Contains(n.TextMarkTextContent, escapedKey) {
-							n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, escapedKey, replacement)
+						if bytes.Contains(n.Tokens, []byte(keyword)) {
+							n.Tokens = bytes.ReplaceAll(n.Tokens, []byte(keyword), []byte(replacement))
 						}
 					} else if 3 == method {
-						if nil != escapedR && escapedR.MatchString(n.TextMarkTextContent) {
-							n.TextMarkTextContent = escapedR.ReplaceAllString(n.TextMarkTextContent, replacement)
+						if nil != r && r.MatchString(string(n.Tokens)) {
+							n.Tokens = []byte(r.ReplaceAllString(string(n.Tokens), replacement))
 						}
 					}
-				} else {
-					if 0 == method {
-						if bytes.Contains(n.Tokens, []byte(keyword)) {
-							n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, keyword, replacement)
+				case ast.NodeTextMark:
+					if n.IsTextMarkType("code") {
+						if 0 == method {
+							if strings.Contains(n.TextMarkTextContent, escapedKey) {
+								n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, escapedKey, replacement)
+							}
+						} else if 3 == method {
+							if nil != escapedR && escapedR.MatchString(n.TextMarkTextContent) {
+								n.TextMarkTextContent = escapedR.ReplaceAllString(n.TextMarkTextContent, replacement)
+							}
 						}
-					} else if 3 == method {
-						if nil != r && r.MatchString(n.TextMarkTextContent) {
-							n.TextMarkTextContent = r.ReplaceAllString(n.TextMarkTextContent, replacement)
+					} else {
+						if 0 == method {
+							if bytes.Contains(n.Tokens, []byte(keyword)) {
+								n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, keyword, replacement)
+							}
+						} else if 3 == method {
+							if nil != r && r.MatchString(n.TextMarkTextContent) {
+								n.TextMarkTextContent = r.ReplaceAllString(n.TextMarkTextContent, replacement)
+							}
 						}
 					}
-				}
 
-				if 0 == method {
-					if strings.Contains(n.TextMarkTextContent, keyword) {
-						n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, keyword, replacement)
-					}
-					if strings.Contains(n.TextMarkInlineMathContent, keyword) {
-						n.TextMarkInlineMathContent = strings.ReplaceAll(n.TextMarkInlineMathContent, keyword, replacement)
-					}
-					if strings.Contains(n.TextMarkInlineMemoContent, keyword) {
-						n.TextMarkInlineMemoContent = strings.ReplaceAll(n.TextMarkInlineMemoContent, keyword, replacement)
-					}
-					if strings.Contains(n.TextMarkATitle, keyword) {
-						n.TextMarkATitle = strings.ReplaceAll(n.TextMarkATitle, keyword, replacement)
-					}
-					if strings.Contains(n.TextMarkAHref, keyword) {
-						n.TextMarkAHref = strings.ReplaceAll(n.TextMarkAHref, keyword, replacement)
-					}
-				} else if 3 == method {
-					if nil != r {
-						if r.MatchString(n.TextMarkTextContent) {
-							n.TextMarkTextContent = r.ReplaceAllString(n.TextMarkTextContent, replacement)
+					if 0 == method {
+						if strings.Contains(n.TextMarkTextContent, keyword) {
+							n.TextMarkTextContent = strings.ReplaceAll(n.TextMarkTextContent, keyword, replacement)
 						}
-						if r.MatchString(n.TextMarkInlineMathContent) {
-							n.TextMarkInlineMathContent = r.ReplaceAllString(n.TextMarkInlineMathContent, replacement)
+						if strings.Contains(n.TextMarkInlineMathContent, keyword) {
+							n.TextMarkInlineMathContent = strings.ReplaceAll(n.TextMarkInlineMathContent, keyword, replacement)
 						}
-						if r.MatchString(n.TextMarkInlineMemoContent) {
-							n.TextMarkInlineMemoContent = r.ReplaceAllString(n.TextMarkInlineMemoContent, replacement)
+						if strings.Contains(n.TextMarkInlineMemoContent, keyword) {
+							n.TextMarkInlineMemoContent = strings.ReplaceAll(n.TextMarkInlineMemoContent, keyword, replacement)
 						}
-						if r.MatchString(n.TextMarkATitle) {
-							n.TextMarkATitle = r.ReplaceAllString(n.TextMarkATitle, replacement)
+						if strings.Contains(n.TextMarkATitle, keyword) {
+							n.TextMarkATitle = strings.ReplaceAll(n.TextMarkATitle, keyword, replacement)
 						}
-						if r.MatchString(n.TextMarkAHref) {
-							n.TextMarkAHref = r.ReplaceAllString(n.TextMarkAHref, replacement)
+						if strings.Contains(n.TextMarkAHref, keyword) {
+							n.TextMarkAHref = strings.ReplaceAll(n.TextMarkAHref, keyword, replacement)
+						}
+					} else if 3 == method {
+						if nil != r {
+							if r.MatchString(n.TextMarkTextContent) {
+								n.TextMarkTextContent = r.ReplaceAllString(n.TextMarkTextContent, replacement)
+							}
+							if r.MatchString(n.TextMarkInlineMathContent) {
+								n.TextMarkInlineMathContent = r.ReplaceAllString(n.TextMarkInlineMathContent, replacement)
+							}
+							if r.MatchString(n.TextMarkInlineMemoContent) {
+								n.TextMarkInlineMemoContent = r.ReplaceAllString(n.TextMarkInlineMemoContent, replacement)
+							}
+							if r.MatchString(n.TextMarkATitle) {
+								n.TextMarkATitle = r.ReplaceAllString(n.TextMarkATitle, replacement)
+							}
+							if r.MatchString(n.TextMarkAHref) {
+								n.TextMarkAHref = r.ReplaceAllString(n.TextMarkAHref, replacement)
+							}
 						}
 					}
 				}
-			}
-			return ast.WalkContinue
-		})
+				return ast.WalkContinue
+			})
 
-		if err = writeJSONQueue(tree); nil != err {
-			return
+			if err = writeJSONQueue(tree); nil != err {
+				return
+			}
 		}
 
 		util.PushEndlessProgress(fmt.Sprintf(Conf.Language(206), i+1, len(ids)))
@@ -396,7 +398,7 @@ func FindReplace(keyword, replacement string, ids []string, paths, boxes []strin
 		newTitle := renameRootTitles[renameRoot.ID]
 		RenameDoc(renameRoot.Box, renameRoot.Path, newTitle)
 
-		util.PushEndlessProgress(fmt.Sprintf(Conf.Language(207), i+1, len(ids)))
+		util.PushEndlessProgress(fmt.Sprintf(Conf.Language(207), i+1, len(renameRoots)))
 	}
 
 	WaitForWritingFiles()