diff --git a/attentive.gemspec b/attentive.gemspec index 9b24c00..6cd73e8 100644 --- a/attentive.gemspec +++ b/attentive.gemspec @@ -33,5 +33,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'thor' gem.add_dependency 'backbone-rails' gem.add_dependency 'rack', '~> 1.4.0' + + gem.add_dependency 'selenium-webdriver' end diff --git a/bin/attentive b/bin/attentive index f4c1239..cade9d5 100755 --- a/bin/attentive +++ b/bin/attentive @@ -113,6 +113,47 @@ class Attentive::CLI < Thor system %{git commit -a -m "Update published site"} system %{git checkout master} end + + desc 'export', 'Export each slide as a .png file using Selenium' + def export + puts "Exporting to static HTML..." + + static + + require 'selenium-webdriver' + + browser = Selenium::WebDriver.for(:firefox) + + browser.navigate.to "file://#{Dir.pwd}/_site/index.html" + + browser.execute_script('window.resizeTo(1024, 768)') + + get_current_slide = lambda { ((browser.execute_script('return document.location.href') || '')[%r{#(\d+)$}, 1] || -1).to_i } + + FileUtils.rm_rf '_export' + FileUtils.mkdir_p '_export' + + while (current_slide = get_current_slide.call) == -1 + sleep 0.1 + end + + while true do + browser.save_screenshot("_export/#{current_slide}.png") + + browser.find_element(:css, 'body').click + + sleep 1 + + next_slide = get_current_slide.call + + break if next_slide == current_slide + + current_slide = next_slide + end + ensure + browser.close if browser + end end Attentive::CLI.start + diff --git a/lib/assets/javascripts/attentive/presentation.js.coffee b/lib/assets/javascripts/attentive/presentation.js.coffee index 8a646f5..3127fd4 100644 --- a/lib/assets/javascripts/attentive/presentation.js.coffee +++ b/lib/assets/javascripts/attentive/presentation.js.coffee @@ -34,8 +34,9 @@ class Attentive.Presentation start: -> @timer.render() - document.addEventListener('click', @handleClick, false) document.addEventListener('keydown', @handleKeyDown, false) + document.addEventListener('mousedown', @handleMouseDown, false) + document.addEventListener('mouseup', @handleMouseUp, false) window.addEventListener('resize', _.throttle(@calculate, 500), false) imageWait = null @@ -59,8 +60,18 @@ class Attentive.Presentation handlePopState: (e) => this.advanceTo(this.slideFromLocation()) - handleClick: (e) => - this.advance() if e.target.tagName != 'A' + handleMouseDown: (e) => + @startSwipeX = e.x + + handleMouseUp: (e) => + distance = @startSwipeX - e.x + if Math.abs(distance) > 10 + if distance < 0 + this.advance(-1) + else + this.advance(1) + else + this.advance() if e.target.tagName != 'A' handleKeyDown: (e) => switch e.keyCode diff --git a/lib/attentive.rb b/lib/attentive.rb index 037fb96..3cd9d0a 100644 --- a/lib/attentive.rb +++ b/lib/attentive.rb @@ -2,6 +2,7 @@ require "attentive/version" module Attentive autoload :Server, 'attentive/server' + autoload :Export, 'attentive/export' class << self attr_accessor :title, :has_presentation, :use_pygments_command_line diff --git a/lib/attentive/server.rb b/lib/attentive/server.rb index d523526..86b2a41 100644 --- a/lib/attentive/server.rb +++ b/lib/attentive/server.rb @@ -7,6 +7,7 @@ require 'sinatra' require 'nokogiri' require 'rdiscount' require 'sinatra/base' +require 'pygments' require 'rack/builder' @@ -30,13 +31,12 @@ module Attentive @sprockets_env ||= Sprockets::EnvironmentWithVendoredGems.new end - def self.start(options) + def self.start(options, &block) require 'rack' require 'coffee_script' require 'sass' require 'tilt/coffee' - require 'pygments' if !Attentive.use_pygments_command_line? # make sure pygments is ready before starting a new thread @@ -44,6 +44,8 @@ module Attentive end Rack::Handler.default.run(Attentive::Server, :Port => options[:port]) do |server| + block.call(server) if block + trap(:INT) do server.shutdown if server.respond_to?(:server) server.stop if server.respond_to?(:stop)