GitHub - flosch/pongo2: Django-syntax like template-engine for Go (original) (raw)

pongo2

PkgGoDev Build Status Run on Repl.it

pongo2 is a Django-syntax like templating-language (official website).

Install/update using go get (no dependencies required by pongo2):

go get -u github.com/flosch/pongo2/v6

Please use the issue tracker if you're encountering any problems with pongo2 or if you need help with implementing tags or filters (create a ticket!).

Looking for a Go developer/consultant? I'm available for hire. 👨‍💻

First impression of a template

Our admins and users {# This is a short example to give you a quick overview of pongo2's syntax. #} {% macro user_details(user, is_admin=false) %}

= 40) || (user.karma > calc_avg_karma(userlist)+5) %} class="karma-good"{% endif %}>
  <!-- This will call user.String() automatically if available: -->
  {{ user }}
</h2>

<!-- Will print a human-readable time duration like "3 weeks ago" -->
<p>This user registered {{ user.register_date|naturaltime }}.</p>

<!-- Let's allow the users to write down their biography using markdown;
         we will only show the first 15 words as a preview -->
<p>The user's biography:</p>
<p>
  {{ user.biography|markdown|truncatewords_html:15 }}
  <a href="/user/{{ user.id }}/">read more</a>
</p>

{% if is_admin %}
<p>This user is an admin!</p>
{% endif %}

{% endmacro %}
<h1>Our admins</h1>
{% for admin in adminlist %} {{ user_details(admin, true) }} {% endfor %}

<h1>Our members</h1>
{% for user in userlist %} {{ user_details(user) }} {% endfor %}

Features

Caveats

Filters

Tags

Misc

Add-ons, libraries and helpers

Official

3rd-party

Please add your project to this list and send me a pull request when you've developed something nice for pongo2.

Who's using pongo2

I'm compiling a list of pongo2 users. Add your project or company!

API-usage examples

Please see the documentation for a full list of provided API methods.

A tiny example (template string)

// Compile the template first (i. e. creating the AST) tpl, err := pongo2.FromString("Hello {{ name|capfirst }}!") if err != nil { panic(err) } // Now you can render the template with the given // pongo2.Context how often you want to. out, err := tpl.Execute(pongo2.Context{"name": "florian"}) if err != nil { panic(err) } fmt.Println(out) // Output: Hello Florian!

Example server-usage (template file)

package main

import ( "github.com/flosch/pongo2/v6" "net/http" )

// Pre-compiling the templates at application startup using the // little Must()-helper function (Must() will panic if FromFile() // or FromString() will return with an error - that's it). // It's faster to pre-compile it anywhere at startup and only // execute the template later. var tplExample = pongo2.Must(pongo2.FromFile("example.html"))

func examplePage(w http.ResponseWriter, r *http.Request) { // Execute the template per HTTP request err := tplExample.ExecuteWriter(pongo2.Context{"query": r.FormValue("query")}, w) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }

func main() { http.HandleFunc("/", examplePage) http.ListenAndServe(":8080", nil) }