Sha256: a4353161fed26300006603340f2e96ce8f97a80dc9ef33fff77b37df9bdfe23d

Contents?: true

Size: 1.96 KB

Versions: 6

Compression:

Stored size: 1.96 KB

Contents

require 'json'
require 'thread'

module H8

  # Coffeescript compiler and evaluator (language version 1.8.0)
  #
  # Note that using global eval/compile is more efficient than create several
  # compiler instance as compiler itself will then be compiled only once.
  class Coffee

    @@compiler = nil
    @@mutex = Mutex.new

    # Compile and evaluate script.
    #
    # This method IS THREAD SAFE, it shares single
    # compiler instance across all threads with a mutex.
    def self.eval src, ** kwargs
      @@mutex.synchronize {
        (@@compiler ||= Coffee.new).eval src, ** kwargs
      }
    end

    # Compile coffeescript and return javascript. Keyword parameters are
    # passed to H8::Context#eval - like time limits and so on.
    #
    # This method IS THREAD SAFE, though it shares single
    # compiler instance across all threads with a mutex.
    def self.compile src, ** kwargs
      @@mutex.synchronize {
        (@@compiler ||= Coffee.new).compile src, ** kwargs
      }
    end

    # Create compiler instance.
    def initialize
      @context = H8::Context.new
      @context.eval read_script 'coffee-script.js'
      eval read_script('globals.coffee')
    end

    # compile coffeescript source and return compiled javascript
    def compile src, file_name: nil, **kwargs
      @context[:cs] = src
      @context[:filename] = file_name
      res = @context.eval('CoffeeScript.compile(cs,{filename: filename})')
      @context[:cs] = nil # Sources can be big...
      res
    end

    # Compile and evaulate coffee script. Optional parameters are passed
    # to H8::Context#eval
    def eval src, **kwargs
      @context.eval compile(src), **kwargs
    end

    # Provide context with CoffeeScrip compiler loaded
    def context
      @context
    end

    private

    @@base = File.expand_path File.join(File.dirname(__FILE__), '../scripts')
    @@cache = {}

    def read_script name
      @@cache[name] ||= open(File.join(@@base, name), 'r').read
    end
  end


end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
h8-0.4.5 lib/h8/coffee.rb
h8-0.4.0 lib/h8/coffee.rb
h8-0.3.0 lib/h8/coffee.rb
h8-0.2.5 lib/h8/coffee.rb
h8-0.2.4 lib/h8/coffee.rb
h8-0.2.3 lib/h8/coffee.rb