Как мне вставить CoffeeScript в Haml за пределами Ruby / Rails? - PullRequest
4 голосов
/ 03 марта 2011

Легко использовать coffee-haml-filter в Rails. Под 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. (Все это предполагает, что вы хотите использовать вилку Герада, которая более актуальна, чем оригинальная версия inem , на момент написания этой статьи.).

В любом другом приложении Ruby это немного сложнее, но все же довольно легко сделать это (например, используя Gemfile и Bundler.require; или проще, загрузив файл coffee.rb непосредственно из репозитория Gerad, вставив его в папку, и require -ing это).

Но что, если я просто использую, например, haml в командной строке? Есть ли способ установить пользовательский фильтр таким образом, чтобы Haml использовал его для всей системы? Или я мог бы использовать require оператор из шаблона Haml для получения необходимого фильтра?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Совсем недавно появился новый фильтр CoffeeScript Haml, который можно установить на системном уровне, как я и хотел: https://github.com/paulnicholson/coffee-filter

Вы должны запустить Haml с аргументами -r 'coffee-filter' в командной строке,хоть.См. это обсуждение .

4 голосов
/ 25 апреля 2011

Создание пользовательского фильтра HAML должно быть таким же простым, как включение модуля Haml::Filters::Base в ваш класс и переопределение метода рендеринга, но я не смог заставить его работать с параметром -r сценария haml, или пытаясь поместить код фильтра в шаблон HAML напрямую. Сценарий просто слишком рано завершился с Фильтр «кофе» не определен Ошибка.

Итак, я написал свой собственный сценарий. Он не использует упомянутый вами фильтр coffee-haml, но сам реализует фильтр :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
...