mirror of
https://github.com/usememos/memos.git
synced 2025-04-02 20:10:45 +02:00
chore: implement list html render
This commit is contained in:
parent
b00443c222
commit
6421fbc68a
@ -43,6 +43,10 @@ func (p *OrderedListParser) Parse(tokens []*tokenizer.Token) (ast.Node, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
contentTokens := tokens[3:size]
|
contentTokens := tokens[3:size]
|
||||||
|
lastToken := contentTokens[len(contentTokens)-1]
|
||||||
|
if lastToken.Type == tokenizer.Newline {
|
||||||
|
contentTokens = contentTokens[:len(contentTokens)-1]
|
||||||
|
}
|
||||||
children, err := ParseInline(contentTokens)
|
children, err := ParseInline(contentTokens)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -30,6 +30,8 @@ var defaultBlockParsers = []BlockParser{
|
|||||||
NewHorizontalRuleParser(),
|
NewHorizontalRuleParser(),
|
||||||
NewHeadingParser(),
|
NewHeadingParser(),
|
||||||
NewBlockquoteParser(),
|
NewBlockquoteParser(),
|
||||||
|
NewUnorderedListParser(),
|
||||||
|
NewOrderedListParser(),
|
||||||
NewParagraphParser(),
|
NewParagraphParser(),
|
||||||
NewLineBreakParser(),
|
NewLineBreakParser(),
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,10 @@ func (*UnorderedListParser) Match(tokens []*tokenizer.Token) (int, bool) {
|
|||||||
|
|
||||||
contentTokens := []*tokenizer.Token{}
|
contentTokens := []*tokenizer.Token{}
|
||||||
for _, token := range tokens[2:] {
|
for _, token := range tokens[2:] {
|
||||||
|
contentTokens = append(contentTokens, token)
|
||||||
if token.Type == tokenizer.Newline {
|
if token.Type == tokenizer.Newline {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
contentTokens = append(contentTokens, token)
|
|
||||||
}
|
}
|
||||||
if len(contentTokens) == 0 {
|
if len(contentTokens) == 0 {
|
||||||
return 0, false
|
return 0, false
|
||||||
@ -44,6 +44,10 @@ func (p *UnorderedListParser) Parse(tokens []*tokenizer.Token) (ast.Node, error)
|
|||||||
|
|
||||||
symbolToken := tokens[0]
|
symbolToken := tokens[0]
|
||||||
contentTokens := tokens[2:size]
|
contentTokens := tokens[2:size]
|
||||||
|
lastToken := contentTokens[len(contentTokens)-1]
|
||||||
|
if lastToken.Type == tokenizer.Newline {
|
||||||
|
contentTokens = contentTokens[:len(contentTokens)-1]
|
||||||
|
}
|
||||||
children, err := ParseInline(contentTokens)
|
children, err := ParseInline(contentTokens)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -39,6 +39,10 @@ func (r *HTMLRender) RenderNode(node ast.Node) {
|
|||||||
r.renderHorizontalRule(n)
|
r.renderHorizontalRule(n)
|
||||||
case *ast.Blockquote:
|
case *ast.Blockquote:
|
||||||
r.renderBlockquote(n)
|
r.renderBlockquote(n)
|
||||||
|
case *ast.UnorderedList:
|
||||||
|
r.renderUnorderedList(n)
|
||||||
|
case *ast.OrderedList:
|
||||||
|
r.renderOrderedList(n)
|
||||||
case *ast.Bold:
|
case *ast.Bold:
|
||||||
r.renderBold(n)
|
r.renderBold(n)
|
||||||
case *ast.Italic:
|
case *ast.Italic:
|
||||||
@ -113,6 +117,32 @@ func (r *HTMLRender) renderBlockquote(node *ast.Blockquote) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *HTMLRender) renderUnorderedList(node *ast.UnorderedList) {
|
||||||
|
prevSibling, nextSibling := node.PrevSibling(), node.NextSibling()
|
||||||
|
if prevSibling == nil || prevSibling.Type() != ast.UnorderedListNode {
|
||||||
|
r.output.WriteString("<ul>")
|
||||||
|
}
|
||||||
|
r.output.WriteString("<li>")
|
||||||
|
r.RenderNodes(node.Children)
|
||||||
|
r.output.WriteString("</li>")
|
||||||
|
if nextSibling == nil || nextSibling.Type() != ast.UnorderedListNode {
|
||||||
|
r.output.WriteString("</ul>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *HTMLRender) renderOrderedList(node *ast.OrderedList) {
|
||||||
|
prevSibling, nextSibling := node.PrevSibling(), node.NextSibling()
|
||||||
|
if prevSibling == nil || prevSibling.Type() != ast.OrderedListNode {
|
||||||
|
r.output.WriteString("<ol>")
|
||||||
|
}
|
||||||
|
r.output.WriteString("<li>")
|
||||||
|
r.RenderNodes(node.Children)
|
||||||
|
r.output.WriteString("</li>")
|
||||||
|
if nextSibling == nil || nextSibling.Type() != ast.OrderedListNode {
|
||||||
|
r.output.WriteString("</ol>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *HTMLRender) renderText(node *ast.Text) {
|
func (r *HTMLRender) renderText(node *ast.Text) {
|
||||||
r.output.WriteString(node.Content)
|
r.output.WriteString(node.Content)
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,14 @@ func TestHTMLRender(t *testing.T) {
|
|||||||
text: "#article #memo",
|
text: "#article #memo",
|
||||||
expected: `<p><span>#article</span> <span>#memo</span></p>`,
|
expected: `<p><span>#article</span> <span>#memo</span></p>`,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: "* Hello\n* world!",
|
||||||
|
expected: `<ul><li>Hello</li><li>world!</li></ul>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "1. Hello\n2. world\n* !",
|
||||||
|
expected: `<ol><li>Hello</li><li>world</li></ol><ul><li>!</li></ul>`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user