add lists support to markdown
This commit is contained in:
parent
46e6d99eda
commit
d31cc36a75
|
@ -2,6 +2,8 @@ changelog
|
||||||
|
|
||||||
-- next
|
-- next
|
||||||
|
|
||||||
|
+ Lists supported in markdown.
|
||||||
|
|
||||||
+ Rewrite admin console to avoid large dependencies.
|
+ Rewrite admin console to avoid large dependencies.
|
||||||
|
|
||||||
+ "Bug" fixes.
|
+ "Bug" fixes.
|
||||||
|
|
|
@ -46,6 +46,11 @@ Inline `code fragments` with single ticks.
|
||||||
int main() { return 0; }
|
int main() { return 0; }
|
||||||
```
|
```
|
||||||
.Ed
|
.Ed
|
||||||
|
.It lists
|
||||||
|
Lists of items starting with either
|
||||||
|
.Sq +
|
||||||
|
or
|
||||||
|
.Sq - .
|
||||||
.It images
|
.It images
|
||||||
Inline images with img tags.
|
Inline images with img tags.
|
||||||
.Bd -literal
|
.Bd -literal
|
||||||
|
|
|
@ -32,6 +32,7 @@ var re_quoter = regexp.MustCompile(`(?m:^> (.*)\n?)`)
|
||||||
var re_link = regexp.MustCompile(`.?.?https?://[^\s"]+[\w/)!]`)
|
var re_link = regexp.MustCompile(`.?.?https?://[^\s"]+[\w/)!]`)
|
||||||
var re_zerolink = regexp.MustCompile(`\[([^]]*)\]\(([^)]*\)?)\)`)
|
var re_zerolink = regexp.MustCompile(`\[([^]]*)\]\(([^)]*\)?)\)`)
|
||||||
var re_imgfix = regexp.MustCompile(`<img ([^>]*)>`)
|
var re_imgfix = regexp.MustCompile(`<img ([^>]*)>`)
|
||||||
|
var re_lister = regexp.MustCompile(`((^|\n)(\+|-).*)+\n?`)
|
||||||
|
|
||||||
var lighter = synlight.New(synlight.Options{Format: synlight.HTML})
|
var lighter = synlight.New(synlight.Options{Format: synlight.HTML})
|
||||||
|
|
||||||
|
@ -78,6 +79,17 @@ func markitzero(s string) string {
|
||||||
s = re_italicer.ReplaceAllString(s, "$1<i>$2</i>$3")
|
s = re_italicer.ReplaceAllString(s, "$1<i>$2</i>$3")
|
||||||
s = re_quoter.ReplaceAllString(s, "<blockquote>$1</blockquote><p>")
|
s = re_quoter.ReplaceAllString(s, "<blockquote>$1</blockquote><p>")
|
||||||
|
|
||||||
|
s = re_lister.ReplaceAllStringFunc(s, func(m string) string {
|
||||||
|
m = strings.Trim(m, "\n")
|
||||||
|
items := strings.Split(m, "\n")
|
||||||
|
r := "<ul>"
|
||||||
|
for _, item := range items {
|
||||||
|
r += "<li>" + strings.Trim(item[1:], " ")
|
||||||
|
}
|
||||||
|
r += "</ul><p>"
|
||||||
|
return r
|
||||||
|
})
|
||||||
|
|
||||||
// restore images
|
// restore images
|
||||||
s = strings.Replace(s, "<img x>", "<img x>", -1)
|
s = strings.Replace(s, "<img x>", "<img x>", -1)
|
||||||
s = re_imgfix.ReplaceAllStringFunc(s, func(string) string {
|
s = re_imgfix.ReplaceAllStringFunc(s, func(string) string {
|
||||||
|
@ -105,6 +117,7 @@ func markitzero(s string) string {
|
||||||
s = strings.Replace(s, "\n", "<br>", -1)
|
s = strings.Replace(s, "\n", "<br>", -1)
|
||||||
s = strings.Replace(s, "<br><blockquote>", "<blockquote>", -1)
|
s = strings.Replace(s, "<br><blockquote>", "<blockquote>", -1)
|
||||||
s = strings.Replace(s, "<br><pre>", "<pre>", -1)
|
s = strings.Replace(s, "<br><pre>", "<pre>", -1)
|
||||||
|
s = strings.Replace(s, "<br><ul>", "<ul>", -1)
|
||||||
s = strings.Replace(s, "<p><br>", "<p>", -1)
|
s = strings.Replace(s, "<p><br>", "<p>", -1)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,3 +94,15 @@ func TestImagelink(t *testing.T) {
|
||||||
output := `an image <img alt="caption" src="https://example.com/wherever"> and linked <a href="example.com"><img src="there"></a>`
|
output := `an image <img alt="caption" src="https://example.com/wherever"> and linked <a href="example.com"><img src="there"></a>`
|
||||||
doonezerotest(t, input, output)
|
doonezerotest(t, input, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLists(t *testing.T) {
|
||||||
|
input := `hello
|
||||||
|
+ a list
|
||||||
|
+ the list
|
||||||
|
|
||||||
|
para
|
||||||
|
|
||||||
|
- singleton`
|
||||||
|
output := `hello<ul><li>a list<li>the list</ul><p>para<ul><li>singleton</ul><p>`
|
||||||
|
doonezerotest(t, input, output)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue