diff options
| author | Bobby <[email protected]> | 2026-01-20 14:02:34 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-01-20 14:02:34 +0530 |
| commit | 7fee36b4fbae90dacdecb917e262ad58927fe746 (patch) | |
| tree | 3739af9bf8d2e78c6536a7dfa24ce391abb90ff1 /tags | |
| parent | 61d5f45189a40621bceeb14c6646031dd15ab6c2 (diff) | |
| download | cafe-7fee36b4fbae90dacdecb917e262ad58927fe746.tar.xz cafe-7fee36b4fbae90dacdecb917e262ad58927fe746.zip | |
Add Tailwind CSS and HTMX integration and implement custom template tags
Diffstat (limited to 'tags')
| -rw-r--r-- | tags/static.go | 25 | ||||
| -rw-r--r-- | tags/tags.go | 26 | ||||
| -rw-r--r-- | tags/url.go | 75 |
3 files changed, 126 insertions, 0 deletions
diff --git a/tags/static.go b/tags/static.go new file mode 100644 index 0000000..253fa9c --- /dev/null +++ b/tags/static.go @@ -0,0 +1,25 @@ +package tags + +import ( + "github.com/flosch/pongo2/v6" +) + +type tagStaticNode struct { + path string +} + +func static(_ *pongo2.Parser, _ *pongo2.Token, arguments *pongo2.Parser) (pongo2.INodeTag, *pongo2.Error) { + pathToken := arguments.MatchType(pongo2.TokenString) + if pathToken == nil { + return nil, arguments.Error("Expected a string path", nil) + } + + return &tagStaticNode{ + path: pathToken.Val, + }, nil +} + +func (node *tagStaticNode) Execute(ctx *pongo2.ExecutionContext, writer pongo2.TemplateWriter) *pongo2.Error { + writer.WriteString("/static/" + node.path) + return nil +} diff --git a/tags/tags.go b/tags/tags.go new file mode 100644 index 0000000..6229c20 --- /dev/null +++ b/tags/tags.go @@ -0,0 +1,26 @@ +package tags + +import ( + "log" + + "github.com/flosch/pongo2/v6" +) + +type templateTag struct { + Name string + Fn pongo2.TagParser +} + +func Initialize() { + + tags := []templateTag{ + {"url", url}, + {"static", static}, + } + + for _, t := range tags { + if err := pongo2.RegisterTag(t.Name, t.Fn); err != nil { + log.Println("Failed to register tag:", t.Name, "Error:", err) + } + } +} diff --git a/tags/url.go b/tags/url.go new file mode 100644 index 0000000..7bde109 --- /dev/null +++ b/tags/url.go @@ -0,0 +1,75 @@ +package tags + +import ( + "cafe/utils/urls" + "fmt" + "strings" + + "github.com/flosch/pongo2/v6" +) + +type urlNode struct { + routeName string + params map[string]pongo2.IEvaluator +} + +func url(doc *pongo2.Parser, start *pongo2.Token, arguments *pongo2.Parser) (pongo2.INodeTag, *pongo2.Error) { + routeNameToken := arguments.MatchType(pongo2.TokenString) + if routeNameToken == nil { + return nil, arguments.Error("expected route name string", nil) + } + routeName := routeNameToken.Val + + params := make(map[string]pongo2.IEvaluator) + + for arguments.Remaining() > 0 { + keyToken := arguments.MatchType(pongo2.TokenIdentifier) + if keyToken == nil { + return nil, arguments.Error("expected param key identifier", nil) + } + + if arguments.Match(pongo2.TokenSymbol, "=") == nil { + return nil, arguments.Error("expected '=' after param key", nil) + } + + valueExpr, err := arguments.ParseExpression() + if err != nil { + return nil, err + } + + params[keyToken.Val] = valueExpr + } + + return &urlNode{ + routeName: routeName, + params: params, + }, nil +} + +func (n *urlNode) Execute(ctx *pongo2.ExecutionContext, writer pongo2.TemplateWriter) *pongo2.Error { + path, ok := urls.GetFullPath(n.routeName) + if !ok { + return &pongo2.Error{ + Sender: "tag:url", + OrigError: fmt.Errorf("route not found: %s", n.routeName), + } + } + + for key, expr := range n.params { + val, err := expr.Evaluate(ctx) + if err != nil { + return err + } + path = strings.ReplaceAll(path, ":"+key, fmt.Sprintf("%v", val.Interface())) + } + + _, err := writer.WriteString(path) + if err != nil { + return &pongo2.Error{ + Sender: "tag:url", + OrigError: err, + } + } + + return nil +} |
