sections_rails 0.7.1 → 0.7.2
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/README.md +82 -92
- data/lib/sections_rails/section.rb +11 -174
- data/lib/sections_rails/section_asset_rendering.rb +92 -0
- data/lib/sections_rails/section_partial_rendering.rb +100 -0
- data/lib/sections_rails/version.rb +1 -1
- data/lib/sections_rails/view_finder.rb +10 -8
- data/lib/sections_rails.rb +1 -1
- data/spec/controllers/image_assets_controller_spec.rb +38 -0
- data/spec/controllers/partials_controller_spec.rb +25 -11
- data/spec/controllers/script_assets_controller_spec.rb +7 -7
- data/spec/controllers/style_assets_controller_spec.rb +10 -10
- data/spec/controllers/view_types_controller_spec.rb +3 -3
- data/spec/dummy/app/controllers/image_assets_controller.rb +14 -0
- data/spec/dummy/app/controllers/partials_controller.rb +6 -0
- data/spec/dummy/app/views/image_assets/gif.html.erb +1 -0
- data/spec/dummy/app/views/image_assets/jpeg.html.erb +1 -0
- data/spec/dummy/app/views/image_assets/jpg.html.erb +1 -0
- data/spec/dummy/app/views/image_assets/png.html.erb +1 -0
- data/spec/dummy/app/views/partials/custom_partial_with_block.html.erb +3 -0
- data/spec/dummy/app/views/partials/tag_option.html.erb +1 -0
- data/spec/dummy/config/application.rb +4 -3
- data/spec/dummy/config/boot.rb +7 -3
- data/spec/dummy/config/environments/test.rb +1 -4
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +3204 -16064
- data/spec/dummy/log/production.log +61 -0
- data/spec/dummy/log/test.log +2041 -0
- data/spec/sections_rails/config_spec.rb +31 -0
- data/spec/sections_rails/partial_parser_spec.rb +12 -12
- data/spec/sections_rails/section_spec.rb +16 -54
- data/spec/sections_rails/view_finder_spec.rb +4 -4
- data/spec/spec_helper.rb +3 -0
- metadata +73 -35
- data/spec/dummy/tmp/cache/assets/CB9/B60/sprockets%2Fe7b839a0806e5c20e5018197f56cd656 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D76/4D0/sprockets%2F8a096b6dd59bfda3e461617a95524eaf +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/DE1/6A0/sprockets%2Fcae9aba95894da8a28fa8a5387dc565f +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E1D/010/sprockets%2Fdffad412d86bfdfbb1f307d711da21d3 +0 -0
data/README.md
CHANGED
@@ -1,38 +1,33 @@
|
|
1
|
-
|
1
|
+
# Sections for Rails [](https://travis-ci.org/kevgo/sections_rails) [](https://codeclimate.com/github/kevgo/sections_rails) [](https://coveralls.io/r/kevgo/sections_rails)
|
2
2
|
|
3
|
-
|
4
|
-
rather than spread across _app/views_, _app/assets/javascripts_, _app/assets/stylesheets_, and _spec/javascripts_.
|
5
|
-
This makes it easier to work on those pieces, makes them more reusable, and large code bases more managable.
|
3
|
+
_A component-oriented infrastructure for the view layer of Ruby on Rails applications._
|
6
4
|
|
5
|
+
A _section_ organizes all assets (DOM, styling, behavior, tests etc) for a particular component of a web site (a menu, a navbar, a slideshow etc)
|
6
|
+
together. This makes development easier, components more reusable, and large code bases more managable.
|
7
7
|
|
8
|
-
# Example
|
9
8
|
|
10
|
-
|
11
|
-
It consists of certain HTML, CSS, and JavaScript code as well as image resources.
|
12
|
-
These assets must be loaded on every page that this navigation menu is visible on,
|
13
|
-
and should be removed when the navigation menu is removed from the site.
|
9
|
+
## Example
|
14
10
|
|
15
|
-
|
11
|
+
A navigation menu (as an example for a component) within a web site consists of HTML, CSS, and JavaScript code, image resources, as well as unit tests.
|
12
|
+
Traditionally, these files are defined in a directory like this:
|
16
13
|
|
17
|
-
|
18
|
-
/
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
/
|
23
|
-
/spec/javascripts/menu_spec.js
|
24
|
-
```
|
14
|
+
/app/assets/images/background.gif # Background image.
|
15
|
+
/javascripts/menu.js # Logic for the menu.
|
16
|
+
/templates/entry.jst.ejs # Client-side template for menu entries.
|
17
|
+
/stylesheets/menu.css # Styling.
|
18
|
+
/views/shared/_menu.html.erb # Server-side template.
|
19
|
+
/spec/javascripts/menu_spec.js # Unit tests.
|
25
20
|
|
26
|
-
_Sections_rails_ allows to define these assets together, as a _section_ inside the _/app_ folder:
|
21
|
+
_Sections_rails_ allows to define these assets together, as a _section_, inside the _/app_ folder:
|
27
22
|
|
28
|
-
/app/sections/menu/_menu.html.erb
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
menu_spec.coffee
|
23
|
+
/app/sections/menu/_menu.html.erb
|
24
|
+
background.gif
|
25
|
+
entry.jst.ejs
|
26
|
+
menu.css
|
27
|
+
menu.js
|
28
|
+
menu_spec.coffee
|
34
29
|
|
35
|
-
To embed this menu
|
30
|
+
To embed this menu into a page, simply do this in your view:
|
36
31
|
|
37
32
|
```erb
|
38
33
|
<%= section :menu %>
|
@@ -40,144 +35,139 @@ To embed this menu and all its assets into a page, simply do this in your view:
|
|
40
35
|
|
41
36
|
This command inserts the partial as well as the JS and CSS files from _/app/sections/menu_ into the page.
|
42
37
|
|
43
|
-
It does the right thing in all circumstances: In development mode it inserts the individual
|
44
|
-
in production mode
|
38
|
+
It does the right thing in all circumstances: In development mode it inserts the individual files into the page,
|
39
|
+
in production mode they are included into the compiled output.
|
40
|
+
And when the menu folder is deleted or moved to another page,
|
41
|
+
all assets of the menu are cleanly deleted or moved with it!
|
45
42
|
|
46
|
-
The gem source comes with a bundled example Rails app in the _demo/_ directory.
|
47
|
-
It provides several working examples of sections in action in _views/demos/index.html.erb_.
|
48
43
|
|
44
|
+
## Example applications
|
49
45
|
|
50
|
-
|
46
|
+
The gem source comes with a bundled example Rails app in the [demo](https://github.com/kevgo/sections_rails/tree/master/demo) directory.
|
47
|
+
Start it up and [check it out](http://localhost:3000)!
|
48
|
+
The source code for the sections is [here](https://github.com/kevgo/sections_rails/tree/master/demo/app/sections).
|
51
49
|
|
52
|
-
In your Gemfile:
|
53
50
|
|
54
|
-
|
55
|
-
gem 'sections_rails'
|
56
|
-
```
|
51
|
+
## Installation
|
57
52
|
|
58
|
-
|
53
|
+
In your Gemfile: `gem 'sections_rails'`, then set up the directory structure:
|
59
54
|
|
60
55
|
```bash
|
61
56
|
$ rails generate sections
|
62
57
|
```
|
63
58
|
|
64
|
-
The generator
|
59
|
+
The generator
|
65
60
|
|
66
|
-
|
67
|
-
in which you put the source code for the different sections.
|
61
|
+
* creates a new folder __/app/sections__, in which you put the source code for the different sections.
|
68
62
|
|
69
|
-
|
63
|
+
* adds the folder _/app/sections_ to the asset pipeline by inserting this line into your _application.rb_ file:
|
70
64
|
|
71
65
|
config.assets.paths << 'app/sections'
|
72
66
|
|
73
|
-
|
67
|
+
* optionally creates a demo section called _hello_world_ that you can try out as described below.
|
74
68
|
|
75
69
|
|
76
|
-
|
77
|
-
__application_sections.js__ and __application_sections.css__.
|
70
|
+
The current implementation requires two empty asset container files: __application_sections.js__ and __application_sections.css__.
|
78
71
|
Make sure you require them from your main _application.js_ and _application.css_ files.
|
79
|
-
They are used only when running _rake assets:precompile_ during deployment,
|
72
|
+
They are used only when running _rake assets:precompile_ during deployment, should be checked into your code repository, and stay the way they are.
|
80
73
|
|
81
74
|
|
82
|
-
|
75
|
+
## Usage
|
83
76
|
|
84
|
-
To
|
77
|
+
To show the "hello_world" section created by the sections generator on a page:
|
85
78
|
|
86
79
|
```erb
|
87
80
|
<%= section :hello_world %>
|
88
81
|
```
|
89
82
|
|
90
83
|
If your section renders itself completely in JavaScript, you can omit its partial file.
|
91
|
-
In this case, the _sections_ helper creates an empty div
|
84
|
+
In this case, the _sections_ helper creates an empty div with the section name as its class.
|
92
85
|
|
93
86
|
```html
|
94
87
|
<div class="hello_world"></div>
|
95
88
|
```
|
96
89
|
|
97
|
-
## Options
|
98
|
-
|
99
90
|
By default, a section automatically includes partials, css, and js files with the section name if they exist.
|
100
|
-
This convention can be overridden.
|
101
|
-
|
91
|
+
This convention can be overridden.
|
92
|
+
|
93
|
+
|
94
|
+
### Customizing the filename of the section's partial.
|
102
95
|
|
103
96
|
```erb
|
104
|
-
<%= section :hello_world, partial: '
|
97
|
+
<%= section :hello_world, partial: 'another_partial' %>
|
105
98
|
```
|
106
99
|
|
107
|
-
|
100
|
+
|
101
|
+
### Customizing the filename of the assets
|
102
|
+
|
103
|
+
To tell the section to use `foobar.js` instead of `hello_world.js`:
|
108
104
|
|
109
105
|
```erb
|
110
|
-
<%= section :hello_world,
|
106
|
+
<%= section :hello_world, js: 'foobar.js' %>
|
111
107
|
```
|
112
108
|
|
113
|
-
You can also provide a block to the section, which can be included into the partial by saying
|
114
109
|
|
110
|
+
### Omitting assets
|
115
111
|
|
116
|
-
|
112
|
+
Sections can be told not not include their css or js file when rendered.
|
117
113
|
|
118
|
-
|
114
|
+
```erb
|
115
|
+
<%= section :hello_world, css: false %>
|
116
|
+
```
|
117
|
+
|
118
|
+
### Providing parameters to the partial
|
119
119
|
|
120
120
|
```erb
|
121
|
-
<%= section :
|
122
|
-
<h1> Elaborate </h1>
|
123
|
-
<div> Block </div>
|
124
|
-
<p> content </p>
|
125
|
-
<% end %>
|
121
|
+
<%= section :hello_world, locals: { message: 'Greetings!' } %>
|
126
122
|
```
|
127
123
|
|
128
|
-
|
124
|
+
### Inline blocks for sections.
|
125
|
+
|
126
|
+
You can provide a block to the section:
|
127
|
+
|
129
128
|
```erb
|
130
|
-
|
131
|
-
|
132
|
-
|
129
|
+
<%= section :info_window do %>
|
130
|
+
<h1> inline </h1>
|
131
|
+
<div> block </div>
|
132
|
+
<p> content </p>
|
133
|
+
<% end %>
|
133
134
|
```
|
134
135
|
|
135
|
-
This
|
136
|
+
This block can be included into the serverside partial of the section using `yield`.
|
136
137
|
|
137
138
|
|
138
|
-
|
139
|
+
### Creating new sections.
|
139
140
|
|
140
|
-
To create a new section, simply create a new folder under _/app/sections_
|
141
|
-
|
141
|
+
To create a new section, simply create a new folder under _/app/sections_.
|
142
|
+
There is also a generator for your convenience, which creates a whole scaffolded section.
|
142
143
|
|
143
144
|
```bash
|
144
145
|
$ rails generate section admin/chart
|
145
146
|
```
|
146
147
|
|
147
|
-
This creates a folder _/app/sections/admin/chart_ with a scaffold for a new section.
|
148
|
-
|
149
148
|
|
150
|
-
|
149
|
+
### Unit tests for sections
|
151
150
|
|
152
151
|
Sections should also contain unit test files for the section.
|
153
152
|
|
154
|
-
|
155
|
-
|
156
|
-
_This feature is still under development._
|
157
|
-
|
158
|
-
To test them for example using [Konacha](https://github.com/jfirebaugh/konacha), create a symlink to _app/sections_ in _spec/javascript_.
|
159
|
-
|
153
|
+
To run your section tests using [Konacha](https://github.com/jfirebaugh/konacha), create a symlink to _app/sections_ in _spec/javascript_.
|
160
154
|
|
161
|
-
# Development
|
162
155
|
|
163
|
-
##
|
156
|
+
## How to contribute
|
164
157
|
|
165
|
-
|
166
|
-
$ rake
|
167
|
-
```
|
158
|
+
Feel free to send unit-tested pull requests! The unit tests of this project are run using `rake`.
|
168
159
|
|
169
|
-
To automatically run unit tests when files change, run
|
170
160
|
|
171
|
-
|
172
|
-
$ bundle exec guard -c
|
173
|
-
```
|
161
|
+
### Missing features
|
174
162
|
|
175
|
-
|
163
|
+
_Sections_rails_ is far from complete. Some missing things are:
|
176
164
|
|
177
|
-
_Sections_rails_ is in prototypical development and far from complete. Missing features are:
|
178
|
-
|
179
|
-
* Better support for unit testing.
|
180
165
|
* Support for multiple application assets, for example page-specific compiled asset files instead of one global one.
|
181
166
|
* Support for serverside controller logic for sections, for example by integrating with https://github.com/apotonick/cells.
|
182
167
|
* More natural integration into the asset pipeline.
|
183
168
|
|
169
|
+
|
170
|
+
### Authors
|
171
|
+
|
172
|
+
* [Kevin Goslar](https://github.com/kevgo)
|
173
|
+
* [Serge Zinin](https://github.com/zininserge)
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module SectionsRails
|
2
2
|
require "sections_rails/config"
|
3
3
|
require 'sections_rails/partial_parser'
|
4
|
+
require 'sections_rails/section_asset_rendering'
|
5
|
+
require 'sections_rails/section_partial_rendering'
|
4
6
|
|
7
|
+
|
8
|
+
# Provides intelligent support for dealing with sections.
|
5
9
|
class Section
|
10
|
+
include SectionAssetRenderering
|
11
|
+
include SectionPartialRendering
|
6
12
|
|
7
13
|
def initialize section_name, view = nil, options = {}
|
8
14
|
@section_name = section_name.to_s
|
@@ -24,122 +30,12 @@ module SectionsRails
|
|
24
30
|
@filename ||= File.basename @section_name, '.*'
|
25
31
|
end
|
26
32
|
|
27
|
-
# Path to the folder for asset includes.
|
28
|
-
# Example: 'folder/section'
|
29
|
-
def folder_includepath
|
30
|
-
@folder_includepath ||= File.join directory_name, filename
|
31
|
-
end
|
32
|
-
|
33
33
|
# Path of the folder on the file system.
|
34
34
|
# Example: 'app/sections/folder/section'
|
35
35
|
def folder_filepath
|
36
36
|
@folder_filepath ||= File.join SectionsRails.config.path, directory_name, filename
|
37
37
|
end
|
38
38
|
|
39
|
-
# Path to access assets on the file system.
|
40
|
-
# Includes only the base name of assets, without extensions.
|
41
|
-
# Example: 'app/sections/folder/section/section'
|
42
|
-
def asset_filepath
|
43
|
-
@asset_filepath ||= File.join SectionsRails.config.path, asset_includepath
|
44
|
-
end
|
45
|
-
|
46
|
-
# Path for including assets into the web page.
|
47
|
-
#
|
48
|
-
def asset_includepath
|
49
|
-
@asset_includepath ||= File.join(directory_name, filename, filename).gsub(/^\//, '')
|
50
|
-
end
|
51
|
-
|
52
|
-
# The path for accessing the partial on the filesystem.
|
53
|
-
# Example: '
|
54
|
-
def partial_renderpath partial_filename = nil
|
55
|
-
File.join(directory_name, filename, partial_filename || filename).gsub(/^\//, '')
|
56
|
-
end
|
57
|
-
|
58
|
-
# The path for accessing the partial on the filesystem.
|
59
|
-
# Example: '
|
60
|
-
def partial_filepath partial_filename = nil
|
61
|
-
File.join(SectionsRails.config.path, directory_name,filename, "_#{partial_filename or filename}").gsub(/^\//, '')
|
62
|
-
end
|
63
|
-
|
64
|
-
# For including the partial into views.
|
65
|
-
def partial_includepath
|
66
|
-
@partial_includepath ||= File.join(directory_name, filename, "#{filename}").gsub(/^\//, '')
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns the content of this sections partial.
|
70
|
-
def partial_content
|
71
|
-
return @partial_content if @has_partial_content
|
72
|
-
@has_partial_content = true
|
73
|
-
if (partial_path = find_partial_filepath)
|
74
|
-
@partial_content = IO.read partial_path
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns the asset path of asset with the given extensions.
|
79
|
-
# Helper method.
|
80
|
-
def find_asset_includepath asset_option, extensions
|
81
|
-
return nil if asset_option == false
|
82
|
-
return asset_option if asset_option
|
83
|
-
extensions.each do |ext|
|
84
|
-
file_path = "#{asset_filepath}.#{ext}"
|
85
|
-
return asset_includepath if File.exists? file_path
|
86
|
-
end
|
87
|
-
nil
|
88
|
-
end
|
89
|
-
|
90
|
-
# Returns the path to the JS asset of this section, or nil if the section doesn't have one.
|
91
|
-
def find_css_includepath
|
92
|
-
@find_css_includepath ||= find_asset_includepath @options[:css], SectionsRails.config.css_extensions
|
93
|
-
end
|
94
|
-
|
95
|
-
# Returns the path to the JS asset of this section, or nil if the section doesn't have one.
|
96
|
-
def find_js_includepath
|
97
|
-
@find_js_includepath ||= find_asset_includepath @options[:js], SectionsRails.config.js_extensions
|
98
|
-
end
|
99
|
-
|
100
|
-
# Returns the filename of the partial of this section, or nil if this section has no partial.
|
101
|
-
# Uses the given custom partial name, or the default partial name if none is given.
|
102
|
-
def find_partial_filepath partial_filename = nil
|
103
|
-
SectionsRails.config.partial_extensions.each do |ext|
|
104
|
-
path = "#{partial_filepath(filename)}.#{ext}"
|
105
|
-
return path if File.exists? path
|
106
|
-
end
|
107
|
-
nil
|
108
|
-
end
|
109
|
-
|
110
|
-
# Returns the path of the partial of this section for rendering, or nil if this section has no partial.
|
111
|
-
# Uses the given custom partial name, or the default partial name if none is given.
|
112
|
-
def find_partial_renderpath partial_filename = nil
|
113
|
-
SectionsRails.config.partial_extensions.each do |ext|
|
114
|
-
return partial_renderpath(partial_filename) if File.exists? "#{partial_filepath(filename)}.#{ext}"
|
115
|
-
end
|
116
|
-
nil
|
117
|
-
end
|
118
|
-
|
119
|
-
# TODO: replace this with find_asset.
|
120
|
-
def has_asset? *extensions
|
121
|
-
extensions.flatten.each do |ext|
|
122
|
-
return true if File.exists?("#{asset_filepath}.#{ext}")
|
123
|
-
end
|
124
|
-
false
|
125
|
-
end
|
126
|
-
|
127
|
-
# TODO: replace this with find_asset.
|
128
|
-
def has_default_js_asset?
|
129
|
-
has_asset? SectionsRails.config.js_extensions
|
130
|
-
end
|
131
|
-
|
132
|
-
# TODO: replace this with find_asset.
|
133
|
-
def has_default_style_asset?
|
134
|
-
has_asset? SectionsRails.config.css_extensions
|
135
|
-
end
|
136
|
-
|
137
|
-
# Returns whether this section has a template.
|
138
|
-
# Deprecated.
|
139
|
-
def has_partial?
|
140
|
-
@view.lookup_context.template_exists? partial_includepath
|
141
|
-
end
|
142
|
-
|
143
39
|
# Returns the sections that this section references.
|
144
40
|
# If 'recursive = true' is given, searches recursively for sections referenced by the referenced sections.
|
145
41
|
# Otherwise, simply returns the sections that are referenced by this section.
|
@@ -158,73 +54,14 @@ module SectionsRails
|
|
158
54
|
result.sort!
|
159
55
|
end
|
160
56
|
|
161
|
-
def render &block
|
162
|
-
result = []
|
163
57
|
|
164
|
-
|
58
|
+
# Renders this section, i.e. returns the HTML for this section.
|
59
|
+
def render &block
|
165
60
|
raise "Section #{folder_filepath} doesn't exist." unless Dir.exists? folder_filepath
|
166
61
|
|
167
|
-
|
168
|
-
if Rails.env != 'production'
|
169
|
-
|
170
|
-
# Include JS assets.
|
171
|
-
if @options.has_key? :js
|
172
|
-
if @options[:js]
|
173
|
-
result << @view.javascript_include_tag(File.join(folder_includepath, @options[:js]))
|
174
|
-
else
|
175
|
-
# :js => (false|nil) given --> don't include any JS.
|
176
|
-
end
|
177
|
-
else
|
178
|
-
# No :js configuration option given --> include the default script.
|
179
|
-
js_includepath = find_js_includepath
|
180
|
-
result << @view.javascript_include_tag(js_includepath) if js_includepath
|
181
|
-
end
|
182
|
-
|
183
|
-
# Include CSS assets.
|
184
|
-
if @options.has_key? :css
|
185
|
-
if @options[:css]
|
186
|
-
# Custom filename for :css given --> include the given CSS file.
|
187
|
-
result << @view.stylesheet_link_tag(File.join(folder_includepath, @options[:css]))
|
188
|
-
else
|
189
|
-
# ":css => false" given --> don't include any CSS.
|
190
|
-
end
|
191
|
-
else
|
192
|
-
# No option for :css given --> include the default stylesheet.
|
193
|
-
css_includepath = find_css_includepath
|
194
|
-
result << @view.stylesheet_link_tag(css_includepath) if css_includepath
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# Render the section partial into the view.
|
199
|
-
if @options.has_key? :partial
|
200
|
-
if @options[:partial] == :tag
|
201
|
-
# :partial => :tag given --> render the empty tag even if there is a partial present.
|
202
|
-
result << @view.content_tag(:div, '', :class => filename)
|
203
|
-
elsif @options[:partial]
|
204
|
-
# Custom partial name given --> render that partial.
|
205
|
-
if block_given?
|
206
|
-
result << @view.render({:layout => find_partial_renderpath(@options[:partial])}, @options[:locals], &block)
|
207
|
-
else
|
208
|
-
result << @view.render(find_partial_renderpath(@options[:partial]), @options[:locals])
|
209
|
-
end
|
210
|
-
else
|
211
|
-
# :partial => (false|nil) given --> render nothing.
|
212
|
-
end
|
213
|
-
else
|
214
|
-
# No :partial option given --> render the default partial.
|
215
|
-
partial_filepath = find_partial_filepath
|
216
|
-
if partial_filepath
|
217
|
-
|
218
|
-
if block_given?
|
219
|
-
result << @view.render(:layout => partial_includepath, :locals => @options[:locals], &block)
|
220
|
-
else
|
221
|
-
result << @view.render(:partial => partial_includepath, :locals => @options[:locals])
|
222
|
-
end
|
223
|
-
else
|
224
|
-
result << @view.content_tag(:div, '', :class => filename)
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
62
|
+
result = []
|
63
|
+
render_assets result if Rails.env != 'production'
|
64
|
+
render_partial result, &block
|
228
65
|
result.join("\n").html_safe
|
229
66
|
end
|
230
67
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module SectionsRails
|
2
|
+
|
3
|
+
# Helps with rendering the assets of a section.
|
4
|
+
module SectionAssetRenderering
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
|
9
|
+
# Path to access assets on the file system.
|
10
|
+
# Includes only the base name of assets, without extensions.
|
11
|
+
# Example: 'app/sections/folder/section/section'
|
12
|
+
def asset_filepath
|
13
|
+
@asset_filepath ||= File.join SectionsRails.config.path, asset_includepath
|
14
|
+
end
|
15
|
+
|
16
|
+
# Path for including assets into the web page.
|
17
|
+
#
|
18
|
+
def asset_includepath
|
19
|
+
@asset_includepath ||= File.join(directory_name, filename, filename).gsub(/^\//, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Returns the path to the JS asset of this section, or nil if the section doesn't have one.
|
24
|
+
def find_js_includepath
|
25
|
+
@find_js_includepath ||= find_asset_includepath @options[:js], SectionsRails.config.js_extensions
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Returns the asset path of asset with the given extensions.
|
30
|
+
# Helper method.
|
31
|
+
def find_asset_includepath asset_option, extensions
|
32
|
+
return nil if asset_option == false
|
33
|
+
return asset_option if asset_option
|
34
|
+
extensions.each do |ext|
|
35
|
+
file_path = "#{asset_filepath}.#{ext}"
|
36
|
+
return asset_includepath if File.exists? file_path
|
37
|
+
end
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the path to the JS asset of this section, or nil if the section doesn't have one.
|
42
|
+
def find_css_includepath
|
43
|
+
@find_css_includepath ||= find_asset_includepath @options[:css], SectionsRails.config.css_extensions
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# Path to the folder for asset includes.
|
48
|
+
# Example: 'folder/section'
|
49
|
+
def folder_includepath
|
50
|
+
@folder_includepath ||= File.join directory_name, filename
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# Renders the assets of this section into the given result.
|
55
|
+
def render_assets result
|
56
|
+
render_js_assets result
|
57
|
+
render_css_assets result
|
58
|
+
end
|
59
|
+
|
60
|
+
# Renders the CSS for this section.
|
61
|
+
def render_css_assets result
|
62
|
+
if @options.has_key? :css
|
63
|
+
if @options[:css]
|
64
|
+
# Custom filename for :css given --> include the given CSS file.
|
65
|
+
result << @view.stylesheet_link_tag(File.join(folder_includepath, @options[:css]))
|
66
|
+
else
|
67
|
+
# ":css => false" given --> don't include any CSS.
|
68
|
+
end
|
69
|
+
else
|
70
|
+
# No option for :css given --> include the default stylesheet.
|
71
|
+
css_includepath = find_css_includepath
|
72
|
+
result << @view.stylesheet_link_tag(css_includepath) if css_includepath
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Renders the JS for this section.
|
77
|
+
def render_js_assets result
|
78
|
+
if @options.has_key? :js
|
79
|
+
if @options[:js]
|
80
|
+
result << @view.javascript_include_tag(File.join(folder_includepath, @options[:js]))
|
81
|
+
else
|
82
|
+
# :js => (false|nil) given --> don't include any JS.
|
83
|
+
end
|
84
|
+
else
|
85
|
+
# No :js configuration option given --> include the default script.
|
86
|
+
js_includepath = find_js_includepath
|
87
|
+
result << @view.javascript_include_tag(js_includepath) if js_includepath
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module SectionsRails
|
2
|
+
|
3
|
+
# Helps with rendering partials of sections.
|
4
|
+
module SectionPartialRendering
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
|
9
|
+
# The path for accessing the partial on the filesystem.
|
10
|
+
# Example: '
|
11
|
+
def partial_renderpath partial_filename = nil
|
12
|
+
File.join(directory_name, filename, partial_filename || filename).gsub(/^\//, '')
|
13
|
+
end
|
14
|
+
|
15
|
+
# The path for accessing the partial on the filesystem.
|
16
|
+
# Example: '
|
17
|
+
def partial_filepath partial_filename = nil
|
18
|
+
File.join(SectionsRails.config.path, directory_name, filename, "_#{partial_filename or filename}").gsub(/^\//, '')
|
19
|
+
end
|
20
|
+
|
21
|
+
# For including the partial into views.
|
22
|
+
def partial_includepath
|
23
|
+
@partial_includepath ||= File.join(directory_name, filename, "#{filename}").gsub(/^\//, '')
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the content of this sections partial.
|
27
|
+
def partial_content
|
28
|
+
return @partial_content if @has_partial_content
|
29
|
+
@has_partial_content = true
|
30
|
+
if (partial_path = find_partial_filepath)
|
31
|
+
@partial_content = IO.read partial_path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns the filename of the partial of this section, or nil if this section has no partial.
|
36
|
+
# Uses the given custom partial name, or the default partial name if none is given.
|
37
|
+
def find_partial_filepath partial_filename = nil
|
38
|
+
SectionsRails.config.partial_extensions.each do |ext|
|
39
|
+
path = "#{partial_filepath(filename)}.#{ext}"
|
40
|
+
return path if File.exists? path
|
41
|
+
end
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns the path of the partial of this section for rendering, or nil if this section has no partial.
|
46
|
+
# Uses the given custom partial name, or the default partial name if none is given.
|
47
|
+
def find_partial_renderpath partial_filename = nil
|
48
|
+
SectionsRails.config.partial_extensions.each do |ext|
|
49
|
+
return partial_renderpath(partial_filename) if File.exists? "#{partial_filepath(filename)}.#{ext}"
|
50
|
+
end
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# Renders the section partial into the view.
|
56
|
+
def render_partial result, &block
|
57
|
+
if @options.has_key? :partial
|
58
|
+
if @options[:partial] == :tag
|
59
|
+
# :partial => :tag given
|
60
|
+
render_empty_tag result
|
61
|
+
elsif @options[:partial]
|
62
|
+
# Custom partial name given
|
63
|
+
render_custom_partial result, &block
|
64
|
+
else
|
65
|
+
# :partial => (false|nil) given --> render nothing.
|
66
|
+
end
|
67
|
+
else
|
68
|
+
# No :partial option given
|
69
|
+
render_default_partial result, &block
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def render_custom_partial result, &block
|
74
|
+
if block_given?
|
75
|
+
result << @view.render({:layout => find_partial_renderpath(@options[:partial])}, @options[:locals], &block)
|
76
|
+
else
|
77
|
+
result << @view.render(find_partial_renderpath(@options[:partial]), @options[:locals])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def render_default_partial result, &block
|
82
|
+
partial_filepath = find_partial_filepath
|
83
|
+
if partial_filepath
|
84
|
+
|
85
|
+
if block_given?
|
86
|
+
result << @view.render(:layout => partial_includepath, :locals => @options[:locals], &block)
|
87
|
+
else
|
88
|
+
result << @view.render(:partial => partial_includepath, :locals => @options[:locals])
|
89
|
+
end
|
90
|
+
else
|
91
|
+
result << @view.content_tag(:div, '', :class => filename)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def render_empty_tag result
|
96
|
+
result << @view.content_tag(:div, '', :class => filename)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|