🐛 导出 PDF/HTML 时丢失自定义表情 Fix https://github.com/siyuan-note/siyuan/issues/5535

This commit is contained in:
Liang Ding 2022-07-29 23:37:04 +08:00
parent b079a35007
commit 236ffd8e64
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
2 changed files with 47 additions and 10 deletions

View file

@ -644,6 +644,27 @@ func UnusedAssets() (ret []string) {
return
}
func emojisInTree(tree *parse.Tree) (ret []string) {
ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {
if !entering {
return ast.WalkContinue
}
if ast.NodeEmojiImg == n.Type {
tokens := n.Tokens
idx := bytes.Index(tokens, []byte("src=\""))
if -1 == idx {
return ast.WalkContinue
}
src := tokens[idx+len("src=\""):]
src = src[:bytes.Index(src, []byte("\""))]
ret = append(ret, string(src))
}
return ast.WalkContinue
})
ret = gulu.Str.RemoveDuplicatedElem(ret)
return
}
func assetsLinkDestsInTree(tree *parse.Tree) (ret []string) {
ret = []string{}
ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {

View file

@ -250,11 +250,14 @@ func ExportMarkdownHTML(id, savePath string, docx bool) (name, dom string) {
}
// 复制自定义表情图片
from := filepath.Join(util.DataDir, "emojis")
to := filepath.Join(savePath, "emojis")
if err := gulu.File.Copy(from, to); nil != err {
logging.LogErrorf("copy emojis from [%s] to [%s] failed: %s", from, savePath, err)
return
emojis := emojisInTree(tree)
for _, emoji := range emojis {
from := filepath.Join(util.DataDir, emoji)
to := filepath.Join(savePath, emoji)
if err := gulu.File.Copy(from, to); nil != err {
logging.LogErrorf("copy emojis from [%s] to [%s] failed: %s", from, savePath, err)
return
}
}
luteEngine := NewLute()
@ -265,6 +268,16 @@ func ExportMarkdownHTML(id, savePath string, docx bool) (name, dom string) {
processIFrame(tree)
}
// 自定义表情图片地址去掉开头的 /
ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {
if !entering {
return ast.WalkContinue
}
if ast.NodeEmojiImg == n.Type {
n.Tokens = bytes.ReplaceAll(n.Tokens, []byte("src=\"/emojis"), []byte("src=\"emojis"))
}
return ast.WalkContinue
})
dom = luteEngine.ProtylePreview(tree, luteEngine.RenderOptions)
return
}
@ -341,11 +354,14 @@ func ExportHTML(id, savePath string, pdf bool) (name, dom string) {
}
// 复制自定义表情图片
from := filepath.Join(util.DataDir, "emojis")
to := filepath.Join(savePath, "emojis")
if err := gulu.File.Copy(from, to); nil != err {
logging.LogErrorf("copy emojis from [%s] to [%s] failed: %s", from, savePath, err)
return
emojis := emojisInTree(tree)
for _, emoji := range emojis {
from := filepath.Join(util.DataDir, emoji)
to := filepath.Join(savePath, emoji)
if err := gulu.File.Copy(from, to); nil != err {
logging.LogErrorf("copy emojis from [%s] to [%s] failed: %s", from, savePath, err)
return
}
}
} else { // 导出 PDF 需要将资源文件路径改为 HTTP 伺服
luteEngine.RenderOptions.LinkBase = "http://127.0.0.1:" + util.ServerPort + "/"