Sha256: a0fcaf2727c7544f81c980dc1715718f37e9be6073e67fdea9d489f31121031b

Contents?: true

Size: 1.97 KB

Versions: 8

Compression:

Stored size: 1.97 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 noglobals: true
      @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

8 entries across 8 versions & 1 rubygems

Version Path
h8-0.5.5 lib/h8/coffee.rb
h8-0.5.4 lib/h8/coffee.rb
h8-0.5.2 lib/h8/coffee.rb
h8-0.5.1 lib/h8/coffee.rb
h8-0.5.0 lib/h8/coffee.rb
h8-0.4.11 lib/h8/coffee.rb
h8-0.4.10 lib/h8/coffee.rb
h8-0.4.8 lib/h8/coffee.rb