eleventy icon indicating copy to clipboard operation
eleventy copied to clipboard

Make nunjucks `env` available to shortcodes in addition to filters

Open andyinabox opened this issue 5 months ago • 2 comments

Is your feature request related to a problem? Please describe.

I'm interested in accessing the nunjucks environment to create shortcodes that do custom rendering. One examples is a shortcode that includes a template with a specific context (similar to the Twig include "template.html" with data behavior):

{% includeWith "template.njk", data %}

Another possible application is creating shortcodes that render a nunjucks template to generate output. So, for instance, for an image shortcode you could write the markup as a nunjucks template and import/render that.

Describe the solution you'd like

I'd like to be able to access the nunjucks environment from the this object in shortcode functions, as is already the case with filters. This would allow me to do something like:

  eleventyConfig.addNunjucksShortcode('includeWith', function (template, ctx) {
      return this.env.filters.safe(this.env.render(template, ctx))
  })

Which would allow

{% includeWith "template.njk", data %}

Describe alternatives you've considered

This is possible to do as a filter, but I think it makes more sense as a shortcode:

  eleventyConfig.addNunjucksFilter('includeWith', function (template, ctx) {
      return this.env.filters.safe(this.env.render(template, ctx))
  })

But this to me seems kind of awkward and hacky.

{{ "template.njk" | includeWith({ data: data }) }}

Additional context

No response

andyinabox avatar Jan 25 '24 10:01 andyinabox