Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit 0ed3e1a

Browse files
committed
修复资源路径bug ,rss.xml 的引用不在底部引用列表与菜单中显示了
1 parent b4bf1f6 commit 0ed3e1a

File tree

5 files changed

+78
-57
lines changed

5 files changed

+78
-57
lines changed

.vscode/launch.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"-OutDir=D:\\code\\doc\\docHTML",
2424
"-TemplateDir=./views/",
2525
"-SqlitePath=C:/Users/llej/Documents/SiYuan/temp/siyuan.db",
26-
"-IsDev=true",
26+
"-IsDev=false",
2727
],
2828
// "args": [
2929
// "-SourceDir=C:/Users/llej/Documents/SiYuan/data/思源笔记用户指南",

src/main.go

+12-7
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func main() {
5151
// copy views 中的资源文件
5252
copy.Copy(path.Join(conf.TemplateDir, "./assets"), path.Join(outDir, "./assets"))
5353
util.RunningLog("2.1", "copy 完成")
54-
copy.Copy(path.Join(workspaceDir, "./widgets"), path.Join(outDir, "./widgets"))
54+
copy.Copy(path.Join(workspaceDir, "./widgets"), path.Join(outDir, "./assets/widgets"))
5555
util.RunningLog("2.2", "copy widgets")
5656

5757
// 流程 3 遍历源目录 生成 html 到输出目录
@@ -127,6 +127,9 @@ func main() {
127127

128128
var sonEntityList []sonEntityI
129129
for _, sonEntity := range sonList {
130+
if conf.RssNoOutputHtml && strings.HasSuffix(sonEntity.Name, ".rss.xml") {
131+
continue
132+
}
130133
webPath := sonEntity.VirtualPath()[len(virtualPath):]
131134
var name string
132135
if sonEntity.Info.IsDir() {
@@ -199,6 +202,8 @@ func fileEntityListFilter(list []structAll.FileEntity, test func(structAll.FileE
199202
}
200203
return
201204
}
205+
206+
// TODO: 逻辑不够严谨,还是存在错误 例如 file:///D:/code/doc/docHTML/工具/文本处理/简单文本处理.html 中的资源地址无法访问
202207
func HandlingAssets(node *ast.Node, outDir string, fileEntity structAll.FileEntity) {
203208
if node.Next != nil {
204209
HandlingAssets(node.Next, outDir, fileEntity)
@@ -235,16 +240,16 @@ func HandlingAssets(node *ast.Node, outDir string, fileEntity structAll.FileEnti
235240
// 资源文件在笔记本内,这里重写链接地址即可
236241
p := path.Join(strings.Repeat("../", level), dest)
237242
node.Tokens = []byte(p)
238-
return
239243
} else {
240244
// 在工作空间内
241-
err := copy.Copy(assetsPath, path.Join(outDir, dest))
242-
if err != nil {
243-
util.Warn("复制资源文件失败", err)
244-
}
245245
node.Tokens = []byte(path.Join(fileEntity.RootPath(), dest))
246-
return
247246
}
247+
// TODO 因为会有多个链接指向同一个资源,所以下面的写法会导致多余的 copy 需要优化
248+
err := copy.Copy(assetsPath, path.Join(outDir, dest))
249+
if err != nil {
250+
util.Warn("复制资源文件失败", err)
251+
}
252+
return
248253
} else {
249254
// 当前路径不存在
250255
level += 1

src/render/link.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,33 @@ func (r *BaseRenderer) PrefixPath(dest []byte) []byte {
3232
return ret
3333
}
3434

35+
// BaseLinkOcean 链接 BaseRenderer 与 OceanPressRender
36+
var BaseLinkOcean = make(map[string]*OceanPressRender)
37+
3538
func (r *BaseRenderer) RelativePath(dest []byte) []byte {
36-
if "" == r.Options.LinkBase {
37-
return dest
38-
}
39+
40+
// if "" == r.Options.LinkBase {
41+
// return dest
42+
// }
43+
oceanpressRender := BaseLinkOcean[r.Tree.ID]
3944

4045
// 强制将 %5C 即反斜杠 \ 转换为斜杠 / 以兼容 Windows 平台上使用的路径
4146
dest = bytes.ReplaceAll(dest, []byte("%5C"), []byte("\\"))
4247
if !r.isRelativePath(dest) {
48+
if bytes.HasPrefix(dest, []byte("/widgets/")) {
49+
dest = append([]byte(oceanpressRender.context.BaseEntity.RootPath()+"assets/"), dest...)
50+
}
4351
return dest
4452
}
4553

4654
linkBase := util.StrToBytes(r.Options.LinkBase)
47-
if !bytes.HasSuffix(linkBase, []byte("/")) {
48-
linkBase = append(linkBase, []byte("/")...)
55+
// if !bytes.HasSuffix(linkBase, []byte("/")) {
56+
// linkBase = append(linkBase, []byte("/")...)
57+
// }
58+
if len(linkBase) > 0 && !bytes.HasPrefix(dest, []byte("/")) {
59+
dest = append([]byte("/"), dest...)
4960
}
61+
5062
ret := append(linkBase, dest...)
5163
if bytes.Equal(linkBase, ret) {
5264
return []byte("")

src/render/ocean_press_render.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -315,19 +315,19 @@ func (r *OceanPressRender) renderAudio(node *ast.Node, entering bool) ast.WalkSt
315315
return ast.WalkContinue
316316
}
317317

318-
// func (r *OceanPressRender) renderIFrame(node *ast.Node, entering bool) ast.WalkStatus {
319-
// if entering {
320-
// r.Tag("div", [][]string{{"class", "iframe"}}, false)
321-
// tokens := node.Tokens
322-
// if r.Options.Sanitize {
323-
// tokens = sanitize(tokens)
324-
// }
325-
// tokens = r.tagSrcPath(tokens)
326-
// r.Write(tokens)
327-
// r.Tag("/div", nil, false)
328-
// }
329-
// return ast.WalkContinue
330-
// }
318+
func (r *OceanPressRender) renderIFrame(node *ast.Node, entering bool) ast.WalkStatus {
319+
if entering {
320+
r.Tag("div", [][]string{{"class", "iframe"}}, false)
321+
tokens := node.Tokens
322+
if r.Options.Sanitize {
323+
tokens = sanitize(tokens)
324+
}
325+
tokens = r.tagSrcPath(tokens)
326+
r.Write(tokens)
327+
r.Tag("/div", nil, false)
328+
}
329+
return ast.WalkContinue
330+
}
331331

332332
// func (r *OceanPressRender) Render() (output []byte) {
333333
// output = r.BaseRenderer.Render()

src/render/ocean_press_render_custom.go

+35-31
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@ import (
55
"errors"
66
"html/template"
77
"path"
8-
"regexp"
98
"strconv"
109
"strings"
1110
"time"
1211

13-
"github.com/88250/lute"
1412
"github.com/88250/lute/ast"
1513
"github.com/88250/lute/html"
1614
"github.com/88250/lute/lex"
17-
"github.com/88250/lute/parse"
1815
"github.com/88250/lute/render"
1916
luteUtil "github.com/88250/lute/util"
2017
"github.com/siyuan-note/oceanpress/src/conf"
@@ -25,9 +22,11 @@ import (
2522
func (r *OceanPressRender) Render() (html string, xml string) {
2623
docName := r.context.BaseEntity.Name
2724
// 调试用,跳过无关文档,免得浪费时间
28-
if conf.IsDev && !strings.Contains(docName, "8月") {
25+
if conf.IsDev && !strings.Contains(docName, "小心的使用") {
2926
return "", ""
3027
}
28+
BaseLinkOcean[r.Tree.ID] = r
29+
3130
output := r.BaseRenderer.Render()
3231
output = append(output, r.RenderFootnotes()...)
3332

@@ -42,8 +41,12 @@ func (r *OceanPressRender) Render() (html string, xml string) {
4241
WHERE
4342
def_block_id = /** 被引用块的 id */
4443
'` + curID + `'
45-
AND /** 当前文档内对当前文档的引用不显示在反链中 */
46-
"blocks".root_id != '` + curID + `';`
44+
AND NOT /** 当前文档内对当前文档的引用不显示在反链中 */
45+
"blocks".root_id = '` + curID + `'
46+
`
47+
if conf.RssNoOutputHtml {
48+
sql += `AND NOT "blocks".hpath LIKE '%.rss.xml'`
49+
}
4750
// 底部反链
4851
content := r.SqlRender(sql, false, true)
4952
if len(content) > 0 {
@@ -177,12 +180,6 @@ func (r *OceanPressRender) renderNodeToHTML(node *ast.Node, headerIncludes bool)
177180
return ast.WalkSkipChildren
178181
})
179182

180-
// 渲染块
181-
root := &ast.Node{Type: ast.NodeDocument}
182-
luteEngine := lute.New()
183-
tree := &parse.Tree{Root: root, Context: &parse.Context{ParseOption: luteEngine.ParseOptions}}
184-
tree.Context.ParseOption.KramdownBlockIAL = false // 关闭 IAL
185-
186183
if node.ID != "" {
187184
err := r.context.push(node.ID)
188185
if err != nil {
@@ -192,7 +189,7 @@ func (r *OceanPressRender) renderNodeToHTML(node *ast.Node, headerIncludes bool)
192189
}
193190
}
194191

195-
renderer := NewOceanPressRenderer(tree, (*Options)(luteEngine.RenderOptions), r.context)
192+
renderer := NewOceanPressRenderer(r.Tree, (*Options)(r.context.LuteEngine.RenderOptions), r.context)
196193
// renderer2 := render.NewFormatRenderer(tree, luteEngine.RenderOptions)
197194
renderer.Writer = &bytes.Buffer{}
198195
// renderer.NodeWriterStack = append(renderer.NodeWriterStack, renderer.Writer) // 因为有可能不是从 root 开始渲染,所以需要初始化
@@ -410,29 +407,36 @@ func (r *OceanPressRender) renderDocument(node *ast.Node, entering bool) ast.Wal
410407
return ast.WalkContinue
411408
}
412409

413-
func (r *OceanPressRender) renderIFrame(node *ast.Node, entering bool) ast.WalkStatus {
414-
if entering {
415-
attr := [][]string{{"class", "iframe"}}
416-
attr = append(attr, node.KramdownIAL...)
417-
r.Tag("div", attr, false)
418-
tokens := node.Tokens
419-
if r.Options.Sanitize {
420-
tokens = sanitize(tokens)
421-
}
422-
data := (string(tokens))
410+
// ========= 附加在 OceanPressRender 上的工具方法
411+
// 重写baserender的RelativePath
412+
func (r *OceanPressRender) RelativePath(dest []byte) []byte {
413+
// r. // monkey patch 挂件块的绝对路径改成相对路径
414+
// reg, _ := regexp.Compile("src=\"/widgets/")
415+
// str := reg.ReplaceAllString(data, "src=\""+r.context.BaseEntity.RootPath()+"widgets/")
423416

424-
// monkey patch 挂件块的绝对路径改成相对路径
425-
reg, _ := regexp.Compile("src=\"/widgets/")
426-
str := reg.ReplaceAllString(data, "src=\""+r.context.BaseEntity.RootPath()+"widgets/")
417+
// tokens = r.tagSrcPath([]byte(str))
427418

428-
tokens = r.tagSrcPath([]byte(str))
429-
r.Write(tokens)
430-
r.Tag("/div", nil, false)
419+
if "" == r.Options.LinkBase {
420+
return dest
431421
}
432-
return ast.WalkContinue
422+
423+
// 强制将 %5C 即反斜杠 \ 转换为斜杠 / 以兼容 Windows 平台上使用的路径
424+
dest = bytes.ReplaceAll(dest, []byte("%5C"), []byte("\\"))
425+
if !r.isRelativePath(dest) {
426+
return dest
427+
}
428+
429+
linkBase := luteUtil.StrToBytes(r.Options.LinkBase)
430+
if !bytes.HasSuffix(linkBase, []byte("/")) {
431+
linkBase = append(linkBase, []byte("/")...)
432+
}
433+
ret := append(linkBase, dest...)
434+
if bytes.Equal(linkBase, ret) {
435+
return []byte("")
436+
}
437+
return ret
433438
}
434439

435-
// ========= 附加在 OceanPressRender 上的工具方法
436440
// pushTopRefId 将 RenderLevel==0 的 id 添加到 topRefId
437441
func (r *OceanPressRender) pushTopRefId(id string) {
438442
if r.RenderLevel() == 0 {

0 commit comments

Comments
 (0)