Implementing the TiltYieldingFilter #28

wants to merge 1 commit into


None yet
3 participants

ethul commented Mar 19, 2012

Hi All,

The purpose of this filter is to allow templates that adhere to the Tilt interface to yield to other templates, and be able to generate the final result from the nested structure. For example, if we have a slim template called layout.slim that we wanted to use as the layout for all of our HTML pages, it might look something like the following.

doctype html
html lang="en"
    meta charset="utf-8"
    title template
    == yield

For completeness, say we have an index.slim as follows where we want to use the template above as our layout for the index.

h1 Hello

Using the TiltYieldingFilter, we can create an Assetfile to generate the desired result. For instance:

require "slim"
require "rake-pipeline-web-filters"
output "public"
input "assets" do
  match "{layout,index}.slim" do
    tilt_yielding :yields_to => ["layout","index"], :output_name => "index.html"

Building the Assetfile above, the filter would run the index.slim through Tilt, and then pass that result as the value for the yield in the layout.slim.

I am sure there is a more elegant way to do this, but I couldn't manage to get it going with the current filters out there. Though, maybe I am missing something! Anyways, if you have any suggestions or want to accept the pull request, that would be great!


PS - I was thinking to modify the existing TiltFilter, but the behavior of the generate_output is so different that I thought it was cleaner to just make a new filter. I'd be open to working in the functionality to TiltFilter though.

@ethul ethul Implementing the TiltYieldingFilter
The purpose of this filter is to allow templates that adhere to the Tilt
interface to yield to other templates. Basically, a yields-to chain is
created where the templates sequentially yield to their predecessor in
the list.

For example, given the yields-to chain of [a,b,c] the filter will
process this as a yields-to b and then b yields to c. This causes the
following behavior:
  - c is processed by Tilt, call this c'
  - c' is given as the value of the yield in b
  - b is processed by Tilt, call this b'
  - b' is given as the value of the yield in a
  - a is processed by Tilt, call this a'
  - a' is written as the final output

dudleyf commented May 20, 2012

Thanks for the PR, sorry it's taken so long to get back to you.

I'd like for the TiltFilter itself to be able to handle nested templates, but I'm not sure this is the right way to go. I don't like having to specify the :yields_to list up front. I don't know of a better way off the top of my head, but I'd like to think about it a little more.

ethul commented May 21, 2012

No problem about the PR, and I agree that specifying the :yields_to list up front is not the most robust solution, but it fit the bill for the project I was working on at the time. I'd be interested in something more elegant though and can also put some more thought into this.



morgoth commented May 21, 2012

You can take a look at very simple filter, that adds support for layout. Maybe you can figure out something based on that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment