【问题标题】:Using HAML with custom filters将 HAML 与自定义过滤器一起使用
【发布时间】:2011-05-31 18:42:38
【问题描述】:

我对 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

如果您觉得有用,请随意使用

【问题讨论】:

    标签: ruby haml coffeescript


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您告诉我!它还需要 ruby​​gems / activesupport 是“必需的”吗?
      • 如果你使用-r rubygems,它会的。但是,看起来 CoffeeScript 过滤器包实际上并不需要它的所有依赖项(例如 ActiveSupport),因此您必须手动完成。真的,coffee-haml-filter 似乎是一个非常糟糕的包......我建议找到或写一个不同的包。
      • 再次感谢您的信息。实际上,如果我是 Ruby 男孩,我会这样做,但我是 pythonista,尽管想到在任何环境中使用 HAML + SCSS + CoffeeScript 而不是 HTML + CSS + JS,我感到很兴奋。目前我正在编写教程如何设置它以在 Django 项目中使用
      • 关于coffee-haml-filter,据我了解,它应该在Rails上运行,所以作者虽然blank?已经在那里了
      • 对,在我看来,让它只在 Rails 或类似 Rails 的环境中运行是一个糟糕的设计。
      【解决方案3】:

      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
      

      【讨论】:

      • 我读过haml --help,当然是%) 1) 已经试过了——没有运气。另外,请注意所需模块的数量(例如,空白?函数需要activesupport)2)在python中它也很容易,虽然看起来像重新实现已经完成的功能,并且在终止观察者之前等待编译完成有一些问题
      • 感谢您的回答。我接受它,虽然我已经用 python 轮询脚本做到了,它也理解目标目录
      • 谢谢,我添加了输入/输出选项以防万一。
      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多