From e8dd34f191f4a7e519a7b58d7e7fc89c71b8251c Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 16 Sep 2022 22:59:24 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E8=A1=8C=E7=BA=A7=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E6=94=AF=E6=8C=81=E5=A4=9A=E9=87=8D=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=20https://github.com/siyuan-note/siyuan/issu?= =?UTF-8?q?es/2911?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/assets.go | 3 ++ kernel/model/export.go | 108 +++++++++++++++++++++++------------------ 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/kernel/model/assets.go b/kernel/model/assets.go index 491b1b57510..84943eaced1 100644 --- a/kernel/model/assets.go +++ b/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)) diff --git a/kernel/model/export.go b/kernel/model/export.go index 3327d3b2bdd..e2be0f19795 100644 --- a/kernel/model/export.go +++ b/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 +}