我对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
如果您觉得有用,请随意使用
答案 0 :(得分:3)
好消息:有一个新的CoffeeScript Haml过滤器,可以独立于Rails工作!
https://github.com/paulnicholson/coffee-filter
绝对推荐使用coffee-haml-filter,而这种过滤器从未真正得到过积极维护。
答案 1 :(得分:1)
--require
/ -r
选项适用于加载CoffeeScript过滤器。它不是最新版本,但这是一个错误;它将在下一个版本中修复。
答案 2 :(得分:0)
1)我会说是的。 (我也没有运行命令行选项)
2)我得到了这个使用咖啡脚本过滤器的例子。使用fssm gem完成文件观看。它在输入文件夹中递归跟踪HAML文件的更改,并将它们呈现为输出文件扩展名为.html的文件夹。
watch.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