lib/flammarion/revelator.rb in flammarion-0.2.1 vs lib/flammarion/revelator.rb in flammarion-0.3.0

- old
+ new

@@ -1,130 +1,130 @@ -require 'ostruct' -require 'launchy' -require 'timeout' - -module Flammarion - # Raised when flammarion cannot find any way to display an engraving. - # On Linux, Flammarion will first try to launch Electron using the command - # +electron+. If that fails, it will try common aliases of Google Chrome. If - # none of them execute succesfully, it will raise this error. On Windows, it - # will try to launch Google Chrome from Program Files (x86). If chrome has - # been installed somewhere else, the user can set the environment variable - # FLAMMARION_REVELATOR_PATH to point to +chrome.exe+. - # @see http://electron.atom.io/ - # @see http://www.google.com/chrome/ - class SetupError < StandardError; end - - # @api private - # @todo This all needs a lot of clean up - module Revelator - CHROME_PATH = ENV["FLAMMARION_REVELATOR_PATH"] || 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' - - def open_a_window(options = {}) - development_mode = Flammarion.development_mode? - host_path = File.absolute_path(File.join(File.dirname(File.absolute_path(__FILE__)), "/../html/build/index.html")) - host_path = `cygpath -w '#{host_path}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" - host = "file://#{host_path}" - host = "http://localhost:4567/" if development_mode - - @expect_title = options[:title] || "Flammarion" - url = "#{host}?path=#{@window_id}&port=#{server.port}&title=#{@expect_title}" - @browser_options = options.merge({url: url, development_mode: development_mode}) - @requested_browser = ENV["FLAMMARION_BROWSER"] || options[:browser] - - @browser = @@browsers.find do |browser| - next if @requested_browser and browser.name.to_s != @requested_browser - begin - __send__(browser.name, @browser_options) - rescue Exception - next - end - end - - raise SetupError.new("You must have either electron or google-chrome installed and accesible via your path.") unless @browser - end - - # @api private - def wait_for_a_connection - Timeout.timeout(20) { sleep 0.01 while @sockets.empty? } - rescue Timeout::Error - raise SetupError.new("Timed out while waiting for a connecting using #{@browser.name}.") - end - - private - @@browsers = [] - def self.browser(name, &block) - @@browsers << OpenStruct.new(name: name, method:define_method(name, block)) - end - - browser :osx do |options| - return false unless RbConfig::CONFIG["host_os"] =~ /darwin|mac os/ - executable = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - @chrome.in, @chrome.out, @chrome.err, @chrome.thread = Open3.popen3("'#{executable}' --app='#{options[:url]}'") - return true if @chrome.in - end - - browser :electron do |options| - if which('electron') then - electron_path = "#{File.dirname(File.absolute_path(__FILE__))}/../../electron" - electron_path = `cygpath -w #{electron_path}`.strip if RbConfig::CONFIG["host_os"] == "cygwin" - Process.detach(spawn("electron '#{electron_path}' '#{options[:url]}' #{options[:width]} #{options[:height]}")) - return true - end - false - end - - browser :chrome_windows do |options| - return false unless RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ - file_path = File.absolute_path(File.join(File.dirname(__FILE__), "..")) - file_path = `cygpath -w '#{file_path}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" - resource = %[file\://#{file_path}/html/build/index.html] - resource = "http://localhost:4567/" if options[:development_mode] - chrome_path = CHROME_PATH - chrome_path = `cygpath -u '#{CHROME_PATH}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" - return false unless File.exist?(chrome_path) - Process.detach(spawn(chrome_path, %[--app=#{resource}?path=#{@window_id}&port=#{server.port}&title="#{options[:title] || "Flammarion%20Engraving"}"])) - end - - browser :chrome do |options| - %w[google-chrome google-chrome-stable chromium chromium-browser chrome].each do |executable| - next unless which(executable) - @chrome.in, @chrome.out, @chrome.err, @chrome.thread = Open3.popen3("#{executable} --app='#{options[:url]}'") - return true if @chrome.in - end - return false - end - - browser :www do |options| - # Last ditch effort to display something - Launchy.open(options[:url].gsub(/\s/, "%20")) do |error| - return false - end - return true - end - - def which(cmd) - exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] - ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| - exts.each do |ext| - exe = File.join(path, "#{cmd}#{ext}") - return exe if File.executable?(exe) && !File.directory?(exe) - end - end - return nil - end - end - - private - def self.development_mode? - if RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ - development_mode = ENV["FLAMMARION_DEVELOPMENT"] == "true" - else - development_mode = system("lsof -i:#{4567}", out: '/dev/null') and File.exist?("#{File.dirname(__FILE__)}/../html/source/index.html.slim") - end - end - - def self.development_mode=(turnOn) - raise StandardError.new("Can't turn on development mode on unix system. (Just start the middleman server, and flammarion will detect it automatically.") unless RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ - ENV["FLAMMARION_DEVELOPMENT"] = "true" - end -end +require 'ostruct' +require 'launchy' +require 'timeout' + +module Flammarion + # Raised when flammarion cannot find any way to display an engraving. + # On Linux, Flammarion will first try to launch Electron using the command + # +electron+. If that fails, it will try common aliases of Google Chrome. If + # none of them execute succesfully, it will raise this error. On Windows, it + # will try to launch Google Chrome from Program Files (x86). If chrome has + # been installed somewhere else, the user can set the environment variable + # FLAMMARION_REVELATOR_PATH to point to +chrome.exe+. + # @see http://electron.atom.io/ + # @see http://www.google.com/chrome/ + class SetupError < StandardError; end + + # @api private + # @todo This all needs a lot of clean up + module Revelator + CHROME_PATH = ENV["FLAMMARION_REVELATOR_PATH"] || 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' + + def open_a_window(options = {}) + development_mode = Flammarion.development_mode? + host_path = File.absolute_path(File.join(File.dirname(File.absolute_path(__FILE__)), "/../html/build/index.html")) + host_path = `cygpath -w '#{host_path}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" + host = "file://#{host_path}" + host = "http://localhost:4567/" if development_mode + + @expect_title = options[:title] || "Flammarion" + url = "#{host}?path=#{@window_id}&port=#{server.port}&title=#{@expect_title}" + @browser_options = options.merge({url: url, development_mode: development_mode}) + @requested_browser = ENV["FLAMMARION_BROWSER"] || options[:browser] + + @browser = @@browsers.find do |browser| + next if @requested_browser and browser.name.to_s != @requested_browser + begin + __send__(browser.name, @browser_options) + rescue Exception + next + end + end + + raise SetupError.new("You must have either electron or google-chrome installed and accesible via your path.") unless @browser + end + + # @api private + def wait_for_a_connection + Timeout.timeout(20) { sleep 0.01 while @sockets.empty? } + rescue Timeout::Error + raise SetupError.new("Timed out while waiting for a connecting using #{@browser.name}.") + end + + private + @@browsers = [] + def self.browser(name, &block) + @@browsers << OpenStruct.new(name: name, method:define_method(name, block)) + end + + browser :osx do |options| + return false unless RbConfig::CONFIG["host_os"] =~ /darwin|mac os/ + executable = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" + @chrome.in, @chrome.out, @chrome.err, @chrome.thread = Open3.popen3("'#{executable}' --app='#{options[:url]}'") + return true if @chrome.in + end + + browser :electron do |options| + if which('electron') then + electron_path = "#{File.dirname(File.absolute_path(__FILE__))}/../../electron" + electron_path = `cygpath -w '#{electron_path}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" + Process.detach(spawn(%|electron "#{electron_path}" "#{options[:url]}" #{options[:width]} #{options[:height]}|)) + return true + end + false + end + + browser :chrome_windows do |options| + return false unless RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ + file_path = File.absolute_path(File.join(File.dirname(__FILE__), "..")) + file_path = `cygpath -w '#{file_path}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" + resource = %[file\://#{file_path}/html/build/index.html] + resource = "http://localhost:4567/" if options[:development_mode] + chrome_path = CHROME_PATH + chrome_path = `cygpath -u '#{CHROME_PATH}'`.strip if RbConfig::CONFIG["host_os"] == "cygwin" + return false unless File.exist?(chrome_path) + Process.detach(spawn(chrome_path, %[--app=#{resource}?path=#{@window_id}&port=#{server.port}&title="#{options[:title] || "Flammarion%20Engraving"}"])) + end + + browser :chrome do |options| + %w[google-chrome google-chrome-stable chromium chromium-browser chrome].each do |executable| + next unless which(executable) + @chrome.in, @chrome.out, @chrome.err, @chrome.thread = Open3.popen3("#{executable} --app='#{options[:url]}'") + return true if @chrome.in + end + return false + end + + browser :www do |options| + # Last ditch effort to display something + Launchy.open(options[:url].gsub(/\s/, "%20")) do |error| + return false + end + return true + end + + def which(cmd) + exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] + ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| + exts.each do |ext| + exe = File.join(path, "#{cmd}#{ext}") + return exe if File.executable?(exe) && !File.directory?(exe) + end + end + return nil + end + end + + private + def self.development_mode? + if RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ + development_mode = ENV["FLAMMARION_DEVELOPMENT"] == "true" + else + development_mode = system("lsof -i:#{4567}", out: '/dev/null') and File.exist?("#{File.dirname(__FILE__)}/../html/source/index.html.slim") + end + end + + def self.development_mode=(turnOn) + raise StandardError.new("Can't turn on development mode on unix system. (Just start the middleman server, and flammarion will detect it automatically.") unless RbConfig::CONFIG["host_os"] =~ /cygwin|mswin|mingw/ + ENV["FLAMMARION_DEVELOPMENT"] = "true" + end +end