dimples 2.7.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dimples.rb +4 -5
- data/lib/dimples/configuration.rb +1 -1
- data/lib/dimples/pagination.rb +99 -0
- data/lib/dimples/renderer.rb +3 -1
- data/lib/dimples/site.rb +59 -125
- data/lib/dimples/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4cee778dfaf4073d4f09fa374b884e684916696
|
4
|
+
data.tar.gz: 269d2ba199c54bc6c5cb66094ab38069896de042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d333b6cf6d9475d643e4e8ae47b5b1777ef598489afaaa5e9eb795e97a773fd84010c182176ba90cffc5c4d0cf7cacf676c9ac63a806d964509e41c25f9531b
|
7
|
+
data.tar.gz: 1bd4720fdfc2d8d506110aff782e1307580f4e90f7f9e6c0d8bcc3244a202c06f64d65bc748f7867a1a30814aa189bb8b78510f96700c7abd1a8532979e20483
|
data/lib/dimples.rb
CHANGED
@@ -8,14 +8,13 @@ require 'logger'
|
|
8
8
|
require 'tilt'
|
9
9
|
require 'yaml'
|
10
10
|
|
11
|
-
require 'dimples/errors'
|
12
|
-
require 'dimples/logger'
|
13
|
-
|
14
|
-
require 'dimples/frontable'
|
15
|
-
|
16
11
|
require 'dimples/category'
|
17
12
|
require 'dimples/configuration'
|
13
|
+
require 'dimples/errors'
|
14
|
+
require 'dimples/frontable'
|
15
|
+
require 'dimples/logger'
|
18
16
|
require 'dimples/page'
|
17
|
+
require 'dimples/pagination'
|
19
18
|
require 'dimples/post'
|
20
19
|
require 'dimples/renderer'
|
21
20
|
require 'dimples/site'
|
@@ -29,7 +29,7 @@ module Dimples
|
|
29
29
|
'source_path' => Dir.pwd,
|
30
30
|
'destination_path' => File.join(Dir.pwd, 'site'),
|
31
31
|
'verbose_logging' => false,
|
32
|
-
'class_overrides' => { site: nil, post: nil
|
32
|
+
'class_overrides' => { site: nil, post: nil },
|
33
33
|
'rendering' => {},
|
34
34
|
'category_names' => {},
|
35
35
|
'paths' => default_paths,
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dimples
|
4
|
+
# A module that supports pagination.
|
5
|
+
module Pagination
|
6
|
+
def paginate(site, items, path, layout, options = {})
|
7
|
+
context = options[:context] || {}
|
8
|
+
url = path.gsub(site.output_paths[:site], '') + '/'
|
9
|
+
per_page = options[:per_page] || site.config['pagination']['per_page']
|
10
|
+
|
11
|
+
pager = Pager.new(url, items, per_page)
|
12
|
+
|
13
|
+
pager.each do |index, page_items|
|
14
|
+
page = Dimples::Page.new(site)
|
15
|
+
page.layout = layout
|
16
|
+
|
17
|
+
page.title = options[:title] || site.templates[layout].title
|
18
|
+
page.extension = options[:extension] if options[:extension]
|
19
|
+
|
20
|
+
output_path = page.output_path(
|
21
|
+
index != 1 ? File.join(path, "page#{index}") : path
|
22
|
+
)
|
23
|
+
|
24
|
+
context[:items] = page_items
|
25
|
+
context[:pagination] = pager.to_h
|
26
|
+
|
27
|
+
page.write(output_path, context)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# A class that models the context of a single page during pagination.
|
32
|
+
class Pager
|
33
|
+
include Enumerable
|
34
|
+
|
35
|
+
attr_reader :current_page
|
36
|
+
attr_reader :previous_page
|
37
|
+
attr_reader :next_page
|
38
|
+
attr_reader :page_count
|
39
|
+
attr_reader :item_count
|
40
|
+
|
41
|
+
def initialize(url, items, per_page)
|
42
|
+
@url = url
|
43
|
+
@items = items
|
44
|
+
@per_page = per_page
|
45
|
+
@page_count = (items.length.to_f / per_page.to_i).ceil
|
46
|
+
|
47
|
+
step_to(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
def each(&block)
|
51
|
+
(1..@page_count).each do |index|
|
52
|
+
block.yield step_to(index), items_at(index)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def step_to(page)
|
57
|
+
@current_page = (1..@page_count).cover?(page) ? page : 1
|
58
|
+
@previous_page = (@current_page - 1).positive? ? @current_page - 1 : nil
|
59
|
+
@next_page = (@current_page + 1) <= @page_count ? @current_page + 1 : nil
|
60
|
+
|
61
|
+
@current_page
|
62
|
+
end
|
63
|
+
|
64
|
+
def items_at(page)
|
65
|
+
@items.slice((page - 1) * @per_page, @per_page)
|
66
|
+
end
|
67
|
+
|
68
|
+
def previous_page_url
|
69
|
+
return unless @previous_page
|
70
|
+
@previous_page != 1 ? "#{@url}page#{@previous_page}" : @url
|
71
|
+
end
|
72
|
+
|
73
|
+
def next_page_url
|
74
|
+
"#{@url}page#{@next_page}" if @next_page
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_h
|
78
|
+
output = {
|
79
|
+
page: @current_page,
|
80
|
+
page_count: @page_count,
|
81
|
+
item_count: @items.count,
|
82
|
+
url: @url
|
83
|
+
}
|
84
|
+
|
85
|
+
if @previous_page
|
86
|
+
output[:previous_page] = @previous_page
|
87
|
+
output[:previous_page_url] = previous_page_url
|
88
|
+
end
|
89
|
+
|
90
|
+
if @next_page
|
91
|
+
output[:next_page] = @next_page
|
92
|
+
output[:next_page_url] = next_page_url
|
93
|
+
end
|
94
|
+
|
95
|
+
output
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/dimples/renderer.rb
CHANGED
@@ -10,7 +10,9 @@ module Dimples
|
|
10
10
|
callback = proc { @source.contents }
|
11
11
|
|
12
12
|
@engine = if @source.path
|
13
|
-
|
13
|
+
ext = File.extname(@source.path)[1..-1]
|
14
|
+
options = @site.config['rendering'][ext] || {}
|
15
|
+
Tilt.new(@source.path, options, &callback)
|
14
16
|
else
|
15
17
|
Tilt::StringTemplate.new(&callback)
|
16
18
|
end
|
data/lib/dimples/site.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
module Dimples
|
4
4
|
# A class that models a single site.
|
5
5
|
class Site
|
6
|
+
include Pagination
|
7
|
+
|
6
8
|
attr_accessor :source_paths
|
7
9
|
attr_accessor :output_paths
|
8
10
|
attr_accessor :config
|
@@ -12,7 +14,6 @@ module Dimples
|
|
12
14
|
attr_accessor :pages
|
13
15
|
attr_accessor :posts
|
14
16
|
attr_accessor :latest_post
|
15
|
-
attr_accessor :page_class
|
16
17
|
attr_accessor :post_class
|
17
18
|
attr_accessor :errors
|
18
19
|
|
@@ -28,31 +29,8 @@ module Dimples
|
|
28
29
|
@archives = { year: {}, month: {}, day: {} }
|
29
30
|
@latest_post = false
|
30
31
|
|
31
|
-
@page_class = @config.class_override(:page) || Dimples::Page
|
32
32
|
@post_class = @config.class_override(:post) || Dimples::Post
|
33
33
|
|
34
|
-
set_source_paths
|
35
|
-
set_output_paths
|
36
|
-
end
|
37
|
-
|
38
|
-
def generate
|
39
|
-
prepare_output_directory
|
40
|
-
scan_files
|
41
|
-
generate_files
|
42
|
-
copy_assets
|
43
|
-
rescue Errors::RenderingError,
|
44
|
-
Errors::PublishingError,
|
45
|
-
Errors::GenerationError => e
|
46
|
-
@errors << e.message
|
47
|
-
end
|
48
|
-
|
49
|
-
def generated?
|
50
|
-
@errors.count.zero?
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def set_source_paths
|
56
34
|
@source_paths = {
|
57
35
|
root: File.expand_path(@config['source_path'])
|
58
36
|
}
|
@@ -60,9 +38,7 @@ module Dimples
|
|
60
38
|
%w[pages posts public templates].each do |path|
|
61
39
|
@source_paths[path.to_sym] = File.join(@source_paths[:root], path)
|
62
40
|
end
|
63
|
-
end
|
64
41
|
|
65
|
-
def set_output_paths
|
66
42
|
@output_paths = {
|
67
43
|
site: File.expand_path(@config['destination_path'])
|
68
44
|
}
|
@@ -73,15 +49,18 @@ module Dimples
|
|
73
49
|
end
|
74
50
|
end
|
75
51
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
79
|
-
|
52
|
+
def generate
|
53
|
+
scan_files
|
54
|
+
generate_files
|
55
|
+
copy_assets
|
56
|
+
rescue Errors::RenderingError,
|
57
|
+
Errors::PublishingError,
|
58
|
+
Errors::GenerationError => e
|
59
|
+
@errors << e.message
|
60
|
+
end
|
80
61
|
|
81
|
-
|
82
|
-
|
83
|
-
error_message = "Couldn't prepare the output directory (#{e.message})"
|
84
|
-
raise Errors::GenerationError, error_message
|
62
|
+
def generated?
|
63
|
+
@errors.count.zero?
|
85
64
|
end
|
86
65
|
|
87
66
|
def scan_files
|
@@ -113,7 +92,7 @@ module Dimples
|
|
113
92
|
end
|
114
93
|
|
115
94
|
def scan_page(path)
|
116
|
-
|
95
|
+
Dimples::Page.new(self, path)
|
117
96
|
end
|
118
97
|
|
119
98
|
def scan_posts
|
@@ -141,29 +120,26 @@ module Dimples
|
|
141
120
|
@categories[slug].posts << post
|
142
121
|
end
|
143
122
|
|
144
|
-
|
123
|
+
archive_year(post.year) << post
|
124
|
+
archive_month(post.year, post.month) << post
|
125
|
+
archive_day(post.year, post.month, post.day) << post
|
145
126
|
end
|
146
127
|
end
|
147
128
|
|
148
|
-
def
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
def archive_year(year)
|
155
|
-
@archives[:year][year] ||= []
|
156
|
-
end
|
157
|
-
|
158
|
-
def archive_month(year, month)
|
159
|
-
@archives[:month]["#{year}/#{month}"] ||= []
|
160
|
-
end
|
129
|
+
def prepare_output_directory
|
130
|
+
if Dir.exist?(@output_paths[:site])
|
131
|
+
FileUtils.remove_dir(@output_paths[:site])
|
132
|
+
end
|
161
133
|
|
162
|
-
|
163
|
-
|
134
|
+
Dir.mkdir(@output_paths[:site])
|
135
|
+
rescue => e
|
136
|
+
error_message = "Couldn't prepare the output directory (#{e.message})"
|
137
|
+
raise Errors::GenerationError, error_message
|
164
138
|
end
|
165
139
|
|
166
140
|
def generate_files
|
141
|
+
prepare_output_directory
|
142
|
+
|
167
143
|
generate_pages unless @pages.count.zero?
|
168
144
|
|
169
145
|
return if @posts.count.zero?
|
@@ -182,9 +158,7 @@ module Dimples
|
|
182
158
|
generate_post(post)
|
183
159
|
end
|
184
160
|
|
185
|
-
|
186
|
-
|
187
|
-
paginate(posts: @posts, path: @output_paths[:archives], layout: layout)
|
161
|
+
paginate(self, @posts, @output_paths[:archives], @config['layouts']['posts'])
|
188
162
|
|
189
163
|
generate_posts_feeds if @config['generation']['feeds']
|
190
164
|
end
|
@@ -220,15 +194,14 @@ module Dimples
|
|
220
194
|
end
|
221
195
|
|
222
196
|
def generate_category(category)
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
context: { category: category.slug }
|
197
|
+
path = File.join(@output_paths[:categories], category.slug)
|
198
|
+
|
199
|
+
options = {
|
200
|
+
context: { category: category.slug },
|
201
|
+
title: category.name
|
229
202
|
}
|
230
203
|
|
231
|
-
paginate(
|
204
|
+
paginate(self, category.posts, path, @config['layouts']['category'], options)
|
232
205
|
end
|
233
206
|
|
234
207
|
def generate_archives
|
@@ -240,27 +213,21 @@ module Dimples
|
|
240
213
|
end
|
241
214
|
|
242
215
|
def generate_archive_posts(date_type)
|
243
|
-
@archives[date_type.to_sym].
|
244
|
-
|
245
|
-
|
246
|
-
dates =
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
params = {
|
256
|
-
posts: posts,
|
257
|
-
title: post.date.strftime(@config['date_formats'][date_type]),
|
258
|
-
path: File.join(@output_paths[:archives], dates.values),
|
259
|
-
layout: @config['layouts']["#{date_type}_archives"],
|
260
|
-
context: dates
|
216
|
+
@archives[date_type.to_sym].each do |date, posts|
|
217
|
+
year, month, day = date.split('/')
|
218
|
+
|
219
|
+
dates = { year: year }
|
220
|
+
dates[:month] = month if month
|
221
|
+
dates[:day] = day if day
|
222
|
+
|
223
|
+
path = File.join(@output_paths[:archives], dates.values)
|
224
|
+
|
225
|
+
options = {
|
226
|
+
context: dates,
|
227
|
+
title: posts[0].date.strftime(@config['date_formats'][date_type])
|
261
228
|
}
|
262
229
|
|
263
|
-
paginate(
|
230
|
+
paginate(self, posts, path, @config['layouts']["#{date_type}_archives"], options)
|
264
231
|
end
|
265
232
|
end
|
266
233
|
|
@@ -268,7 +235,7 @@ module Dimples
|
|
268
235
|
feed_templates.each do |format|
|
269
236
|
next unless @templates[format]
|
270
237
|
|
271
|
-
feed =
|
238
|
+
feed = Dimples::Page.new(self)
|
272
239
|
|
273
240
|
feed.filename = 'feed'
|
274
241
|
feed.extension = @templates[format].slug
|
@@ -292,10 +259,6 @@ module Dimples
|
|
292
259
|
end
|
293
260
|
end
|
294
261
|
|
295
|
-
def feed_templates
|
296
|
-
@feed_templates ||= @templates.keys.select { |k| k =~ /^feeds\./ }
|
297
|
-
end
|
298
|
-
|
299
262
|
def copy_assets
|
300
263
|
if Dir.exist?(@source_paths[:public])
|
301
264
|
Dimples.logger.debug('Copying assets...') if @config['verbose_logging']
|
@@ -307,51 +270,22 @@ module Dimples
|
|
307
270
|
raise Errors::GenerationError, "Site assets failed to copy (#{e.message})"
|
308
271
|
end
|
309
272
|
|
310
|
-
|
311
|
-
per_page = @config['pagination']['per_page']
|
312
|
-
pages = (posts.length.to_f / per_page.to_i).ceil
|
313
|
-
url = path.gsub(@output_paths[:site], '') + '/'
|
314
|
-
|
315
|
-
(1..pages).each do |index|
|
316
|
-
page = @page_class.new(self)
|
317
|
-
|
318
|
-
page.layout = layout
|
319
|
-
page.title = title || @templates[layout].title
|
320
|
-
|
321
|
-
output_path = File.join(path, index != 1 ? "page#{index}" : '')
|
322
|
-
|
323
|
-
context[:posts] = posts.slice((index - 1) * per_page, per_page)
|
324
|
-
context[:pagination] = build_pagination(index, pages, posts.count, url)
|
273
|
+
private
|
325
274
|
|
326
|
-
|
327
|
-
|
275
|
+
def archive_year(year)
|
276
|
+
@archives[:year][year] ||= []
|
328
277
|
end
|
329
278
|
|
330
|
-
def
|
331
|
-
|
332
|
-
|
333
|
-
pages: pages,
|
334
|
-
post_count: item_count,
|
335
|
-
url: url
|
336
|
-
}
|
337
|
-
|
338
|
-
if (index - 1).positive?
|
339
|
-
pagination[:previous_page] = index - 1
|
340
|
-
pagination[:previous_page_url] = url
|
341
|
-
|
342
|
-
if pagination[:previous_page] != 1
|
343
|
-
page_string = "page#{pagination[:previous_page]}"
|
344
|
-
pagination[:previous_page_url] += page_string
|
345
|
-
end
|
346
|
-
end
|
279
|
+
def archive_month(year, month)
|
280
|
+
@archives[:month]["#{year}/#{month}"] ||= []
|
281
|
+
end
|
347
282
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
pagination[:next_page_url] = page_string
|
352
|
-
end
|
283
|
+
def archive_day(year, month, day)
|
284
|
+
@archives[:day]["#{year}/#{month}/#{day}"] ||= []
|
285
|
+
end
|
353
286
|
|
354
|
-
|
287
|
+
def feed_templates
|
288
|
+
@feed_templates ||= @templates.keys.select { |k| k =~ /^feeds\./ }
|
355
289
|
end
|
356
290
|
end
|
357
291
|
end
|
data/lib/dimples/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dimples
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Bogan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tilt
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- lib/dimples/frontable.rb
|
145
145
|
- lib/dimples/logger.rb
|
146
146
|
- lib/dimples/page.rb
|
147
|
+
- lib/dimples/pagination.rb
|
147
148
|
- lib/dimples/post.rb
|
148
149
|
- lib/dimples/renderer.rb
|
149
150
|
- lib/dimples/site.rb
|