func (b *Builder) BulletedList(list ...interface{}) *Builder {
	for _, el := range list {
		lines := strings.Split(fmt.Sprintf("%s", el), "\n")
		for i, l := range lines {
			if i == 0 {
				b.writelnf("* %s", l)
			} else {
				b.writelnf("  %s", l)
			}
		}
	}
	return b.nl()
}
BulletedList adds the given list as a bulleted
list to the markdown.
package markdown
import (
	"fmt"
	"math"
	"regexp"
	"strings"
	"golang.org/x/text/unicode/norm"
)
type TableAlignment uint8
const (
	AlignLeft TableAlignment = iota
	AlignCenter
	AlignRight
)
var reCRLN = regexp.MustCompile(`\r?\n`)
type Builder struct {
	markdown string
}
func (b *Builder) String() string {
	return strings.TrimSpace(b.nl().markdown)
}
func (b *Builder) Block() *Builder {
	return new(Builder)
}
func (b *Builder) Line(text string) *Builder {
	return b.write(text)
}
func (b *Builder) P(text string) *Builder {
	return b.writeln(text).nl()
}
func (b *Builder) H1(text string) *Builder {
	return b.writeln(header(text, 1)).nl()
}
func (b *Builder) H2(text string) *Builder {
	return b.writeln(header(text, 2)).nl()
}
func (b *Builder) H3(text string) *Builder {
	return b.writeln(header(text, 3)).nl()
}
func (b *Builder) H4(text string) *Builder {
	return b.writeln(header(text, 4)).nl()
}
func (b *Builder) H5(text string) *Builder {
	return b.writeln(header(text, 5)).nl()
}
func (b *Builder) H6(text string) *Builder {
	return b.writeln(header(text, 6)).nl()
}
func header(text string, level int) string {
	text = reCRLN.ReplaceAllString(text, " ")
	return fmt.Sprintf("%s %s", strings.Repeat("#", level), strings.TrimSpace(text))
}
func (b *Builder) nl() *Builder {
	return b.write("\n")
}
func (b *Builder) AltH1(header string) *Builder {
	header = reCRLN.ReplaceAllString(header, " ")
	header = strings.TrimSpace(header)
	return b.writeln(header).writeln(strings.Repeat("=", charLen(header))).nl()
}
func (b *Builder) AltH2(header string) *Builder {
	header = reCRLN.ReplaceAllString(header, " ")
	header = strings.TrimSpace(header)
	return b.writeln(header).writeln(strings.Repeat("-", charLen(header))).nl()
}
func (b *Builder) HR() *Builder {
	return b.P("---------------------------------------")
}
func (b *Builder) BR() *Builder {
	return b.write("   \n")
}
func (b *Builder) InlineCode(code string) string {
	return fmt.Sprintf("`%s`", code)
}
func (b *Builder) Code(code, lang string) *Builder {
	return b.
		writelnf("```%s", lang).
		writeln(code).
		writeln("```").
		nl()
}
func (b *Builder) Emphasis(text string) string {
	return b.Italic(text)
}
func (b *Builder) Italic(text string) string {
	return fmt.Sprintf("*%s*", text)
}
func (b *Builder) StrongEmphasis(text string) string {
	return b.Bold(text)
}
func (b *Builder) Bold(text string) string {
	return fmt.Sprintf("**%s**", text)
}
func (b *Builder) CombinedEmphasis(text string) string {
	return fmt.Sprintf("**_%s_**", text)
}
func (b *Builder) Strikethrough(text string) string {
	return fmt.Sprintf("~~%s~~", text)
}
func (b *Builder) Link(url, title string) string {
	return fmt.Sprintf("[%s](%s)", title, url)
}
func (b *Builder) Image(url, title string) string {
	return fmt.Sprintf("![%s](%s)", title, url)
}
func (b *Builder) Blockquote(text string) *Builder {
	lines := strings.Split(text, "\n")
	var newLines []string
	for _, l := range lines {
		newLines = append(newLines, strings.TrimSpace(">  "+l))
	}
	content := strings.Join(newLines, "\n")
	return b.P(content)
}