htmgo/framework/hx/trigger.go

95 lines
1.8 KiB
Go
Raw Normal View History

2024-09-21 03:59:07 +00:00
package hx
import (
"strings"
)
type Trigger struct {
events []TriggerEvent
}
type TriggerEvent struct {
event Event
modifiers []Modifier
}
2024-09-21 17:08:23 +00:00
func ToHtmxTriggerName(event string) string {
if strings.HasPrefix(event, "htmx:") {
return event[5:]
}
if strings.HasPrefix(event, "on") {
return event[2:]
}
return event
}
func FormatEventName(event string, isDomEvent bool) string {
raw := ToHtmxTriggerName(event)
if isDomEvent {
return "on" + raw
}
return event
}
2024-09-21 03:59:07 +00:00
func NewTrigger(opts ...TriggerEvent) *Trigger {
t := Trigger{
events: make([]TriggerEvent, 0),
}
if len(opts) > 0 {
2024-09-21 17:08:23 +00:00
for i, opt := range opts {
opts[i].event = ToHtmxTriggerName(opt.event)
}
2024-09-21 03:59:07 +00:00
t.events = opts
}
return &t
}
func NewStringTrigger(trigger string) Trigger {
t := Trigger{
events: make([]TriggerEvent, 0),
}
split := strings.Split(trigger, ", ")
for _, s := range split {
parts := strings.Split(s, " ")
2024-09-21 17:08:23 +00:00
event := ToHtmxTriggerName(parts[0])
2024-09-21 03:59:07 +00:00
modifiers := make([]Modifier, 0)
if len(parts) > 1 {
for _, m := range parts[1:] {
modifiers = append(modifiers, RawModifier{modifier: m})
}
}
t.events = append(t.events, TriggerEvent{
event: event,
modifiers: modifiers,
})
}
return t
}
func (t Trigger) AddEvent(event TriggerEvent) Trigger {
t.events = append(t.events, event)
return t
}
func (t Trigger) ToString() string {
builder := strings.Builder{}
for i, e := range t.events {
2024-09-21 17:20:35 +00:00
eventName := ToHtmxTriggerName(e.event)
2024-09-21 03:59:07 +00:00
builder.WriteString(eventName)
for _, m := range e.modifiers {
builder.WriteString(" ")
builder.WriteString(m.Modifier())
}
if i < len(t.events)-1 {
builder.WriteString(", ")
}
}
return builder.String()
}
func (t Trigger) Render(builder *strings.Builder) {
builder.WriteString(t.ToString())
}