9

我正在使用 HAML 为站点生成一些静态 html 页面,并且我想将常用组件拆分为可以包含在多个页面中的部分,就像在 Rails 中一样。但是,我不想使用整个 Rails 堆栈来执行此操作,因为这似乎有点矫枉过正。

我在互联网上环顾四周,但没有找到任何东西,比仅仅做这样的事情要好:

Haml::Engine.new(IO.read("header.haml")).render

有没有更好的方法从 HAML 中包含所谓的部分?我缺少的现有过滤器或命令?

4

5 回答 5

6

最好将haml & sass 与构建静态网站的工具结合使用。这里有一些链接:

我正在为我的博客使用 jekyll,但如果您不构建博客,它可能不适合您的需求。

于 2009-09-09T15:19:09.430 回答
3

该死,你是对的——没有内置的方法。我在haml命令行中使用了助手,但总是那些输出已经是 HTML 格式的助手。

我最好的建议是编写一个partial()方法并要求它。看起来你已经开始走这条路了。我建议任何编写此类函数的人考虑以某种方式保留原始绑定。Haml::Helpers#capture_hame看起来是实现这一目标的最简单方法。

如果执行速度是一个问题,那么以与Merb相同的方式缓存一些已解析的模板也可能是一个好主意。

如果有人确实得到了一些代码,请将其放在GitHub 上并在此处发表评论。

于 2009-09-07T05:35:06.797 回答
1

我终于找到了我要找的东西,所以我想我会和你分享我的发现。您可以简单地使用与 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
于 2013-12-12T01:54:30.263 回答
0

我有同样的问题。我需要生成一些 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 文件。这对我有用,也许它也可以帮助你。

于 2013-05-07T13:43:22.740 回答
0

尽管我正在尝试做基本相同的事情,但所有解决方案对于我的目的来说似乎都很庞大。这是我写的一个 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

于 2012-09-12T06:41:49.857 回答