Sha256: 80e89c66fd84ccbc2fe03cb5c7404139b18368506f636019e890e77d0c01aeb6

Contents?: true

Size: 1.68 KB

Versions: 3

Compression:

Stored size: 1.68 KB

Contents

module Rail
  module Processor
    class CoffeeScript < Base
      def self.input_extension
        'coffee'
      end

      def self.output_extension
        'js'
      end

      def self.mime_type
        'application/javascript'
      end

      def compile(filename, options = {})
        code = process(filename, options)
        code = Uglifier.new.compile(code) if compress?
        code
      end

      private

      def process(filename, options = {})
        output = []

        code = File.read(filename)

        extract_requirements(code).each do |name|
          requirement_filename = find_requirement(name, filename)
          raise NotFoundError unless requirement_filename
          output << compile(requirement_filename, options)
        end

        output << ::CoffeeScript.compile(code, options)

        output.join
      end

      def find_requirement(name, referrer)
        assets = [name, "#{name}.coffee", "#{name}.js.coffee"]

        if name =~ /^\.\// # relative?
          path = File.dirname(referrer)
          assets.each do |asset|
            filename = File.join(path, asset)
            return filename if File.exist?(filename)
          end
        else
          assets.each do |asset|
            filename = pipeline.find(asset)
            return filename if filename
          end
        end

        nil
      end

      def extract_requirements(code)
        match = /\A(?:\s*(?:\#.*\n?)+)+/.match(code) or return []
        match[0].split(/\n/).map(&:strip).reject(&:empty?).map do |line|
          match = /^\s*\#\s*=\s*require\s+(.*)$/.match(line)
          match ? match[1].strip.gsub(/(^['"])|(['"]$)/, '') : nil
        end.compact
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rail-0.1.1 lib/rail/processor/coffee_script.rb
rail-0.1.0 lib/rail/processor/coffee_script.rb
rail-0.0.8 lib/rail/processor/coffee_script.rb