我正在使用 HAML 为站点生成一些静态 html 页面,并且我想将常用组件拆分为可以包含在多个页面中的部分,就像在 Rails 中一样。但是,我不想使用整个 Rails 堆栈来执行此操作,因为这似乎有点矫枉过正。
我在互联网上环顾四周,但没有找到任何东西,比仅仅做这样的事情要好:
Haml::Engine.new(IO.read("header.haml")).render
有没有更好的方法从 HAML 中包含所谓的部分?我缺少的现有过滤器或命令?
最好将haml & sass 与构建静态网站的工具结合使用。这里有一些链接:
我正在为我的博客使用 jekyll,但如果您不构建博客,它可能不适合您的需求。
该死,你是对的——没有内置的方法。我在haml
命令行中使用了助手,但总是那些输出已经是 HTML 格式的助手。
我最好的建议是编写一个partial()
方法并要求它。看起来你已经开始走这条路了。我建议任何编写此类函数的人考虑以某种方式保留原始绑定。Haml::Helpers#capture_hame看起来是实现这一目标的最简单方法。
如果执行速度是一个问题,那么以与Merb相同的方式缓存一些已解析的模板也可能是一个好主意。
如果有人确实得到了一些代码,请将其放在GitHub 上并在此处发表评论。
我终于找到了我要找的东西,所以我想我会和你分享我的发现。您可以简单地使用与 haml 相同的语法 - http://www.semicomplete.com/blog/geekery/partials-in-haml-in-sinatra.html
/views/file.haml
%h3 Title
%div= haml :content, :layout => false
/views/content.haml
%p your content here
我有同样的问题。我需要生成一些 html 片段来优化服务器响应,一旦这些片段有很多计算(用于绘制图形)并且每次用户发出请求时,它都会做所有不必要的事情。
一旦我将视图划分为几个 haml 部分,我想重用它来生成 html 文件。
我的第一种方法是尝试使用 Haml 引擎,但是一旦我有部分渲染其他部分和应用程序助手的某些功能,它就不起作用了。最终,我找到了一个解决方案,该解决方案通过在我想要创建一个 html 文件 ( to_html ) 的模型中创建一个函数来传递,这是它:
def to_html
ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper
File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file|
file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
:partial => 'partial_folder/partial',
:format => :html,
:locals => { :model => self}
)
end
end
这样,我就可以使用已经完成的部分来打印 html 文件。这对我有用,也许它也可以帮助你。
尽管我正在尝试做基本相同的事情,但所有解决方案对于我的目的来说似乎都很庞大。这是我写的一个 ruby 脚本,它做的很少 - 评估 Haml 并选择粘贴在= partial "test.haml"
任何你喜欢的地方。它会执行少量的逻辑来尝试查找部分文件。
require 'haml'
def find filename
return filename if File.exists? filename
path = File.dirname ARGV[0]
filename = path+"/"+filename
return filename if File.exists? filename
throw "Could not find file."
end
def partial filename
source = File.read(find(filename))
engine = Haml::Engine.new(source)
engine.render(binding)
end
puts partial ARGV[0]
你像这样执行它:ruby hamlize.rb input.haml > output.html