finish testing markdown
This commit is contained in:
parent
b78959867f
commit
ad3f63822a
@ -13,7 +13,7 @@ func escapeMarkdown(s string, additional ...rune) string {
|
|||||||
var (
|
var (
|
||||||
rr []rune
|
rr []rune
|
||||||
isNumberOnNewLine bool
|
isNumberOnNewLine bool
|
||||||
isLinkOpen, isLinkClosed, isLinkLabel bool
|
isLinkOpen, isLinkClosed, isLinkValue bool
|
||||||
)
|
)
|
||||||
|
|
||||||
isNewLine := true
|
isNewLine := true
|
||||||
@ -45,7 +45,7 @@ func escapeMarkdown(s string, additional ...rune) string {
|
|||||||
default:
|
default:
|
||||||
rr = append(rr, ri)
|
rr = append(rr, ri)
|
||||||
}
|
}
|
||||||
case isLinkLabel:
|
case isLinkValue:
|
||||||
switch ri {
|
switch ri {
|
||||||
case ')':
|
case ')':
|
||||||
rr = append(rr, '\\', ri)
|
rr = append(rr, '\\', ri)
|
||||||
@ -63,9 +63,9 @@ func escapeMarkdown(s string, additional ...rune) string {
|
|||||||
|
|
||||||
isNumberOnNewLine = (isNewLine || isNumberOnNewLine) && ri >= '0' && ri <= '9'
|
isNumberOnNewLine = (isNewLine || isNumberOnNewLine) && ri >= '0' && ri <= '9'
|
||||||
isNewLine = ri == '\n'
|
isNewLine = ri == '\n'
|
||||||
isLinkOpen = !isLinkLabel && ri == '[' || isLinkOpen && ri != ']'
|
isLinkValue = isLinkClosed && ri == '(' || isLinkValue && ri != ')'
|
||||||
isLinkClosed = isLinkOpen && ri == ']'
|
isLinkClosed = isLinkOpen && ri == ']'
|
||||||
isLinkLabel = isLinkClosed && ri == '(' || isLinkLabel && ri != ')'
|
isLinkOpen = !isLinkValue && ri == '[' || isLinkOpen && ri != ']'
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(rr)
|
return string(rr)
|
||||||
|
|||||||
222
markdown_test.go
222
markdown_test.go
@ -8,19 +8,173 @@ import (
|
|||||||
|
|
||||||
func TestMarkdown(t *testing.T) {
|
func TestMarkdown(t *testing.T) {
|
||||||
t.Run("invalid", func(t *testing.T) {
|
t.Run("invalid", func(t *testing.T) {
|
||||||
t.Fatal()
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, textfmt.Doc(textfmt.Entry{})); err == nil {
|
||||||
|
t.Fatal("failed to fail")
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("empty", func(t *testing.T) {
|
t.Run("empty", func(t *testing.T) {
|
||||||
t.Fatal()
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, textfmt.Doc()); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.String() != "" {
|
||||||
|
t.Fatal(b.String())
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("example", func(t *testing.T) {
|
t.Run("example", func(t *testing.T) {
|
||||||
t.Fatal()
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Title(0, "Example Text"),
|
||||||
|
|
||||||
|
textfmt.Wrap(
|
||||||
|
textfmt.Indent(
|
||||||
|
textfmt.Paragraph(textfmt.Text("Below you can find some test text, with various text items.")),
|
||||||
|
0,
|
||||||
|
8,
|
||||||
|
),
|
||||||
|
30,
|
||||||
|
),
|
||||||
|
|
||||||
|
textfmt.Title(1, "Document syntax:"),
|
||||||
|
|
||||||
|
textfmt.Indent(
|
||||||
|
textfmt.Syntax(
|
||||||
|
textfmt.Symbol("textfmt.Doc"),
|
||||||
|
textfmt.Symbol("("),
|
||||||
|
textfmt.ZeroOrMore(textfmt.Symbol("Entry")),
|
||||||
|
textfmt.Symbol(")"),
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
8,
|
||||||
|
),
|
||||||
|
|
||||||
|
textfmt.Title(1, "Entries:"),
|
||||||
|
|
||||||
|
textfmt.Paragraph(textfmt.Text("textfmt supports the following entries:")),
|
||||||
|
|
||||||
|
textfmt.List(
|
||||||
|
textfmt.Item(textfmt.Text("CodeBlock")),
|
||||||
|
textfmt.Item(textfmt.Text("DefinitionList")),
|
||||||
|
textfmt.Item(textfmt.Text("List")),
|
||||||
|
textfmt.Item(textfmt.Text("NumberedDefinitionList")),
|
||||||
|
textfmt.Item(textfmt.Text("NumberedList")),
|
||||||
|
textfmt.Item(textfmt.Text("Paragraph")),
|
||||||
|
textfmt.Item(textfmt.Text("Syntax")),
|
||||||
|
textfmt.Item(textfmt.Text("Table")),
|
||||||
|
textfmt.Item(textfmt.Text("Title")),
|
||||||
|
),
|
||||||
|
|
||||||
|
textfmt.Title(1, "Entry explanations:"),
|
||||||
|
|
||||||
|
textfmt.Wrap(
|
||||||
|
textfmt.DefinitionList(
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("CodeBlock"),
|
||||||
|
textfmt.Text("a multiline block of code"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("DefinitionList"),
|
||||||
|
textfmt.Text("a list of definitions like this one"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("List"),
|
||||||
|
textfmt.Text("a list of items"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("NumberedDefinitionList"),
|
||||||
|
textfmt.Text("numbered definitions"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("NumberedList"),
|
||||||
|
textfmt.Text("numbered list"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("Paragraph"),
|
||||||
|
textfmt.Text("paragraph of text"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("Syntax"),
|
||||||
|
textfmt.Text("a syntax expression"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("Table"),
|
||||||
|
textfmt.Text("a table"),
|
||||||
|
),
|
||||||
|
textfmt.Definition(
|
||||||
|
textfmt.Text("Title"),
|
||||||
|
textfmt.Text("a title"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
48,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, doc); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
const expect = `
|
||||||
|
# Example Text
|
||||||
|
|
||||||
|
Below you can find some test
|
||||||
|
text, with various text items.
|
||||||
|
|
||||||
|
## Document syntax:
|
||||||
|
|
||||||
|
` + "```" + `
|
||||||
|
textfmt.Doc ( [Entry]... )
|
||||||
|
` + "```" + `
|
||||||
|
|
||||||
|
## Entries:
|
||||||
|
|
||||||
|
textfmt supports the following entries:
|
||||||
|
|
||||||
|
- CodeBlock
|
||||||
|
- DefinitionList
|
||||||
|
- List
|
||||||
|
- NumberedDefinitionList
|
||||||
|
- NumberedList
|
||||||
|
- Paragraph
|
||||||
|
- Syntax
|
||||||
|
- Table
|
||||||
|
- Title
|
||||||
|
|
||||||
|
## Entry explanations:
|
||||||
|
|
||||||
|
- CodeBlock: a multiline block of code
|
||||||
|
- DefinitionList: a list of definitions like
|
||||||
|
this one
|
||||||
|
- List: a list of items
|
||||||
|
- NumberedDefinitionList: numbered definitions
|
||||||
|
- NumberedList: numbered list
|
||||||
|
- Paragraph: paragraph of text
|
||||||
|
- Syntax: a syntax expression
|
||||||
|
- Table: a table
|
||||||
|
- Title: a title
|
||||||
|
`
|
||||||
|
|
||||||
|
if "\n"+b.String() != expect {
|
||||||
|
t.Log("\n" + b.String())
|
||||||
|
t.Log(expect)
|
||||||
|
logBytes(t, "\n"+b.String())
|
||||||
|
logBytes(t, expect)
|
||||||
|
t.Fatal()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("write error", func(t *testing.T) {
|
t.Run("write error", func(t *testing.T) {
|
||||||
t.Fatal()
|
w := &failingWriter{failAfter: 15}
|
||||||
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Paragraph(textfmt.Text("Some sample text...\non multiple lines.")),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err := textfmt.Markdown(w, doc); err == nil {
|
||||||
|
t.Fatal("failed to fail")
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("title", func(t *testing.T) {
|
t.Run("title", func(t *testing.T) {
|
||||||
@ -241,19 +395,71 @@ func TestMarkdown(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("escape", func(t *testing.T) {
|
t.Run("escape", func(t *testing.T) {
|
||||||
t.Fatal()
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Paragraph(
|
||||||
|
textfmt.Text("\\`*_[]#<>"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, doc); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.String() != "\\\\\\`\\*\\_\\[\\]\\#\\<\\>\n" {
|
||||||
|
t.Fatal(b.String())
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("escape link", func(t *testing.T) {
|
t.Run("escape link", func(t *testing.T) {
|
||||||
t.Fatal()
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Paragraph(
|
||||||
|
textfmt.Text("[looks-like-a-link](https://foo.bar)"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, doc); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.String() != "\\[looks-like-a-link\\]\\(https://foo.bar\\)\n" {
|
||||||
|
t.Fatal(b.String())
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("escape negative number on line start", func(t *testing.T) {
|
t.Run("escape negative number on line start", func(t *testing.T) {
|
||||||
t.Fatal()
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Paragraph(
|
||||||
|
textfmt.Text("-42 policemen jumped on the bus"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, doc); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.String() != "\\-42 policemen jumped on the bus\n" {
|
||||||
|
t.Fatal(b.String())
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("escape year on line start", func(t *testing.T) {
|
t.Run("escape year on line start", func(t *testing.T) {
|
||||||
t.Fatal()
|
doc := textfmt.Doc(
|
||||||
|
textfmt.Paragraph(
|
||||||
|
textfmt.Text("2005. was the year when it started, and not 2002. tbh"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := textfmt.Markdown(&b, doc); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.String() != "2005\\. was the year when it started, and not 2002. tbh\n" {
|
||||||
|
t.Fatal(b.String())
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user