metadin
clone your own copy | download snapshot

Snapshots | iceberg

Inside this repository

app.rb
application/x-ruby

Download raw (4.4 KB)

#
# metaflop - web interface
# © 2012 by alexis reigel
# www.metaflop.com
#
# licensed under gpl v3
#

# encoding: UTF-8
require 'sinatra'
require 'sinatra/reloader'
require 'sinatra/config_file'
require 'sinatra/simple-navigation'
require 'sass'
require 'mustache/sinatra'
require 'time'
require 'data_mapper' # metagem, requires common plugins too.
require './lib/metaflop'
require './lib/url'

class App < Sinatra::Application

  configure do
    register Sinatra::ConfigFile
    config_file ['./config.yml', './db.yml']

    register Sinatra::SimpleNavigation

    # setup the tmp dir where the generated fonts go
    tmp_dir = "/tmp/metaflop"
    FileUtils.rm_rf(tmp_dir)
    Dir.mkdir(tmp_dir)

    require './views/layout'
    register Mustache::Sinatra

    set :mustache, {
      :views => './views',
      :templates => './views'
    }

    mime_type :otf, 'font/opentype'

    enable :sessions

    # db
    DataMapper.setup(:default, {
      :adapter  => settings.db[:adapter],
      :host     => settings.db[:host],
      :username => settings.db[:username],
      :password => settings.db[:password],
      :database => settings.db[:database]
    })

    DataMapper.finalize
    Url.auto_upgrade!
  end

  configure :development do
    register Sinatra::Reloader
    also_reload '**/*.rb'
    dont_reload '**/*spec.rb'
  end

  configure :production do
    # logging
    log_dir = "log/rack/"
    Dir.mkdir(log_dir) unless Dir.exist? log_dir
    logger = File.new("#{log_dir}#{Time.new.iso8601}.log", 'w+')
    $stderr.reopen(logger)
    $stdout.reopen(logger)
  end

  before do
    @main_navigation = render_navigation :context => :main
    @meta_navigation = render_navigation :context => :meta
  end

  get '/' do
    mustache :news
  end

  get '/modulator' do
    mf = mf_instance_from_request
    @font_parameters = mf.font_parameters
    @active_fontface = mf.font_settings.fontface

    mustache :modulator
  end

  # creates a shortened url for the current params (i.e. font setting)
  get '/modulator/font/create' do
    Url.create(:params => params)[:short]
  end

  get '/modulator/font/:url' do |url|
    url = Url.first(:short => url)

    if url.nil?
      redirect '/'
    end

    mf = mf_instance_from_request url[:params]
    @font_parameters = mf.font_parameters
    @active_fontface = mf.font_settings.fontface

    mustache :modulator
  end

  # redirect for legacy short urls
  get '/font/:url' do |url|
    redirect to "/modulator/font/#{url}"
  end

  get '/assets/css/:name.scss' do |name|
    require './views/scss/bourbon/lib/bourbon.rb'
    content_type :css
    scss name.to_sym, :layout => false
  end

  get '/modulator/preview/:type' do |type|
    mf = mf_instance_from_request
    method = "preview_#{type}"
    if mf.respond_to? method
      image = mf.method(method).call
      [image ? 200 : 404, { 'Content-Type' => 'image/gif' }, image]
    else
      not_found "The preview type could not be found"
    end
  end

  get '/modulator/export/font/:type/:face/:hash' do |type, face, hash|
    mf = Metaflop.new({ :out_dir => out_dir, :font_hash => hash, :fontface => face })
    mf.settings = settings.metaflop
    mf.logger = logger
    method = "font_#{type}"
    if mf.respond_to? method
      file = mf.method(method).call
      attachment file[:name]
      file[:data]
    else
      not_found "The font type is not supported"
    end
  end

  get '/:page/partial' do |page|
    mf = mf_instance_from_request
    @font_parameters = mf.font_parameters
    @active_fontface = mf.font_settings.fontface

    mustache page.to_sym, :layout => false
  end

  get '/:page/?:subpage?' do |page, subpage|
    if settings.respond_to? page
      @settings = settings.method(page).call
    end

    unless subpage.nil?
      @subpage = subpage
    end

    mustache page.to_sym
  end

  def out_dir
    session[:id] ||= SecureRandom.urlsafe_base64
    "/tmp/metaflop/#{session[:id]}"
  end

  def mf_instance_from_request(params = params)
    # map all query params
    args = { :out_dir => out_dir }
    (FontParameters::VALID_PARAMETERS_KEYS + FontSettings::VALID_OPTIONS_KEYS).each do |key|
      # query params come in with dashes -> replace by underscores to match properties
      value = params[key.to_s.gsub("_", "-")]

      # whitelist allowed characters
      args[key] = value.delete "^a-zA-Z0-9., " if value && !value.empty?
    end

    mf = Metaflop.new(args)
    mf.settings = settings.metaflop
    mf.logger = logger

    mf
  end

end