GithubHelp home page GithubHelp logo

dldevinc / jinja2-simple-tags Goto Github PK

View Code? Open in Web Editor NEW
33.0 1.0 3.0 49 KB

Base classes for quick-and-easy template tag development

License: BSD 3-Clause "New" or "Revised" License

Python 98.73% HTML 1.27%
jinja2 django templatetags

jinja2-simple-tags's Introduction

jinja2-simple-tags

jinja2-simple-tags is a library that provides a simple way to create custom template tags in Jinja2 templates.

PyPI Build Status

Compatibility

  • python >= 3.6
  • Jinja2 >= 2.10

Installation

pip install jinja2-simple-tags

Usage

To use jinja2-simple-tags, you need to create a subclass of one of the provided tag types and implement the render method.

StandaloneTag

StandaloneTag is a tag that doesn't require a closing tag. It can be used like this:

from datetime import datetime
from jinja2_simple_tags import StandaloneTag


class NowExtension(StandaloneTag):
    tags = {"now"}

    def render(self, format="%Y-%m-%d %H:%I:%S"):
        return datetime.now().strftime(format)
{% now %}               {# 2023-04-27 20:08:03 #}
{% now '%m/%d/%Y' %}    {# 04/27/2023 #}

Escaping

By default, the output of StandaloneTag will be escaped. To disable escaping, set the safe_output property of your tag to True:

from jinja2_simple_tags import StandaloneTag


class AlertExtension(StandaloneTag):
    safe_output = True
    tags = {"alert"}

    def render(self, message):
        return "<script>alert('{}')</script>".format(message)

You can also return a jinja2.Markup object from the render() method to explicitly mark the output as safe.

ContainerTag

ContainerTag is a tag that requires a closing tag and can contain arbitrary content. It can be used like this:

import hmac
from jinja2_simple_tags import ContainerTag


class HMACExtension(ContainerTag):
    tags = {"hmac"}

    def render(self, secret, digest="sha256", caller=None):
        content = str(caller()).encode()

        if isinstance(secret, str):
            secret = secret.encode()

        signing = hmac.new(secret, content, digestmod=digest)
        return signing.hexdigest()
{% hmac 'SECRET', digest='sha1' %}Hello world!{% endhmac %}

{# e29371e24dc99c5641681728855a92e26829e288 #}

InclusionTag

InclusionTag is a tag that can be used for including other templates. It allows you to specify a template name or implement the get_template_names() method for dynamic template selection. Here's an example:

from jinja2_simple_tags import InclusionTag

class IncludeHeader(InclusionTag):
    tags = {"include_header"}
    template_name = "header.html"

    def get_context(self, logo):
        return {
            "logo": logo
        }
{% include_header logo="/static/logo.png" %}

Context Inheritance

InclusionTag inherits the current context from the parent template, which allows you to access and use variables from the parent context within the included template. Any additional context variables returned by the get_context() method are merged with the inherited context.

Context

Current context can be accessed using self.context attribute of the tag class:

from jinja2_simple_tags import StandaloneTag


class UserNameExtension(StandaloneTag):
    tags = {"username"}

    def render(self):
        return self.context["user"].username

Assignment

In addition to returning the rendered value, ContainerTag, StandaloneTag and InclusionTag also supports assigning the output to a variable in the context. This can be done using the as keyword:

{% now '%m/%d/%Y' as today %}    
...
{{ today }}         {# 04/27/2023 #}
{% hmac 'SECRET', digest='sha1' as signature %}Hello world!{% endhmac %}
...
{{ signature }}     {# e29371e24dc99c5641681728855a92e26829e288 #}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.