So I played around with this to see what could be done within the existing framework. Here's what I've come up with...
The haml code looks like: - define_template :titlebar do |content| %h1= content - define_template :box do |title,content| .box .title= title .content= content %html %body = eval_template :titlebar,"My title" = eval_template :box,"My Eval Template Title" do My internal special content = Time.now - sleep 2 = eval_template :box,"Another box" do This is another box = Time.now The supporting code is surprisingly simple.... module Haml module Helpers class TemplateStore def self.save(name,&block) @blocks ||= {} @blocks[name] = *block end def self.get(name) @blocks[name] end end def define_template(name,&block) TemplateStore.save(name,&block) end def eval_template(name,*args,&block) if block_given? content = capture_haml(&block) args << content end capture_haml(*args,&(TemplateStore.get(name))) end end end It has room for improvement, but it's a start. John On 10/12/07, John Aughey <[EMAIL PROTECTED]> wrote: > > Ok, so the subject doesn't make total sense, but I have an idea of how to > use haml to defer some of the layout decisions to an external template. > Maybe this doesn't make sense either. Here's an example. > > > I have a site that puts content inside pretty boxes styled with CSS. > In the haml code, it looks something like... > > .box > .title Title of the box > .content > Here's where all the content goes > > > Which generates html > > <div class='box'> > <div class='title'>"This is a test"</div> > <div class='content'> > All my content goes here > > </div> > </div> > > This is all fine, but the haml code has too much layout logic for my taste. > If I changed how a box were to be structured (maybe I want to use a *gasp* > table), everywhere I put something inside this logical box would need to > > be modified. > > I'm proposing a new special character such as ! or whatever that passes the > evaluated haml block to another template. The new haml code for the above > example would look like... > > !box Title of the box > > Here's where all the content goes > > This really says what I mean. I want a titled box with the following > content. The previous example put too much of the required layout of having > several nested div sections in the code. > > > The layout logic would go into another file or block that would be rendered > inline with the same engine. In this example, there would be a file > _box.haml that looks like: > > .box > .title @args[0] > > .content > @content > > So with this template defined of how a box is to be structured, I can then > use this !box tag throughout my thousands of .haml files without worry. If > I need to modified how the box is structured to use some new CSS style or > > presentation, I only need to modify the above template. > > Rather than using an external file to render the template, it might be > defined inline with the main haml code, so a single file haml source for > this might look like: > > > ^define_template :box > .box > .title @args[0] > .content > @content > > !box "Title for the box" > Content for the box > > > I started to look at the haml source to make this modification, but the > > learning code was a little steep. The advantage this has over Rails > partials is the inclusion of the content block that can be inserted wherever > the template feels it should be put and wrapped with whatever layout is > > necessary. > > John > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Haml" group. To post to this group, send email to haml@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/haml?hl=en -~----------~----~----~----~------~----~------~--~---