mirror of https://github.com/coder/coder.git
112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
package parameter
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/glamour"
|
|
"github.com/charmbracelet/glamour/ansi"
|
|
gomarkdown "github.com/gomarkdown/markdown"
|
|
"github.com/gomarkdown/markdown/html"
|
|
"github.com/gomarkdown/markdown/parser"
|
|
"golang.org/x/xerrors"
|
|
)
|
|
|
|
var plaintextStyle = ansi.StyleConfig{
|
|
Document: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
BlockQuote: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
Paragraph: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
List: ansi.StyleList{
|
|
StyleBlock: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
LevelIndent: 4,
|
|
},
|
|
Heading: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H1: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H2: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H3: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H4: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H5: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
H6: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
Strikethrough: ansi.StylePrimitive{},
|
|
Emph: ansi.StylePrimitive{},
|
|
Strong: ansi.StylePrimitive{},
|
|
HorizontalRule: ansi.StylePrimitive{},
|
|
Item: ansi.StylePrimitive{},
|
|
Enumeration: ansi.StylePrimitive{
|
|
BlockPrefix: ". ",
|
|
}, Task: ansi.StyleTask{},
|
|
Link: ansi.StylePrimitive{
|
|
Format: "({{.text}})",
|
|
},
|
|
LinkText: ansi.StylePrimitive{
|
|
Format: "{{.text}}",
|
|
},
|
|
ImageText: ansi.StylePrimitive{
|
|
Format: "{{.text}}",
|
|
},
|
|
Image: ansi.StylePrimitive{
|
|
Format: "({{.text}})",
|
|
},
|
|
Code: ansi.StyleBlock{
|
|
StylePrimitive: ansi.StylePrimitive{},
|
|
},
|
|
CodeBlock: ansi.StyleCodeBlock{
|
|
StyleBlock: ansi.StyleBlock{},
|
|
},
|
|
Table: ansi.StyleTable{},
|
|
DefinitionDescription: ansi.StylePrimitive{},
|
|
}
|
|
|
|
// Plaintext function converts the description with optional Markdown tags
|
|
// to the plaintext form.
|
|
func Plaintext(markdown string) (string, error) {
|
|
renderer, err := glamour.NewTermRenderer(
|
|
glamour.WithStandardStyle("ascii"),
|
|
glamour.WithWordWrap(0), // don't need to add spaces in the end of line
|
|
glamour.WithStyles(plaintextStyle),
|
|
)
|
|
if err != nil {
|
|
return "", xerrors.Errorf("can't initialize the Markdown renderer: %w", err)
|
|
}
|
|
|
|
output, err := renderer.Render(markdown)
|
|
if err != nil {
|
|
return "", xerrors.Errorf("can't render description to plaintext: %w", err)
|
|
}
|
|
defer renderer.Close()
|
|
|
|
return strings.TrimSpace(output), nil
|
|
}
|
|
|
|
func HTML(markdown string) string {
|
|
p := parser.NewWithExtensions(parser.CommonExtensions)
|
|
doc := p.Parse([]byte(markdown))
|
|
renderer := html.NewRenderer(html.RendererOptions{
|
|
Flags: html.CommonFlags | html.SkipHTML,
|
|
},
|
|
)
|
|
return string(bytes.TrimSpace(gomarkdown.Render(doc, renderer)))
|
|
}
|