locomotive_cms 0.0.4.beta10 → 0.0.4.beta11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -1
- data/app/controllers/admin/imports_controller.rb +3 -1
- data/app/controllers/admin/pages_controller.rb +1 -1
- data/app/models/extensions/page/tree.rb +60 -2
- data/app/models/page.rb +2 -0
- data/app/models/site.rb +4 -0
- data/app/uploaders/asset_uploader.rb +1 -1
- data/app/uploaders/theme_asset_uploader.rb +12 -1
- data/app/views/admin/pages/_page.html.haml +4 -2
- data/app/views/admin/shared/menu/_contents.html.haml +1 -1
- data/config/initializers/locomotive.rb +2 -0
- data/config/locales/admin_ui_en.yml +1 -1
- data/config/locales/admin_ui_fr.yml +1 -1
- data/config/mongoid.yml +12 -5
- data/lib/generators/locomotive/install/templates/locomotive.rb +4 -2
- data/lib/locomotive/engine.rb +4 -1
- data/lib/locomotive/httparty/webservice.rb +12 -1
- data/lib/locomotive/import/pages.rb +19 -5
- data/lib/locomotive/liquid/drops/page.rb +4 -0
- data/lib/locomotive/liquid/filters/html.rb +6 -23
- data/lib/locomotive/liquid/tags/nav.rb +37 -19
- data/lib/locomotive/middlewares/fonts.rb +3 -11
- data/lib/locomotive/routing/site_dispatcher.rb +3 -1
- data/lib/locomotive/version.rb +1 -1
- metadata +5 -5
data/Gemfile
CHANGED
|
@@ -30,7 +30,7 @@ gem 'RedCloth'
|
|
|
30
30
|
gem 'delayed_job', '2.1.2'
|
|
31
31
|
gem 'delayed_job_mongoid', '1.0.1'
|
|
32
32
|
gem 'rubyzip'
|
|
33
|
-
gem 'jammit-s3'
|
|
33
|
+
gem 'locomotive_jammit-s3', :require => 'jammit-s3'
|
|
34
34
|
|
|
35
35
|
# The rest of the dependencies are for use when in the locomotive dev environment
|
|
36
36
|
|
|
@@ -31,7 +31,9 @@ module Admin
|
|
|
31
31
|
flash[:notice] = t("flash.admin.imports.create.#{Locomotive.config.delayed_job ? 'notice' : 'done'}")
|
|
32
32
|
|
|
33
33
|
redirect_to Locomotive.config.delayed_job ? admin_import_url : new_admin_import_url
|
|
34
|
-
rescue
|
|
34
|
+
rescue Exception => e
|
|
35
|
+
logger.error "[Locomotive import] #{e.message}"
|
|
36
|
+
|
|
35
37
|
@error = t('errors.messages.invalid_theme_file')
|
|
36
38
|
flash[:alert] = t('flash.admin.imports.create.alert')
|
|
37
39
|
|
|
@@ -27,8 +27,62 @@ module Models
|
|
|
27
27
|
alias :descendants :hacked_descendants
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
module ClassMethods
|
|
31
|
+
|
|
32
|
+
# Warning: used only in read-only
|
|
33
|
+
def quick_tree(site)
|
|
34
|
+
pages = site.pages.minimal_attributes.order_by([[:depth, :asc], [:position, :asc]]).to_a
|
|
35
|
+
|
|
36
|
+
tmp = []
|
|
37
|
+
|
|
38
|
+
while !pages.empty?
|
|
39
|
+
tmp << _quick_tree(pages.delete_at(0), pages)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
tmp
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def _quick_tree(current_page, pages)
|
|
46
|
+
i, children = 0, []
|
|
47
|
+
|
|
48
|
+
while !pages.empty?
|
|
49
|
+
page = pages[i]
|
|
50
|
+
|
|
51
|
+
break if page.nil?
|
|
52
|
+
|
|
53
|
+
if page.parent_id == current_page.id
|
|
54
|
+
page = pages.delete_at(i)
|
|
55
|
+
|
|
56
|
+
children << _quick_tree(page, pages)
|
|
57
|
+
else
|
|
58
|
+
i += 1
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
current_page.instance_eval do
|
|
63
|
+
def children=(list); @children = list; end
|
|
64
|
+
def children; @children || []; end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
current_page.children = children
|
|
68
|
+
|
|
69
|
+
current_page
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
30
74
|
module InstanceMethods
|
|
31
75
|
|
|
76
|
+
def children?
|
|
77
|
+
self.class.where(self.parent_id_field => self.id).count
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def children_with_minimal_attributes
|
|
81
|
+
self.class.where(self.parent_id_field => self.id).
|
|
82
|
+
order_by(self.tree_order).
|
|
83
|
+
minimal_attributes
|
|
84
|
+
end
|
|
85
|
+
|
|
32
86
|
def sort_children!(ids)
|
|
33
87
|
ids.each_with_index do |id, position|
|
|
34
88
|
child = self.children.detect { |p| p._id == BSON::ObjectId(id) }
|
|
@@ -53,8 +107,12 @@ module Models
|
|
|
53
107
|
def change_parent
|
|
54
108
|
if self.parent_id_changed?
|
|
55
109
|
self.fix_position(false)
|
|
56
|
-
|
|
57
|
-
self.
|
|
110
|
+
|
|
111
|
+
unless self.parent_id_was.nil?
|
|
112
|
+
self.position = nil # make it move to bottom
|
|
113
|
+
self.add_to_list_bottom
|
|
114
|
+
end
|
|
115
|
+
|
|
58
116
|
self.instance_variable_set :@_will_move, true
|
|
59
117
|
end
|
|
60
118
|
end
|
data/app/models/page.rb
CHANGED
|
@@ -40,6 +40,8 @@ class Page
|
|
|
40
40
|
scope :index, :where => { :slug => 'index', :depth => 0 }
|
|
41
41
|
scope :not_found, :where => { :slug => '404', :depth => 0 }
|
|
42
42
|
scope :published, :where => { :published => true }
|
|
43
|
+
scope :fullpath, lambda { |fullpath| { :where => { :fullpath => fullpath } } }
|
|
44
|
+
scope :minimal_attributes, :only => %w(title slug fullpath position depth published templatized parent_id created_at updated_at)
|
|
43
45
|
|
|
44
46
|
## methods ##
|
|
45
47
|
|
data/app/models/site.rb
CHANGED
|
@@ -60,7 +60,7 @@ class AssetUploader < CarrierWave::Uploader::Base
|
|
|
60
60
|
|
|
61
61
|
def self.content_types
|
|
62
62
|
{
|
|
63
|
-
:image => ['image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png', 'image/jpg'],
|
|
63
|
+
:image => ['image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png', 'image/jpg', 'image/x-icon'],
|
|
64
64
|
:video => [/^video/, 'application/x-shockwave-flash', 'application/x-swf'],
|
|
65
65
|
:audio => [/^audio/, 'application/ogg', 'application/x-mp3'],
|
|
66
66
|
:pdf => ['application/pdf', 'application/x-pdf'],
|
|
@@ -15,7 +15,18 @@ class ThemeAssetUploader < AssetUploader
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def extension_white_list
|
|
18
|
-
%w(jpg jpeg gif png css js swf flv eot svg ttf woff otf)
|
|
18
|
+
%w(jpg jpeg gif png css js swf flv eot svg ttf woff otf ico)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.url_for(site, path)
|
|
22
|
+
build(site, path).url
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.build(site, path)
|
|
26
|
+
asset = ThemeAsset.new(:site => site, :folder => File.dirname(path))
|
|
27
|
+
uploader = ThemeAssetUploader.new(asset)
|
|
28
|
+
uploader.retrieve_from_store!(File.basename(path))
|
|
29
|
+
uploader
|
|
19
30
|
end
|
|
20
31
|
|
|
21
32
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
%li{ :id => "item-#{page.id}", :class => "#{'not-found' if page.not_found? } #{'templatized' if page.templatized?}"}
|
|
2
|
-
-
|
|
2
|
+
- with_children = !page.children.empty?
|
|
3
|
+
|
|
4
|
+
- if not page.index? and with_children
|
|
3
5
|
= image_tag 'admin/list/icons/node_closed.png', :class => 'toggler'
|
|
4
6
|
%em
|
|
5
7
|
%strong= link_to truncate(page.title, :length => 80), edit_admin_page_url(page)
|
|
@@ -11,6 +13,6 @@
|
|
|
11
13
|
- if not page.index? and not page.not_found?
|
|
12
14
|
= link_to image_tag('admin/list/icons/trash.png'), admin_page_url(page), :class => 'remove', :confirm => t('admin.messages.confirm'), :method => :delete
|
|
13
15
|
|
|
14
|
-
- if
|
|
16
|
+
- if with_children
|
|
15
17
|
%ul{ :id => "folder-#{page._id}", :class => "folder depth-#{(page.depth || 0) + 1}", :data_url => sort_admin_page_url(page), :style => "display: #{cookies["folder-#{page._id}"] || 'block'}" }
|
|
16
18
|
= render page.children
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
.inner
|
|
6
6
|
%h2!= t('admin.pages.index.lastest_items')
|
|
7
7
|
%ul
|
|
8
|
-
- current_site.pages.latest_updated.each do |page|
|
|
8
|
+
- current_site.pages.latest_updated.minimal_attributes.each do |page|
|
|
9
9
|
%li
|
|
10
10
|
= link_to truncate(page.title, :length => 25), edit_admin_page_url(page)
|
|
11
11
|
%span= time_ago_in_words(page.updated_at)
|
|
@@ -8,6 +8,8 @@ Locomotive.configure do |config|
|
|
|
8
8
|
# If you use locomotive for a single site in Heroku, use "heroku.com" as default domain name.
|
|
9
9
|
# Your heroku app name (<app_name>.heroku.name) will be used as the sub domain name in Locomotive
|
|
10
10
|
# during the installation wizzard.
|
|
11
|
+
# Ex:
|
|
12
|
+
# config.default_domain = Rails.env.production? ? 'heroku.com' : 'example.com'
|
|
11
13
|
config.default_domain = 'example.com'
|
|
12
14
|
|
|
13
15
|
# configure how many items we display in sub menu in the "Contents" section.
|
|
@@ -290,7 +290,7 @@ en:
|
|
|
290
290
|
next: Create account
|
|
291
291
|
step_3:
|
|
292
292
|
title: "Step 3/3 — Create first site"
|
|
293
|
-
explanations: "This is the last step of the installation. You can upload a theme as a zip file. We have free available themes <a href=\"http://www.locomotivecms.com/
|
|
293
|
+
explanations: "This is the last step of the installation. You can upload a theme as a zip file. We have free available themes <a href=\"http://www.locomotivecms.com/support/themes\">here</a>."
|
|
294
294
|
next: Create site
|
|
295
295
|
|
|
296
296
|
|
|
@@ -291,7 +291,7 @@ fr:
|
|
|
291
291
|
next: Créer compte
|
|
292
292
|
step_3:
|
|
293
293
|
title: "Étape 3/3 — Créer premier site"
|
|
294
|
-
explanations: "C'est la dernière étape de l'installation. Vous pouvez uploader un theme sous forme d'un fichier zip. Nous avons quelques themes disponibles <a href=\"http://www.locomotivecms.com/
|
|
294
|
+
explanations: "C'est la dernière étape de l'installation. Vous pouvez uploader un theme sous forme d'un fichier zip. Nous avons quelques themes disponibles <a href=\"http://www.locomotivecms.com/support/themes\">ici</a>."
|
|
295
295
|
next: Créer site
|
|
296
296
|
|
|
297
297
|
formtastic:
|
data/config/mongoid.yml
CHANGED
|
@@ -18,8 +18,15 @@ test:
|
|
|
18
18
|
production:
|
|
19
19
|
<<: *defaults
|
|
20
20
|
database: locomotive_prod
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
|
|
22
|
+
# other settings for production
|
|
23
|
+
|
|
24
|
+
# host: <%= ENV['MONGOID_HOST'] %>
|
|
25
|
+
# port: <%= ENV['MONGOID_PORT'] %>
|
|
26
|
+
# username: <%= ENV['MONGOID_USERNAME'] %>
|
|
27
|
+
# password: <%= ENV['MONGOID_PASSWORD'] %>
|
|
28
|
+
# database: <%= ENV['MONGOID_DATABASE'] %>
|
|
29
|
+
|
|
30
|
+
# heroku
|
|
31
|
+
# uri: <%= ENV['MONGOHQ_URL'] %>
|
|
32
|
+
|
|
@@ -6,7 +6,9 @@ Locomotive.configure do |config|
|
|
|
6
6
|
# If you use locomotive for a single site in Heroku, use "heroku.com" as default domain name.
|
|
7
7
|
# Your heroku app name (<app_name>.heroku.name) will be used as the sub domain name in Locomotive
|
|
8
8
|
# during the installation wizzard.
|
|
9
|
-
|
|
9
|
+
# Ex:
|
|
10
|
+
# config.default_domain = Rails.env.production? ? 'heroku.com' : 'example.com'
|
|
11
|
+
config.default_domain = 'example.com'
|
|
10
12
|
|
|
11
13
|
# configure how many items we display in sub menu in the "Contents" section.
|
|
12
14
|
config.lastest_items_nb = 5
|
|
@@ -35,4 +37,4 @@ Locomotive.configure do |config|
|
|
|
35
37
|
|
|
36
38
|
# default locale (for now, only en and fr are supported)
|
|
37
39
|
config.default_locale = :en
|
|
38
|
-
end
|
|
40
|
+
end
|
data/lib/locomotive/engine.rb
CHANGED
|
@@ -18,7 +18,6 @@ require 'httparty'
|
|
|
18
18
|
require 'redcloth'
|
|
19
19
|
require 'delayed_job_mongoid'
|
|
20
20
|
require 'zip/zipfilesystem'
|
|
21
|
-
# require 'jammit'
|
|
22
21
|
require 'jammit-s3'
|
|
23
22
|
|
|
24
23
|
$:.unshift File.dirname(__FILE__)
|
|
@@ -30,5 +29,9 @@ module Locomotive
|
|
|
30
29
|
load "railties/tasks.rake"
|
|
31
30
|
end
|
|
32
31
|
|
|
32
|
+
initializer "serving fonts" do |app|
|
|
33
|
+
app.middleware.insert_after Rack::Lock, '::Locomotive::Middlewares::Fonts', :path => %r{^/fonts}
|
|
34
|
+
end
|
|
35
|
+
|
|
33
36
|
end
|
|
34
37
|
end
|
|
@@ -17,7 +17,18 @@ module Locomotive
|
|
|
17
17
|
|
|
18
18
|
# puts "[WebService] consuming #{path}, #{options.inspect}"
|
|
19
19
|
|
|
20
|
-
self.get(path, options)
|
|
20
|
+
response = self.get(path, options)
|
|
21
|
+
|
|
22
|
+
if response.code == 200
|
|
23
|
+
if response.respond_to?(:each)
|
|
24
|
+
response.collect(&:underscore_keys)
|
|
25
|
+
else
|
|
26
|
+
response.try(:underscore_keys)
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
|
|
21
32
|
end
|
|
22
33
|
|
|
23
34
|
end
|
|
@@ -36,7 +36,8 @@ module Locomotive
|
|
|
36
36
|
:title => fullpath.split('/').last.humanize,
|
|
37
37
|
:slug => fullpath.split('/').last,
|
|
38
38
|
:parent => parent,
|
|
39
|
-
:raw_template => template
|
|
39
|
+
:raw_template => template,
|
|
40
|
+
:published => true
|
|
40
41
|
}.merge(self.pages[fullpath] || {}).symbolize_keys
|
|
41
42
|
|
|
42
43
|
# templatized ?
|
|
@@ -54,7 +55,7 @@ module Locomotive
|
|
|
54
55
|
|
|
55
56
|
page.save!
|
|
56
57
|
|
|
57
|
-
self.log "adding #{page.fullpath}"
|
|
58
|
+
self.log "adding #{page.fullpath} / #{page.position}"
|
|
58
59
|
|
|
59
60
|
site.reload
|
|
60
61
|
|
|
@@ -137,10 +138,23 @@ module Locomotive
|
|
|
137
138
|
pages = context[:database]['site']['pages']
|
|
138
139
|
|
|
139
140
|
if pages.is_a?(Array) # ordered list of pages
|
|
140
|
-
tmp = {}
|
|
141
|
-
pages.
|
|
141
|
+
tmp, positions = {}, Hash.new(0)
|
|
142
|
+
pages.each do |data|
|
|
143
|
+
position = nil
|
|
144
|
+
fullpath = data.keys.first.to_s
|
|
145
|
+
|
|
146
|
+
unless %w(index 404).include?(fullpath)
|
|
147
|
+
(segments = fullpath.split('/')).pop
|
|
148
|
+
position_key = segments.empty? ? 'index' : segments.join('/')
|
|
149
|
+
|
|
150
|
+
position = positions[position_key]
|
|
151
|
+
|
|
152
|
+
positions[position_key] += 1
|
|
153
|
+
end
|
|
154
|
+
|
|
142
155
|
attributes = (data.values.first || {}).merge(:position => position)
|
|
143
|
-
|
|
156
|
+
|
|
157
|
+
tmp[fullpath] = attributes
|
|
144
158
|
end
|
|
145
159
|
pages = tmp
|
|
146
160
|
end
|
|
@@ -9,11 +9,7 @@ module Locomotive
|
|
|
9
9
|
return '' if input.nil?
|
|
10
10
|
|
|
11
11
|
unless input =~ /^(\/|http:)/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
filename, folder = segments.pop, segments.join('/')
|
|
15
|
-
|
|
16
|
-
input = asset_url(folder, filename)
|
|
12
|
+
input = asset_url("stylesheets/#{input}")
|
|
17
13
|
end
|
|
18
14
|
|
|
19
15
|
input = "#{input}.css" unless input.ends_with?('.css')
|
|
@@ -27,14 +23,7 @@ module Locomotive
|
|
|
27
23
|
return '' if input.nil?
|
|
28
24
|
|
|
29
25
|
unless input =~ /^(\/|http:)/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
filename, folder = segments.pop, segments.join('/')
|
|
33
|
-
|
|
34
|
-
input = asset_url(folder, filename)
|
|
35
|
-
# javascript = ThemeAsset.new(:site => @context.registers[:site], :folder => folder)
|
|
36
|
-
#
|
|
37
|
-
# input = '/' + ThemeAssetUploader.new(javascript).store_path(filename)
|
|
26
|
+
input = asset_url("javascripts/#{input}")
|
|
38
27
|
end
|
|
39
28
|
|
|
40
29
|
input = "#{input}.js" unless input.ends_with?('.js')
|
|
@@ -47,11 +36,7 @@ module Locomotive
|
|
|
47
36
|
|
|
48
37
|
input = "images/#{input}" unless input.starts_with?('/')
|
|
49
38
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
filename, folder = segments.pop, segments.join('/')
|
|
53
|
-
|
|
54
|
-
asset_url(folder, filename)
|
|
39
|
+
asset_url(input)
|
|
55
40
|
end
|
|
56
41
|
|
|
57
42
|
# Write an image tag
|
|
@@ -143,12 +128,10 @@ module Locomotive
|
|
|
143
128
|
input.respond_to?(:url) ? input.url : input
|
|
144
129
|
end
|
|
145
130
|
|
|
146
|
-
def asset_url(
|
|
147
|
-
|
|
148
|
-
uploader = ThemeAssetUploader.new(asset)
|
|
149
|
-
uploader.retrieve_from_store!(filename)
|
|
150
|
-
uploader.url
|
|
131
|
+
def asset_url(path)
|
|
132
|
+
ThemeAssetUploader.url_for(@context.registers[:site], path)
|
|
151
133
|
end
|
|
134
|
+
|
|
152
135
|
end
|
|
153
136
|
|
|
154
137
|
::Liquid::Template.register_filter(Html)
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
module Locomotive
|
|
2
2
|
module Liquid
|
|
3
3
|
module Tags
|
|
4
|
-
# Display the children pages of the site or the
|
|
4
|
+
# Display the children pages of the site, current page or the parent page. If not precised, nav is applied on the current page.
|
|
5
5
|
# The html output is based on the ul/li tags.
|
|
6
6
|
#
|
|
7
7
|
# Usage:
|
|
8
8
|
#
|
|
9
9
|
# {% nav site %} => <ul class="nav"><li class="on"><a href="/features">Features</a></li></ul>
|
|
10
10
|
#
|
|
11
|
+
# {% nav site, no_wrapper: true, exclude: 'contact|about', id: 'main-nav' }
|
|
12
|
+
#
|
|
11
13
|
class Nav < ::Liquid::Tag
|
|
12
14
|
|
|
13
15
|
Syntax = /(#{::Liquid::Expression}+)?/
|
|
14
16
|
|
|
15
17
|
def initialize(tag_name, markup, tokens, context)
|
|
16
18
|
if markup =~ Syntax
|
|
17
|
-
@
|
|
18
|
-
@options = {}
|
|
19
|
-
markup.scan(::Liquid::TagAttributes) { |key, value| @options[key.to_sym] = value }
|
|
19
|
+
@source = ($1 || 'page').gsub(/"|'/, '')
|
|
20
|
+
@options = { :id => 'nav' }
|
|
21
|
+
markup.scan(::Liquid::TagAttributes) { |key, value| @options[key.to_sym] = value.gsub(/"|'/, '') }
|
|
20
22
|
|
|
21
|
-
@options[:exclude] = Regexp.new(@options[:exclude]
|
|
23
|
+
@options[:exclude] = Regexp.new(@options[:exclude]) if @options[:exclude]
|
|
22
24
|
else
|
|
23
25
|
raise ::Liquid::SyntaxError.new("Syntax Error in 'nav' - Valid syntax: nav <page|site> <options>")
|
|
24
26
|
end
|
|
@@ -27,29 +29,45 @@ module Locomotive
|
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def render(context)
|
|
30
|
-
|
|
32
|
+
children_output = []
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
entries = fetch_entries(context)
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
entries.each_with_index do |p, index|
|
|
37
|
+
css = []
|
|
38
|
+
css << 'first' if index == 0
|
|
39
|
+
css << 'last' if index == entries.size - 1
|
|
40
|
+
|
|
41
|
+
children_output << render_entry_link(p, css.join(' '))
|
|
38
42
|
end
|
|
39
43
|
|
|
40
|
-
output =
|
|
44
|
+
output = children_output.join("\n")
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
if @options[:no_wrapper] != 'true'
|
|
47
|
+
output = %{<ul id="#{@options[:id]}">\n#{output}</ul>}
|
|
48
|
+
end
|
|
45
49
|
|
|
46
50
|
output
|
|
47
51
|
end
|
|
48
52
|
|
|
49
53
|
private
|
|
50
54
|
|
|
55
|
+
def fetch_entries(context)
|
|
56
|
+
@current_page = context.registers[:page]
|
|
57
|
+
|
|
58
|
+
children = (case @source
|
|
59
|
+
when 'site' then context.registers[:site].pages.index.minimal_attributes.first # start from home page
|
|
60
|
+
when 'parent' then @current_page.parent || @current_page
|
|
61
|
+
when 'page' then @current_page
|
|
62
|
+
else
|
|
63
|
+
context.registers[:site].pages.fullpath(@source).minimal_attributes.first
|
|
64
|
+
end).children_with_minimal_attributes.to_a
|
|
65
|
+
|
|
66
|
+
children.delete_if { |p| !include_page?(p) }
|
|
67
|
+
end
|
|
68
|
+
|
|
51
69
|
def include_page?(page)
|
|
52
|
-
if page.templatized?
|
|
70
|
+
if page.templatized? || !page.published?
|
|
53
71
|
false
|
|
54
72
|
elsif @options[:exclude]
|
|
55
73
|
(page.fullpath =~ @options[:exclude]).nil?
|
|
@@ -58,14 +76,14 @@ module Locomotive
|
|
|
58
76
|
end
|
|
59
77
|
end
|
|
60
78
|
|
|
61
|
-
def
|
|
62
|
-
selected = @current_page.
|
|
79
|
+
def render_entry_link(page, css)
|
|
80
|
+
selected = @current_page.fullpath =~ /^#{page.fullpath}/ ? ' on' : ''
|
|
63
81
|
|
|
64
82
|
icon = @options[:icon] ? '<span></span>' : ''
|
|
65
83
|
label = %{#{icon if @options[:icon] != 'after' }#{page.title}#{icon if @options[:icon] == 'after' }}
|
|
66
84
|
|
|
67
85
|
%{
|
|
68
|
-
<li id="#{page.slug.dasherize}" class="link#{selected}">
|
|
86
|
+
<li id="#{page.slug.dasherize}" class="link#{selected} #{css}">
|
|
69
87
|
<a href="/#{page.fullpath}">#{label}</a>
|
|
70
88
|
</li>
|
|
71
89
|
}.strip
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
require 'rack/utils'
|
|
2
|
-
|
|
3
1
|
module Locomotive
|
|
4
2
|
module Middlewares
|
|
5
3
|
class Fonts
|
|
6
|
-
include Rack::Utils
|
|
7
4
|
|
|
8
5
|
def initialize(app, opts = {})
|
|
9
6
|
@app = app
|
|
10
7
|
@path_regexp = opts[:path] || %r{^/fonts/}
|
|
11
|
-
@
|
|
12
|
-
@expires_in = opts[:expires_in] || 24.hour
|
|
8
|
+
@expires_in = opts[:expires_in] || 24.hour # varnish
|
|
13
9
|
end
|
|
14
10
|
|
|
15
11
|
def call(env)
|
|
@@ -19,13 +15,9 @@ module Locomotive
|
|
|
19
15
|
if site.nil?
|
|
20
16
|
@app.call(env)
|
|
21
17
|
else
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
response = @file_server.call(env)
|
|
25
|
-
|
|
26
|
-
response[1]['Cache-Control'] = "public; max-age=#{@expires_in}" # varnish
|
|
18
|
+
body = ThemeAssetUploader.build(site, env["PATH_INFO"]).read.to_s
|
|
27
19
|
|
|
28
|
-
|
|
20
|
+
[200, { 'Cache-Control' => "public; max-age=#{@expires_in}" }, [body]]
|
|
29
21
|
end
|
|
30
22
|
else
|
|
31
23
|
@app.call(env)
|
|
@@ -26,9 +26,11 @@ module Locomotive
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def require_site
|
|
29
|
+
return true if current_site
|
|
30
|
+
|
|
29
31
|
redirect_to admin_installation_url and return false if Account.count == 0 || Site.count == 0
|
|
30
32
|
|
|
31
|
-
render_no_site_error and return false
|
|
33
|
+
render_no_site_error and return false
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
def render_no_site_error
|
data/lib/locomotive/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: locomotive_cms
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash: -
|
|
4
|
+
hash: -1967355473
|
|
5
5
|
prerelease: true
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 0
|
|
9
9
|
- 4
|
|
10
|
-
-
|
|
11
|
-
version: 0.0.4.
|
|
10
|
+
- beta11
|
|
11
|
+
version: 0.0.4.beta11
|
|
12
12
|
platform: ruby
|
|
13
13
|
authors:
|
|
14
14
|
- Didier Lafforgue
|
|
@@ -16,7 +16,7 @@ autorequire:
|
|
|
16
16
|
bindir: bin
|
|
17
17
|
cert_chain: []
|
|
18
18
|
|
|
19
|
-
date:
|
|
19
|
+
date: 2011-01-03 00:00:00 +01:00
|
|
20
20
|
default_executable:
|
|
21
21
|
dependencies:
|
|
22
22
|
- !ruby/object:Gem::Dependency
|
|
@@ -380,7 +380,7 @@ dependencies:
|
|
|
380
380
|
- !ruby/object:Gem::Dependency
|
|
381
381
|
type: :runtime
|
|
382
382
|
prerelease: false
|
|
383
|
-
name:
|
|
383
|
+
name: locomotive_jammit-s3
|
|
384
384
|
version_requirements: &id024 !ruby/object:Gem::Requirement
|
|
385
385
|
none: false
|
|
386
386
|
requirements:
|