summaryrefslogtreecommitdiff
path: root/tags
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-01-20 14:02:34 +0530
committerBobby <[email protected]>2026-01-20 14:02:34 +0530
commit7fee36b4fbae90dacdecb917e262ad58927fe746 (patch)
tree3739af9bf8d2e78c6536a7dfa24ce391abb90ff1 /tags
parent61d5f45189a40621bceeb14c6646031dd15ab6c2 (diff)
downloadcafe-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.go25
-rw-r--r--tags/tags.go26
-rw-r--r--tags/url.go75
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
+}