2

我对 HAML 和 CoffeeScript 感到非常兴奋,并且正在编写教程来展示如何在非 Rails 环境中使用它们。因此,haml 具有易于使用的命令行实用程序

haml input.haml output.html.

而且,很棒的是,有一个项目(许多分支之一:https ://github.com/aussiegeek/coffee-haml-filter )旨在提供自定义过滤器,将 CoffeeScript 转换为 HAML 文件中的 JS。不幸的是(或者我错过了什么?)haml 不允许在命令行或使用某些配置文件指定自定义过滤器。

我(不是 Ruby 粉丝,甚至不是足够了解它)设法用这个帮助脚本解决了它(基于 SO 某处的一些聪明的建议): haml.rb

require 'rubygems'
require 'active_support/core_ext/object/blank'
require 'haml'
require 'haml/filters/coffee'

template = ARGV.length > 0 ? File.read(ARGV.shift) : STDIN.read
haml_engine = Haml::Engine.new(template)
file = ARGV.length > 0 ? File.open(ARGV.shift, 'w') : STDOUT
file.write(haml_engine.render)
file.close

这很简单,除了一开始的要求。

现在,问题是:

1)我真的应该使用它,还是有另一种方法可以使用自定义过滤器按需进行 HAML 到 HTML 编译?

2) HAML 监视模式怎么样?它很棒而且很方便。当然,我可以创建一个轮询脚本python来监视目录更改并调用此.rb脚本,但它看起来像一个肮脏的解决方案。

除了 Heikki 的回复,我的解决方案如下: https ://gist.github.com/759002

觉得好用就放心使用

4

3 回答 3

3

好消息:有一个新的 CoffeeScript Haml 过滤器被设计为独立于 Rails 工作!

https://github.com/paulnicholson/coffee-filter

绝对推荐在咖啡哈姆过滤器上,它从未真正积极维护过。

于 2011-04-29T18:38:46.537 回答
1

/选项应该适用于加载 CoffeeScript 过滤器--require-r它不在最新版本中,但这是一个错误;它将在下一个版本中修复。

于 2010-12-29T19:58:05.657 回答
0

1)我会说是的。(我对命令行选项也没有运气)

2)我得到了这个使用咖啡脚本过滤器的例子。文件监视是用fssm gem完成的。它在输入文件夹中递归地跟踪对 HAML 文件的更改,并将它们呈现到具有 .html 文件扩展名的输出文件夹。

观看.rb:

require 'rubygems'
require 'fssm'
require 'haml'
require 'coffee-haml-filter'
require 'active_support/core_ext/object/blank'

def render(input_dir, output_dir, relative)
  input_path = File.join(input_dir, relative)
  output_path = File.join(output_dir, relative).gsub(/\.haml$/, ".html")
  haml_engine = Haml::Engine.new(File.read(input_path))
  puts "Rendering #{input_path} -> #{output_path}"
  FileUtils.makedirs(File.dirname(output_path))
  File.open(output_path, 'w') do |file|
    file.write(haml_engine.render)
  end
end

input_dir = File.expand_path(ARGV.length > 0 ? ARGV.shift : '.')
output_dir = File.expand_path(ARGV.length > 0 ? ARGV.shift : input_dir)

puts "Input folder:  '#{input_dir}'"
puts "Output folder: '#{output_dir}'"

FSSM.monitor(input_dir, '**/*.haml') do
  create {|base, relative| render(input_dir, output_dir, relative) }
  update {|base, relative| render(input_dir, output_dir, relative) }
  delete {|base, relative|
    output_path = File.join(output_dir, relative).gsub(/\.haml$/, ".html")
    puts "Deleting #{output_path}"
    File.delete(output_path)
  }
end

用法:

ruby watch.rb input_folder output_folder
于 2010-12-28T21:59:41.350 回答