flosch / pongo2

Django-syntax like template-engine for Go
https://www.schlachter.tech/pongo2
MIT License
2.86k stars 269 forks source link

raise exception if variable is not defined in context for a template #307

Open EmadHelmi opened 2 years ago

EmadHelmi commented 2 years ago

say this is my template file:

<html>
  <head>
    <title>Our admins and users</title>
  </head>
  {# This is a short example to give you a quick overview of pongo2's syntax. #}
  {% macro user_details(user, is_admin=false) %}
  <div class="user_item">
    <!-- Let's indicate a user's good karma -->
    <h2 {% if (user.karma>= 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 }}.</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 }}
      <a href="/user/{{ user.id }}/">read more</a>
    </p>

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

  <body>
    <!-- Make use of the macro defined above to avoid repetitive HTML code
      since we want to use the same code for admins AND members -->

    <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 %}
  </body>
</html>

and in this simple code I want to render the template

tpl, err := pongo2.FromFile("sample.tpl")
if err != nil {
        log.Fatal(err)
    }
ctx := pongo2.Context{}

In a way I want to get an error if the defined context does not match the variables in the template or get used variable names in the template. How can I do this?

flosch commented 2 years ago

This is not yet supported.

EmadHelmi commented 2 years ago

This is not yet supported.

So you mean that there is no way even to get the identifier names in a template? I saw some parsing tools but all of them are locally used. I should write a local function but I need to access the template variables. Isn't there any way?

flosch commented 2 years ago

So you mean that there is no way even to get the identifier names in a template?

Yes, that's correct. There is no official or supported way to do so. I don't know about custom solutions though.

dezashibi commented 2 years ago

There are 2 issues in here:

  1. Method for getting tokens is not exported nor template's token
  2. It seems the tokenozer mixes all identifiers and keywords in one place as identifier for example if I have a variable called user in my template and also I have used if these 2 shouldnt be recognized as a similar token type first is identifier and the other is keyword
dezashibi commented 2 years ago

If these issues are resolved then yes we can implement what @EmadHelmi needs manually