maciejhirsz/ramhorns

Lambdas sections?

Opened this issue · 6 comments

d4h0 commented

Hi,

Mustache supports lambdas sections – is my understanding correct that this isn't supported in ramhorns?

If so, are there any plans for this?

grego commented

What is your use case? It's very well possible Ramhorns indirectly supports it now.

d4h0 commented

I'd use lambda sections for example to create Markdown sections (which would need to be processed).

I'm also interested in something like this:

{{#hero}}
    <h1>test</h1>
    <p>Some other text</p>
{{/hero}}

hero then would add some other stuff (like wrapping the children content in a div that is styled in a certain way).

Ideally, lambda sections would support arguments, which would make it possible to generate more complex sections.

I'd also use this in Markdown to create sections with certain attributes (for example):

{{#my_section id="foo" class="my_class"}}
# Title
some text
{{/my_section}}

(I'd like to avoid to write HTML in my Markdown)

Normal functions (which don't exist in Ramhorns, if remember correctly) would be already useful for some things I'd like to do (but not all). For example, currently, I'm working on a template helper that optimizes images and generates HTML for responsive images.

Is anything of the above ergonomically possible with Ramhorns?

This would also be helpful for formatting. For example rendering a number as hexadecimal

@d4h0:

I'm also interested in something like this:

{{#hero}}
    <h1>test</h1>
    <p>Some other text</p>
{{/hero}}

hero then would add some other stuff (like wrapping the children content in a div that is styled in a certain way).

You can already do that with partials, you just have to split your padding into two partials:

{{>hero_head.html}}
    <h1>test</h1>
    <p>Some other text</p>
{{>hero_tail.html}}
{{#my_section id="foo" class="my_class"}}
# Title
some text
{{/my_section}}

This you can also do with partials, except the id and class would have to be passed as content variables. Extending mustache syntax with custom attributes is definitely out of scope for Ramhorns.

(I'd like to avoid to write HTML in my Markdown)

Why? HTML is already valid Markdown, it's widely supported, and understandable. A mustache section with custom attributes syntax is none of those things.


@ibutra:

This would also be helpful for formatting. For example rendering a number as hexadecimal

For simple formatting or wrapping content in some preprocessor, the better way to do that in Rust would be to use attribute flags (which could be used as a generic replacement for markdown support per #27), so that's definitely on the line.

Is it even possible to have something like custom filters or functions with Mustache templates? I'm looking for something along these lines https://tera.netlify.app/docs/#functions.

The use case I want to support is to give this filter/function a path to an image asset, generate jpeg/png, webp, and avif versions, and then render a <picture> tag that abstracts away picking the best version for a specific browser.

Mustache is, by design, logic-less, so no, not really. It's possible to add a similar mechanism via attributes to the Content derived struct, though in that case it of course is no longer controlled by the template.