plate 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -1
- data/README.md +2 -2
- data/lib/plate/dsl.rb +170 -0
- data/lib/plate/dynamic_page.rb +22 -2
- data/lib/plate/helpers/blogging_helper.rb +24 -20
- data/lib/plate/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
## Plate 0.7.
|
1
|
+
## Plate 0.7.1
|
2
|
+
|
3
|
+
* Added DSL method `write` to create a dynamic page.
|
4
|
+
* Added DSL method `archives` to create category, monthly, and yearly post archives.
|
5
|
+
|
6
|
+
## Plate 0.7.0
|
2
7
|
|
3
8
|
* Added support for view partials
|
4
9
|
* Reload page layout when re-rendering a page
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ In addition to basic formatting with Markdown, Plate also supports generating mo
|
|
8
8
|
|
9
9
|
Plate is a command line utility installed as a Ruby Gem. Installation requires Ruby 1.8.7, 1.9.2 or 1.9.3.
|
10
10
|
|
11
|
-
Current version is **0.7.
|
11
|
+
Current version is **0.7.1**
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
@@ -72,7 +72,7 @@ When creating a new post, you can choose to put it in the *drafts* folder, inste
|
|
72
72
|
```
|
73
73
|
publish: true
|
74
74
|
```
|
75
|
-
|
75
|
+
|
76
76
|
On the next site build, your post will automatically be moved to the appropriate spot in the *posts* folder.
|
77
77
|
|
78
78
|
By default, the `plate post [Title]` command does not use the drafts folder. To enable draft usage by default when a new post is generated, just change the following line in the `config/plate.yml` file to true:
|
data/lib/plate/dsl.rb
CHANGED
@@ -23,6 +23,68 @@ module Plate
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
# Used for writing dynamic pages. Allows for calling:
|
27
|
+
#
|
28
|
+
# title "Test"
|
29
|
+
# layout "default"
|
30
|
+
#
|
31
|
+
# Instead of:
|
32
|
+
#
|
33
|
+
# self.title = "Test"
|
34
|
+
# self.layout = "default"
|
35
|
+
#
|
36
|
+
class PageProxy
|
37
|
+
def initialize(page, site)
|
38
|
+
@page = page
|
39
|
+
@site = site
|
40
|
+
end
|
41
|
+
|
42
|
+
%w( category month year month_name ).each do |m|
|
43
|
+
class_eval <<-META
|
44
|
+
def _#{m}=(val) # def _category=(val)
|
45
|
+
@_#{m} = val # @_category = val
|
46
|
+
end # end
|
47
|
+
|
48
|
+
def #{m} # def category
|
49
|
+
defined?(@_#{m}) ? @_#{m} : nil # defined?(@_category) ? @_category : nil
|
50
|
+
end # end
|
51
|
+
META
|
52
|
+
end
|
53
|
+
|
54
|
+
def site
|
55
|
+
@site
|
56
|
+
end
|
57
|
+
|
58
|
+
def method_missing(method, *args)
|
59
|
+
if @page.respond_to?("#{method}=")
|
60
|
+
@page.send("#{method}=", *args)
|
61
|
+
else
|
62
|
+
@page.send(method, *args)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_url(*args)
|
67
|
+
@site.to_url(*args)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Loop through the given item name to generate archive pages.
|
72
|
+
#
|
73
|
+
# Available item types are:
|
74
|
+
#
|
75
|
+
# * :category
|
76
|
+
# * :tag
|
77
|
+
# * :year
|
78
|
+
# * :month
|
79
|
+
# * :day
|
80
|
+
#
|
81
|
+
def archives(item_type, options = {}, &block)
|
82
|
+
# If there is a method to return the list of items
|
83
|
+
if self.respond_to?("archive_#{item_type}_items")
|
84
|
+
self.send("archive_#{item_type}_items", options, &block)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
26
88
|
# Register a new callback for the given object and event.
|
27
89
|
#
|
28
90
|
# @example Run block after rendering a site
|
@@ -64,5 +126,113 @@ module Plate
|
|
64
126
|
def register_template_engine(extension, klass)
|
65
127
|
Plate.register_template_engine(extension, klass)
|
66
128
|
end
|
129
|
+
|
130
|
+
# Create and write a dynamic page. Pages are written during the Site.after_render
|
131
|
+
# callback.
|
132
|
+
def write_page(path, site = nil, &block)
|
133
|
+
delayed_write = lambda { |site|
|
134
|
+
page = DynamicPage.new(site, path)
|
135
|
+
proxy = PageProxy.new(page, site)
|
136
|
+
proxy.instance_eval(&block)
|
137
|
+
page.write!
|
138
|
+
proxy = nil
|
139
|
+
page = nil
|
140
|
+
}
|
141
|
+
|
142
|
+
# If a site was passed to the write method, use it.
|
143
|
+
if site
|
144
|
+
delayed_write.call(site)
|
145
|
+
# If no site was sent to the write method, run it after site render
|
146
|
+
else
|
147
|
+
callback :site, :after_render do |rendered_site|
|
148
|
+
delayed_write.call(rendered_site)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
alias :write :write_page
|
153
|
+
|
154
|
+
protected
|
155
|
+
# Category archives
|
156
|
+
def archive_category_items(options, &block)
|
157
|
+
callback :site, :after_render do |site|
|
158
|
+
site.categories.each do |category|
|
159
|
+
page = DynamicPage.new(site, "/categories/#{category}")
|
160
|
+
proxy = PageProxy.new(page, site)
|
161
|
+
proxy._category = category
|
162
|
+
page.meta[:category] = category
|
163
|
+
proxy.instance_eval(&block)
|
164
|
+
page.write!
|
165
|
+
proxy = nil
|
166
|
+
page = nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Monthly archive rendering
|
172
|
+
def archive_month_items(options, &block)
|
173
|
+
filter_year = options[:year] || nil
|
174
|
+
filter_category = options[:category] || nil
|
175
|
+
|
176
|
+
callback :site, :after_render do |site|
|
177
|
+
site.posts.archives.keys.each do |year|
|
178
|
+
if filter_year == nil or filter_year == year
|
179
|
+
site.posts.archives[year].keys.each do |month|
|
180
|
+
posts = []
|
181
|
+
|
182
|
+
site.posts.archives[year][month].each_value do |day|
|
183
|
+
posts << day.select { |post| filter_category == nil or post.category == filter_category }
|
184
|
+
end
|
185
|
+
|
186
|
+
posts.flatten!
|
187
|
+
|
188
|
+
if posts.size > 0
|
189
|
+
page = DynamicPage.new(site, "/archives/#{year}/#{month}")
|
190
|
+
proxy = PageProxy.new(page, site)
|
191
|
+
proxy._year = year
|
192
|
+
proxy._month = month
|
193
|
+
proxy._month_name = Date.new(year.to_i, month.to_i, 1).strftime('%B %Y')
|
194
|
+
proxy._category = filter_category if filter_category
|
195
|
+
proxy.locals = { :monthly_posts => posts, :month => month, :year => year }
|
196
|
+
proxy.instance_eval(&block)
|
197
|
+
page.write!
|
198
|
+
proxy = nil
|
199
|
+
page = nil
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Yearly archive rendering
|
208
|
+
def archive_year_items(options, &block)
|
209
|
+
filter_category = options[:category] || nil
|
210
|
+
|
211
|
+
callback :site, :after_render do |site|
|
212
|
+
site.posts.archives.keys.each do |year|
|
213
|
+
posts = []
|
214
|
+
|
215
|
+
site.posts.archives[year].keys.each do |month|
|
216
|
+
site.posts.archives[year][month].each_value do |day|
|
217
|
+
posts << day.select { |post| filter_category == nil or post.category == filter_category }
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
posts.flatten!
|
222
|
+
|
223
|
+
if posts.size > 0
|
224
|
+
page = DynamicPage.new(site, "/archives/#{year}")
|
225
|
+
proxy = PageProxy.new(page, site)
|
226
|
+
proxy._year = year
|
227
|
+
proxy._category = filter_category if filter_category
|
228
|
+
proxy.locals = { :yearly_posts => posts, :year => year }
|
229
|
+
proxy.instance_eval(&block)
|
230
|
+
page.write!
|
231
|
+
proxy = nil
|
232
|
+
page = nil
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
67
237
|
end
|
68
238
|
end
|
data/lib/plate/dynamic_page.rb
CHANGED
@@ -29,18 +29,38 @@ module Plate
|
|
29
29
|
# Set up a new instance of Dynamic Page
|
30
30
|
def initialize(site, destination_path, meta = {})
|
31
31
|
self.site = site
|
32
|
-
self.
|
32
|
+
self.path = destination_path
|
33
33
|
self.meta = meta
|
34
34
|
self.content = ""
|
35
35
|
self.locals = {}
|
36
36
|
self.partials = []
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
|
+
# name for dynamic pages is the path
|
40
|
+
def name
|
41
|
+
self.file_path
|
42
|
+
end
|
43
|
+
|
39
44
|
# Set the full hash to be provided to the view. Hash keys are symbolized before
|
40
45
|
# sending to the view.
|
41
46
|
def locals=(hash)
|
42
47
|
@locals = hash.symbolize_keys!
|
43
48
|
end
|
49
|
+
|
50
|
+
# Set the destination path for this page.
|
51
|
+
def path=(destination_path)
|
52
|
+
# Remove leading and trailing slashes
|
53
|
+
destination_path = destination_path.to_s.gsub(/^\//, '').gsub(/\/$/, '')
|
54
|
+
|
55
|
+
# Unless file ends in an extension, add /index.html
|
56
|
+
unless destination_path =~ /(.*?)\.[a-z0-0]{2,4}/i
|
57
|
+
destination_path = "#{destination_path}/index.html"
|
58
|
+
end
|
59
|
+
|
60
|
+
destination_path = "/#{destination_path}"
|
61
|
+
|
62
|
+
self.file_path = destination_path
|
63
|
+
end
|
44
64
|
|
45
65
|
# Alias for the content that is provided
|
46
66
|
def rendered_body
|
@@ -6,7 +6,7 @@ module Plate
|
|
6
6
|
# Returns a customized hash of post archives for the given category
|
7
7
|
def category_archives(category)
|
8
8
|
result = {}
|
9
|
-
|
9
|
+
|
10
10
|
posts.archives.keys.each do |year|
|
11
11
|
posts.archives[year].keys.each do |month|
|
12
12
|
posts.archives[year][month].keys.each do |day|
|
@@ -21,16 +21,20 @@ module Plate
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
result
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# Escape markup for use in XML or HTML
|
29
29
|
def html_escape(text)
|
30
30
|
::CGI.escapeHTML(text)
|
31
31
|
end
|
32
32
|
alias_method :xml_escape, :html_escape
|
33
|
-
|
33
|
+
|
34
|
+
def month_name(year, month)
|
35
|
+
Date.new(year.to_i, month.to_i, 1).strftime('%B %Y')
|
36
|
+
end
|
37
|
+
|
34
38
|
# Grab the next blog post.
|
35
39
|
#
|
36
40
|
# Returns nil if this is the last post.
|
@@ -38,34 +42,34 @@ module Plate
|
|
38
42
|
return nil if post_index < 0 or post_index >= post_count
|
39
43
|
@next_post ||= self.posts[post_index + 1]
|
40
44
|
end
|
41
|
-
|
42
|
-
# Grab the post previous to this one.
|
45
|
+
|
46
|
+
# Grab the post previous to this one.
|
43
47
|
#
|
44
48
|
# Returns nil if this is the first post.
|
45
49
|
def previous_post
|
46
|
-
return nil if post_index < 1
|
50
|
+
return nil if post_index < 1
|
47
51
|
@previous_post ||= self.posts[post_index - 1]
|
48
52
|
end
|
49
|
-
|
53
|
+
|
50
54
|
# The total number blog posts
|
51
55
|
def post_count
|
52
56
|
@post_count ||= self.posts.length
|
53
57
|
end
|
54
|
-
|
58
|
+
|
55
59
|
# Returns a number of where this post is in all posts
|
56
60
|
def post_index
|
57
61
|
@post_index ||= self.posts.index(self.post)
|
58
62
|
end
|
59
|
-
|
63
|
+
|
60
64
|
# Find all posts for the given category
|
61
65
|
def posts_for_category(category)
|
62
66
|
self.posts.select { |p| p.category == category }
|
63
67
|
end
|
64
|
-
|
68
|
+
|
65
69
|
# Find all posts for the given year, month and optional category.
|
66
70
|
def posts_for_month(year, month, category = nil)
|
67
71
|
result = []
|
68
|
-
|
72
|
+
|
69
73
|
if months = self.posts.archives[year.to_s]
|
70
74
|
if month = months[month.to_s]
|
71
75
|
month.each_value do |day|
|
@@ -73,14 +77,14 @@ module Plate
|
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
76
|
-
|
80
|
+
|
77
81
|
result.flatten
|
78
82
|
end
|
79
|
-
|
83
|
+
|
80
84
|
# Find all posts for the given year and optional category.
|
81
85
|
def posts_for_year(year, category = nil)
|
82
86
|
result = []
|
83
|
-
|
87
|
+
|
84
88
|
if months = self.posts.archives[year.to_s]
|
85
89
|
months.each_value do |month|
|
86
90
|
month.each_value do |day|
|
@@ -88,19 +92,19 @@ module Plate
|
|
88
92
|
end
|
89
93
|
end
|
90
94
|
end
|
91
|
-
|
95
|
+
|
92
96
|
result.flatten
|
93
97
|
end
|
94
|
-
|
98
|
+
|
95
99
|
def years_for_category(category)
|
96
100
|
result = []
|
97
|
-
|
101
|
+
|
98
102
|
self.posts.archives.keys.each do |year|
|
99
103
|
if posts_for_year(year, category).size > 0
|
100
|
-
result << year
|
104
|
+
result << year
|
101
105
|
end
|
102
106
|
end
|
103
|
-
|
107
|
+
|
104
108
|
result.sort
|
105
109
|
end
|
106
110
|
end
|
data/lib/plate/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|