make an engine of the cms
5
.gitignore
vendored
@ -7,3 +7,8 @@ rerun.txt
|
|||||||
uploads
|
uploads
|
||||||
spec/tmp
|
spec/tmp
|
||||||
public/sites
|
public/sites
|
||||||
|
public/uploads
|
||||||
|
pkg
|
||||||
|
*.gemspec
|
||||||
|
rails_3_gems
|
||||||
|
doc/performance.txt
|
||||||
|
16
Gemfile
@ -8,14 +8,20 @@ gem "liquid"
|
|||||||
gem "bson_ext", ">= 1.0.1"
|
gem "bson_ext", ">= 1.0.1"
|
||||||
gem "mongo_ext"
|
gem "mongo_ext"
|
||||||
gem "mongoid", ">= 2.0.0.beta6"
|
gem "mongoid", ">= 2.0.0.beta6"
|
||||||
gem "mongoid_acts_as_tree", :git => 'git://github.com/evansagge/mongoid_acts_as_tree.git'
|
gem "mongoid_acts_as_tree", ">= 0.1.2"
|
||||||
gem "warden"
|
gem "warden"
|
||||||
gem "devise", ">= 1.1.rc0"
|
gem "devise", ">= 1.1.rc0"
|
||||||
gem "haml", '>= 3.0.1' #, :git => 'git://github.com/nex3/haml.git'
|
gem "haml", '>= 3.0.1'
|
||||||
gem "formtastic", :git => 'git://github.com/justinfrench/formtastic.git', :branch => 'rails3'
|
|
||||||
gem "mongoid_acts_as_tree", :git => 'git://github.com/evansagge/mongoid_acts_as_tree.git'
|
|
||||||
gem "carrierwave", :git => "http://github.com/jnicklas/carrierwave.git"
|
|
||||||
gem "rmagick"
|
gem "rmagick"
|
||||||
|
gem "jeweler"
|
||||||
|
gem "mimetype-fu", :require => "mimetype_fu"
|
||||||
|
gem "formtastic-rails3", :require => "formtastic"
|
||||||
|
gem "carrierwave-rails3", :require => "carrierwave"
|
||||||
|
|
||||||
|
# gem 'formtastic-rails3', :require => 'formtastic', :path => 'rails_3_gems/formtastic'
|
||||||
|
# gem "formtastic", :git => 'git://github.com/justinfrench/formtastic.git', :branch => 'rails3'
|
||||||
|
# gem "carrierwave", :git => "http://github.com/jnicklas/carrierwave.git"
|
||||||
|
# gem "carrierwave", :path => 'rails_3_gems/carrierwave'
|
||||||
|
|
||||||
|
|
||||||
# Development environment
|
# Development environment
|
||||||
|
22
Rakefile
@ -8,3 +8,25 @@ require 'rake/testtask'
|
|||||||
require 'rake/rdoctask'
|
require 'rake/rdoctask'
|
||||||
|
|
||||||
Rails::Application.load_tasks
|
Rails::Application.load_tasks
|
||||||
|
|
||||||
|
begin
|
||||||
|
require "jeweler"
|
||||||
|
Jeweler::Tasks.new do |gem|
|
||||||
|
gem.name = "locomotive_cms"
|
||||||
|
gem.summary = "Locomotive cms engine"
|
||||||
|
gem.files = Dir["Gemfile", "{lib}/**/*", "{app}/**/*", "{config}/**/*",
|
||||||
|
"{public}/stylesheets/**/*", "{public}/javascripts/**/*", "{public}/images/**/*",
|
||||||
|
"{vendor}/**/*"]
|
||||||
|
# other fields that would normally go in your gemspec
|
||||||
|
# like authors, email and has_rdoc can also be included here
|
||||||
|
bundle = Bundler::Definition.from_gemfile('Gemfile')
|
||||||
|
bundle.dependencies.each do |dep|
|
||||||
|
if dep.groups.include?(:default)
|
||||||
|
gem.add_dependency(dep.name, dep.requirement.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
puts "Jeweler or one of its dependencies is not installed."
|
||||||
|
end
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ module Admin
|
|||||||
|
|
||||||
include Locomotive::Routing::SiteDispatcher
|
include Locomotive::Routing::SiteDispatcher
|
||||||
|
|
||||||
layout 'admin'
|
layout 'admin/application'
|
||||||
|
|
||||||
before_filter :authenticate_account!
|
before_filter :authenticate_account!
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ module Admin
|
|||||||
|
|
||||||
include Locomotive::Routing::SiteDispatcher
|
include Locomotive::Routing::SiteDispatcher
|
||||||
|
|
||||||
layout 'login'
|
layout 'admin/login'
|
||||||
|
|
||||||
before_filter :require_site
|
before_filter :require_site
|
||||||
|
|
||||||
|
15
app/controllers/admin/rendering_controller.rb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
module Admin
|
||||||
|
class RenderingController < ActionController::Base
|
||||||
|
|
||||||
|
include Locomotive::Routing::SiteDispatcher
|
||||||
|
|
||||||
|
include Locomotive::Render
|
||||||
|
|
||||||
|
before_filter :require_site
|
||||||
|
|
||||||
|
def show
|
||||||
|
render_locomotive_page
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
@ -3,7 +3,7 @@ module Admin
|
|||||||
|
|
||||||
include Locomotive::Routing::SiteDispatcher
|
include Locomotive::Routing::SiteDispatcher
|
||||||
|
|
||||||
layout 'login'
|
layout 'admin/login'
|
||||||
|
|
||||||
before_filter :require_site
|
before_filter :require_site
|
||||||
|
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
|
||||||
# before_filter :set_locale
|
|
||||||
#
|
|
||||||
# protected
|
|
||||||
#
|
|
||||||
# def set_locale
|
|
||||||
# I18n.locale = 'fr'
|
|
||||||
# end
|
|
||||||
end
|
end
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
class PagesController < ActionController::Base
|
|
||||||
|
|
||||||
include Locomotive::Routing::SiteDispatcher
|
|
||||||
|
|
||||||
include Locomotive::Render
|
|
||||||
|
|
||||||
before_filter :require_site
|
|
||||||
|
|
||||||
def show
|
|
||||||
render_locomotive_page
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
@ -1,4 +1,13 @@
|
|||||||
module Admin::BaseHelper
|
module Admin::BaseHelper
|
||||||
|
|
||||||
|
def title(title = nil)
|
||||||
|
if title.nil?
|
||||||
|
@content_for_title
|
||||||
|
else
|
||||||
|
@content_for_title = title
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def admin_menu_item(name, url)
|
def admin_menu_item(name, url)
|
||||||
label = content_tag(:em) + escape_once(' ') + t("admin.shared.menu.#{name}")
|
label = content_tag(:em) + escape_once(' ') + t("admin.shared.menu.#{name}")
|
||||||
@ -28,4 +37,18 @@ module Admin::BaseHelper
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def growl_message
|
||||||
|
if not flash.empty?
|
||||||
|
%{
|
||||||
|
$(document).ready(function() {
|
||||||
|
$.growl("#{flash.keys.first}", "#{flash.values.first}");
|
||||||
|
});
|
||||||
|
}.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def nocoffee_tag
|
||||||
|
link_to content_tag(:em, 'no') + 'Coffee', 'http://www.nocoffee.fr', :id => 'nocoffee'
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
17
app/helpers/admin/login_helper.rb
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
module Admin::LoginHelper
|
||||||
|
|
||||||
|
def login_flash_message
|
||||||
|
if not flash.empty?
|
||||||
|
content_tag :div, flash.values.first,
|
||||||
|
:id => "flash-#{flash.keys.first}",
|
||||||
|
:class => 'application-message'
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def login_button_tag(label)
|
||||||
|
content_tag(:button, content_tag(:span, label), :type => 'submit', :class => 'button')
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -1,40 +0,0 @@
|
|||||||
module ApplicationHelper
|
|
||||||
|
|
||||||
def title(title = nil)
|
|
||||||
if title.nil?
|
|
||||||
@content_for_title
|
|
||||||
else
|
|
||||||
@content_for_title = title
|
|
||||||
''
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def flash_message
|
|
||||||
if not flash.empty?
|
|
||||||
content_tag :div, flash.values.first,
|
|
||||||
:id => "flash-#{flash.keys.first}",
|
|
||||||
:class => 'application-message'
|
|
||||||
else
|
|
||||||
''
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def growl_message
|
|
||||||
if not flash.empty?
|
|
||||||
%{
|
|
||||||
$(document).ready(function() {
|
|
||||||
$.growl("#{flash.keys.first}", "#{flash.values.first}");
|
|
||||||
});
|
|
||||||
}.to_s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def nocoffee_tag
|
|
||||||
link_to content_tag(:em, 'no') + 'Coffee', 'http://www.nocoffee.fr', :id => 'nocoffee'
|
|
||||||
end
|
|
||||||
|
|
||||||
def submit_button_tag(label)
|
|
||||||
content_tag(:button, content_tag(:span, label), :type => 'submit', :class => 'button')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
@ -1,9 +1,6 @@
|
|||||||
module Models
|
module Models
|
||||||
|
module Extensions
|
||||||
module Extensions
|
module Asset
|
||||||
|
|
||||||
module Asset
|
|
||||||
|
|
||||||
module Vignette
|
module Vignette
|
||||||
|
|
||||||
def vignette_url
|
def vignette_url
|
||||||
@ -37,10 +34,7 @@ module Models
|
|||||||
File.join("admin", "icons", "filetype", size.to_s, filename + ".png")
|
File.join("admin", "icons", "filetype", size.to_s, filename + ".png")
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Models
|
module Models
|
||||||
|
module Extensions
|
||||||
module Extensions
|
module Page
|
||||||
|
|
||||||
module Page
|
|
||||||
|
|
||||||
module Parts
|
module Parts
|
||||||
|
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
@ -50,12 +47,8 @@ module Models
|
|||||||
self.save
|
self.save
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Models
|
module Models
|
||||||
|
module Extensions
|
||||||
module Extensions
|
module Page
|
||||||
|
|
||||||
module Page
|
|
||||||
|
|
||||||
module Render
|
module Render
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
@ -16,10 +13,7 @@ module Models
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Models
|
module Models
|
||||||
|
module Extensions
|
||||||
module Extensions
|
module Page
|
||||||
|
|
||||||
module Page
|
|
||||||
|
|
||||||
module Tree
|
module Tree
|
||||||
|
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
@ -93,12 +90,8 @@ module Models
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -61,7 +61,7 @@ class AssetUploader < CarrierWave::Uploader::Base
|
|||||||
:audio => [/^audio/, 'application/ogg', 'application/x-mp3'],
|
:audio => [/^audio/, 'application/ogg', 'application/x-mp3'],
|
||||||
:pdf => ['application/pdf', 'application/x-pdf'],
|
:pdf => ['application/pdf', 'application/x-pdf'],
|
||||||
:stylesheet => ['text/css'],
|
:stylesheet => ['text/css'],
|
||||||
:javascript => ['text/javascript', 'text/js', 'application/x-javascript']
|
:javascript => ['text/javascript', 'text/js', 'application/x-javascript', 'application/javascript']
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,6 +6,21 @@ class ThemeAssetUploader < AssetUploader
|
|||||||
process :set_size
|
process :set_size
|
||||||
process :set_width_and_height
|
process :set_width_and_height
|
||||||
|
|
||||||
|
version :thumb do
|
||||||
|
process :resize_to_fill => [50, 50]
|
||||||
|
process :convert => 'png'
|
||||||
|
end
|
||||||
|
|
||||||
|
version :medium do
|
||||||
|
process :resize_to_fill => [80, 80]
|
||||||
|
process :convert => 'png'
|
||||||
|
end
|
||||||
|
|
||||||
|
version :preview do
|
||||||
|
process :resize_to_fit => [880, 1100]
|
||||||
|
process :convert => 'png'
|
||||||
|
end
|
||||||
|
|
||||||
def store_dir
|
def store_dir
|
||||||
"sites/#{model.site_id}/themes/#{model.id}"
|
"sites/#{model.site_id}/themes/#{model.id}"
|
||||||
end
|
end
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
- title t('.title')
|
- title t('.title')
|
||||||
|
|
||||||
= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f|
|
= semantic_form_for(resource, :as => resource_name, :url => password_path, :html => { :method => :put }) do |f|
|
||||||
|
|
||||||
= f.hidden_field :reset_password_token
|
= f.hidden_field :reset_password_token
|
||||||
|
|
||||||
.inner
|
.inner
|
||||||
= flash_message
|
= login_flash_message
|
||||||
|
|
||||||
= f.inputs do
|
= f.inputs do
|
||||||
= f.input :password, :label => t('.password'), :required => false
|
= f.input :password, :label => t('.password'), :required => false
|
||||||
= f.input :password_confirmation, :label => t('.password_confirmation'), :required => false
|
= f.input :password_confirmation, :label => t('.password_confirmation'), :required => false
|
||||||
|
|
||||||
%p.link
|
%p.link
|
||||||
= link_to t('.link'), new_account_session_path(resource_name)
|
= link_to t('.link'), new_account_session_path
|
||||||
|
|
||||||
.footer
|
.footer
|
||||||
= submit_button_tag t('admin.buttons.change_password')
|
= login_button_tag t('admin.buttons.change_password')
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
- title t('.title')
|
- title t('.title')
|
||||||
|
|
||||||
= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name)) do |f|
|
= semantic_form_for(resource, :as => resource_name, :url => password_path) do |f|
|
||||||
|
|
||||||
= f.hidden_field :reset_password_token
|
= f.hidden_field :reset_password_token
|
||||||
|
|
||||||
.inner
|
.inner
|
||||||
= flash_message
|
= login_flash_message
|
||||||
|
|
||||||
= f.inputs do
|
= f.inputs do
|
||||||
= f.input :email, :label => t('.email'), :required => false
|
= f.input :email, :label => t('.email'), :required => false
|
||||||
|
|
||||||
%p.link
|
%p.link
|
||||||
= link_to t('.link'), new_account_session_path(resource_name)
|
= link_to t('.link'), new_account_session_path
|
||||||
|
|
||||||
.footer
|
.footer
|
||||||
= submit_button_tag t('admin.buttons.send_password')
|
= login_button_tag t('admin.buttons.send_password')
|
@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
= semantic_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
|
= semantic_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
|
||||||
.inner
|
.inner
|
||||||
= flash_message
|
= login_flash_message
|
||||||
|
|
||||||
= f.inputs do
|
= f.inputs do
|
||||||
= f.input :email, :label => t('.email'), :required => false
|
= f.input :email, :label => t('.email'), :required => false
|
||||||
= f.input :password, :label => t('.password'), :required => false
|
= f.input :password, :label => t('.password'), :required => false
|
||||||
|
|
||||||
%p.link
|
%p.link
|
||||||
= link_to t('.link'), new_password_path(resource_name)
|
= link_to t('.link'), new_password_path
|
||||||
|
|
||||||
.footer
|
.footer
|
||||||
= submit_button_tag t('admin.buttons.login')
|
= login_button_tag t('admin.buttons.login')
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
%meta{ :name => 'locale', :content => I18n.locale }
|
%meta{ :name => 'locale', :content => I18n.locale }
|
||||||
|
|
||||||
= stylesheet_link_tag 'blueprint/screen', :media => 'screen'
|
= stylesheet_link_tag 'admin/blueprint/screen', :media => 'screen'
|
||||||
/ [if IE]
|
/ [if IE]
|
||||||
= stylesheet_link_tag 'blueprint/ie', :media => 'screen'
|
= stylesheet_link_tag 'admin/blueprint/ie', :media => 'screen'
|
||||||
|
|
||||||
= stylesheet_link_tag 'admin/layout', 'admin/plugins/toggle', 'admin/menu', 'admin/buttons', 'admin/formtastic', 'admin/formtastic_changes', 'admin/application', :media => 'screen', :cache => Rails.env.production?
|
= stylesheet_link_tag 'admin/layout', 'admin/plugins/toggle', 'admin/menu', 'admin/buttons', 'admin/formtastic', 'admin/formtastic_changes', 'admin/application', :media => 'screen', :cache => Rails.env.production?
|
||||||
|
|
||||||
= javascript_include_tag 'jquery', 'jquery.ui', 'rails', 'admin/plugins/toggle', 'admin/plugins/growl', 'admin/plugins/cookie', 'admin/application', :cache => Rails.env.production?
|
= javascript_include_tag 'admin/jquery', 'admin/jquery.ui', 'admin/rails', 'admin/plugins/toggle', 'admin/plugins/growl', 'admin/plugins/cookie', 'admin/application', :cache => Rails.env.production?
|
||||||
|
|
||||||
%script{ :type => 'text/javascript' }
|
%script{ :type => 'text/javascript' }
|
||||||
= find_and_preserve(growl_message)
|
= find_and_preserve(growl_message)
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
%head
|
%head
|
||||||
%title= escape_once("#{Locomotive.config.name} — #{current_site.name}")
|
%title= escape_once("#{Locomotive.config.name} — #{current_site.name}")
|
||||||
|
|
||||||
= stylesheet_link_tag 'blueprint/screen', 'admin/login', :media => 'screen'
|
= stylesheet_link_tag 'admin/blueprint/screen', 'admin/login', :media => 'screen'
|
||||||
/ [if IE]
|
/ [if IE]
|
||||||
= stylesheet_link_tag('blueprint/ie', :media => 'screen')
|
= stylesheet_link_tag('admin/blueprint/ie', :media => 'screen')
|
||||||
|
|
||||||
%body
|
%body
|
||||||
#wrapper
|
#wrapper
|
@ -1,8 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title><%= current_site.name %></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>...rendering liquid templates soon</h1>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,16 +1,7 @@
|
|||||||
require 'lib/locomotive.rb'
|
require File.dirname(__FILE__) + '/../../lib/locomotive.rb'
|
||||||
require 'lib/core_ext.rb'
|
require File.dirname(__FILE__) + '/../../lib/core_ext.rb'
|
||||||
|
|
||||||
Locomotive.configure do |config|
|
Locomotive.configure do |config|
|
||||||
config.default_domain = 'example.com'
|
config.default_domain = 'example.com'
|
||||||
|
|
||||||
config.lastest_items_nb = 5
|
config.lastest_items_nb = 5
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: embed them in Locomotive right after configure
|
|
||||||
ActionMailer::Base.default_url_options[:host] = Locomotive.config.default_domain + (Rails.env.development? ? ':3000' : '')
|
|
||||||
|
|
||||||
Rails.application.config.session_store :cookie_store, {
|
|
||||||
:key => '_locomotive_session',
|
|
||||||
:domain => ".#{Locomotive.config.default_domain}"
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
Locomotive::Application.configure do
|
# Locomotive::Application.configure do
|
||||||
config.generators do |g|
|
# config.generators do |g|
|
||||||
g.integration_tool :rspec
|
# g.integration_tool :rspec
|
||||||
g.test_framework :rspec
|
# g.test_framework :rspec
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
Locomotive::Application.routes.draw do |map|
|
# Locomotive::Application.routes.draw do |map|
|
||||||
|
Rails.application.routes.draw do |map|
|
||||||
|
|
||||||
constraints(Locomotive::Routing::DefaultConstraint) do
|
constraints(Locomotive::Routing::DefaultConstraint) do
|
||||||
root :to => 'home#show'
|
root :to => 'home#show'
|
||||||
@ -51,6 +52,6 @@ Locomotive::Application.routes.draw do |map|
|
|||||||
end
|
end
|
||||||
|
|
||||||
# magic urls
|
# magic urls
|
||||||
match '/' => 'pages#show'
|
match '/' => 'admin/rendering#show'
|
||||||
match '*path' => 'pages#show'
|
match '*path' => 'admin/rendering#show'
|
||||||
end
|
end
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
# class DeviseCreateAccounts < ActiveRecord::Migration
|
|
||||||
# def self.up
|
|
||||||
# create_table(:accounts) do |t|
|
|
||||||
# t.authenticatable :encryptor => :sha1, :null => false
|
|
||||||
# t.confirmable
|
|
||||||
# t.recoverable
|
|
||||||
# t.rememberable
|
|
||||||
# t.trackable
|
|
||||||
# # t.lockable
|
|
||||||
#
|
|
||||||
# t.timestamps
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# add_index :accounts, :email, :unique => true
|
|
||||||
# add_index :accounts, :confirmation_token, :unique => true
|
|
||||||
# add_index :accounts, :reset_password_token, :unique => true
|
|
||||||
# # add_index :accounts, :unlock_token, :unique => true
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# def self.down
|
|
||||||
# drop_table :accounts
|
|
||||||
# end
|
|
||||||
# end
|
|
5
doc/TODO
@ -1,4 +1,8 @@
|
|||||||
BOARD:
|
BOARD:
|
||||||
|
- make an engine:
|
||||||
|
- move initializers to lib/...
|
||||||
|
- write doc about setting up the parent app
|
||||||
|
x helpers do not work
|
||||||
- theme assets: disable version if not image
|
- theme assets: disable version if not image
|
||||||
- refactoring: CustomFields::CustomField => CustomFields::Field
|
- refactoring: CustomFields::CustomField => CustomFields::Field
|
||||||
- new types for custom field
|
- new types for custom field
|
||||||
@ -20,6 +24,7 @@ BACKLOG:
|
|||||||
|
|
||||||
BUGS:
|
BUGS:
|
||||||
- when assigning new layout, disabled parts show up :-( (js problem)
|
- when assigning new layout, disabled parts show up :-( (js problem)
|
||||||
|
- password resets
|
||||||
|
|
||||||
NICE TO HAVE:
|
NICE TO HAVE:
|
||||||
- asset collections: custom resizing if image
|
- asset collections: custom resizing if image
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
Before('@site_up') do
|
Before('@site_up') do
|
||||||
create_site_and_admin_account
|
create_site_and_admin_account
|
||||||
create_layout_samples
|
create_layout_samples
|
||||||
create_index_page
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Before('@authenticated') do
|
Before('@authenticated') do
|
||||||
@ -44,6 +43,8 @@ end
|
|||||||
def create_site_and_admin_account
|
def create_site_and_admin_account
|
||||||
@site = Factory(:site, :name => 'Locomotive test website', :subdomain => 'test')
|
@site = Factory(:site, :name => 'Locomotive test website', :subdomain => 'test')
|
||||||
@admin = Factory(:account, { :name => 'Admin', :email => 'admin@locomotiveapp.org' })
|
@admin = Factory(:account, { :name => 'Admin', :email => 'admin@locomotiveapp.org' })
|
||||||
|
@site.memberships.build :account => @admin, :admin => true
|
||||||
|
@site.save
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_layout_samples
|
def create_layout_samples
|
||||||
@ -55,9 +56,5 @@ def create_layout_samples
|
|||||||
<div id="main">\{\{ content_for_layout \}\}</div>
|
<div id="main">\{\{ content_for_layout \}\}</div>
|
||||||
</body>
|
</body>
|
||||||
</html>})
|
</html>})
|
||||||
Factory(:layout, :site => @site)
|
Factory(:layout, :site => @site)
|
||||||
end
|
|
||||||
|
|
||||||
def create_index_page
|
|
||||||
Factory(:page, :site => @site, :layout => @site.layouts.last, :parts => [PagePart.new(:slug => 'layout', :name => 'Body', :value => 'Hello world')])
|
|
||||||
end
|
end
|
35
lib/generators/locomotive_generator.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
class LocomotiveGenerator < Rails::Generators::NamedBase
|
||||||
|
class_option :update, :type => :boolean, :default => false,
|
||||||
|
:desc => "Just update public files, do not create seed"
|
||||||
|
|
||||||
|
def self.source_root
|
||||||
|
@_locomotive_source_root ||= File.dirname(__FILE__)
|
||||||
|
end
|
||||||
|
|
||||||
|
def copy_public_files
|
||||||
|
directory "../../public", "public", :recursive => true
|
||||||
|
exit(0) if options.update?
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# def invoke_model
|
||||||
|
# invoke "model", [name].concat(migration_columns),
|
||||||
|
# :timestamps => false, :test_framework => false, :migration => options.migration?
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# def add_model_config
|
||||||
|
# inject_into_class "app/models/#{file_name}.rb", class_name, <<-CONTENT
|
||||||
|
# include RailsMetrics::ORM::#{Rails::Generators.options[:rails][:orm].to_s.camelize}
|
||||||
|
# CONTENT
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# def add_application_config
|
||||||
|
# inject_into_class "config/application.rb", "Application", <<-CONTENT
|
||||||
|
# # Set rails metrics store
|
||||||
|
# config.rails_metrics.set_store = lambda { ::#{class_name} }
|
||||||
|
#
|
||||||
|
# CONTENT
|
||||||
|
# end
|
||||||
|
|
||||||
|
end
|
@ -3,9 +3,8 @@ require 'locomotive/configuration'
|
|||||||
require 'locomotive/liquid'
|
require 'locomotive/liquid'
|
||||||
require 'locomotive/mongoid'
|
require 'locomotive/mongoid'
|
||||||
|
|
||||||
|
|
||||||
module Locomotive
|
module Locomotive
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
attr_accessor :config
|
attr_accessor :config
|
||||||
|
|
||||||
@ -18,6 +17,19 @@ module Locomotive
|
|||||||
def self.configure
|
def self.configure
|
||||||
self.config ||= Configuration.new
|
self.config ||= Configuration.new
|
||||||
yield(self.config)
|
yield(self.config)
|
||||||
|
|
||||||
|
after_configure
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.after_configure
|
||||||
|
raise '[Error] Locomotive needs a default domain name' if Locomotive.config.default_domain.blank?
|
||||||
|
|
||||||
|
ActionMailer::Base.default_url_options[:host] = Locomotive.config.default_domain + (Rails.env.development? ? ':3000' : '')
|
||||||
|
|
||||||
|
Rails.application.config.session_store :cookie_store, {
|
||||||
|
:key => Locomotive.config.cookie_key,
|
||||||
|
:domain => ".#{Locomotive.config.default_domain}"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,5 +1,4 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
|
||||||
class Configuration
|
class Configuration
|
||||||
|
|
||||||
@@defaults = {
|
@@defaults = {
|
||||||
@ -8,7 +7,8 @@ module Locomotive
|
|||||||
:reserved_subdomains => %w{www admin email blog webmail mail support help site sites},
|
:reserved_subdomains => %w{www admin email blog webmail mail support help site sites},
|
||||||
# :forbidden_paths => %w{layouts snippets stylesheets javascripts assets admin system api},
|
# :forbidden_paths => %w{layouts snippets stylesheets javascripts assets admin system api},
|
||||||
:reserved_slugs => %w{stylesheets javascripts assets admin images api pages},
|
:reserved_slugs => %w{stylesheets javascripts assets admin images api pages},
|
||||||
:locales => %w{en fr}
|
:locales => %w{en fr},
|
||||||
|
:cookie_key => '_locomotive_session'
|
||||||
}
|
}
|
||||||
|
|
||||||
cattr_accessor :settings
|
cattr_accessor :settings
|
||||||
@ -62,8 +62,6 @@ module Locomotive
|
|||||||
else
|
else
|
||||||
send(:[], name.to_sym, &block)
|
send(:[], name.to_sym, &block)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,5 +1,2 @@
|
|||||||
Devise::SessionsController.class_eval do
|
Devise::SessionsController.class_eval do
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
32
lib/locomotive/engine.rb
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
puts "...Locomotive engine loaded"
|
||||||
|
|
||||||
|
# require 'liquid'
|
||||||
|
# require 'devise'
|
||||||
|
# require 'carrierwave'
|
||||||
|
# require 'formtastic'
|
||||||
|
# require 'mongoid'
|
||||||
|
# require 'mongoid_acts_as_tree'
|
||||||
|
|
||||||
|
require File.dirname(__FILE__) + '/../../vendor/plugins/custom_fields/init.rb'
|
||||||
|
|
||||||
|
module Locomotive
|
||||||
|
class Engine < Rails::Engine
|
||||||
|
|
||||||
|
initializer "locomotive.add_helpers" do |app|
|
||||||
|
path = [*ActionController::Base.helpers_path] << File.dirname(__FILE__) + "/../../app/helpers"
|
||||||
|
ActionController::Base.helpers_path = path
|
||||||
|
end
|
||||||
|
|
||||||
|
initializer "locomotive.require_dependencies" do
|
||||||
|
require 'bundler'
|
||||||
|
gemfile = Bundler::Definition.from_gemfile(root.join('Gemfile'))
|
||||||
|
specs = gemfile.dependencies.select do |d|
|
||||||
|
d.name != 'jeweler' and (d.groups & [:default, :production]).any?
|
||||||
|
end
|
||||||
|
specs.collect { |s| s.autorequire || [s.name] }.flatten.each do |r|
|
||||||
|
require r
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
@ -1,9 +1,7 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
class DbFileSystem
|
||||||
|
|
||||||
class DbFileSystem
|
|
||||||
|
|
||||||
# Works only with snippets
|
# Works only with snippets
|
||||||
def read_template_file(site, template_path)
|
def read_template_file(site, template_path)
|
||||||
raise FileSystemError, "Illegal snippet name '#{template_path}'" unless template_path =~ /^[^.\/][a-zA-Z0-9_\/]+$/
|
raise FileSystemError, "Illegal snippet name '#{template_path}'" unless template_path =~ /^[^.\/][a-zA-Z0-9_\/]+$/
|
||||||
@ -13,10 +11,8 @@ module Locomotive
|
|||||||
raise FileSystemError, "No such snippet '#{template_path}'" if snippet.nil?
|
raise FileSystemError, "No such snippet '#{template_path}'" if snippet.nil?
|
||||||
|
|
||||||
snippet.template
|
snippet.template
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,7 +1,5 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
|
||||||
|
|
||||||
module Drops
|
module Drops
|
||||||
|
|
||||||
class AssetCollections < ::Liquid::Drop
|
class AssetCollections < ::Liquid::Drop
|
||||||
@ -17,7 +15,5 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,12 +1,9 @@
|
|||||||
# Code taken from Mephisto sources (http://mephistoblog.com/)
|
# Code taken from Mephisto sources (http://mephistoblog.com/)
|
||||||
|
|
||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Drops
|
||||||
|
|
||||||
module Drops
|
|
||||||
|
|
||||||
class Base < ::Liquid::Drop
|
class Base < ::Liquid::Drop
|
||||||
|
|
||||||
class_inheritable_reader :liquid_attributes
|
class_inheritable_reader :liquid_attributes
|
||||||
write_inheritable_attribute :liquid_attributes, []
|
write_inheritable_attribute :liquid_attributes, []
|
||||||
attr_reader :source
|
attr_reader :source
|
||||||
@ -43,13 +40,11 @@ module Locomotive
|
|||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def liquify(*records, &block)
|
def liquify(*records, &block)
|
||||||
self.class.liquify(*records, &block)
|
self.class.liquify(*records, &block)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Drops
|
||||||
|
|
||||||
module Drops
|
|
||||||
|
|
||||||
class Content < Base
|
class Content < Base
|
||||||
|
|
||||||
@@forbidden_attributes = %w{_id _version _index}
|
@@forbidden_attributes = %w{_id _version _index}
|
||||||
@ -16,10 +13,7 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
module Drops
|
module Drops
|
||||||
|
|
||||||
class Contents < ::Liquid::Drop
|
class Contents < ::Liquid::Drop
|
||||||
|
|
||||||
def initialize(site)
|
def initialize(site)
|
||||||
@ -59,12 +56,8 @@ module Locomotive
|
|||||||
:total_pages => @collection.total_pages,
|
:total_pages => @collection.total_pages,
|
||||||
:per_page => @collection.per_page
|
:per_page => @collection.per_page
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Drops
|
||||||
|
|
||||||
module Drops
|
|
||||||
|
|
||||||
class Javascripts < ::Liquid::Drop
|
class Javascripts < ::Liquid::Drop
|
||||||
|
|
||||||
def initialize(site)
|
def initialize(site)
|
||||||
@ -16,9 +13,6 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Drops
|
||||||
|
|
||||||
module Drops
|
|
||||||
|
|
||||||
class Stylesheets < ::Liquid::Drop
|
class Stylesheets < ::Liquid::Drop
|
||||||
|
|
||||||
def initialize(site)
|
def initialize(site)
|
||||||
@ -17,8 +14,6 @@ module Locomotive
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Filters
|
||||||
|
|
||||||
module Filters
|
|
||||||
|
|
||||||
module Date
|
module Date
|
||||||
|
|
||||||
def localized_date(input, *args)
|
def localized_date(input, *args)
|
||||||
@ -27,10 +24,7 @@ module Locomotive
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
::Liquid::Template.register_filter(Date)
|
::Liquid::Template.register_filter(Date)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Filters
|
||||||
|
|
||||||
module Filters
|
|
||||||
|
|
||||||
module Html
|
module Html
|
||||||
|
|
||||||
# Write the link to a stylesheet resource
|
# Write the link to a stylesheet resource
|
||||||
@ -112,7 +109,6 @@ module Locomotive
|
|||||||
|
|
||||||
::Liquid::Template.register_filter(Html)
|
::Liquid::Template.register_filter(Html)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
module Filters
|
||||||
module Filters
|
|
||||||
|
|
||||||
module Misc
|
module Misc
|
||||||
|
|
||||||
def underscore(input)
|
def underscore(input)
|
||||||
@ -28,8 +25,6 @@ module Locomotive
|
|||||||
|
|
||||||
::Liquid::Template.register_filter(Misc)
|
::Liquid::Template.register_filter(Misc)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
@ -1,7 +1,5 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
|
||||||
|
|
||||||
module LiquifyTemplate
|
module LiquifyTemplate
|
||||||
|
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
@ -53,10 +51,7 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,27 +1,21 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
module Liquid
|
module Tags
|
||||||
|
|
||||||
module Tags
|
|
||||||
|
|
||||||
class Blueprint < ::Liquid::Tag
|
class Blueprint < ::Liquid::Tag
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
%{
|
%{
|
||||||
<link href="/stylesheets/blueprint/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
|
<link href="/stylesheets/admin/blueprint/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
|
||||||
<link href="/stylesheets/blueprint/print.css" media="print" rel="stylesheet" type="text/css" />
|
<link href="/stylesheets/admin/blueprint/print.css" media="print" rel="stylesheet" type="text/css" />
|
||||||
<!--[if IE]>
|
<!--[if IE]>
|
||||||
<link href="/stylesheets/blueprint/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
|
<link href="/stylesheets/admin/blueprint/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
::Liquid::Template.register_tag('blueprint_stylesheets', Blueprint)
|
::Liquid::Template.register_tag('blueprint_stylesheets', Blueprint)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
module Locomotive
|
||||||
module Locomotive
|
module Tags
|
||||||
|
|
||||||
module Tags
|
|
||||||
|
|
||||||
class Jquery < ::Liquid::Tag
|
class Jquery < ::Liquid::Tag
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
@ -14,10 +11,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
::Liquid::Template.register_tag('jQuery', Jquery)
|
::Liquid::Template.register_tag('jQuery', Jquery)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1,9 +1,6 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
module Tags
|
module Tags
|
||||||
|
|
||||||
class WithScope < ::Liquid::Block
|
class WithScope < ::Liquid::Block
|
||||||
|
|
||||||
def initialize(tag_name, markup, tokens)
|
def initialize(tag_name, markup, tokens)
|
||||||
@ -36,10 +33,7 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
::Liquid::Template.register_tag('with_scope', WithScope)
|
::Liquid::Template.register_tag('with_scope', WithScope)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -1 +1 @@
|
|||||||
Dir[File.join(Rails.root, 'app', 'models', 'extensions', '**', '*.rb')].each { |lib| require lib }
|
Dir[File.join(File.dirname(__FILE__), '..', '..', '..', 'app', 'models', 'extensions', '**', '*.rb')].each { |lib| require lib }
|
Before Width: | Height: | Size: 321 B After Width: | Height: | Size: 321 B |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
@ -121,7 +121,7 @@ ul.assets li.asset h4 { margin: 0px; height: 30px; }
|
|||||||
|
|
||||||
ul.assets li.asset h4 a {
|
ul.assets li.asset h4 a {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 7px;
|
top: 0px;
|
||||||
left: 12px;
|
left: 12px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 0.6em;
|
font-size: 0.6em;
|
||||||
|
Before Width: | Height: | Size: 655 B After Width: | Height: | Size: 655 B |
Before Width: | Height: | Size: 455 B After Width: | Height: | Size: 455 B |
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 537 B |
Before Width: | Height: | Size: 777 B After Width: | Height: | Size: 777 B |
Before Width: | Height: | Size: 641 B After Width: | Height: | Size: 641 B |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 691 B After Width: | Height: | Size: 691 B |
Before Width: | Height: | Size: 741 B After Width: | Height: | Size: 741 B |
Before Width: | Height: | Size: 591 B After Width: | Height: | Size: 591 B |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 663 B After Width: | Height: | Size: 663 B |
Before Width: | Height: | Size: 161 B After Width: | Height: | Size: 161 B |
@ -166,7 +166,7 @@ body {
|
|||||||
|
|
||||||
/* ___ NoCoffee / Rails Tags ___ */
|
/* ___ NoCoffee / Rails Tags ___ */
|
||||||
|
|
||||||
a#nocoffee { text-decoration: none; font-size: 1.1em; line-height: 20px; color: #505b64; padding-right: 20px; margin: 0 4px; background: transparent url(../../images/nocoffee.gif) no-repeat right 0px; }
|
a#nocoffee { text-decoration: none; font-size: 1.1em; line-height: 20px; color: #505b64; padding-right: 20px; margin: 0 4px; background: transparent url(../../images/admin/nocoffee.gif) no-repeat right 0px; }
|
||||||
a#nocoffee em { color: #ef3f44; font-weight: normal; font-style: normal; }
|
a#nocoffee em { color: #ef3f44; font-weight: normal; font-style: normal; }
|
||||||
|
|
||||||
a#powered-by { text-decoration: none; font-size: 1.1em; color: #666; }
|
a#powered-by { text-decoration: none; font-size: 1.1em; color: #666; }
|
||||||
|
20
vendor/plugins/mimetype_fu/MIT-LICENSE
vendored
@ -1,20 +0,0 @@
|
|||||||
Copyright (c) 2007 [name of plugin creator]
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
16
vendor/plugins/mimetype_fu/README
vendored
@ -1,16 +0,0 @@
|
|||||||
MimetypeFu
|
|
||||||
==========
|
|
||||||
|
|
||||||
Some great Rails plugins like attachment_fu use the content type/mime type of a file to validate the instance of an object.
|
|
||||||
The plugin usually gets the mime type using the CGI request, however, if the file is already in the system, this approach won't work.
|
|
||||||
Adobe Flash is also known not to send the proper mime type.
|
|
||||||
As an alternative, I wrote mimetype_fu, a simple plugin which will try to guess the mimetype of a file based on its extension.
|
|
||||||
|
|
||||||
Note that mimetype_fu only looks at the extension to define its mime type if you are using Windows!
|
|
||||||
|
|
||||||
http://code.google.com/p/mimetype-fu/
|
|
||||||
|
|
||||||
Thanks to forestcarlisle for his big report and patch.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright (c) 2008 Matt Aimonetti, released under the MIT license
|
|
22
vendor/plugins/mimetype_fu/Rakefile
vendored
@ -1,22 +0,0 @@
|
|||||||
require 'rake'
|
|
||||||
require 'rake/testtask'
|
|
||||||
require 'rake/rdoctask'
|
|
||||||
|
|
||||||
desc 'Default: run unit tests.'
|
|
||||||
task :default => :test
|
|
||||||
|
|
||||||
desc 'Test the mimetype_fu plugin.'
|
|
||||||
Rake::TestTask.new(:test) do |t|
|
|
||||||
t.libs << 'lib'
|
|
||||||
t.pattern = 'test/**/*_test.rb'
|
|
||||||
t.verbose = true
|
|
||||||
end
|
|
||||||
|
|
||||||
desc 'Generate documentation for the mimetype_fu plugin.'
|
|
||||||
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
||||||
rdoc.rdoc_dir = 'rdoc'
|
|
||||||
rdoc.title = 'MimetypeFu'
|
|
||||||
rdoc.options << '--line-numbers' << '--inline-source'
|
|
||||||
rdoc.rdoc_files.include('README')
|
|
||||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
||||||
end
|
|
2
vendor/plugins/mimetype_fu/init.rb
vendored
@ -1,2 +0,0 @@
|
|||||||
require File.dirname(__FILE__) + '/lib/extensions_const'
|
|
||||||
require File.dirname(__FILE__) + '/lib/mimetype_fu'
|
|
1
vendor/plugins/mimetype_fu/install.rb
vendored
@ -1 +0,0 @@
|
|||||||
# Install hook code here
|
|
@ -1 +0,0 @@
|
|||||||
EXTENSIONS = YAML.load_file(File.dirname(__FILE__) + '/mime_types.yml').symbolize_keys
|
|
384
vendor/plugins/mimetype_fu/lib/mime_types.yml
vendored
@ -1,384 +0,0 @@
|
|||||||
# EXTENSIONS => CONTENT TYPE
|
|
||||||
csh: application/x-csh
|
|
||||||
x_t: model/vnd.parasolid.transmit.text
|
|
||||||
kpt: application/vnd.kde.kpresenter
|
|
||||||
vst: application/vnd.visio
|
|
||||||
ksp: application/vnd.kde.kspread
|
|
||||||
fsc: application/vnd.fsc.weblaunch
|
|
||||||
vcs: text/x-vcalendar
|
|
||||||
hvs: application/vnd.yamaha.hv-script
|
|
||||||
seml: application/vnd.sealed.eml
|
|
||||||
lzh: application/octet-stream
|
|
||||||
movie: video/x-sgi-movie
|
|
||||||
wav: audio/x-wav
|
|
||||||
tbz2: application/x-gtar
|
|
||||||
plt: application/vnd.hp-HPGL
|
|
||||||
3gpp: video/3gpp
|
|
||||||
eol: audio/vnd.digital-winds
|
|
||||||
vsw: application/vnd.visio
|
|
||||||
rtf: text/rtf
|
|
||||||
rgb: image/x-rgb
|
|
||||||
midi: audio/x-midi
|
|
||||||
sit: application/x-stuffit
|
|
||||||
mov: video/quicktime
|
|
||||||
kfo: application/vnd.kde.kformula
|
|
||||||
rdf: application/rdf+xml
|
|
||||||
wpd: application/vnd.wordperfect
|
|
||||||
hbc: application/vnd.hbci
|
|
||||||
ogg: application/ogg
|
|
||||||
dwf: x-drawing/dwf
|
|
||||||
pbm: image/x-portable-bitmap
|
|
||||||
cpp: text/plain
|
|
||||||
smp3: audio/vnd.sealedmedia.softseal.mpeg
|
|
||||||
html: text/html
|
|
||||||
igs: model/iges
|
|
||||||
dwg: image/vnd.dwg
|
|
||||||
see: application/vnd.seemail
|
|
||||||
ram: audio/x-pn-realaudio
|
|
||||||
jad: text/vnd.sun.j2me.app-descriptor
|
|
||||||
iges: model/iges
|
|
||||||
pot: application/powerpoint
|
|
||||||
exe: application/octet-stream
|
|
||||||
siv: application/sieve
|
|
||||||
wml: text/vnd.wap.wml
|
|
||||||
hlp: text/plain
|
|
||||||
pkd: application/vnd.hbci
|
|
||||||
ice: x-conference/x-cooltalk
|
|
||||||
ustar: application/x-ustar
|
|
||||||
vis: application/vnd.visionary
|
|
||||||
pkipath: application/pkix-pkipath
|
|
||||||
ecelp4800: audio/vnd.nuera.ecelp4800
|
|
||||||
tgz: application/x-gtar
|
|
||||||
roff: text/troff
|
|
||||||
ltx: application/x-latex
|
|
||||||
nim: video/vnd.nokia.interleaved-multimedia
|
|
||||||
qcp: audio/QCELP
|
|
||||||
ai: application/postscript
|
|
||||||
sppt: application/vnd.sealed.ppt
|
|
||||||
igx: application/vnd.micrografx.igx
|
|
||||||
tcl: application/x-tcl
|
|
||||||
viv: video/vnd.vivo
|
|
||||||
css: text/css
|
|
||||||
js: text/javascript
|
|
||||||
wpl: application/vnd.ms-wpl
|
|
||||||
ami: application/vnd.amiga.ami
|
|
||||||
l16: audio/L16
|
|
||||||
vivo: video/vnd.vivo
|
|
||||||
dat: text/plain
|
|
||||||
vrml: x-world/x-vrml
|
|
||||||
pqa: application/vnd.palm
|
|
||||||
request: application/vnd.nervana
|
|
||||||
oprc: application/vnd.palm
|
|
||||||
vbk: audio/vnd.nortel.vbk
|
|
||||||
pki: application/pkixcmp
|
|
||||||
ras: image/x-cmu-raster
|
|
||||||
asc: text/plain
|
|
||||||
kom: application/vnd.hbci
|
|
||||||
jpeg: image/jpeg
|
|
||||||
sem: application/vnd.sealed.eml
|
|
||||||
chrt: application/vnd.kde.kchart
|
|
||||||
tif: image/tiff
|
|
||||||
cil: application/vnd.ms-artgalry
|
|
||||||
xwd: image/x-xwindowdump
|
|
||||||
dgn: image/x-vnd.dgn
|
|
||||||
mxu: video/vnd.mpegurl
|
|
||||||
csv: text/comma-separated-values
|
|
||||||
kon: application/vnd.kde.kontour
|
|
||||||
png: image/png
|
|
||||||
bkm: application/vnd.nervana
|
|
||||||
sxl: application/vnd.sealed.xls
|
|
||||||
xfdf: application/vnd.adobe.xfdf
|
|
||||||
snd: audio/basic
|
|
||||||
dl: video/dl
|
|
||||||
sxls: application/vnd.sealed.xls
|
|
||||||
karbon: application/vnd.kde.karbon
|
|
||||||
ico: image/vnd.microsoft.icon
|
|
||||||
sus: application/vnd.sus-calendar
|
|
||||||
pdb: x-chemical/x-pdb
|
|
||||||
wif: application/watcherinfo+xml
|
|
||||||
ser: application/x-java-serialized-object
|
|
||||||
xmt_txt: model/vnd.parasolid.transmit.text
|
|
||||||
upa: application/vnd.hbci
|
|
||||||
pnm: image/x-portable-anymap
|
|
||||||
jar: application/x-java-archive
|
|
||||||
qt: video/quicktime
|
|
||||||
tsv: text/tab-separated-values
|
|
||||||
rtx: text/richtext
|
|
||||||
mdi: image/vnd.ms-modi
|
|
||||||
rcprofile: application/vnd.ipunplugged.rcprofile
|
|
||||||
gl: video/gl
|
|
||||||
me: application/x-troff-me
|
|
||||||
man: application/x-troff-man
|
|
||||||
tr: text/troff
|
|
||||||
amr: audio/AMR
|
|
||||||
wp5: application/wordperfect5.1
|
|
||||||
pdf: application/pdf
|
|
||||||
pgb: image/vnd.globalgraphics.pgb
|
|
||||||
au: audio/basic
|
|
||||||
avi: video/x-msvideo
|
|
||||||
qxb: application/vnd.Quark.QuarkXPress
|
|
||||||
wp: application/wordperfect5.1
|
|
||||||
wmlsc: application/vnd.wap.wmlscriptc
|
|
||||||
wbxml: application/vnd.wap.wbxml
|
|
||||||
s1a: application/vnd.sealedmedia.softseal.pdf
|
|
||||||
saf: application/vnd.yamaha.smaf-audio
|
|
||||||
gtar: application/x-gtar
|
|
||||||
Z: application/x-compressed
|
|
||||||
crl: application/pkix-crl
|
|
||||||
pti: application/vnd.pvi.ptid1
|
|
||||||
rdz: application/vnd.data-vision.rdz
|
|
||||||
aif: audio/x-aiff
|
|
||||||
flo: application/vnd.micrografx.flo
|
|
||||||
qxd: application/vnd.Quark.QuarkXPress
|
|
||||||
rpm: audio/x-pn-realaudio-plugin
|
|
||||||
djv: image/vnd.djvu
|
|
||||||
jpe: image/jpeg
|
|
||||||
kne: application/vnd.Kinar
|
|
||||||
lvp: audio/vnd.lucent.voice
|
|
||||||
stml: application/vnd.sealedmedia.softseal.html
|
|
||||||
p7c: application/pkcs7-mime
|
|
||||||
dms: application/octet-stream
|
|
||||||
s1e: application/vnd.sealed.xls
|
|
||||||
sdf: application/vnd.Kinar
|
|
||||||
sc: application/vnd.ibm.secure-container
|
|
||||||
jnlp: application/x-java-jnlp-file
|
|
||||||
dvi: application/x-dvi
|
|
||||||
smov: video/vnd.sealedmedia.softseal.mov
|
|
||||||
jisp: application/vnd.jisp
|
|
||||||
aifc: audio/x-aiff
|
|
||||||
latex: application/x-latex
|
|
||||||
cc: text/plain
|
|
||||||
s1g: image/vnd.sealedmedia.softseal.gif
|
|
||||||
wv: application/vnd.wv.csp+wbxml
|
|
||||||
mseq: application/vnd.mseq
|
|
||||||
jpg: image/jpeg
|
|
||||||
mmf: application/vnd.smaf
|
|
||||||
xmt_bin: model/vnd.parasolid.transmit.binary
|
|
||||||
s1h: application/vnd.sealedmedia.softseal.html
|
|
||||||
mpc: application/vnd.mophun.certificate
|
|
||||||
hdf: application/x-hdf
|
|
||||||
stk: application/hyperstudio
|
|
||||||
txd: application/vnd.genomatix.tuxedo
|
|
||||||
ent: application/vnd.nervana
|
|
||||||
xml: text/xml
|
|
||||||
aiff: audio/x-aiff
|
|
||||||
sh: application/x-sh
|
|
||||||
mpe: video/mpeg
|
|
||||||
s1j: image/vnd.sealedmedia.softseal.jpg
|
|
||||||
psid: audio/prs.sid
|
|
||||||
mpga: audio/mpeg
|
|
||||||
pgm: image/x-portable-graymap
|
|
||||||
si: text/vnd.wap.si
|
|
||||||
stm: application/vnd.sealedmedia.softseal.html
|
|
||||||
lbd: application/vnd.llamagraphics.life-balance.desktop
|
|
||||||
flw: application/vnd.kde.kivio
|
|
||||||
mpg: video/mpeg
|
|
||||||
c: text/plain
|
|
||||||
sgi: image/vnd.sealedmedia.softseal.gif
|
|
||||||
zip: application/zip
|
|
||||||
ecelp7470: audio/vnd.nuera.ecelp7470
|
|
||||||
lbe: application/vnd.llamagraphics.life-balance.exchange+xml
|
|
||||||
qxl: application/vnd.Quark.QuarkXPress
|
|
||||||
p10: application/pkcs10
|
|
||||||
bpd: application/vnd.hbci
|
|
||||||
ief: image/ief
|
|
||||||
gz: application/x-gzip
|
|
||||||
doc: application/word
|
|
||||||
efif: application/vnd.picsel
|
|
||||||
jpm: image/jpm
|
|
||||||
hpgl: application/vnd.hp-HPGL
|
|
||||||
s1m: audio/vnd.sealedmedia.softseal.mpeg
|
|
||||||
xhtml: application/xhtml+xml
|
|
||||||
xpm: image/x-xpixmap
|
|
||||||
ms: application/x-troff-ms
|
|
||||||
bcpio: application/x-bcpio
|
|
||||||
sl: text/vnd.wap.sl
|
|
||||||
wrl: x-world/x-vrml
|
|
||||||
s1n: image/vnd.sealed.png
|
|
||||||
irm: application/vnd.ibm.rights-management
|
|
||||||
pgp: application/octet-stream
|
|
||||||
entity: application/vnd.nervana
|
|
||||||
mcd: application/vnd.mcd
|
|
||||||
ecelp9600: audio/vnd.nuera.ecelp9600
|
|
||||||
kwd: application/vnd.kde.kword
|
|
||||||
gif: image/gif
|
|
||||||
sdo: application/vnd.sealed.doc
|
|
||||||
cer: application/pkix-cert
|
|
||||||
m4u: video/vnd.mpegurl
|
|
||||||
rst: text/prs.fallenstein.rst
|
|
||||||
htm: text/html
|
|
||||||
mxmf: audio/vnd.nokia.mobile-xmf
|
|
||||||
psb: application/vnd.3gpp.pic-bw-small
|
|
||||||
knp: application/vnd.Kinar
|
|
||||||
cab: application/vnd.ms-cab-compressed
|
|
||||||
mj2: video/MJ2
|
|
||||||
sgm: text/sgml
|
|
||||||
wbmp: image/vnd.wap.wbmp
|
|
||||||
p7m: application/pkcs7-mime
|
|
||||||
spng: image/vnd.sealed.png
|
|
||||||
lha: application/octet-stream
|
|
||||||
s1p: application/vnd.sealed.ppt
|
|
||||||
texi: application/x-texinfo
|
|
||||||
s1q: video/vnd.sealedmedia.softseal.mov
|
|
||||||
troff: text/troff
|
|
||||||
h: text/plain
|
|
||||||
shtml: text/html
|
|
||||||
msh: model/mesh
|
|
||||||
irp: application/vnd.irepository.package+xml
|
|
||||||
rct: application/prs.nprend
|
|
||||||
smht: application/vnd.sealed.mht
|
|
||||||
s11: video/vnd.sealed.mpeg1
|
|
||||||
htke: application/vnd.kenameaapp
|
|
||||||
ps: application/postscript
|
|
||||||
mpm: application/vnd.blueice.multipass
|
|
||||||
dfac: application/vnd.dreamfactory
|
|
||||||
pvb: application/vnd.3gpp.pic-bw-var
|
|
||||||
lrm: application/vnd.ms-lrm
|
|
||||||
smh: application/vnd.sealed.mht
|
|
||||||
mpn: application/vnd.mophun.application
|
|
||||||
spd: application/vnd.sealedmedia.softseal.pdf
|
|
||||||
tiff: image/tiff
|
|
||||||
jp2: image/jp2
|
|
||||||
rpss: application/vnd.nokia.radio-presets
|
|
||||||
qxt: application/vnd.Quark.QuarkXPress
|
|
||||||
wmlc: application/vnd.wap.wmlc
|
|
||||||
rpst: application/vnd.nokia.radio-preset
|
|
||||||
etx: text/x-setext
|
|
||||||
bmp: image/bmp
|
|
||||||
s14: video/vnd.sealed.mpeg4
|
|
||||||
\"123\": application/vnd.lotus-1-2-3
|
|
||||||
mpp: application/vnd.ms-project
|
|
||||||
spf: application/vnd.yamaha.smaf-phrase
|
|
||||||
kar: audio/x-midi
|
|
||||||
mid: audio/x-midi
|
|
||||||
3gp: video/3gpp
|
|
||||||
3g2: video/3gpp2
|
|
||||||
hqx: application/mac-binhex40
|
|
||||||
p7s: application/pkcs7-signature
|
|
||||||
ppm: image/x-portable-pixmap
|
|
||||||
pspimage: image/x-paintshoppro
|
|
||||||
cdf: application/netcdf
|
|
||||||
texinfo: application/x-texinfo
|
|
||||||
sjp: image/vnd.sealedmedia.softseal.jpg
|
|
||||||
wbs: application/vnd.criticaltools.wbs+xml
|
|
||||||
emm: application/vnd.ibm.electronic-media
|
|
||||||
s1w: application/vnd.sealed.doc
|
|
||||||
ra: audio/x-realaudio
|
|
||||||
jpx: image/jpx
|
|
||||||
evc: audio/EVRC
|
|
||||||
mif: application/x-mif
|
|
||||||
qwd: application/vnd.Quark.QuarkXPress
|
|
||||||
mp2: video/mpeg
|
|
||||||
spdf: application/vnd.sealedmedia.softseal.pdf
|
|
||||||
tbz: application/x-gtar
|
|
||||||
txt: text/plain
|
|
||||||
x_b: model/vnd.parasolid.transmit.binary
|
|
||||||
mp3: audio/mpeg
|
|
||||||
class: application/x-java-vm
|
|
||||||
smo: video/vnd.sealedmedia.softseal.mov
|
|
||||||
mp4: video/vnd.objectvideo
|
|
||||||
m4v: video/x-m4v
|
|
||||||
htx: text/html
|
|
||||||
hbci: application/vnd.hbci
|
|
||||||
tex: application/x-tex
|
|
||||||
vsc: application/vnd.vidsoft.vidconference
|
|
||||||
wqd: application/vnd.wqd
|
|
||||||
mfm: application/vnd.mfmp
|
|
||||||
sgml: text/sgml
|
|
||||||
smp: audio/vnd.sealedmedia.softseal.mpeg
|
|
||||||
curl: application/vnd.curl
|
|
||||||
cw: application/prs.cww
|
|
||||||
djvu: image/vnd.djvu
|
|
||||||
tga: image/targa
|
|
||||||
vsd: application/vnd.visio
|
|
||||||
t: text/troff
|
|
||||||
wtb: application/vnd.webturbo
|
|
||||||
spn: image/vnd.sealed.png
|
|
||||||
plb: application/vnd.3gpp.pic-bw-large
|
|
||||||
pps: application/powerpoint
|
|
||||||
yaml: text/x-yaml
|
|
||||||
psp: image/x-paintshoppro
|
|
||||||
mjp2: video/MJ2
|
|
||||||
sms: application/vnd.3gpp.sms
|
|
||||||
hvd: application/vnd.yamaha.hv-dic
|
|
||||||
acutc: application/vnd.acucorp
|
|
||||||
ppt: application/powerpoint
|
|
||||||
les: application/vnd.hhe.lesson-player
|
|
||||||
vcf: text/x-vcard
|
|
||||||
sjpg: image/vnd.sealedmedia.softseal.jpg
|
|
||||||
kwt: application/vnd.kde.kword
|
|
||||||
sic: application/vnd.wap.sic
|
|
||||||
spp: application/vnd.sealed.ppt
|
|
||||||
cmc: application/vnd.cosmocaller
|
|
||||||
dot: application/word
|
|
||||||
sv4cpio: application/x-sv4cpio
|
|
||||||
cpio: application/x-cpio
|
|
||||||
sswf: video/vnd.sealed.swf
|
|
||||||
silo: model/mesh
|
|
||||||
sid: audio/prs.sid
|
|
||||||
yml: text/x-yaml
|
|
||||||
smv: audio/SMV
|
|
||||||
eps: application/postscript
|
|
||||||
ptid: application/vnd.pvi.ptid1
|
|
||||||
wks: application/vnd.lotus-1-2-3
|
|
||||||
z: application/x-compressed
|
|
||||||
hpp: text/plain
|
|
||||||
htmlx: text/html
|
|
||||||
ani: application/octet-stream
|
|
||||||
sig: application/pgp-signature
|
|
||||||
slc: application/vnd.wap.slc
|
|
||||||
rm: audio/x-pn-realaudio
|
|
||||||
smpg: video/vnd.sealed.mpeg4
|
|
||||||
wmls: text/vnd.wap.wmlscript
|
|
||||||
bin: application/x-mac
|
|
||||||
mesh: model/mesh
|
|
||||||
atc: application/vnd.acucorp
|
|
||||||
pfr: application/font-tdpfr
|
|
||||||
plj: audio/vnd.everad.plj
|
|
||||||
rnd: application/prs.nprend
|
|
||||||
xls: application/excel
|
|
||||||
tar: application/x-tar
|
|
||||||
mp3g: video/mpeg
|
|
||||||
sgif: image/vnd.sealedmedia.softseal.gif
|
|
||||||
oda: application/oda
|
|
||||||
sdoc: application/vnd.sealed.doc
|
|
||||||
kia: application/vnd.kidspiration
|
|
||||||
prc: application/vnd.palm
|
|
||||||
req: application/vnd.nervana
|
|
||||||
xyz: x-chemical/x-xyz
|
|
||||||
soc: application/sgml-open-catalog
|
|
||||||
xlt: application/excel
|
|
||||||
awb: audio/AMR-WB
|
|
||||||
susp: application/vnd.sus-calendar
|
|
||||||
xbm: image/x-xbm
|
|
||||||
ccc: text/vnd.net2phone.commcenter.command
|
|
||||||
hh: text/plain
|
|
||||||
qwt: application/vnd.Quark.QuarkXPress
|
|
||||||
shar: application/x-shar
|
|
||||||
ssw: video/vnd.sealed.swf
|
|
||||||
xul: application/vnd.mozilla.xul+xml
|
|
||||||
kcm: application/vnd.nervana
|
|
||||||
kpr: application/vnd.kde.kpresenter
|
|
||||||
cdy: application/vnd.cinderella
|
|
||||||
nc: application/netcdf
|
|
||||||
src: application/x-wais-source
|
|
||||||
sv4crc: application/x-sv4crc
|
|
||||||
dtd: text/xml
|
|
||||||
hvp: application/vnd.yamaha.hv-voice
|
|
||||||
cww: application/prs.cww
|
|
||||||
vss: application/vnd.visio
|
|
||||||
rb: application/x-ruby
|
|
||||||
log: text/plain
|
|
||||||
swf: application/x-shockwave-flash
|
|
||||||
flv: video/x-flv
|
|
||||||
asf: video/x-ms-asf
|
|
||||||
asx: video/x-ms-asf
|
|
||||||
wma: audio/x-ms-wma
|
|
||||||
wax: audio/x-ms-wax
|
|
||||||
wmv: audio/x-ms-wmv
|
|
||||||
wvx: video/x-ms-wvx
|
|
||||||
wm: video/x-ms-wm
|
|
||||||
wmx: video/x-ms-wmx
|
|
||||||
wmz: application/x-ms-wmz
|
|
||||||
wmd: application/x-ms-wmd
|
|
||||||
|
|
35
vendor/plugins/mimetype_fu/lib/mimetype_fu.rb
vendored
@ -1,35 +0,0 @@
|
|||||||
class File
|
|
||||||
|
|
||||||
def self.mime_type?(file)
|
|
||||||
if file.class == File
|
|
||||||
unless RUBY_PLATFORM.include? 'mswin32'
|
|
||||||
mime = `file -bir #{file.path}`.strip
|
|
||||||
else
|
|
||||||
mime = EXTENSIONS[File.extname(file.path).gsub('.','').downcase.to_sym]
|
|
||||||
end
|
|
||||||
elsif file.class == String
|
|
||||||
mime = EXTENSIONS[(file[file.rindex('.')+1, file.size]).downcase.to_sym]
|
|
||||||
elsif file.class == StringIO
|
|
||||||
temp = File.open(Dir.tmpdir + '/upload_file.' + Process.pid.to_s, "wb")
|
|
||||||
temp << file.string
|
|
||||||
temp.close
|
|
||||||
mime = `file -bir #{temp.path}`
|
|
||||||
mime = mime.gsub(/^.*: */,"")
|
|
||||||
mime = mime.gsub(/;.*$/,"")
|
|
||||||
mime = mime.gsub(/,.*$/,"")
|
|
||||||
File.delete(temp.path)
|
|
||||||
end
|
|
||||||
|
|
||||||
if mime
|
|
||||||
return mime
|
|
||||||
else
|
|
||||||
'unknown/unknown'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def self.extensions
|
|
||||||
EXTENSIONS
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
@ -1,57 +0,0 @@
|
|||||||
require File.dirname(__FILE__) + '/spec_helper'
|
|
||||||
require File.dirname(__FILE__) + '/../lib/mimetype_fu'
|
|
||||||
|
|
||||||
describe 'A file with a know extension' do
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
@file = File.open(File.dirname(__FILE__) + '/fixtures/file.jpg')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have an extension' do
|
|
||||||
File.extname(@file.path).should == '.jpg'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have a mime type' do
|
|
||||||
File.mime_type?(@file).should == "image/jpeg"
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'A file with anunknow extension' do
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
@file = File.open(File.dirname(__FILE__) + '/fixtures/file.unknown')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have an extension' do
|
|
||||||
File.extname(@file.path).should == '.unknown'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have an unkwown mime type' do
|
|
||||||
File.mime_type?(@file).should == "unknown/unknown"
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'A valid file path' do
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
@file_path = "#{Dir.pwd} + /picture.png"
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have a mime type' do
|
|
||||||
File.mime_type?(@file_path).should == "image/png"
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "An unknown extension" do
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
@file_path = 'file.unknown'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have an unknown mime type' do
|
|
||||||
File.mime_type?(@file_path).should == "unknown/unknown"
|
|
||||||
end
|
|
||||||
end
|
|