✨ 行级元素支持多重样式类型 https://github.com/siyuan-note/siyuan/issues/2911
This commit is contained in:
parent
395d5e6583
commit
61453ad84b
2 changed files with 65 additions and 46 deletions
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue