Git Product home page Git Product logo

ha-nunjucks's Introduction

ha-nunjucks

License Project Maintenance GitHub Activity Community Forum

Github

A simple wrapper for nunjucks for use with Home Assistant frontend custom components to render templates instanteneously at HTML render time. This repository offers an easy way for developers to add templating support to Home Assistant custom cards.

What is nunjucks?

Nunjucks is a templating engine for JavaScript that is heavily inspired by jinja2. Home Assistant uses jinja2 to process templates in card configurations on the backend, so the syntax of jinja2 and Nunjucks is virtually the same. This makes it an excellent alternative for Home Assistant templating for custom cards.

While some Home Assistant native cards support templating for certain fields, implementing proper Home Assistant jinja2 template support in custom cards can be difficult. Additionally Home Assistant jinja2 templates are processed by the Python backend, and can take several seconds to render. Nunjucks templates are processed by the frontend using the frontend hass object before your custom card's HTML is rendered, making nunjucks templating instanteous and much faster than traditional jinja2 templates.

Usage

Install using npm:

npm install ha-nunjucks

Then import renderTemplate from ha-nunjucks and provide it with the hass object and a template string you want to process.

import { renderTemplate } from 'ha-nunjucks';

const renderedString = renderTemplate(this.hass, templateString);

Rather than rendering templates on the backend, nunjucks renders templates on the frontend. This repository uses the Home Assistant object present in all custom cards to read entity state data.

You can also provide additional context to the renderTemplate function to pass to nunjucks if you want to make additional variables or project specific functions available to your users for use in templates.

import { renderTemplate } from 'ha-nunjucks';

const context = {
  foo: 'bar',
  doThing(thing: string) {
    return `doing ${thing}!`;
  },
};

const renderedString = renderTemplate(this.hass, templateString, context);

Return Types

renderTemplate will return a string unless the result is true or false (not case sensitive), in which case it will return a boolean.

When the return type is expected to be a number, end users should cast these values using the nunjucks int or float filters to prevent undesired behavior caused by JavaScript forcing operations between disparate variable types. Numbers are not returned by default to prevent leading and trailing zeroes from being truncated from numerical strings.

renderTemplate will return an empty string for strings that may have been cast from nullish non-numerical values, such as undefined, null, and None (case sensitive).

Available Extensions

The catch to this approach of rendering jinja2/nunjucks templates is that we have to reimplement all of the Home Assistant template extension functions and filters. If there are functions or filters that you use that are not currently supported, please make a feature request or try adding it to the project yourself and create a pull request.

So far a subset of the Home Assistant template extension functions have been implemented as documented below.

Variables

These variables just remap Python built-in constants to JavaScript ones.

Python JavaScript
True true
False false
None null

The frontend data hass object has been exposed to users to call upon.

Because entity IDs contain periods in them, it's better to access it using bracket notation like so:

{{ hass["states"]["light.sunroom_ceiling"]["state"] }}

You can also use dot notation for everything but the entity ID.

{{ hass.states["light.sunroom_ceiling"].state }}

Functions used to determine an entity's state or an attribute.

Name Arguments Description
states entity_id Returns the state string of the given entity.
is_state entity_id, value Compares an entity's state with a specified state or list of states and returns true or false.
state_attr entity_id, attribute Returns the value of the attribute or undefined if it doesn't exist.
is_state_attr entity_id, attribute, value Tests if the given entity attribute is the specified value.
has_value entity_id Tests if the given entity is not unknown or unavailable.

A shorthand for an if else statement.

Name Arguments Description
iif condition, if_true, if_false, if_none Immediate if. Returns the value of if_true if the condition is true, the value of if_false if it's false, and the value of if_none if it's undefined, null, or an empty string. All arguments except condition are optional. Cannot be used as a filter.

Other

Functions that are not from the Home Assistant templating documentation

Name Arguments Description
match_media mediaquery Returns the boolean result of the provided CSS media query.

ha-nunjucks's People

Contributors

nerwyn avatar

Stargazers

Lakti Ivan avatar Jens-Uwe Rossbach avatar kinghat avatar

Watchers

 avatar  avatar  avatar

ha-nunjucks's Issues

Ability to add custom context

Currently, only some HASS context is available to the template. But it would be useful to be able to add more arbitrary context, including full objects, to be made available inside the template.

Something like this:

ha-nunjucks.addContext({ username: 'James' });
ha-nunjucks.addContext({ goes: 'here' });
ha-nunjucks.addContext({ tasklist: someObject });
ha-nunjucks.render('the template text goes {{ goes }}, using any parts of the context it wants');

For reference, here's the forum thread that started this suggestion.

Thanks!

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.