Bladeren bron

:sparkles: 行级元素支持多重样式类型 https://github.com/siyuan-note/siyuan/issues/2911

Liang Ding 2 jaren geleden
bovenliggende
commit
61453ad84b
2 gewijzigde bestanden met toevoegingen van 65 en 46 verwijderingen
  1. 3 0
      kernel/model/assets.go
  2. 62 46
      kernel/model/export.go

+ 3 - 0
kernel/model/assets.go

@@ -195,6 +195,9 @@ func SearchAssetsByName(keyword string) (ret []*cache.Asset) {
 
 func GetAssetAbsPath(relativePath string) (absPath string, err error) {
 	relativePath = strings.TrimSpace(relativePath)
+	if strings.Contains(relativePath, "?") {
+		relativePath = relativePath[:strings.Index(relativePath, "?")]
+	}
 	notebooks, err := ListNotebooks()
 	if nil != err {
 		err = errors.New(Conf.Language(0))

+ 62 - 46
kernel/model/export.go

@@ -1083,6 +1083,11 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros bool) (ret *parse.T
 			if n.IsTextMarkType("inline-math") {
 				n.TextMarkInlineMathContent = strings.TrimSpace(n.TextMarkInlineMathContent)
 				return ast.WalkContinue
+			} else if n.IsTextMarkType("file-annotation-ref") {
+				refID := n.TextMarkFileAnnotationRefID
+				status := processFileAnnotationRef(refID, n)
+				unlinks = append(unlinks, n)
+				return status
 			}
 		case ast.NodeFileAnnotationRef:
 			refIDNode := n.ChildByType(ast.NodeFileAnnotationRefID)
@@ -1090,53 +1095,9 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros bool) (ret *parse.T
 				return ast.WalkSkipChildren
 			}
 			refID := refIDNode.TokensStr()
-			p := refID[:strings.LastIndex(refID, "/")]
-			absPath, err := GetAssetAbsPath(p)
-			if nil != err {
-				logging.LogWarnf("get assets abs path by rel path [%s] failed: %s", p, err)
-				return ast.WalkSkipChildren
-			}
-			sya := absPath + ".sya"
-			syaData, err := os.ReadFile(sya)
-			if nil != err {
-				logging.LogErrorf("read file [%s] failed: %s", sya, err)
-				return ast.WalkSkipChildren
-			}
-			syaJSON := map[string]interface{}{}
-			if err = gulu.JSON.UnmarshalJSON(syaData, &syaJSON); nil != err {
-				logging.LogErrorf("unmarshal file [%s] failed: %s", sya, err)
-				return ast.WalkSkipChildren
-			}
-			annotationID := refID[strings.LastIndex(refID, "/")+1:]
-			annotationData := syaJSON[annotationID]
-			if nil == annotationData {
-				logging.LogErrorf("not found annotation [%s] in .sya", annotationID)
-				return ast.WalkSkipChildren
-			}
-			pages := annotationData.(map[string]interface{})["pages"].([]interface{})
-			page := int(pages[0].(map[string]interface{})["index"].(float64)) + 1
-			pageStr := strconv.Itoa(page)
-			refTextNode := n.ChildByType(ast.NodeFileAnnotationRefText)
-			if nil == refTextNode {
-				return ast.WalkSkipChildren
-			}
-			refText := refTextNode.TokensStr()
-			ext := filepath.Ext(p)
-			file := p[7:len(p)-23-len(ext)] + ext
-			fileAnnotationRefLink := &ast.Node{Type: ast.NodeLink}
-			fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenBracket})
-			if 0 == Conf.Export.FileAnnotationRefMode {
-				fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(file + " - p" + pageStr + " - " + refText)})
-			} else {
-				fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(refText)})
-			}
-			fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseBracket})
-			fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenParen})
-			fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkDest, Tokens: []byte(p + "?p=" + pageStr)})
-			fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseParen})
-			n.InsertBefore(fileAnnotationRefLink)
+			status := processFileAnnotationRef(refID, n)
 			unlinks = append(unlinks, n)
-			return ast.WalkSkipChildren
+			return status
 		}
 
 		if !treenode.IsBlockRef(n) {
@@ -1498,3 +1459,58 @@ func exportRefTrees0(tree *parse.Tree, retTrees *map[string]*parse.Tree) {
 		return ast.WalkContinue
 	})
 }
+
+func processFileAnnotationRef(refID string, n *ast.Node) ast.WalkStatus {
+	p := refID[:strings.LastIndex(refID, "/")]
+	absPath, err := GetAssetAbsPath(p)
+	if nil != err {
+		logging.LogWarnf("get assets abs path by rel path [%s] failed: %s", p, err)
+		return ast.WalkSkipChildren
+	}
+	sya := absPath + ".sya"
+	syaData, err := os.ReadFile(sya)
+	if nil != err {
+		logging.LogErrorf("read file [%s] failed: %s", sya, err)
+		return ast.WalkSkipChildren
+	}
+	syaJSON := map[string]interface{}{}
+	if err = gulu.JSON.UnmarshalJSON(syaData, &syaJSON); nil != err {
+		logging.LogErrorf("unmarshal file [%s] failed: %s", sya, err)
+		return ast.WalkSkipChildren
+	}
+	annotationID := refID[strings.LastIndex(refID, "/")+1:]
+	annotationData := syaJSON[annotationID]
+	if nil == annotationData {
+		logging.LogErrorf("not found annotation [%s] in .sya", annotationID)
+		return ast.WalkSkipChildren
+	}
+	pages := annotationData.(map[string]interface{})["pages"].([]interface{})
+	page := int(pages[0].(map[string]interface{})["index"].(float64)) + 1
+	pageStr := strconv.Itoa(page)
+
+	var refText string
+	if ast.NodeTextMark == n.Type {
+		refText = n.TextMarkTextContent
+	} else {
+		refTextNode := n.ChildByType(ast.NodeFileAnnotationRefText)
+		if nil == refTextNode {
+			return ast.WalkSkipChildren
+		}
+		refText = refTextNode.TokensStr()
+	}
+	ext := filepath.Ext(p)
+	file := p[7:len(p)-23-len(ext)] + ext
+	fileAnnotationRefLink := &ast.Node{Type: ast.NodeLink}
+	fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenBracket})
+	if 0 == Conf.Export.FileAnnotationRefMode {
+		fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(file + " - p" + pageStr + " - " + refText)})
+	} else {
+		fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkText, Tokens: []byte(refText)})
+	}
+	fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseBracket})
+	fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeOpenParen})
+	fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeLinkDest, Tokens: []byte(p + "?p=" + pageStr)})
+	fileAnnotationRefLink.AppendChild(&ast.Node{Type: ast.NodeCloseParen})
+	n.InsertBefore(fileAnnotationRefLink)
+	return ast.WalkSkipChildren
+}