Skip to content

Commit

Permalink
✨ 支持 ==mark== 高亮语法 #84
Browse files Browse the repository at this point in the history
  • Loading branch information
88250 committed Aug 22, 2020
1 parent bfb5fb5 commit 42c8802
Show file tree
Hide file tree
Showing 16 changed files with 160 additions and 50 deletions.
8 changes: 5 additions & 3 deletions ast/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -447,9 +447,11 @@ const (
NodeBlockRefText NodeType = 433 // 内容块文本

// 支持 ==Mark== 标记语法 https://github.com/88250/lute/issues/84
NodeMark NodeType = 450 // 标记
NodeMarkOpenMarker NodeType = 451 // 开始标记标记符 ==
NodeMarkCloseMarker NodeType = 452 // 结束标记标记符 ==
NodeMark NodeType = 450 // 标记
NodeMark1OpenMarker NodeType = 451 // 开始标记标记符 =
NodeMark1CloseMarker NodeType = 452 // 结束标记标记符 =
NodeMark2OpenMarker NodeType = 453 // 开始标记标记符 ==
NodeMark2CloseMarker NodeType = 454 // 结束标记标记符 ==

NodeTypeMaxVal NodeType = 1024 // 节点类型最大值
)
16 changes: 10 additions & 6 deletions ast/nodetype_string.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions h2m.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ func (lute *Lute) genASTByDOM(n *html.Node, tree *parse.Tree) {
case atom.Mark:
node.Type = ast.NodeMark
marker := "=="
node.AppendChild(&ast.Node{Type: ast.NodeMarkOpenMarker, Tokens: util.StrToBytes(marker)})
node.AppendChild(&ast.Node{Type: ast.NodeMark1OpenMarker, Tokens: util.StrToBytes(marker)})
tree.Context.Tip.AppendChild(node)
tree.Context.Tip = node
defer tree.Context.ParentTip()
Expand Down Expand Up @@ -418,7 +418,7 @@ func (lute *Lute) genASTByDOM(n *html.Node, tree *parse.Tree) {
node.AppendChild(&ast.Node{Type: ast.NodeStrikethrough1CloseMarker, Tokens: util.StrToBytes(marker)})
case atom.Mark:
marker := "=="
node.AppendChild(&ast.Node{Type: ast.NodeMarkCloseMarker, Tokens: util.StrToBytes(marker)})
node.AppendChild(&ast.Node{Type: ast.NodeMark1CloseMarker, Tokens: util.StrToBytes(marker)})
case atom.Details:
tree.Context.Tip.AppendChild(&ast.Node{Type: ast.NodeHTMLBlock, Tokens: []byte("</details>")})
}
Expand Down
8 changes: 4 additions & 4 deletions javascript/lute.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion javascript/lute.min.js.map

Large diffs are not rendered by default.

13 changes: 10 additions & 3 deletions parse/delimiter.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ func (t *Tree) processEmphasis(stackBottom *delimiter, ctx *InlineContext) {
openersBottom[lex.ItemUnderscore] = stackBottom
openersBottom[lex.ItemAsterisk] = stackBottom
openersBottom[lex.ItemTilde] = stackBottom
openersBottom[lex.ItemEqual] = stackBottom

// find first closer above stack_bottom:
closer = ctx.delimiters
Expand Down Expand Up @@ -134,7 +135,7 @@ func (t *Tree) processEmphasis(stackBottom *delimiter, ctx *InlineContext) {
}

if t.Context.Option.Mark {
if lex.ItemEqual == closercc && (2 != opener.num || (opener.num != closer.num)) {
if lex.ItemEqual == closercc && opener.num != closer.num {
break
}
} else {
Expand Down Expand Up @@ -172,6 +173,12 @@ func (t *Tree) processEmphasis(stackBottom *delimiter, ctx *InlineContext) {
openMarker.Type = ast.NodeStrikethrough1OpenMarker
closeMarker.Type = ast.NodeStrikethrough1CloseMarker
}
} else if lex.ItemEqual == closercc {
if t.Context.Option.Mark {
emStrongDelMark.Type = ast.NodeMark
openMarker.Type = ast.NodeMark1OpenMarker
closeMarker.Type = ast.NodeMark1CloseMarker
}
}
} else {
if lex.ItemAsterisk == closercc {
Expand All @@ -191,8 +198,8 @@ func (t *Tree) processEmphasis(stackBottom *delimiter, ctx *InlineContext) {
} else if lex.ItemEqual == closercc {
if t.Context.Option.Mark {
emStrongDelMark.Type = ast.NodeMark
openMarker.Type = ast.NodeMarkOpenMarker
closeMarker.Type = ast.NodeMarkCloseMarker
openMarker.Type = ast.NodeMark1OpenMarker
closeMarker.Type = ast.NodeMark1CloseMarker
}
}
}
Expand Down
20 changes: 16 additions & 4 deletions render/format_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ func NewFormatRenderer(tree *parse.Tree) *FormatRenderer {
ret.RendererFuncs[ast.NodeBlockRefSpace] = ret.renderBlockRefSpace
ret.RendererFuncs[ast.NodeBlockRefText] = ret.renderBlockRefText
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand Down Expand Up @@ -146,12 +148,22 @@ func (r *FormatRenderer) renderMark(node *ast.Node, entering bool) ast.WalkStatu
return ast.WalkContinue
}

func (r *FormatRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *FormatRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.WriteString("=")
return ast.WalkStop
}

func (r *FormatRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.WriteString("=")
return ast.WalkStop
}

func (r *FormatRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.WriteString("==")
return ast.WalkStop
}

func (r *FormatRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *FormatRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.WriteString("==")
return ast.WalkStop
}
Expand Down
20 changes: 16 additions & 4 deletions render/html_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,10 @@ func NewHtmlRenderer(tree *parse.Tree) *HtmlRenderer {
ret.RendererFuncs[ast.NodeBlockRefSpace] = ret.renderBlockRefSpace
ret.RendererFuncs[ast.NodeBlockRefText] = ret.renderBlockRefText
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand All @@ -129,12 +131,22 @@ func (r *HtmlRenderer) renderMark(node *ast.Node, entering bool) ast.WalkStatus
return ast.WalkContinue
}

func (r *HtmlRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *HtmlRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("mark", nil, false)
return ast.WalkStop
}

func (r *HtmlRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *HtmlRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
return ast.WalkStop
}

func (r *HtmlRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("mark", nil, false)
return ast.WalkStop
}

func (r *HtmlRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
return ast.WalkStop
}
Expand Down
26 changes: 22 additions & 4 deletions render/vditor_ir_block_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ func NewVditorIRBlockRenderer(tree *parse.Tree, genNodeID bool) *VditorIRBlockRe
ret.RendererFuncs[ast.NodeBlockRefSpace] = ret.renderBlockRefSpace
ret.RendererFuncs[ast.NodeBlockRefText] = ret.renderBlockRefText
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand Down Expand Up @@ -151,15 +153,31 @@ func (r *VditorIRBlockRenderer) renderMark(node *ast.Node, entering bool) ast.Wa
return ast.WalkContinue
}

func (r *VditorIRBlockRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorIRBlockRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
r.tag("mark", [][]string{{"data-newline", "1"}}, false)
return ast.WalkStop
}

func (r *VditorIRBlockRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
return ast.WalkStop
}

func (r *VditorIRBlockRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("==")
r.tag("/span", nil, false)
r.tag("mark", [][]string{{"data-newline", "1"}}, false)
return ast.WalkStop
}

func (r *VditorIRBlockRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorIRBlockRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("==")
Expand Down
26 changes: 22 additions & 4 deletions render/vditor_ir_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,10 @@ func NewVditorIRRenderer(tree *parse.Tree) *VditorIRRenderer {
ret.RendererFuncs[ast.NodeYamlFrontMatterContent] = ret.renderYamlFrontMatterContent
ret.RendererFuncs[ast.NodeYamlFrontMatterCloseMarker] = ret.renderYamlFrontMatterCloseMarker
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand Down Expand Up @@ -147,15 +149,31 @@ func (r *VditorIRRenderer) renderMark(node *ast.Node, entering bool) ast.WalkSta
return ast.WalkContinue
}

func (r *VditorIRRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorIRRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
r.tag("mark", [][]string{{"data-newline", "1"}}, false)
return ast.WalkStop
}

func (r *VditorIRRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
return ast.WalkStop
}

func (r *VditorIRRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("==")
r.tag("/span", nil, false)
r.tag("mark", [][]string{{"data-newline", "1"}}, false)
return ast.WalkStop
}

func (r *VditorIRRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorIRRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
r.tag("span", [][]string{{"class", "vditor-ir__marker"}}, false)
r.WriteString("==")
Expand Down
25 changes: 21 additions & 4 deletions render/vditor_sv_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,10 @@ func NewVditorSVRenderer(tree *parse.Tree) *VditorSVRenderer {
ret.RendererFuncs[ast.NodeYamlFrontMatterContent] = ret.renderYamlFrontMatterContent
ret.RendererFuncs[ast.NodeYamlFrontMatterCloseMarker] = ret.renderYamlFrontMatterCloseMarker
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand Down Expand Up @@ -198,20 +200,35 @@ func (r *VditorSVRenderer) renderMark(node *ast.Node, entering bool) ast.WalkSta
return ast.WalkContinue
}

func (r *VditorSVRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorSVRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-sv__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
return ast.WalkStop
}

func (r *VditorSVRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-sv__marker"}}, false)
r.WriteString("=")
r.tag("/span", nil, false)
return ast.WalkStop
}

func (r *VditorSVRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-sv__marker"}}, false)
r.WriteString("==")
r.tag("/span", nil, false)
return ast.WalkStop
}

func (r *VditorSVRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorSVRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("span", [][]string{{"class", "vditor-sv__marker"}}, false)
r.WriteString("==")
r.tag("/span", nil, false)
return ast.WalkStop
}


func (r *VditorSVRenderer) renderYamlFrontMatterCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.Newline()
r.tag("span", [][]string{{"data-type", "yaml-front-matter-close-marker"}, {"class", "vditor-sv__marker"}}, false)
Expand Down
20 changes: 16 additions & 4 deletions render/vditor_wysiwyg_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,10 @@ func NewVditorRenderer(tree *parse.Tree) *VditorRenderer {
ret.RendererFuncs[ast.NodeYamlFrontMatterContent] = ret.renderYamlFrontMatterContent
ret.RendererFuncs[ast.NodeYamlFrontMatterCloseMarker] = ret.renderYamlFrontMatterCloseMarker
ret.RendererFuncs[ast.NodeMark] = ret.renderMark
ret.RendererFuncs[ast.NodeMarkOpenMarker] = ret.renderMarkOpenMarker
ret.RendererFuncs[ast.NodeMarkCloseMarker] = ret.renderMarkCloseMarker
ret.RendererFuncs[ast.NodeMark1OpenMarker] = ret.renderMark1OpenMarker
ret.RendererFuncs[ast.NodeMark1CloseMarker] = ret.renderMark1CloseMarker
ret.RendererFuncs[ast.NodeMark2OpenMarker] = ret.renderMark2OpenMarker
ret.RendererFuncs[ast.NodeMark2CloseMarker] = ret.renderMark2CloseMarker
return ret
}

Expand Down Expand Up @@ -144,12 +146,22 @@ func (r *VditorRenderer) renderMark(node *ast.Node, entering bool) ast.WalkStatu
return ast.WalkContinue
}

func (r *VditorRenderer) renderMarkOpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorRenderer) renderMark1OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("mark", [][]string{{"data-marker", "="}}, false)
return ast.WalkStop
}

func (r *VditorRenderer) renderMark1CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
return ast.WalkStop
}

