2010-06-02 17 views
5

Estoy usando Haml (Haml/Sass 3.0.9 - Classy Cassidy) autónomo para generar HTML estático. Quiero crear una plantilla de diseño compartido que todas mis otras plantillas hereden.Plantillas Haml Inherit

Layout.haml

%html 
    %head 
    %title Test Template 
    %body 
    .Content 

Content.haml

SOMEHOW INHERIT Layout.haml 
SOMEHOW Change the title of the page "My Content". 
    %p This is my content 

Para producir:

content.html

<html> 
    <head> 
    <title>My Content</title> 
    </head> 
    <body> 
    <div class="Content"> 
     <p>This is my content</p> 
    </div> 
    </body> 
</html> 

Pero esto no parece posible. He visto el uso de parciales de renderizado cuando uso Haml with Rails pero no puedo encontrar ninguna solución cuando uso Haml autónomo.

Tener que poner el código de diseño en todas mis plantillas sería una pesadilla de mantenimiento; entonces mi pregunta es ¿cómo puedo evitar hacer esto? ¿Hay una forma estándar de resolver este problema? ¿Me he perdido algo fundamental?

me encontré con una pregunta similar: Rendering HAML partials from within HAMLoutside of Rails

Respuesta

4

He creado un prototipo que hace lo que necesito. Solo necesito crear esto como un módulo y permitir que acepte la plantilla de diseño y la plantilla de contenido como argumentos (junto con un conjunto de datos).

require "haml" 

layoutTemplate = File.read('layout.haml') 
layoutEngine = Haml::Engine.new(layoutTemplate) 
layoutScope = Object.new 

output = layoutEngine.render(scope=layoutScope) { |x| 
    case x 
    when :title 
     scope.instance_variable_get("@haml_buffer").buffer << "My Title\n" 
    when :content 
     contentTemplate = File.read('page.haml') 
     contentEngine = Haml::Engine.new(contentTemplate) 
     contentOutput = contentEngine.render 
     scope.instance_variable_get("@haml_buffer").buffer << contentOutput 
    end 
} 

puts output 

layout.haml

%html 
    %head 
    %title 
     - yield :title 
    %body 
    .content 
     - yield :content 

page.haml

%h1 Testing 
%p This is my test page. 

salida

<html> 
    <head> 
    <title> 
My Title 
    </title> 
    </head> 
    <body> 
    <div class='content'> 
<h1>Testing</h1> 
<p>This is my test page.</p> 
    </div> 
    </body> 
</html> 
2

Haml se construye con la suposición de que va a ser utilizado junto con algún marco Ruby que ofrece cosas como parciales y diseños. Si desea una forma sencilla de representar el código Haml estático con diseños y parciales, consulte StaticMatic.

+0

+1 Gracias, estado mirando StaticMatic. Proporciona exactamente lo que quiero para las plantillas de diseño, pero plantea problemas en otras áreas. – kjfletch