adoc/formatter/asciidoc.go

78 lines
1.9 KiB
Go
Raw Normal View History

2022-06-11 09:30:22 +02:00
package formatter
2022-06-10 14:58:36 +02:00
import (
"fmt"
2022-06-11 09:30:22 +02:00
"ewintr.nl/adoc/document"
2022-06-10 14:58:36 +02:00
"ewintr.nl/adoc/element"
)
2022-06-11 09:30:22 +02:00
type AsciiDoc struct{}
func NewAsciiDoc() *AsciiDoc {
return &AsciiDoc{}
}
func (ad *AsciiDoc) Format(doc *document.Document) string {
return fmt.Sprintf("%s\n%s", asciiDocHeader(doc), ad.FormatFragments(doc.Content...))
2022-06-10 14:58:36 +02:00
}
2022-06-11 09:30:22 +02:00
func asciiDocHeader(doc *document.Document) string {
2022-06-10 14:58:36 +02:00
header := fmt.Sprintf("= %s\n", doc.Title)
2022-06-11 08:50:20 +02:00
if doc.Author != "" {
header += fmt.Sprintf("%s\n", doc.Author)
}
if !doc.Date.IsZero() {
header += fmt.Sprintf("%s\n", doc.Date.Format("2006-01-02"))
}
2022-06-10 14:58:36 +02:00
for k, v := range doc.Attributes {
header += fmt.Sprintf(":%s: %s\n", k, v)
}
return header
}
2022-06-11 09:30:22 +02:00
func (ad *AsciiDoc) FormatFragments(els ...element.Element) string {
2022-06-10 14:58:36 +02:00
var asciiDoc string
for _, el := range els {
2022-06-11 09:30:22 +02:00
asciiDoc += ad.asciiDocElement(el)
2022-06-10 14:58:36 +02:00
}
return asciiDoc
}
2022-06-11 09:30:22 +02:00
func (ad *AsciiDoc) asciiDocElement(el element.Element) string {
2022-06-10 14:58:36 +02:00
switch v := el.(type) {
case element.SubTitle:
return fmt.Sprintf("== %s\n\n", v.Text())
case element.SubSubTitle:
return fmt.Sprintf("=== %s\n\n", v.Text())
case element.List:
var items []element.Element
for _, i := range v {
items = append(items, i)
}
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("%s\n", ad.FormatFragments(items...))
2022-06-10 14:58:36 +02:00
case element.ListItem:
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("* %s\n", ad.FormatFragments(v...))
2022-06-10 14:58:36 +02:00
case element.CodeBlock:
return fmt.Sprintf("----\n%s\n----\n\n", v.Text())
case element.Paragraph:
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("%s\n\n", ad.FormatFragments(v.Elements...))
2022-06-10 14:58:36 +02:00
case element.Strong:
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("*%s*", ad.FormatFragments(v...))
2022-06-10 14:58:36 +02:00
case element.Emphasis:
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("_%s_", ad.FormatFragments(v...))
2022-06-10 14:58:36 +02:00
case element.Code:
2022-06-11 09:30:22 +02:00
return fmt.Sprintf("`%s`", ad.FormatFragments(v...))
2022-06-10 14:58:36 +02:00
case element.Link:
return fmt.Sprintf("%s[%s]", v.URL, v.Title)
case element.Word:
return v.Text()
case element.WhiteSpace:
return " "
default:
return ""
}
}