如何在Ruby / Rails之外的Haml中嵌入CoffeeScript?

时间:2011-03-02 22:44:58

标签: ruby haml coffeescript

在Rails中使用coffee-haml-filter很容易。在Rails 2下,运行

script/plugin install git://github.com/gerad/coffee-haml-filter.git

在Rails 3下,您可以添加

gem 'coffee-haml-filter', :git => 'git://github.com/gerad/coffee-haml-filter.git'

到您的Gemfile并执行bundle install。 (这就是假设你想要使用gerad的fork,它比inem的original version更新,在撰写本文时。)。

在任何其他Ruby应用程序中,它稍微复杂但仍然相当容易(例如,使用Gemfile和Bundler.require;或者更简单地直接从gerad的repo下载coffee.rb文件,将它粘贴在一个文件夹中,并require - 它。

但是,如果我只是在命令行上使用haml怎么办?有没有办法以Haml在系统范围内使用它的方式安装自定义过滤器?或者我可以使用Haml模板中的require语句来获取所需的过滤器吗?

2 个答案:

答案 0 :(得分:4)

制作自定义HAML过滤器应该像在类中包含Haml::Filters::Base模块并覆盖render方法一样简单,但我无法使用-r选项haml 1}}脚本,或试图直接将过滤器代码放入HAML模板。由于过滤器“咖啡”未定义错误,该脚本过早失败。

所以我最终编写了自己的脚本。它没有使用您提到的coffee-haml-filter,而是自己实现了:coffee过滤器。它将haml脚本文件名作为参数。它绝对可以写得更好,但它适用于我的目的。

#! /usr/bin/env ruby
require 'tempfile'
require 'haml'

TEMPDIR = '/dev/shm'

module Haml::Filters::Coffee
  include Haml::Filters::Base

  def render(text)
    tmpf = Tempfile.new('hamlcoffee', TEMPDIR)
    tmpf.write text
    tmpf.close
    output = `coffee -pl '#{tmpf.path}'`

    # strip the first and last line,
    # since the js code is wrapped as a function
    output = output.lines.collect[1..-2].join
    return output
  end
end

template = File.read(ARGV[0])
haml_engine = Haml::Engine.new(template)
output = haml_engine.render
puts output

答案 1 :(得分:4)

就在最近,一个新的CoffeeScript Haml过滤器可以在系统级安装,就像我想要的那样:https://github.com/paulnicholson/coffee-filter

但是,您必须在命令行上使用参数-r 'coffee-filter'运行Haml。请参阅this discussion