theme_generator 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/USAGE +11 -3
- data/templates/README +57 -10
- data/templates/actioncontroller_ex.rb +20 -21
- data/templates/actionview_ex.rb +43 -18
- data/templates/init.rb +7 -0
- data/templates/layout.liquid +11 -0
- data/templates/liquid_helpers.rb +45 -0
- data/templates/theme.rb +1 -16
- data/templates/themes.rake +6 -2
- data/theme_generator.rb +22 -13
- metadata +4 -2
data/USAGE
CHANGED
@@ -3,7 +3,7 @@ NAME
|
|
3
3
|
folder structure.
|
4
4
|
|
5
5
|
SYNOPSIS
|
6
|
-
theme [theme name]
|
6
|
+
theme [theme name] (use _system_ to update theme system files only)
|
7
7
|
|
8
8
|
DESCRIPTION
|
9
9
|
This generator creates general purpose theme support. It's designed to leverage
|
@@ -12,10 +12,18 @@ DESCRIPTION
|
|
12
12
|
|
13
13
|
Included:
|
14
14
|
- Abstraction of Typo style theme support
|
15
|
-
-
|
15
|
+
- Tag helpers for accessing theme specfic content
|
16
|
+
- Support for overriding views in theme
|
17
|
+
- Support for ERb templates and Liquid templates
|
18
|
+
- Theme system can allow a mix of both template types, or Liquid templates only
|
19
|
+
- Liquid tag for accessing theme specfic content
|
16
20
|
|
17
21
|
EXAMPLE
|
18
|
-
|
22
|
+
./script/generate theme default
|
19
23
|
|
20
24
|
This will generate the file structure for a theme named 'default' and prepare
|
21
25
|
the rails application for theme support.
|
26
|
+
|
27
|
+
Starting with version 1.2, you can update just the theme system files by running:
|
28
|
+
|
29
|
+
./script/generate theme _system_
|
data/templates/README
CHANGED
@@ -35,26 +35,73 @@ In the views, there are theme specific helper tags available to you.
|
|
35
35
|
- theme_stylesheet_link_tag
|
36
36
|
- theme_stylesheet_path
|
37
37
|
|
38
|
+
Views can be overidden by placing templates in the themes/[theme_name]/views
|
39
|
+
folder. You can use the default ERb templates, or Liquid templates.
|
40
|
+
|
41
|
+
You can tell the theme system to only allow Liquid templates in a theme by
|
42
|
+
setting 'force_liquid' in your controller:
|
43
|
+
|
44
|
+
class ApplicationController < ActionController::Base
|
45
|
+
|
46
|
+
layout 'default'
|
47
|
+
theme 'blue'
|
48
|
+
|
49
|
+
force_liquid true
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
If force_liquid is set to true, the theme system will only render .liquid
|
54
|
+
template files. If .rhtml templates are found, an exception is raised.
|
55
|
+
|
56
|
+
Note: force_liquid is only for theme templates. Your
|
57
|
+
application templates can still be ERb (.rhtml)
|
58
|
+
files.
|
59
|
+
|
38
60
|
Before hosting, I would recommend running the rake task to pre-cache all of
|
39
61
|
the theme files:
|
40
62
|
|
41
|
-
rake
|
63
|
+
rake theme_create_cache
|
42
64
|
|
43
65
|
There is also a handy rake task for removing all the cached theme files:
|
44
66
|
|
45
|
-
rake
|
67
|
+
rake theme_remove_cache
|
68
|
+
|
69
|
+
You can also update the cache:
|
70
|
+
|
71
|
+
rake theme_update_cache
|
72
|
+
|
73
|
+
== Upgrading
|
74
|
+
|
75
|
+
Starting with version 1.2, you can update just the theme system files by
|
76
|
+
running:
|
77
|
+
|
78
|
+
./script/generate theme _system_
|
46
79
|
|
47
80
|
|
48
81
|
== Changelog
|
49
82
|
|
50
|
-
1.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
83
|
+
1.2.0 - Updated actionview_ex with the new render_file additions from
|
84
|
+
Typo. Renamed the rake tasks so that they all start with
|
85
|
+
'theme' (theme_create_cache, theme_remove_cache,
|
86
|
+
theme_update_cache). You can update the system files by running:
|
87
|
+
|
88
|
+
$ ./script/generate theme _system_
|
89
|
+
|
90
|
+
Full support for Liquid templates, as well as an option to only
|
91
|
+
allow Liquid templates in a theme.
|
92
|
+
|
93
|
+
1.1.1 - Added rake tasks for pre-caching the themes, and removing the
|
94
|
+
cached themes.
|
95
|
+
|
56
96
|
1.1.0 - [Breaking] Abstraction of the Typo theme system. The themes are
|
57
97
|
now the same as is used in Typo. The theme engine itself is a
|
58
98
|
combination of plugins and a component.
|
59
|
-
|
60
|
-
|
99
|
+
|
100
|
+
1.0.2 - The current_theme is now retrieved from the controller. Where
|
101
|
+
symlinks are created on *nix systems, shortcuts are created
|
102
|
+
on Windows if Win32Utils is installed.
|
103
|
+
|
104
|
+
1.0.1 - Added 'themes' directory, theme definition file, and symlinks
|
105
|
+
to the appropriate directories on supported platforms.
|
106
|
+
|
107
|
+
1.0.0 - Initial release
|
@@ -3,42 +3,41 @@
|
|
3
3
|
ActionController::Base.class_eval do
|
4
4
|
|
5
5
|
attr_accessor :current_theme
|
6
|
-
|
6
|
+
attr_accessor :force_liquid_template
|
7
|
+
|
7
8
|
def self.theme(theme_name, conditions = {})
|
8
9
|
# TODO: Allow conditions... (?)
|
9
10
|
write_inheritable_attribute "theme", theme_name
|
10
11
|
end
|
11
12
|
|
13
|
+
def self.force_liquid(force_liquid_value, conditions = {})
|
14
|
+
# TODO: Allow conditions... (?)
|
15
|
+
write_inheritable_attribute "force_liquid", force_liquid_value
|
16
|
+
end
|
17
|
+
|
18
|
+
|
12
19
|
# You need to override this in your +ApplicationController+
|
13
20
|
# This should return the current theme name
|
14
21
|
def current_theme(passed_theme=nil)
|
15
22
|
theme = passed_theme || self.class.read_inheritable_attribute("theme")
|
16
23
|
|
17
|
-
active_theme = case theme
|
24
|
+
@active_theme = case theme
|
18
25
|
when Symbol then send(theme)
|
19
26
|
when Proc then theme.call(self)
|
20
27
|
when String then theme
|
21
28
|
end
|
22
29
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
when Symbol then send(layout)
|
35
|
-
when Proc then layout.call(self)
|
36
|
-
when String then layout
|
37
|
-
end
|
38
|
-
|
39
|
-
active_layout.include?("/") ? active_layout : Theme.new(current_theme).layout(active_layout) if active_layout
|
40
|
-
else
|
41
|
-
__active_layout(passed_layout)
|
30
|
+
|
31
|
+
def force_liquid_template(passed_value=nil)
|
32
|
+
force_liquid = passed_value || self.class.read_inheritable_attribute("force_liquid")
|
33
|
+
|
34
|
+
force_liquid_template = case force_liquid
|
35
|
+
when Symbol then send(force_liquid)
|
36
|
+
when Proc then force_liquid.call(self)
|
37
|
+
when String then force_liquid == 'true'
|
38
|
+
when TrueClass then force_liquid
|
39
|
+
when FalseClass then force_liquid
|
40
|
+
when Fixnum then force_liquid == 1
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
data/templates/actionview_ex.rb
CHANGED
@@ -1,21 +1,46 @@
|
|
1
|
+
# Extend the Base ActionView to support rendering themes
|
2
|
+
#
|
1
3
|
module ActionView
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
4
|
+
class ThemeError < StandardError
|
5
|
+
end
|
6
|
+
|
7
|
+
class Base
|
8
|
+
alias_method :__render_file, :render_file
|
9
|
+
|
10
|
+
def render_file(template_path, use_full_path = true, local_assigns = {})
|
11
|
+
search_path = [
|
12
|
+
"../themes/#{controller.current_theme}/views", # for components
|
13
|
+
"../../themes/#{controller.current_theme}/views", # for normal views
|
14
|
+
"../../themes/#{controller.current_theme}", # for layouts
|
15
|
+
"." # fallback
|
16
|
+
]
|
17
|
+
|
18
|
+
if use_full_path
|
19
|
+
search_path.each do |prefix|
|
20
|
+
theme_path = prefix +'/'+ template_path
|
21
|
+
begin
|
22
|
+
template_extension = pick_template_extension(theme_path)
|
23
|
+
|
24
|
+
# Prevent .rhtml (or any other template type) if force_liquid == true
|
25
|
+
if controller.force_liquid_template and
|
26
|
+
template_extension.to_s != 'liquid' and
|
27
|
+
prefix != '.'
|
28
|
+
raise ThemeError.new("Template '#{template_path}' must be a liquid document")
|
29
|
+
end
|
30
|
+
|
31
|
+
local_assigns['active_theme'] = controller.current_theme unless controller.current_theme.nil?
|
32
|
+
rescue ActionView::ActionViewError => err
|
33
|
+
next
|
34
|
+
rescue ThemeError => err
|
35
|
+
# Should it raise an exception, or just call 'next' and revert to
|
36
|
+
# the default template?
|
37
|
+
raise err
|
38
|
+
end
|
39
|
+
return __render_file(theme_path, use_full_path, local_assigns)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
__render_file(template_path, use_full_path, local_assigns)
|
43
|
+
end
|
16
44
|
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
|
45
|
+
end
|
21
46
|
end
|
data/templates/init.rb
CHANGED
@@ -3,4 +3,11 @@ require 'actioncontroller_ex'
|
|
3
3
|
require 'routeset_ex'
|
4
4
|
require 'theme_helpers'
|
5
5
|
|
6
|
+
begin
|
7
|
+
require 'liquid_helpers'
|
8
|
+
rescue
|
9
|
+
# I guess Liquid isn't being used...
|
10
|
+
puts "Liquid helpers weren't loaded: #{$!}"
|
11
|
+
end
|
12
|
+
|
6
13
|
ActionController::Routing::Routes.install_theme_routes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title></title>
|
6
|
+
<link href="{% themeitem %} <%= file_name %> {% endthemeitem %}" media="screen" rel="Stylesheet" type="text/css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
{{ content_for_layout }}
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# A Liquid Tag for retrieving path information for theme specific media
|
2
|
+
#
|
3
|
+
# Returns the path based on the file extension
|
4
|
+
#
|
5
|
+
class Themeitem < Liquid::Block
|
6
|
+
|
7
|
+
@@image_exts = %w( .png .jpg .jpeg .jpe .gif )
|
8
|
+
|
9
|
+
@@stylesheet_exts = %w( .css )
|
10
|
+
|
11
|
+
@@javascript_exts = %w( .js .htc )
|
12
|
+
|
13
|
+
def initialize(markup, tokens)
|
14
|
+
super
|
15
|
+
#@media_type = markup.strip
|
16
|
+
end
|
17
|
+
|
18
|
+
def block_delimiter
|
19
|
+
["endthemeitem"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def block_name
|
23
|
+
"themeitem"
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(context)
|
27
|
+
# Which, if either, of these are correct?
|
28
|
+
base_url = context['request'].relative_url_root || ActionController::Base.asset_host.to_s
|
29
|
+
|
30
|
+
filename = @nodelist.join('').strip
|
31
|
+
ext = File.extname( filename )
|
32
|
+
|
33
|
+
if @@image_exts.include?( ext )
|
34
|
+
"#{base_url}/themes/#{context['active_theme']}/images/#{filename}"
|
35
|
+
|
36
|
+
elsif @@stylesheet_exts.include?( ext )
|
37
|
+
"#{base_url}/themes/#{context['active_theme']}/stylesheets/#{filename}"
|
38
|
+
|
39
|
+
elsif @@javascript_exts.include?( ext )
|
40
|
+
"#{base_url}/themes/#{context['active_theme']}/javascripts/#{filename}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
Liquid::Template.register_block( 'themeitem', Themeitem )
|
data/templates/theme.rb
CHANGED
@@ -8,11 +8,7 @@ class Theme
|
|
8
8
|
@name = name
|
9
9
|
@path = path ||= Theme.path_to_theme(name)
|
10
10
|
end
|
11
|
-
|
12
|
-
def layout(layout='default')
|
13
|
-
"../../themes/#{name}/layouts/#{layout}"
|
14
|
-
end
|
15
|
-
|
11
|
+
|
16
12
|
def description
|
17
13
|
File.read("#{path}/about.markdown") rescue "### #{name}"
|
18
14
|
end
|
@@ -20,17 +16,6 @@ class Theme
|
|
20
16
|
def self.themes_root
|
21
17
|
RAILS_ROOT + "/themes"
|
22
18
|
end
|
23
|
-
|
24
|
-
# DEPRECATED: There is no 'current' theme, at least, not from here...
|
25
|
-
def self.current_theme_path
|
26
|
-
raise 'DEPRECATED: The current theme is set in the controller'
|
27
|
-
"#{themes_root}/#{config[:theme]}"
|
28
|
-
end
|
29
|
-
# DEPRECATED: There is no 'current' theme, at least, not from here...
|
30
|
-
def self.current
|
31
|
-
theme_from_path(current_theme_path)
|
32
|
-
end
|
33
|
-
|
34
19
|
|
35
20
|
def self.path_to_theme(theme)
|
36
21
|
"#{themes_root}/#{theme}"
|
data/templates/themes.rake
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
desc "Creates the cached (public) theme folders"
|
3
|
-
task :
|
3
|
+
task :theme_create_cache do
|
4
4
|
for theme in Dir.glob("#{RAILS_ROOT}/themes/*")
|
5
5
|
theme_name = theme.split( File::Separator )[-1]
|
6
6
|
puts "Creating #{RAILS_ROOT}/public/themes/#{theme_name}"
|
@@ -15,7 +15,11 @@ task :create_theme_cache do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
desc "Removes the cached (public) theme folders"
|
18
|
-
task :
|
18
|
+
task :theme_remove_cache do
|
19
|
+
puts "Creating #{RAILS_ROOT}/public/themes/#{theme_name}"
|
19
20
|
FileUtils.rm_r Dir.glob("#{RAILS_ROOT}/public/themes/*")
|
20
21
|
FileUtils.rm_r "#{RAILS_ROOT}/public/themes", :force => true
|
21
22
|
end
|
23
|
+
|
24
|
+
desc "Updates the cached (public) theme folders"
|
25
|
+
task :theme_update_cache => [:theme_remove_cache, :theme_create_cache]
|
data/theme_generator.rb
CHANGED
@@ -1,23 +1,30 @@
|
|
1
1
|
class ThemeGenerator < Rails::Generator::NamedBase
|
2
|
+
|
2
3
|
def manifest
|
3
4
|
record do |m|
|
4
|
-
# Readme file
|
5
|
-
m.template 'README', "README_THEMES"
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
if file_name != '_system_'
|
7
|
+
|
8
|
+
# Theme folder(s)
|
9
|
+
m.directory File.join( "themes", file_name )
|
10
|
+
m.template 'about.markdown', File.join( 'themes', file_name, 'about.markdown' )
|
11
|
+
m.template 'preview.png', File.join( 'themes', file_name, 'preview.png' )
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
m.directory File.join( "themes", file_name, "stylesheets" )
|
14
|
+
m.template "theme.css", File.join( "themes", file_name, "stylesheets", "#{file_name}.css" )
|
15
|
+
|
16
|
+
m.directory File.join( "themes", file_name, "layouts" )
|
17
|
+
m.template 'layout.rhtml', File.join( 'themes', file_name, 'layouts', 'default.rhtml' )
|
18
|
+
m.template 'layout.liquid', File.join( 'themes', file_name, 'layouts', 'default.liquid' )
|
14
19
|
|
15
|
-
|
16
|
-
|
20
|
+
m.directory File.join( "themes", file_name, "views" )
|
21
|
+
m.directory File.join( "themes", file_name, "images" )
|
22
|
+
m.directory File.join( "themes", file_name, "javascript" )
|
23
|
+
|
24
|
+
end
|
17
25
|
|
18
|
-
|
19
|
-
m.
|
20
|
-
m.directory File.join( "themes", file_name, "javascript" )
|
26
|
+
# Readme file
|
27
|
+
m.template 'README', "README_THEMES"
|
21
28
|
|
22
29
|
# The ThemeEngine plugins
|
23
30
|
m.directory File.join( "vendor", "plugins", "theme_engine" )
|
@@ -25,6 +32,7 @@ class ThemeGenerator < Rails::Generator::NamedBase
|
|
25
32
|
m.directory File.join( "vendor", "plugins", "theme_engine", "lib" )
|
26
33
|
m.template 'actioncontroller_ex.rb', File.join( 'vendor', 'plugins', 'theme_engine', 'lib', 'actioncontroller_ex.rb' )
|
27
34
|
m.template 'actionview_ex.rb', File.join( 'vendor', 'plugins', 'theme_engine', 'lib', 'actionview_ex.rb' )
|
35
|
+
m.template 'liquid_helpers.rb', File.join( 'vendor', 'plugins', 'theme_engine', 'lib', 'liquid_helpers.rb' )
|
28
36
|
m.template 'routeset_ex.rb', File.join( 'vendor', 'plugins', 'theme_engine', 'lib', 'routeset_ex.rb' )
|
29
37
|
m.template 'theme_helpers.rb', File.join( 'vendor', 'plugins', 'theme_engine', 'lib', 'theme_helpers.rb' )
|
30
38
|
m.directory File.join( "vendor", "plugins", "theme_engine", "tasks" )
|
@@ -34,6 +42,7 @@ class ThemeGenerator < Rails::Generator::NamedBase
|
|
34
42
|
m.directory File.join( "components", "theme_system" )
|
35
43
|
m.template 'theme.rb', File.join( 'components', 'theme_system', 'theme.rb' )
|
36
44
|
m.template 'theme_controller.rb', File.join( 'components', 'theme_system', 'theme_controller.rb' )
|
45
|
+
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: theme_generator
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2005-11-
|
6
|
+
version: 1.2.0
|
7
|
+
date: 2005-11-11 00:00:00 -06:00
|
8
8
|
summary: "[Rails] Theme generator adds support for themes into Rails applications"
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -39,6 +39,8 @@ files:
|
|
39
39
|
- templates/theme_controller.rb
|
40
40
|
- templates/actioncontroller_ex.rb
|
41
41
|
- templates/layout.rhtml
|
42
|
+
- templates/layout.liquid
|
43
|
+
- templates/liquid_helpers.rb
|
42
44
|
- templates/theme.css
|
43
45
|
- templates/theme_helpers.rb
|
44
46
|
- templates/themes.rake
|