func (r *VditorRenderer) renderMark2OpenMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("mark", [][]string{{"data-marker", "=="}}, false)
return ast.WalkStop
}

func (r *VditorRenderer) renderMarkCloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
func (r *VditorRenderer) renderMark2CloseMarker(node *ast.Node, entering bool) ast.WalkStatus {
r.tag("/mark", nil, false)
return ast.WalkStop
}
Expand Down
7 changes: 4 additions & 3 deletions test/mark_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ import (

var markTests = []parseTest{

{"10", "*[==foo==*](bar)", "<p>*<a href=\"bar\"><mark>foo</mark>*</a></p>\n"},
{"9", "==[*foo*==](bar)", "<p>==<a href=\"bar\"><em>foo</em>==</a></p>\n"},
{"11", "==foo=t= **bar**\n", "<p>==foo<mark>t</mark> <strong>bar</strong></p>\n"},
{"10", "*[==foo==*](bar)\n", "<p>*<a href=\"bar\"><mark>foo</mark>*</a></p>\n"},
{"9", "==[*foo*==](bar)\n", "<p>==<a href=\"bar\"><em>foo</em>==</a></p>\n"},
{"8", "==[*foo*](bar)==\n", "<p><mark><a href=\"bar\"><em>foo</em></a></mark></p>\n"},
{"7", "==*[foo](bar)*==\n", "<p><mark><em><a href=\"bar\">foo</a></em></mark></p>\n"},
{"6", "==*[foo](bar)==*\n", "<p><mark>*<a href=\"bar\">foo</a></mark>*</p>\n"},
Expand All @@ -46,7 +47,7 @@ func TestMark(t *testing.T) {

var markDisableTests = []parseTest{

{"7", "*[==foo==*](bar)", "<p>*<a href=\"bar\">==foo==*</a></p>\n"},
{"7", "*[==foo==*](bar)\n", "<p>*<a href=\"bar\">==foo==*</a></p>\n"},
{"6", "==[*foo*==](bar)\n", "<p>==<a href=\"bar\"><em>foo</em>==</a></p>\n"},
{"5", "==[*foo*](bar)==\n", "<p>==<a href=\"bar\"><em>foo</em></a>==</p>\n"},
{"4", "==*[foo](bar)*==\n", "<p>==<em><a href=\"bar\">foo</a></em>==</p>\n"},
Expand Down
1 change: 1 addition & 0 deletions test/spinv_ir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func TestSpinVditorIRDOM(t *testing.T) {
luteEngine := lute.New()
luteEngine.ToC = true
luteEngine.Sanitize = true
luteEngine.Mark = true

for _, test := range spinVditorIRDOMTests {
html := luteEngine.SpinVditorIRDOM(test.from)
Expand Down

0 comments on commit 42c8802

Please sign in to comment.