middleman-blog 3.4.1 → 3.5.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -6
- data/CHANGELOG.md +32 -1
- data/Gemfile +5 -9
- data/README.md +3 -2
- data/features/article_cli.feature +10 -1
- data/features/custom_collections.feature +11 -0
- data/features/language.feature +82 -0
- data/features/multiblog.feature +4 -2
- data/features/permalink-data.feature +12 -0
- data/features/summary.feature +13 -0
- data/features/support/env.rb +3 -0
- data/features/tags.feature +18 -1
- data/features/time_zone.feature +1 -1
- data/fixtures/custom-article-template-app/config.rb +3 -0
- data/fixtures/custom-article-template-app/my_custom_article.tt +7 -0
- data/fixtures/custom-article-template-app/source/index.html.erb +9 -0
- data/fixtures/custom-article-template-app/source/layout.erb +30 -0
- data/fixtures/custom-collections-sources-app/config.rb +11 -0
- data/fixtures/custom-collections-sources-app/source/articles/2011-01-02-another-article.html.markdown +8 -0
- data/fixtures/custom-collections-sources-app/source/category.html.erb +7 -0
- data/fixtures/custom-collections-sources-app/source/index.html.erb +5 -0
- data/fixtures/custom-collections-sources-app/source/layout.erb +13 -0
- data/fixtures/custom-collections-sources-app/source/news/2011-01-01-new-article.html.markdown +7 -0
- data/fixtures/language-app/config.rb +2 -0
- data/fixtures/language-app/locales/en.yml +4 -0
- data/fixtures/language-app/locales/ru.yml +4 -0
- data/fixtures/language-app/source/2013-09-07-english-article-with-lang-in-frontmatter.html.erb +6 -0
- data/fixtures/language-app/source/2013-09-07-russian-article-with-lang-in-frontmatter.html.erb +6 -0
- data/fixtures/language-app/source/en/2013-09-07-english-article-with-lang-in-path.html.erb +5 -0
- data/fixtures/language-app/source/layouts/layout.erb +8 -0
- data/fixtures/language-app/source/localizable/index.html.erb +5 -0
- data/fixtures/language-app/source/ru/2013-09-07-russian-article-with-lang-in-path.html.erb +5 -0
- data/fixtures/multiblog-app/source/blog1/index.html.erb +7 -0
- data/fixtures/permalink-data-app/config.rb +5 -0
- data/fixtures/permalink-data-app/source/index.html.erb +3 -0
- data/fixtures/permalink-data-app/source/layout.erb +14 -0
- data/fixtures/permalink-data-app/source/news/2011-01-01-new-article.html.markdown +7 -0
- data/fixtures/time-zone-app/source/blog/2013-06-24-hello.html.erb +1 -0
- data/lib/middleman-blog.rb +3 -8
- data/lib/middleman-blog/blog_article.rb +96 -60
- data/lib/middleman-blog/blog_data.rb +78 -76
- data/lib/middleman-blog/calendar_pages.rb +87 -119
- data/lib/middleman-blog/commands/article.rb +20 -14
- data/lib/middleman-blog/custom_pages.rb +30 -64
- data/lib/middleman-blog/extension.rb +175 -0
- data/lib/middleman-blog/helpers.rb +152 -0
- data/lib/middleman-blog/paginator.rb +127 -123
- data/lib/middleman-blog/tag_pages.rb +27 -45
- data/lib/middleman-blog/template.rb +17 -15
- data/lib/middleman-blog/template/config.tt +30 -33
- data/lib/middleman-blog/template/source/layout.erb +1 -0
- data/lib/middleman-blog/uri_templates.rb +58 -0
- data/lib/middleman-blog/version.rb +1 -1
- data/middleman-blog.gemspec +4 -1
- metadata +75 -9
- data/Gemfile-3.0 +0 -27
- data/lib/middleman-blog/extension_3_0.rb +0 -248
- data/lib/middleman-blog/extension_3_1.rb +0 -278
data/Gemfile-3.0
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in middleman-blog.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
gem "middleman", "~> 3.0.0"
|
7
|
-
|
8
|
-
gem "rake", "~> 10.0.3", :require => false
|
9
|
-
gem "yard", "~> 0.8.0", :require => false
|
10
|
-
|
11
|
-
# Test tools
|
12
|
-
gem "cucumber", "~> 1.3.1"
|
13
|
-
gem "fivemat"
|
14
|
-
gem "aruba", "~> 0.5.1"
|
15
|
-
gem "rspec", "~> 2.12"
|
16
|
-
gem "simplecov"
|
17
|
-
|
18
|
-
gem "timecop", "~> 0.4.0"
|
19
|
-
gem "nokogiri", "~> 1.5.0" # 1.6.0 requires Ruby 1.9+ but we still test on 1.8
|
20
|
-
gem "kramdown"
|
21
|
-
|
22
|
-
# Code Quality
|
23
|
-
gem "cane", :platforms => [:mri_19, :mri_20], :require => false
|
24
|
-
|
25
|
-
platforms :ruby do
|
26
|
-
gem "redcarpet", "~> 2.3.0"
|
27
|
-
end
|
@@ -1,248 +0,0 @@
|
|
1
|
-
module Middleman
|
2
|
-
module Blog
|
3
|
-
class Options
|
4
|
-
KEYS = [
|
5
|
-
:prefix,
|
6
|
-
:permalink,
|
7
|
-
:sources,
|
8
|
-
:taglink,
|
9
|
-
:layout,
|
10
|
-
:summary_separator,
|
11
|
-
:summary_length,
|
12
|
-
:summary_generator,
|
13
|
-
:year_link,
|
14
|
-
:month_link,
|
15
|
-
:day_link,
|
16
|
-
:default_extension,
|
17
|
-
:calendar_template,
|
18
|
-
:year_template,
|
19
|
-
:month_template,
|
20
|
-
:day_template,
|
21
|
-
:tag_template,
|
22
|
-
:paginate,
|
23
|
-
:per_page,
|
24
|
-
:page_link,
|
25
|
-
:publish_future_dated,
|
26
|
-
:custom_collections
|
27
|
-
]
|
28
|
-
|
29
|
-
KEYS.each do |name|
|
30
|
-
attr_accessor name
|
31
|
-
end
|
32
|
-
|
33
|
-
def initialize(options={})
|
34
|
-
options.each do |k,v|
|
35
|
-
self.send(:"#{k}=", v)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class << self
|
41
|
-
def registered(app, options_hash={}, &block)
|
42
|
-
require 'middleman-blog/blog_data'
|
43
|
-
require 'middleman-blog/blog_article'
|
44
|
-
require 'active_support/core_ext/time/zones'
|
45
|
-
|
46
|
-
app.send :include, Helpers
|
47
|
-
|
48
|
-
options = Options.new(options_hash)
|
49
|
-
yield options if block_given?
|
50
|
-
|
51
|
-
options.permalink ||= "/:year/:month/:day/:title.html"
|
52
|
-
options.sources ||= ":year-:month-:day-:title.html"
|
53
|
-
options.taglink ||= "tags/:tag.html"
|
54
|
-
options.layout ||= "layout"
|
55
|
-
options.summary_separator ||= /(READMORE)/
|
56
|
-
options.summary_length ||= 250
|
57
|
-
options.year_link ||= "/:year.html"
|
58
|
-
options.month_link ||= "/:year/:month.html"
|
59
|
-
options.day_link ||= "/:year/:month/:day.html"
|
60
|
-
options.default_extension ||= ".markdown"
|
61
|
-
options.paginate ||= false
|
62
|
-
options.per_page ||= 10
|
63
|
-
options.page_link ||= "page/:num"
|
64
|
-
options.publish_future_dated ||= false
|
65
|
-
options.custom_collections ||= {}
|
66
|
-
|
67
|
-
# optional: :tag_template
|
68
|
-
# optional: :year_template
|
69
|
-
# optional: :month_template
|
70
|
-
# optional: :day_template
|
71
|
-
# Allow one setting to set all the calendar templates
|
72
|
-
if options.calendar_template
|
73
|
-
options.year_template ||= options.calendar_template
|
74
|
-
options.month_template ||= options.calendar_template
|
75
|
-
options.day_template ||= options.calendar_template
|
76
|
-
end
|
77
|
-
|
78
|
-
# If "prefix" option is specified, all other paths are relative to it.
|
79
|
-
if options.prefix
|
80
|
-
options.prefix = "/#{options.prefix}" unless options.prefix.start_with? '/'
|
81
|
-
options.permalink = File.join(options.prefix, options.permalink)
|
82
|
-
options.sources = File.join(options.prefix, options.sources)
|
83
|
-
options.taglink = File.join(options.prefix, options.taglink)
|
84
|
-
options.year_link = File.join(options.prefix, options.year_link)
|
85
|
-
options.month_link = File.join(options.prefix, options.month_link)
|
86
|
-
options.day_link = File.join(options.prefix, options.day_link)
|
87
|
-
|
88
|
-
options.custom_collections.each do |key, opts|
|
89
|
-
opts[:link] = File.join(options.prefix, opts[:link])
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
app.after_configuration do
|
94
|
-
# Make sure ActiveSupport's TimeZone stuff has something to work with,
|
95
|
-
# allowing people to set their desired time zone via Time.zone or
|
96
|
-
# set :time_zone
|
97
|
-
Time.zone = self.time_zone if self.respond_to?(:time_zone)
|
98
|
-
time_zone = Time.zone if Time.zone
|
99
|
-
zone_default = Time.find_zone!(time_zone || 'UTC')
|
100
|
-
unless zone_default
|
101
|
-
raise 'Value assigned to time_zone not recognized.'
|
102
|
-
end
|
103
|
-
Time.zone_default = zone_default
|
104
|
-
|
105
|
-
ignore(options.calendar_template) if options.calendar_template
|
106
|
-
ignore(options.year_template) if options.year_template
|
107
|
-
ignore(options.month_template) if options.month_template
|
108
|
-
ignore(options.day_template) if options.day_template
|
109
|
-
|
110
|
-
# Initialize blog with options
|
111
|
-
blog(options)
|
112
|
-
|
113
|
-
sitemap.register_resource_list_manipulator(
|
114
|
-
:blog_articles,
|
115
|
-
blog,
|
116
|
-
false
|
117
|
-
)
|
118
|
-
|
119
|
-
if options.tag_template
|
120
|
-
ignore options.tag_template
|
121
|
-
|
122
|
-
require 'middleman-blog/tag_pages'
|
123
|
-
sitemap.register_resource_list_manipulator(
|
124
|
-
:blog_tags,
|
125
|
-
TagPages.new(self),
|
126
|
-
false
|
127
|
-
)
|
128
|
-
end
|
129
|
-
|
130
|
-
if options.year_template ||
|
131
|
-
options.month_template ||
|
132
|
-
options.day_template
|
133
|
-
|
134
|
-
require 'middleman-blog/calendar_pages'
|
135
|
-
sitemap.register_resource_list_manipulator(
|
136
|
-
:blog_calendar,
|
137
|
-
CalendarPages.new(self),
|
138
|
-
false
|
139
|
-
)
|
140
|
-
end
|
141
|
-
|
142
|
-
if options.paginate
|
143
|
-
require 'middleman-blog/paginator'
|
144
|
-
sitemap.register_resource_list_manipulator(
|
145
|
-
:blog_paginate,
|
146
|
-
Paginator.new(self),
|
147
|
-
false
|
148
|
-
)
|
149
|
-
end
|
150
|
-
|
151
|
-
if options.custom_collections
|
152
|
-
require 'middleman-blog/custom_pages'
|
153
|
-
options.custom_collections.each do |property, options|
|
154
|
-
ignore options[:template]
|
155
|
-
sitemap.register_resource_list_manipulator(
|
156
|
-
:"blog_#{property}",
|
157
|
-
CustomPages.new(property, self),
|
158
|
-
false
|
159
|
-
)
|
160
|
-
|
161
|
-
m = Module.new
|
162
|
-
m.module_eval(%Q{
|
163
|
-
def #{property}_path(value, key = nil)
|
164
|
-
sitemap.find_resource_by_path(CustomPages.link(self.blog.options, :#{property}, value)).try(:url)
|
165
|
-
end
|
166
|
-
})
|
167
|
-
|
168
|
-
self.class.send(:include, m)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
alias :included :registered
|
174
|
-
end
|
175
|
-
|
176
|
-
# Helpers for use within templates and layouts.
|
177
|
-
module Helpers
|
178
|
-
# Get the {BlogData} for this site.
|
179
|
-
# @return [BlogData]
|
180
|
-
def blog(options=nil)
|
181
|
-
@_blog ||= BlogData.new(self, options)
|
182
|
-
end
|
183
|
-
|
184
|
-
# Determine whether the currently rendering template is a blog article.
|
185
|
-
# This can be useful in layouts.
|
186
|
-
# @return [Boolean]
|
187
|
-
def is_blog_article?
|
188
|
-
!current_article.nil?
|
189
|
-
end
|
190
|
-
|
191
|
-
# Get a {Resource} with mixed in {BlogArticle} methods representing the current article.
|
192
|
-
# @return [Middleman::Sitemap::Resource]
|
193
|
-
def current_article
|
194
|
-
blog.article(current_resource.path)
|
195
|
-
end
|
196
|
-
|
197
|
-
# Get a path to the given tag, based on the :taglink setting.
|
198
|
-
# @param [String] tag
|
199
|
-
# @return [String]
|
200
|
-
def tag_path(tag)
|
201
|
-
sitemap.find_resource_by_path(TagPages.link(self.blog.options, tag)).try(:url)
|
202
|
-
end
|
203
|
-
|
204
|
-
# Get a path to the given year-based calendar page, based on the :year_link setting.
|
205
|
-
# @param [Number] year
|
206
|
-
# @return [String]
|
207
|
-
def blog_year_path(year)
|
208
|
-
sitemap.find_resource_by_path(CalendarPages.link(self.blog.options, year)).try(:url)
|
209
|
-
end
|
210
|
-
|
211
|
-
# Get a path to the given month-based calendar page, based on the :month_link setting.
|
212
|
-
# @param [Number] year
|
213
|
-
# @param [Number] month
|
214
|
-
# @return [String]
|
215
|
-
def blog_month_path(year, month)
|
216
|
-
sitemap.find_resource_by_path(CalendarPages.link(self.blog.options, year, month)).try(:url)
|
217
|
-
end
|
218
|
-
|
219
|
-
# Get a path to the given day-based calendar page, based on the :day_link setting.
|
220
|
-
# @param [Number] year
|
221
|
-
# @param [Number] month
|
222
|
-
# @param [Number] day
|
223
|
-
# @return [String]
|
224
|
-
def blog_day_path(year, month, day)
|
225
|
-
sitemap.find_resource_by_path(CalendarPages.link(self.blog.options, year, month, day)).try(:url)
|
226
|
-
end
|
227
|
-
|
228
|
-
|
229
|
-
# Pagination Helpers
|
230
|
-
# These are used by the template if pagination is off, to allow a single template to work
|
231
|
-
# in both modes. They get overridden by the local variables if the paginator is active.
|
232
|
-
|
233
|
-
# Returns true if pagination is turned on for this template; false otherwise.
|
234
|
-
# @return [Boolean]
|
235
|
-
def paginate; false; end
|
236
|
-
|
237
|
-
# Returns the list of articles to display on this page.
|
238
|
-
# @return [Array<Middleman::Sitemap::Resource>]
|
239
|
-
def page_articles
|
240
|
-
limit = (current_resource.metadata[:page]["per_page"] || 0) - 1
|
241
|
-
|
242
|
-
# "articles" local variable is populated by Calendar and Tag page generators
|
243
|
-
# If it's not set then use the complete list of articles
|
244
|
-
(current_resource.metadata[:locals]["articles"] || blog.articles)[0..limit]
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
@@ -1,278 +0,0 @@
|
|
1
|
-
module Middleman
|
2
|
-
class BlogExtension < Extension
|
3
|
-
self.supports_multiple_instances = true
|
4
|
-
|
5
|
-
option :name, nil, 'Unique ID for telling multiple blogs apart'
|
6
|
-
option :prefix, nil, 'Prefix to mount the blog at'
|
7
|
-
option :permalink, "/:year/:month/:day/:title.html", 'HTTP path to host articles at'
|
8
|
-
option :sources, ":year-:month-:day-:title.html", 'How to extract metadata from on-disk files'
|
9
|
-
option :taglink, "tags/:tag.html", 'HTTP path to host tag pages at'
|
10
|
-
option :layout, "layout", 'Article-specific layout'
|
11
|
-
option :summary_separator, /(READMORE)/, 'How to split article summaries around a delimeter'
|
12
|
-
option :summary_length, 250, 'Length of words in automatic summaries'
|
13
|
-
option :summary_generator, nil, 'Block to definte how summaries are extracted'
|
14
|
-
option :year_link, "/:year.html", 'HTTP path for yearly archives'
|
15
|
-
option :month_link, "/:year/:month.html", 'HTTP path for monthly archives'
|
16
|
-
option :day_link, "/:year/:month/:day.html", 'HTTP path for daily archives'
|
17
|
-
option :default_extension, ".markdown", 'Default article extension'
|
18
|
-
option :calendar_template, nil, 'Template for calendar pages'
|
19
|
-
option :year_template, nil, 'Template for yearly archive pages'
|
20
|
-
option :month_template, nil, 'Template for monthyl archive pages'
|
21
|
-
option :day_template, nil, 'Template for daily archive pages'
|
22
|
-
option :tag_template, nil, 'Template for tag archive pages'
|
23
|
-
option :paginate, false, 'Whether to paginate pages'
|
24
|
-
option :per_page, 10, 'Articles per page when paginating'
|
25
|
-
option :page_link, "page/:num", 'HTTP path for paging'
|
26
|
-
option :publish_future_dated, false, 'Whether to pubish articles dated in the future'
|
27
|
-
option :custom_collections, {}, 'Hash of custom frontmatter properties to collect articles on and their options'
|
28
|
-
|
29
|
-
attr_accessor :data, :uid
|
30
|
-
|
31
|
-
def initialize(app, options_hash={}, &block)
|
32
|
-
super
|
33
|
-
|
34
|
-
@uid = options.name
|
35
|
-
|
36
|
-
require 'middleman-blog/blog_data'
|
37
|
-
require 'middleman-blog/blog_article'
|
38
|
-
require 'active_support/core_ext/time/zones'
|
39
|
-
|
40
|
-
# app.set :time_zone, 'UTC'
|
41
|
-
|
42
|
-
# optional: :tag_template
|
43
|
-
# optional: :year_template
|
44
|
-
# optional: :month_template
|
45
|
-
# optional: :day_template
|
46
|
-
# Allow one setting to set all the calendar templates
|
47
|
-
if options.calendar_template
|
48
|
-
options.year_template ||= options.calendar_template
|
49
|
-
options.month_template ||= options.calendar_template
|
50
|
-
options.day_template ||= options.calendar_template
|
51
|
-
end
|
52
|
-
|
53
|
-
# If "prefix" option is specified, all other paths are relative to it.
|
54
|
-
if options.prefix
|
55
|
-
options.prefix = "/#{options.prefix}" unless options.prefix.start_with? '/'
|
56
|
-
options.permalink = File.join(options.prefix, options.permalink)
|
57
|
-
options.sources = File.join(options.prefix, options.sources)
|
58
|
-
options.taglink = File.join(options.prefix, options.taglink)
|
59
|
-
options.year_link = File.join(options.prefix, options.year_link)
|
60
|
-
options.month_link = File.join(options.prefix, options.month_link)
|
61
|
-
options.day_link = File.join(options.prefix, options.day_link)
|
62
|
-
|
63
|
-
options.custom_collections.each do |key, opts|
|
64
|
-
opts[:link] = File.join(options.prefix, opts[:link])
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def after_configuration
|
70
|
-
@uid ||= "blog#{@app.blog_instances.keys.length}"
|
71
|
-
|
72
|
-
@app.ignore(options.calendar_template) if options.calendar_template
|
73
|
-
@app.ignore(options.year_template) if options.year_template
|
74
|
-
@app.ignore(options.month_template) if options.month_template
|
75
|
-
@app.ignore(options.day_template) if options.day_template
|
76
|
-
|
77
|
-
@app.blog_instances[@uid.to_sym] = self
|
78
|
-
|
79
|
-
# Make sure ActiveSupport's TimeZone stuff has something to work with,
|
80
|
-
# allowing people to set their desired time zone via Time.zone or
|
81
|
-
# set :time_zone
|
82
|
-
Time.zone = app.config[:time_zone] if app.config[:time_zone]
|
83
|
-
time_zone = Time.zone if Time.zone
|
84
|
-
zone_default = Time.find_zone!(time_zone || 'UTC')
|
85
|
-
unless zone_default
|
86
|
-
raise 'Value assigned to time_zone not recognized.'
|
87
|
-
end
|
88
|
-
Time.zone_default = zone_default
|
89
|
-
|
90
|
-
# Initialize blog with options
|
91
|
-
|
92
|
-
@data = ::Middleman::Blog::BlogData.new(@app, options, self)
|
93
|
-
|
94
|
-
@app.sitemap.register_resource_list_manipulator(
|
95
|
-
:"blog_#{uid}_articles",
|
96
|
-
@data,
|
97
|
-
false
|
98
|
-
)
|
99
|
-
|
100
|
-
if options.tag_template
|
101
|
-
@app.ignore options.tag_template
|
102
|
-
|
103
|
-
require 'middleman-blog/tag_pages'
|
104
|
-
@app.sitemap.register_resource_list_manipulator(
|
105
|
-
:"blog_#{uid}_tags",
|
106
|
-
::Middleman::Blog::TagPages.new(@app, self),
|
107
|
-
false
|
108
|
-
)
|
109
|
-
end
|
110
|
-
|
111
|
-
if options.year_template || options.month_template || options.day_template
|
112
|
-
require 'middleman-blog/calendar_pages'
|
113
|
-
@app.sitemap.register_resource_list_manipulator(
|
114
|
-
:"blog_#{uid}_calendar",
|
115
|
-
::Middleman::Blog::CalendarPages.new(@app, self),
|
116
|
-
false
|
117
|
-
)
|
118
|
-
end
|
119
|
-
|
120
|
-
if options.paginate
|
121
|
-
require 'middleman-blog/paginator'
|
122
|
-
@app.sitemap.register_resource_list_manipulator(
|
123
|
-
:"blog_#{uid}_paginate",
|
124
|
-
::Middleman::Blog::Paginator.new(@app, self),
|
125
|
-
false
|
126
|
-
)
|
127
|
-
end
|
128
|
-
|
129
|
-
if options.custom_collections
|
130
|
-
require 'middleman-blog/custom_pages'
|
131
|
-
register_custom_pages
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Register any custom page collections that may be set in the config
|
136
|
-
#
|
137
|
-
# A custom resource list manipulator will be generated for each key in the
|
138
|
-
# custom collections hash.
|
139
|
-
#
|
140
|
-
# The following will collect posts on the "category" frontmatter property:
|
141
|
-
# ```
|
142
|
-
# activate :blog do |blog|
|
143
|
-
# blog.custom_collections = {
|
144
|
-
# link: "/categories/:category.html",
|
145
|
-
# template: "/category.html"
|
146
|
-
# }
|
147
|
-
# end
|
148
|
-
# ```
|
149
|
-
#
|
150
|
-
# Category pages in the example above will use the category.html as a template file
|
151
|
-
# and it will be ignored when building.
|
152
|
-
def register_custom_pages
|
153
|
-
options.custom_collections.each do |property, options|
|
154
|
-
@app.ignore options[:template]
|
155
|
-
@app.sitemap.register_resource_list_manipulator(
|
156
|
-
:"blog_#{uid}_#{property}",
|
157
|
-
::Middleman::Blog::CustomPages.new(property, @app, self),
|
158
|
-
false
|
159
|
-
)
|
160
|
-
|
161
|
-
generate_custom_helper(property)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
# Generate helpers to access the path to a custom collection.
|
166
|
-
#
|
167
|
-
# For example, when using a custom property called "category" to collect articles on
|
168
|
-
# the method **category_path** will be generated.
|
169
|
-
#
|
170
|
-
# @param [Symbol] custom_property Custom property which is being used to collect articles on
|
171
|
-
def generate_custom_helper(custom_property)
|
172
|
-
m = Module.new
|
173
|
-
m.module_eval(%Q{
|
174
|
-
def #{custom_property}_path(value, key = nil)
|
175
|
-
sitemap.find_resource_by_path(::Middleman::Blog::CustomPages.link(blog_controller(key).options, :#{custom_property}, value)).try(:url)
|
176
|
-
end
|
177
|
-
})
|
178
|
-
|
179
|
-
app.class.send(:include, m)
|
180
|
-
end
|
181
|
-
|
182
|
-
# Helpers for use within templates and layouts.
|
183
|
-
helpers do
|
184
|
-
def blog_instances
|
185
|
-
@blog_instances ||= {}
|
186
|
-
end
|
187
|
-
|
188
|
-
def blog_controller(key=nil)
|
189
|
-
if !key && current_resource
|
190
|
-
key = current_resource.metadata[:page]["blog"]
|
191
|
-
|
192
|
-
if !key && current_resource.respond_to?(:blog_controller) && current_resource.blog_controller
|
193
|
-
return current_resource.blog_controller
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
# In multiblog situations, force people to specify the blog
|
198
|
-
if !key && blog_instances.size > 1
|
199
|
-
raise "You must either specify the blog name in calling this method or in your page frontmatter (using the 'blog' key)"
|
200
|
-
end
|
201
|
-
|
202
|
-
key ||= blog_instances.keys.first
|
203
|
-
blog_instances[key.to_sym]
|
204
|
-
end
|
205
|
-
|
206
|
-
def blog(key=nil)
|
207
|
-
blog_controller(key).data
|
208
|
-
end
|
209
|
-
|
210
|
-
# Determine whether the currently rendering template is a blog article.
|
211
|
-
# This can be useful in layouts.
|
212
|
-
# @return [Boolean]
|
213
|
-
def is_blog_article?
|
214
|
-
!current_article.nil?
|
215
|
-
end
|
216
|
-
|
217
|
-
# Get a {Resource} with mixed in {BlogArticle} methods representing the current article.
|
218
|
-
# @return [Middleman::Sitemap::Resource]
|
219
|
-
def current_article
|
220
|
-
blog_instances.each do |key, blog|
|
221
|
-
found = blog.data.article(current_resource.path)
|
222
|
-
return found if found
|
223
|
-
end
|
224
|
-
|
225
|
-
nil
|
226
|
-
end
|
227
|
-
|
228
|
-
# Get a path to the given tag, based on the :taglink setting.
|
229
|
-
# @param [String] tag
|
230
|
-
# @return [String]
|
231
|
-
def tag_path(tag, key=nil)
|
232
|
-
sitemap.find_resource_by_path(::Middleman::Blog::TagPages.link(blog_controller(key).options, tag)).try(:url)
|
233
|
-
end
|
234
|
-
|
235
|
-
# Get a path to the given year-based calendar page, based on the :year_link setting.
|
236
|
-
# @param [Number] year
|
237
|
-
# @return [String]
|
238
|
-
def blog_year_path(year, key=nil)
|
239
|
-
sitemap.find_resource_by_path(::Middleman::Blog::CalendarPages.link(blog_controller(key).options, year)).try(:url)
|
240
|
-
end
|
241
|
-
|
242
|
-
# Get a path to the given month-based calendar page, based on the :month_link setting.
|
243
|
-
# @param [Number] year
|
244
|
-
# @param [Number] month
|
245
|
-
# @return [String]
|
246
|
-
def blog_month_path(year, month, key=nil)
|
247
|
-
sitemap.find_resource_by_path(::Middleman::Blog::CalendarPages.link(blog_controller(key).options, year, month)).try(:url)
|
248
|
-
end
|
249
|
-
|
250
|
-
# Get a path to the given day-based calendar page, based on the :day_link setting.
|
251
|
-
# @param [Number] year
|
252
|
-
# @param [Number] month
|
253
|
-
# @param [Number] day
|
254
|
-
# @return [String]
|
255
|
-
def blog_day_path(year, month, day, key=nil)
|
256
|
-
sitemap.find_resource_by_path(::Middleman::Blog::CalendarPages.link(blog_controller(key).options, year, month, day)).try(:url)
|
257
|
-
end
|
258
|
-
|
259
|
-
# Pagination Helpers
|
260
|
-
# These are used by the template if pagination is off, to allow a single template to work
|
261
|
-
# in both modes. They get overridden by the local variables if the paginator is active.
|
262
|
-
|
263
|
-
# Returns true if pagination is turned on for this template; false otherwise.
|
264
|
-
# @return [Boolean]
|
265
|
-
def paginate; false; end
|
266
|
-
|
267
|
-
# Returns the list of articles to display on this page.
|
268
|
-
# @return [Array<Middleman::Sitemap::Resource>]
|
269
|
-
def page_articles(key=nil)
|
270
|
-
limit = (current_resource.metadata[:page]["per_page"] || 0) - 1
|
271
|
-
|
272
|
-
# "articles" local variable is populated by Calendar and Tag page generators
|
273
|
-
# If it's not set then use the complete list of articles
|
274
|
-
d = (current_resource.metadata[:locals]["articles"] || blog(key).articles)[0..limit]
|
275
|
-
end
|
276
|
-
end
|
277
|
-
end
|
278
|
-
end
|