| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package notifications
- import (
- "io"
- "github.com/diamondburned/ningen/v3/discordmd"
- "github.com/yuin/goldmark/ast"
- gmr "github.com/yuin/goldmark/renderer"
- )
- // Using a modified version of the discordmd BasicRenderer
- var PlainTextRenderer = newRenderer()
- type renderer struct {
- config *gmr.Config
- }
- func newRenderer() *renderer {
- config := gmr.NewConfig()
- return &renderer{config}
- }
- func (r *renderer) AddOptions(opts ...gmr.Option) {
- for _, opt := range opts {
- opt.SetConfig(r.config)
- }
- }
- func (r *renderer) Render(w io.Writer, source []byte, n ast.Node) error {
- return ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
- switch n := n.(type) {
- case *ast.Document:
- // noop
- case *ast.Blockquote:
- io.WriteString(w, "\"")
- case *ast.Heading:
- io.WriteString(w, "\n")
- case *ast.FencedCodeBlock:
- io.WriteString(w, "\n")
- if entering {
- for i := range n.Lines().Len() {
- line := n.Lines().At(i)
- io.WriteString(w, "| ")
- w.Write(line.Value(source))
- }
- }
- case *ast.AutoLink:
- if entering {
- w.Write(n.URL(source))
- }
- case *ast.Link:
- if !entering {
- io.WriteString(w, " ("+string(n.Destination)+")")
- }
- case *discordmd.Inline:
- if n.Attr&discordmd.AttrSpoiler != 0 {
- if entering {
- io.WriteString(w, "*spoiler*")
- }
- return ast.WalkSkipChildren, nil
- }
- case *ast.Text:
- if entering {
- w.Write(n.Segment.Value(source))
- switch {
- case n.HardLineBreak():
- io.WriteString(w, "\n\n")
- case n.SoftLineBreak():
- io.WriteString(w, "\n")
- }
- }
- case *discordmd.Mention:
- if entering {
- switch {
- case n.Channel != nil:
- io.WriteString(w, "#"+n.Channel.Name)
- case n.GuildUser != nil:
- io.WriteString(w, "@"+n.GuildUser.Username)
- case n.GuildRole != nil:
- io.WriteString(w, "@"+n.GuildRole.Name)
- }
- }
- case *discordmd.Emoji:
- if entering {
- io.WriteString(w, ":"+string(n.Name)+":")
- }
- }
- return ast.WalkContinue, nil
- })
- }
|