aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mardown/ast_list.go6
-rw-r--r--mardown/ast_list_test.go2
-rw-r--r--mardown/lexer.go30
-rw-r--r--mardown/lexer_test.go4
4 files changed, 31 insertions, 11 deletions
diff --git a/mardown/ast_list.go b/mardown/ast_list.go
index 39be70c..8eb451a 100644
--- a/mardown/ast_list.go
+++ b/mardown/ast_list.go
@@ -34,8 +34,7 @@ func (a *astList) Eval() (template.HTML, error) {
func list(lxs *lexers) (block, error) {
tree := new(astList)
- current := lxs.Current().Value
- tree.tag = detectListType(current)
+ tree.tag = detectListType(lxs.Current().Value)
if len(tree.tag) == 0 {
return paragraph(lxs, false)
}
@@ -64,7 +63,8 @@ func list(lxs *lexers) (block, error) {
}
func detectListType(val string) listType {
- if []rune(val)[0] == '-' {
+ first := []rune(val)[0]
+ if first == '-' || first == '*' {
if len(val) > 1 {
return ""
}
diff --git a/mardown/ast_list_test.go b/mardown/ast_list_test.go
index 895e439..6736223 100644
--- a/mardown/ast_list_test.go
+++ b/mardown/ast_list_test.go
@@ -8,6 +8,7 @@ import (
var rw = `
- item A
- item B
+* item C
1. item 1
2. item 2
@@ -17,6 +18,7 @@ var expected = `
<ul>
<li>item A</li>
<li>item B</li>
+<li>item C</li>
</ul>
<ol>
<li>item 1</li>
diff --git a/mardown/lexer.go b/mardown/lexer.go
index 52e5788..c4ff988 100644
--- a/mardown/lexer.go
+++ b/mardown/lexer.go
@@ -73,8 +73,10 @@ func lex(s string) *lexers {
currentType = t
previous += string(c)
}
+ newLine := true
literalNext := false
- for _, c := range []rune(s) {
+ runes := []rune(s)
+ for i, c := range runes {
if literalNext {
fn(c, lexerLiteral)
literalNext = false
@@ -86,27 +88,39 @@ func lex(s string) *lexers {
}
switch c {
case '*', '_':
- if (currentType != lexerModifier && len(previous) > 0) ||
- (len(previous) > 0 && []rune(previous)[0] != c) ||
- len(previous) >= 3 {
- lexs = append(lexs, lexer{Type: currentType, Value: previous})
- previous = ""
+ if c == '*' && newLine && i < len(runes)-1 && runes[i+1] == ' ' {
+ fn(c, lexerList)
+ } else {
+ if (currentType != lexerModifier && len(previous) > 0) ||
+ (len(previous) > 0 && []rune(previous)[0] != c) ||
+ len(previous) >= 3 {
+ lexs = append(lexs, lexer{Type: currentType, Value: previous})
+ previous = ""
+ }
+ currentType = lexerModifier
+ previous += string(c)
}
- currentType = lexerModifier
- previous += string(c)
+ newLine = false
case '`':
+ newLine = false
fn(c, lexerCode)
case '\n':
+ newLine = true
fn(c, lexerBreak)
case '#':
+ newLine = false
fn(c, lexerHeader)
case '>':
+ newLine = false
fn(c, lexerQuote)
case '[', ']', '(', ')', '!':
+ newLine = false
fn(c, lexerExternal)
case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.':
+ newLine = false
fn(c, lexerList)
default:
+ newLine = false
fn(c, lexerLiteral)
}
}
diff --git a/mardown/lexer_test.go b/mardown/lexer_test.go
index 8fe81cc..3ef87cc 100644
--- a/mardown/lexer_test.go
+++ b/mardown/lexer_test.go
@@ -23,4 +23,8 @@ func TestLex(t *testing.T) {
if lxs.String() != `Lexers[literal(Xxx_DarkEmperor_xxX) ]` {
t.Errorf("invalid lex, got %s", lxs)
}
+ lxs = lex(`* list`)
+ if lxs.String() != `Lexers[list(*) literal( list) ]` {
+ t.Errorf("invalid lex, got %s", lxs)
+ }
}