class Markedly::App

Public Class Methods

new(source, options = {}) click to toggle source
# File lib/markedly/app.rb, line 12
def initialize(source, options = {})
  @document = Document.new(source, options)
  @options = options
end
run!(source, options = {}) click to toggle source
# File lib/markedly/app.rb, line 8
def self.run!(source, options = {})
  App.new(source, options).run!
end

Public Instance Methods

run!() click to toggle source
# File lib/markedly/app.rb, line 17
def run!
  @document.convert
  puts "Open '%s'" % @document.uri
  Launchy.open(@document.uri)

  EM.run do

    @channel = EM::Channel.new

    debug "Start WebSocket Server (ws://localhost:#{@document.port})"
    EM::WebSocket.start(host: '0.0.0.0', port: @document.port) do |ws|
      ws.onopen do
        subscriber = @channel.subscribe do |message|
          ws.send(message)
        end

        debug "client #{subscriber} connected"

        ws.onclose do
          @channel.unsubscribe(subscriber)
          debug "client #{subscriber} closed"
        end
      end
    end

    EM.defer do
      mtime = last_mtime = File.mtime(@document.source)
      loop do
        mtime = File.mtime(@document.source)
        if mtime > last_mtime
          puts "file modified"
          @document.convert
          @channel.push 'updated'
        end
        last_mtime = mtime
        sleep @options[:interval]
      end
    end
  end
end

Private Instance Methods

debug(message) click to toggle source
# File lib/markedly/app.rb, line 60
def debug(message)
  puts message if @options[:debug]
end