class Opal::Builder
def self.runtime
def self.runtime core_dir = Opal.core_dir load_order = File.join core_dir, 'load_order' result = [] corelib = File.read(load_order).strip.split.map do |c| File.read File.join(core_dir, "#{c}.rb") end methods = Parser::METHOD_NAMES.map { |f, t| "'#{f}': '$#{t}$'" } runtime = File.read(File.join core_dir, 'runtime.js') corelib = Opal.parse corelib.join("\n") [ "/*!", " * Opal v#{Opal::VERSION}", " * http://opalrb.org", " *", " * Copyright 2012, Adam Beynon", " * Released under the MIT License", " */", "(function(undefined) {", runtime, "var method_names = {#{ methods.join ', ' }},", "reverse_method_names = {};", "for (var id in method_names) {", "reverse_method_names[method_names[id]] = id;", "}", corelib, "}).call(this);" ].join("\n") end
def build
def build unless out = @options[:out] # ... out = "out.js" end # puts " - Building to #{out}" files = files_for @sources # puts " - files: #{files.inspect}" FileUtils.mkdir_p File.dirname(out) build_to files, out end
def build_file(file)
def build_file(file) @parser.parse File.read(file) end
def build_to(files, out)
def build_to(files, out) @parser = Parser.new File.open(out, 'w+') do |o| files.each { |file| o.puts build_file(file) } end end
def files_for(sources)
def files_for(sources) files = [] sources.each do |s| if File.directory? s files.push *Dir[File.join s, '**/*.rb'] elsif File.extname(s) == '.rb' files << s end end files end
def initialize(options = {})
def initialize(options = {}) @sources = Array(options[:files]) @options = options end