@@ -5,16 +5,13 @@ import (
5
5
"errors"
6
6
"html/template"
7
7
"path"
8
- "regexp"
9
8
"strconv"
10
9
"strings"
11
10
"time"
12
11
13
- "github.com/88250/lute"
14
12
"github.com/88250/lute/ast"
15
13
"github.com/88250/lute/html"
16
14
"github.com/88250/lute/lex"
17
- "github.com/88250/lute/parse"
18
15
"github.com/88250/lute/render"
19
16
luteUtil "github.com/88250/lute/util"
20
17
"github.com/siyuan-note/oceanpress/src/conf"
@@ -25,9 +22,11 @@ import (
25
22
func (r * OceanPressRender ) Render () (html string , xml string ) {
26
23
docName := r .context .BaseEntity .Name
27
24
// 调试用,跳过无关文档,免得浪费时间
28
- if conf .IsDev && ! strings .Contains (docName , "8月 " ) {
25
+ if conf .IsDev && ! strings .Contains (docName , "小心的使用 " ) {
29
26
return "" , ""
30
27
}
28
+ BaseLinkOcean [r .Tree .ID ] = r
29
+
31
30
output := r .BaseRenderer .Render ()
32
31
output = append (output , r .RenderFootnotes ()... )
33
32
@@ -42,8 +41,12 @@ func (r *OceanPressRender) Render() (html string, xml string) {
42
41
WHERE
43
42
def_block_id = /** 被引用块的 id */
44
43
'` + 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
+ }
47
50
// 底部反链
48
51
content := r .SqlRender (sql , false , true )
49
52
if len (content ) > 0 {
@@ -177,12 +180,6 @@ func (r *OceanPressRender) renderNodeToHTML(node *ast.Node, headerIncludes bool)
177
180
return ast .WalkSkipChildren
178
181
})
179
182
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
-
186
183
if node .ID != "" {
187
184
err := r .context .push (node .ID )
188
185
if err != nil {
@@ -192,7 +189,7 @@ func (r *OceanPressRender) renderNodeToHTML(node *ast.Node, headerIncludes bool)
192
189
}
193
190
}
194
191
195
- renderer := NewOceanPressRenderer (tree , (* Options )(luteEngine .RenderOptions ), r .context )
192
+ renderer := NewOceanPressRenderer (r . Tree , (* Options )(r . context . LuteEngine .RenderOptions ), r .context )
196
193
// renderer2 := render.NewFormatRenderer(tree, luteEngine.RenderOptions)
197
194
renderer .Writer = & bytes.Buffer {}
198
195
// renderer.NodeWriterStack = append(renderer.NodeWriterStack, renderer.Writer) // 因为有可能不是从 root 开始渲染,所以需要初始化
@@ -410,29 +407,36 @@ func (r *OceanPressRender) renderDocument(node *ast.Node, entering bool) ast.Wal
410
407
return ast .WalkContinue
411
408
}
412
409
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/")
423
416
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))
427
418
428
- tokens = r .tagSrcPath ([]byte (str ))
429
- r .Write (tokens )
430
- r .Tag ("/div" , nil , false )
419
+ if "" == r .Options .LinkBase {
420
+ return dest
431
421
}
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
433
438
}
434
439
435
- // ========= 附加在 OceanPressRender 上的工具方法
436
440
// pushTopRefId 将 RenderLevel==0 的 id 添加到 topRefId
437
441
func (r * OceanPressRender ) pushTopRefId (id string ) {
438
442
if r .RenderLevel () == 0 {
0 commit comments