mdalert.gno
3.81 Kb ยท 142 lines
1// Package mdalert provides support for creating Markdown alerts.
2//
3// It defines supported alert types and helper functions that can be
4// called to generate Markdown for different alert types.
5//
6// The different alert types are documented in the Markdown docs realm:
7// https://gno.land/r/docs/markdown#alerts
8package mdalert
9
10import (
11 "strings"
12
13 "gno.land/p/nt/ufmt"
14)
15
16// Types of alerts.
17const (
18 TypeCaution Type = "CAUTION"
19 TypeInfo = "INFO"
20 TypeNote = "NOTE"
21 TypeSuccess = "SUCCESS"
22 TypeTip = "TIP"
23 TypeWarning = "WARNING"
24)
25
26type (
27 // Type defines a type for the alert types.
28 Type string
29
30 // Alert defines a type for alerts.
31 Alert struct {
32 // Type defines the type of alert.
33 Type Type
34
35 // Title contains an optional title for the alert.
36 Title string
37
38 // Message contains alerts's message.
39 Message string
40
41 // Folded indicates that the alert must be folded on render.
42 // Message is not initially visible when folded, only title is visible.
43 Folded bool
44 }
45)
46
47// String returns the alert as a Markdown string.
48func (a Alert) String() string {
49 alertType := string(a.Type)
50 msg := strings.TrimSpace(a.Message)
51 if msg == "" || alertType == "" {
52 return ""
53 }
54
55 // Init alert fold marker
56 var fold string
57 if a.Folded {
58 fold = "-"
59 }
60
61 // Write alert header
62 var b strings.Builder
63 header := ufmt.Sprintf("> [!%s]%s %s", alertType, fold, a.Title)
64 b.WriteString(strings.TrimSpace(header) + "\n")
65
66 // Write alert message
67 lines := strings.Split(msg, "\n")
68 for _, line := range lines {
69 b.WriteString("> " + line + "\n")
70 }
71 return b.String()
72}
73
74// New creates a new alert.
75func New(t Type, title, msg string, folded bool) Alert {
76 return Alert{
77 Type: t,
78 Title: title,
79 Message: msg,
80 Folded: folded,
81 }
82}
83
84// Caution returns an alert Markdown of type caution.
85func Caution(title, msg string) string {
86 return New(TypeCaution, title, msg, false).String()
87}
88
89// Cautionf returns an alert Markdown of type caution with a formatted message.
90func Cautionf(title, format string, a ...any) string {
91 return New(TypeCaution, title, ufmt.Sprintf(format, a...), false).String()
92}
93
94// Info returns an alert Markdown of type info.
95func Info(title, msg string) string {
96 return New(TypeInfo, title, msg, false).String()
97}
98
99// Infof returns an alert Markdown of type info with a formatted message.
100func Infof(title, format string, a ...any) string {
101 return New(TypeInfo, title, ufmt.Sprintf(format, a...), false).String()
102}
103
104// Note returns an alert Markdown of type note.
105func Note(title, msg string) string {
106 return New(TypeNote, title, msg, false).String()
107}
108
109// Notef returns an alert Markdown of type note with a formatted message.
110func Notef(title, format string, a ...any) string {
111 return New(TypeNote, title, ufmt.Sprintf(format, a...), false).String()
112}
113
114// Success returns an alert Markdown of type success.
115func Success(title, msg string) string {
116 return New(TypeSuccess, title, msg, false).String()
117}
118
119// Notef returns an alert Markdown of type success with a formatted message.
120func Successf(title, format string, a ...any) string {
121 return New(TypeSuccess, title, ufmt.Sprintf(format, a...), false).String()
122}
123
124// Tip returns an alert Markdown of type tip.
125func Tip(title, msg string) string {
126 return New(TypeTip, title, msg, false).String()
127}
128
129// Tipf returns an alert Markdown of type tip with a formatted message.
130func Tipf(title, format string, a ...any) string {
131 return New(TypeTip, title, ufmt.Sprintf(format, a...), false).String()
132}
133
134// Warning returns an alert Markdown of type warning.
135func Warning(title, msg string) string {
136 return New(TypeWarning, title, msg, false).String()
137}
138
139// Warningf returns an alert Markdown of type warning with a formatted message.
140func Warningf(title, format string, a ...any) string {
141 return New(TypeWarning, title, ufmt.Sprintf(format, a...), false).String()
142}