class Natour::MapGeoAdmin

Public Class Methods

new(port: 0) click to toggle source
# File lib/natour/map_geo_admin.rb, line 10
def initialize(port: 0)
  @doc_root = Dir.mktmpdir
  FileUtils.cp_r("#{__dir__}/data/js", @doc_root)
  event = Concurrent::Event.new
  @server = WEBrick::HTTPServer.new(
    StartCallback: -> { event.set },
    Logger: WEBrick::Log.new(File.open(File::NULL, 'w')),
    AccessLog: [],
    DocumentRoot: @doc_root,
    BindAddress: 'localhost',
    Port: port
  )
  @server.mount('/map', MapServlet)
  @thread = Thread.new { @server.start }
  event.wait
  @browser = Ferrum::Browser.new(
    slowmo: 2.0,
    window_size: [5000, 5000],
    browser_options: { 'no-sandbox': nil }
  )
end
open(*args) { |map| ... } click to toggle source
# File lib/natour/map_geo_admin.rb, line 56
def self.open(*args)
  map = MapGeoAdmin.new(*args)
  return map unless block_given?

  yield(map)
ensure
  map&.close
end

Public Instance Methods

close() click to toggle source
# File lib/natour/map_geo_admin.rb, line 32
def close
  @browser.quit
  @server.shutdown
  @thread.join
  FileUtils.remove_entry(@doc_root)
end
save_image(filename, tracks: [], layers: [], size: [1200, 900]) click to toggle source
# File lib/natour/map_geo_admin.rb, line 39
def save_image(filename, tracks: [], layers: [], size: [1200, 900])
  FileUtils.cp(tracks, @doc_root)
  FileUtils.mkdir_p(Pathname(filename).dirname)
  uri = URI("http://#{@server[:BindAddress]}:#{@server[:Port]}/map")
  uri.query = URI.encode_www_form(
    tracks: tracks.map { |track| Pathname(track).basename }.join(','),
    layers: layers.join(','),
    size: size.map { |dim| dim.is_a?(String) ? dim : "#{dim}px" }.join(',')
  )
  @browser.goto(uri)
  @browser.screenshot(
    path: filename,
    quality: 100,
    selector: '.map'
  )
end