2010-06-02 9 views
5

Ich benutze Haml (Haml/Sass 3.0.9 - Classy Cassidy) Stand-alone, um statische HTML zu generieren. Ich möchte eine freigegebene Layoutvorlage erstellen, die alle meine anderen Vorlagen erben.Haml Inherit Templates

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 

Zur Herstellung:

Content.html

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

Aber das scheint nicht möglich. Ich habe die Verwendung von Renderingpartials bei der Verwendung von Haml mit Rails gesehen, kann aber keine Lösung finden, wenn ich Haml Stand-Alone verwende.

Wenn ich den Layout-Code in alle meine Vorlagen schreiben müsste, wäre das ein Albtraum. Also meine Frage ist, wie vermeide ich das zu tun? Gibt es einen Standardweg, um dieses Problem zu lösen? Habe ich etwas Grundlegendes verpasst?

fand ich eine ähnliche Frage: Rendering HAML partials from within HAMLoutside of Rails

Antwort

4

Ich habe einen Prototyp erstellt, der tut, was ich brauche. Ich muss dies nur als Modul erstellen und zulassen, dass die Layoutvorlage und die Inhaltsvorlage als Argumente (zusammen mit einem Dataset) akzeptiert werden.

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. 

Output

<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 mit der Annahme aufgebaut, dass es neben einigem Ruby-Framework verwendet werden wird, dass Dinge wie partials und Layouts zur Verfügung stellt. Wenn Sie eine einfache Methode zum Rendern statischer Haml-Codes mit Layouts und Teilbildern benötigen, lesen Sie StaticMatic.

+0

+1 verwendet. Danke, StaticMatic. Es bietet genau das, was ich für Layout-Vorlagen benötige, wirft aber Probleme in anderen Bereichen auf. – kjfletch