/css/main.css にアクセスがあったら less に送る Rack ミドルウェア

しょーもないメモメモ。

module Rack
  class LessCss
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, body = @app.call(env)
      req = Rack::Request.new(env)

      if req.fullpath == '/css/main.css' then
        lessfile = 'less_template/main.less' # less file
        if ::File.exists?(lessfile) then
          cssstr = Less::Engine.new(::File.new(lessfile)).to_css
          body = [cssstr]
          headers['Content-Type'] = 'text/css'
          headers.delete('Content-Length')  # Rack::ContentLength に任せる
          status = 200
        end
      end

      [status, headers, body]
    end
  end
end

PATHが、ウルトラハードコーディングだけど今は気にしない(汗。

んで、main.less には、以下のように import を書いています。

@import 'html5-reset-1.4.css';
@import 'core.less';
@import 'header.less';
@import 'footer.less';
.
.
.

書くときは分割して、読み込むときは1つのファイルですむと。
キャッシュなどは全く考えてないので、制作のためのものです。
# 実際 main.css にまとめて css にしてから上げてるし。