Git Product home page Git Product logo

Comments (14)

djbe avatar djbe commented on June 12, 2024 1

@AliSoftware I don't know about anything :trollface:

from stencilswiftkit.

AliSoftware avatar AliSoftware commented on June 12, 2024 1

@djbe You can't hide 😄
image

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024 1

Sorry @claire-lynch-okcupid I don't know what was the outcome of this. Unfortunately I did not work with StencilKit lately.

from stencilswiftkit.

djbe avatar djbe commented on June 12, 2024

The thing is that for Stencil, everything that you output is a String. The result of a map iteration will always be a String. What you're doing here is actually mapping your array of variables to a list of variable descriptions and empty strings (for those that don't match your if)

What you could do instead is filter in the for loop:

{% for variable in vars where variable.readAccess != "private" and variable.readAccess != "fileprivate" %}{{ variable.name }}: {{ variable.name }}{% if not forloop.last %}, {% endif %}{% endfor %}

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024

Ok. The filter in the for loop is what I am doing right now. And sure it does work. But I use this for loop and therefore the filter several times and the condition is a lot more complex. Thats why I want to filter the array once and then iterate over it at different places.

from stencilswiftkit.

djbe avatar djbe commented on June 12, 2024

What's useful then is to separate that filter logic into a macro, which returns "true" or "false", and set a variable to that result inside your for loop. Then check the value with an if test:

{% macro myMacro variable %}{% filter removeNewlines:"all" %}
{% if some long test %}true{%else %}false{% endif %}
{% endfilter %}{% endmacro %}

...

{% for variable in vars %}{% filter removeNewlines:"leading" %}
  {% set shouldShow %}{% call myMacro variable %}{% endset %}
  {% if shouldShow == "true" %}
    {{ variable.name }}: {{ variable.name }}
    {% if not forloop.last %}, {% endif %}{% endfor %}
  {% endif %}
{% endfilter %}{% endfor %}

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024

Thanks for that pattern. I am gonna try this tomorrow.

from stencilswiftkit.

AliSoftware avatar AliSoftware commented on June 12, 2024

PS: just missing an {% endfilter %} in the macro and for blocks of your example @djbe 😉

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024

This works. Thanks. But the {% if not forloop.last %}, {% endif %}does not work anymore since we don't now if the last variable is filtered by the macro.

PS: just an {% endfor %} after {% if not forloop.last %}, {% endif %} too much in your example @djbe 😉

from stencilswiftkit.

AliSoftware avatar AliSoftware commented on June 12, 2024

One idea I pitched in our Slack was to create a new filter named call in StencilSwiftKit, that would take as a parameter the name of a 1-arity macro defined in your template, and call it like the call tag does.

That would allow you to use the filter syntax to call macros that take one parameter, like this {{ myvariable|call:"myMacro" }} … as an alternative way of using the set + call tags syntax {% set shouldShow %}{% call myMacro myvariable %}{% endset %}

note that this filter would only accept macros that have exactly one parameter then, and should throw a TemplateError otherwise

If we decide to add such a convenience filter in StencilSwiftKit, that means the code suggested by @djbe would become something like this:

{% for variable in vars where variable|call:"myMacro" == "true" %}{% filter removeNewlines:"all" %}
    {{ variable.name }}: {{ variable.name }}
{% if not forloop.last %}, {% endif %}
{% endfilter %}{% endfor %}

And given that you'd be able to use the "for where" syntax in the for tag, I think that would fix the issue you mention with the forloop.last too!

If you feel like this addition would be interesting and worth it, we'd welcome a PR to add it 😉

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024

That would a nice addition as the filtering is would ne named and separated from the template. I am going to experiment with this

from stencilswiftkit.

cornr avatar cornr commented on June 12, 2024

I think this can not be implemented as a filter since

protocol FilterType {
    func invoke(value: Any?, arguments: [Any?]) throws -> Any?
}

does not get the context to resolve the CallableBlock from the macro tag.

from stencilswiftkit.

djbe avatar djbe commented on June 12, 2024

@cornr stencilproject/Stencil#203 was merged a while ago that adds a context: Context parameter to the invoke function, so that shouldn't be an issue. It hasn't been released yet, but you can test the latest "master" branch of Stencil.

from stencilswiftkit.

claire-lynch-okcupid avatar claire-lynch-okcupid commented on June 12, 2024

@djbe @cornr it's been a long time but do you remember whether you got this working? I read in the Stencil docs, "The equality operator only supports numerical, string and boolean types." So when I attempt to evaluate something like, {* if myVariable == "true" *} it doesn't ever evaluate to true because myVariable isn't a string. Suggestions?

from stencilswiftkit.

Related Issues (20)

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.