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
@@ -1,147 +1,115 @@
|
|
1
|
+
require 'middleman-blog/uri_templates'
|
2
|
+
|
1
3
|
module Middleman
|
2
4
|
module Blog
|
3
|
-
|
4
5
|
# A sitemap plugin that adds month/day/year pages to the sitemap
|
5
6
|
# based on the dates of blog articles.
|
6
7
|
class CalendarPages
|
7
|
-
|
8
|
-
# Get a path to the given calendar page, based on the :year_link, :month_link or :day_link setting.
|
9
|
-
# @param [Hash] blog_options
|
10
|
-
# @param [Number] year
|
11
|
-
# @param [Number] month
|
12
|
-
# @param [Number] day
|
13
|
-
# @return [String]
|
14
|
-
def link(blog_options, year, month=nil, day=nil)
|
15
|
-
path = if day
|
16
|
-
blog_options.day_link.
|
17
|
-
sub(':year', year.to_s).
|
18
|
-
sub(':month', month.to_s.rjust(2,'0')).
|
19
|
-
sub(':day', day.to_s.rjust(2,'0'))
|
20
|
-
elsif month
|
21
|
-
blog_options.month_link.
|
22
|
-
sub(':year', year.to_s).
|
23
|
-
sub(':month', month.to_s.rjust(2,'0'))
|
24
|
-
else
|
25
|
-
blog_options.year_link.
|
26
|
-
sub(':year', year.to_s)
|
27
|
-
end
|
28
|
-
::Middleman::Util.normalize_path(path)
|
29
|
-
end
|
30
|
-
end
|
8
|
+
include UriTemplates
|
31
9
|
|
32
|
-
def initialize(app,
|
33
|
-
@
|
34
|
-
@blog_controller =
|
35
|
-
|
10
|
+
def initialize(app, blog_controller)
|
11
|
+
@sitemap = app.sitemap
|
12
|
+
@blog_controller = blog_controller
|
13
|
+
@blog_data = blog_controller.data
|
36
14
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
15
|
+
blog_options = blog_controller.options
|
16
|
+
@day_link_template = uri_template blog_options.day_link
|
17
|
+
@month_link_template = uri_template blog_options.month_link
|
18
|
+
@year_link_template = uri_template blog_options.year_link
|
19
|
+
@day_template = blog_options.day_template
|
20
|
+
@month_template = blog_options.month_template
|
21
|
+
@year_template = blog_options.year_template
|
43
22
|
end
|
44
23
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
24
|
+
# Get a path to the given calendar page, based on the :year_link, :month_link or :day_link setting.
|
25
|
+
# @param [Number] year
|
26
|
+
# @param [Number] month
|
27
|
+
# @param [Number] day
|
28
|
+
# @return [String]
|
29
|
+
def link(year, month=nil, day=nil)
|
30
|
+
template = if day
|
31
|
+
@day_link_template
|
32
|
+
elsif month
|
33
|
+
@month_link_template
|
34
|
+
else
|
35
|
+
@year_link_template
|
36
|
+
end
|
37
|
+
|
38
|
+
apply_uri_template template, date_to_params(Date.new(year, month || 1, day || 1))
|
51
39
|
end
|
52
|
-
|
40
|
+
|
53
41
|
# Update the main sitemap resource list
|
54
|
-
# @return [
|
42
|
+
# @return [Array<Middleman::Sitemap::Resource>]
|
55
43
|
def manipulate_resource_list(resources)
|
56
44
|
new_resources = []
|
57
45
|
|
58
46
|
# Set up date pages if the appropriate templates have been specified
|
59
|
-
|
60
|
-
if
|
61
|
-
|
62
|
-
|
63
|
-
p = ::Middleman::Sitemap::Resource.new(
|
64
|
-
@app.sitemap,
|
65
|
-
path
|
66
|
-
)
|
67
|
-
p.proxy_to(self.blog_options.year_template)
|
68
|
-
|
69
|
-
# Add metadata in local variables so it's accessible to
|
70
|
-
# later extensions
|
71
|
-
p.add_metadata :locals => {
|
72
|
-
'page_type' => 'year',
|
73
|
-
'year' => year,
|
74
|
-
'articles' => year_articles,
|
75
|
-
'blog_controller' => @blog_controller
|
76
|
-
}
|
77
|
-
# Add metadata in instance variables for backwards compatibility
|
78
|
-
p.add_metadata do
|
79
|
-
@year = year
|
80
|
-
@articles = year_articles
|
81
|
-
end
|
82
|
-
|
83
|
-
new_resources << p
|
47
|
+
@blog_data.articles.group_by {|a| a.date.year }.each do |year, year_articles|
|
48
|
+
if @year_template
|
49
|
+
new_resources << year_page_resource(year, year_articles)
|
84
50
|
end
|
85
|
-
|
86
|
-
year_articles.group_by {|a| a.date.month }.each do |month, month_articles|
|
87
|
-
if self.blog_options.month_template
|
88
|
-
path = CalendarPages.link(self.blog_options, year, month)
|
89
|
-
|
90
|
-
p = ::Middleman::Sitemap::Resource.new(
|
91
|
-
@app.sitemap,
|
92
|
-
path
|
93
|
-
)
|
94
|
-
p.proxy_to(self.blog_options.month_template)
|
95
|
-
|
96
|
-
p.add_metadata :locals => {
|
97
|
-
'page_type' => 'month',
|
98
|
-
'year' => year,
|
99
|
-
'month' => month,
|
100
|
-
'articles' => month_articles,
|
101
|
-
'blog_controller' => @blog_controller
|
102
|
-
}
|
103
|
-
p.add_metadata do
|
104
|
-
@year = year
|
105
|
-
@month = month
|
106
|
-
@articles = month_articles
|
107
|
-
end
|
108
51
|
|
109
|
-
|
52
|
+
year_articles.group_by {|a| a.date.month }.each do |month, month_articles|
|
53
|
+
if @month_template
|
54
|
+
new_resources << month_page_resource(year, month, month_articles)
|
110
55
|
end
|
111
|
-
|
56
|
+
|
112
57
|
month_articles.group_by {|a| a.date.day }.each do |day, day_articles|
|
113
|
-
if
|
114
|
-
|
115
|
-
|
116
|
-
p = ::Middleman::Sitemap::Resource.new(
|
117
|
-
@app.sitemap,
|
118
|
-
path
|
119
|
-
)
|
120
|
-
p.proxy_to(self.blog_options.day_template)
|
121
|
-
|
122
|
-
p.add_metadata :locals => {
|
123
|
-
'page_type' => 'day',
|
124
|
-
'year' => year,
|
125
|
-
'month' => month,
|
126
|
-
'day' => day,
|
127
|
-
'articles' => day_articles,
|
128
|
-
'blog_controller' => @blog_controller
|
129
|
-
}
|
130
|
-
p.add_metadata do
|
131
|
-
@year = year
|
132
|
-
@month = month
|
133
|
-
@day = day
|
134
|
-
@articles = day_articles
|
135
|
-
end
|
136
|
-
|
137
|
-
new_resources << p
|
58
|
+
if @day_template
|
59
|
+
new_resources << day_page_resource(year, month, day, day_articles)
|
138
60
|
end
|
139
61
|
end
|
140
62
|
end
|
141
63
|
end
|
142
64
|
|
143
65
|
resources + new_resources
|
144
|
-
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def year_page_resource(year, year_articles)
|
71
|
+
Sitemap::Resource.new(@sitemap, link(year)).tap do |p|
|
72
|
+
p.proxy_to(@year_template)
|
73
|
+
|
74
|
+
# Add metadata in local variables so it's accessible to
|
75
|
+
# later extensions
|
76
|
+
p.add_metadata locals: {
|
77
|
+
'page_type' => 'year',
|
78
|
+
'year' => year,
|
79
|
+
'articles' => year_articles,
|
80
|
+
'blog_controller' => @blog_controller
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def month_page_resource(year, month, month_articles)
|
86
|
+
Sitemap::Resource.new(@sitemap, link(year, month)).tap do |p|
|
87
|
+
p.proxy_to(@month_template)
|
88
|
+
|
89
|
+
p.add_metadata locals: {
|
90
|
+
'page_type' => 'month',
|
91
|
+
'year' => year,
|
92
|
+
'month' => month,
|
93
|
+
'articles' => month_articles,
|
94
|
+
'blog_controller' => @blog_controller
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def day_page_resource(year, month, day, day_articles)
|
100
|
+
Sitemap::Resource.new(@sitemap, link(year, month, day)).tap do |p|
|
101
|
+
p.proxy_to(@day_template)
|
102
|
+
|
103
|
+
p.add_metadata locals: {
|
104
|
+
'page_type' => 'day',
|
105
|
+
'year' => year,
|
106
|
+
'month' => month,
|
107
|
+
'day' => day,
|
108
|
+
'articles' => day_articles,
|
109
|
+
'blog_controller' => @blog_controller
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
145
113
|
end
|
146
114
|
end
|
147
115
|
end
|
@@ -1,20 +1,20 @@
|
|
1
|
-
require 'middleman-core/cli'
|
1
|
+
require 'middleman-core/cli'
|
2
2
|
require 'date'
|
3
|
+
require 'middleman-blog/uri_templates'
|
3
4
|
|
4
5
|
module Middleman
|
5
6
|
module Cli
|
6
7
|
# This class provides an "article" command for the middleman CLI.
|
7
8
|
class Article < Thor
|
8
9
|
include Thor::Actions
|
10
|
+
include Blog::UriTemplates
|
9
11
|
|
10
12
|
check_unknown_options!
|
11
13
|
|
12
14
|
namespace :article
|
13
15
|
|
14
|
-
# Template files are relative to this file
|
15
|
-
# @return [String]
|
16
16
|
def self.source_root
|
17
|
-
|
17
|
+
ENV['MM_ROOT']
|
18
18
|
end
|
19
19
|
|
20
20
|
# Tell Thor to exit with a nonzero exit code on failure
|
@@ -24,24 +24,31 @@ module Middleman
|
|
24
24
|
|
25
25
|
desc "article TITLE", "Create a new blog article"
|
26
26
|
method_option "date",
|
27
|
-
:
|
28
|
-
:
|
27
|
+
aliases: "-d",
|
28
|
+
desc: "The date to create the post with (defaults to now)"
|
29
|
+
method_option "lang",
|
30
|
+
aliases: "-l",
|
31
|
+
desc: "The language to create the post with (defaults to I18n.default_locale if avaliable)"
|
32
|
+
method_option "blog",
|
33
|
+
aliases: "-b",
|
34
|
+
desc: "The name of the blog to creat the post inside (for multi-blog apps, defaults to the only blog in single-blog apps)"
|
29
35
|
def article(title)
|
30
36
|
shared_instance = ::Middleman::Application.server.inst
|
31
37
|
|
32
38
|
# This only exists when the config.rb sets it!
|
33
39
|
if shared_instance.respond_to? :blog
|
34
40
|
@title = title
|
35
|
-
@slug = title
|
41
|
+
@slug = safe_parameterize(title)
|
36
42
|
@date = options[:date] ? Time.zone.parse(options[:date]) : Time.zone.now
|
43
|
+
@lang = options[:lang] || ( I18n.default_locale if defined? I18n )
|
37
44
|
|
38
|
-
|
39
|
-
sub(':year', @date.year.to_s).
|
40
|
-
sub(':month', @date.month.to_s.rjust(2,'0')).
|
41
|
-
sub(':day', @date.day.to_s.rjust(2,'0')).
|
42
|
-
sub(':title', @slug)
|
45
|
+
blog_inst = shared_instance.blog(options[:blog])
|
43
46
|
|
44
|
-
|
47
|
+
path_template = blog_inst.source_template
|
48
|
+
params = date_to_params(@date).merge(lang: @lang.to_s, title: @slug)
|
49
|
+
article_path = apply_uri_template path_template, params
|
50
|
+
|
51
|
+
template blog_inst.options.new_article_template, File.join(shared_instance.source_dir, article_path + blog_inst.options.default_extension)
|
45
52
|
else
|
46
53
|
raise Thor::Error.new "You need to activate the blog extension in config.rb before you can create an article"
|
47
54
|
end
|
@@ -49,4 +56,3 @@ module Middleman
|
|
49
56
|
end
|
50
57
|
end
|
51
58
|
end
|
52
|
-
|
@@ -1,85 +1,51 @@
|
|
1
|
+
require 'middleman-blog/uri_templates'
|
2
|
+
|
1
3
|
module Middleman
|
2
4
|
module Blog
|
3
5
|
|
6
|
+
# This adds new summary pages for arbitrarily defined blog article properties
|
4
7
|
class CustomPages
|
8
|
+
include UriTemplates
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
# Return a path to the given property / value pair
|
9
|
-
#
|
10
|
-
# @param [Hash] blog_options
|
11
|
-
# @param [String|Symbol] property Frontmatter property used to collect on
|
12
|
-
# @param [String| value Frontmatter value for the given article for the given property
|
13
|
-
def link(blog_options, property, value)
|
14
|
-
link_template = blog_options.custom_collections[property][:link]
|
15
|
-
::Middleman::Util.normalize_path(link_template.sub(":#{property}", value.parameterize))
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
10
|
+
attr_reader :property
|
19
11
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@property = property
|
24
|
-
@app = app
|
12
|
+
def initialize(property, app, controller, options)
|
13
|
+
@property = property
|
14
|
+
@sitemap = app.sitemap
|
25
15
|
@blog_controller = controller
|
16
|
+
@blog_data = controller.data
|
17
|
+
@link_template = uri_template options[:link]
|
18
|
+
@page_template = options[:template]
|
26
19
|
end
|
27
20
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def blog_options
|
37
|
-
if blog_controller
|
38
|
-
blog_controller.options
|
39
|
-
else
|
40
|
-
app.blog.options
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def articles
|
45
|
-
blog_data.articles
|
21
|
+
# Return a path to the page for this property value.
|
22
|
+
#
|
23
|
+
# @param [String] value
|
24
|
+
def link(value)
|
25
|
+
apply_uri_template @link_template, property => safe_parameterize(value)
|
46
26
|
end
|
47
27
|
|
48
28
|
def manipulate_resource_list(resources)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
path = CustomPages.link(blog_options, property, property_value)
|
53
|
-
new_resources << build_resource(path, property_value, property_articles)
|
29
|
+
articles_by_property = @blog_data.articles.group_by { |a| a.metadata[:page][property.to_s] }
|
30
|
+
resources + articles_by_property.map do |property_value, articles|
|
31
|
+
build_resource(link(property_value), property_value, articles)
|
54
32
|
end
|
55
|
-
|
56
|
-
resources + new_resources
|
57
33
|
end
|
58
34
|
|
59
|
-
|
60
|
-
p = ::Middleman::Sitemap::Resource.new(app.sitemap, path)
|
61
|
-
p.proxy_to(template_for_page)
|
62
|
-
p.add_metadata :locals => {
|
63
|
-
"page_type" => property,
|
64
|
-
"#{property}" => value,
|
65
|
-
"articles" => property_articles,
|
66
|
-
"blog_controller" => blog_controller
|
67
|
-
}
|
35
|
+
private
|
68
36
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@
|
37
|
+
def build_resource(path, value, articles)
|
38
|
+
articles = articles.sort_by(&:date).reverse
|
39
|
+
Sitemap::Resource.new(@sitemap, path).tap do |p|
|
40
|
+
p.proxy_to(@page_template)
|
41
|
+
p.add_metadata locals: {
|
42
|
+
"page_type" => property.to_s,
|
43
|
+
property => value,
|
44
|
+
"articles" => articles,
|
45
|
+
"blog_controller" => @blog_controller
|
46
|
+
}
|
73
47
|
end
|
74
|
-
|
75
|
-
p
|
76
|
-
end
|
77
|
-
|
78
|
-
def template_for_page
|
79
|
-
blog_options.custom_collections[property][:template]
|
80
48
|
end
|
81
|
-
|
82
49
|
end
|
83
|
-
|
84
50
|
end
|
85
51
|
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'active_support/core_ext/time/zones'
|
2
|
+
require 'middleman-blog/blog_data'
|
3
|
+
require 'middleman-blog/blog_article'
|
4
|
+
require 'middleman-blog/helpers'
|
5
|
+
|
6
|
+
module Middleman
|
7
|
+
class BlogExtension < Extension
|
8
|
+
self.supports_multiple_instances = true
|
9
|
+
|
10
|
+
option :name, nil, 'Unique ID for telling multiple blogs apart'
|
11
|
+
option :prefix, nil, 'Prefix to mount the blog at (modifies permalink, sources, taglink, year_link, month_link, day_link to start with the prefix)'
|
12
|
+
option :permalink, '/{year}/{month}/{day}/{title}.html', 'Path articles are generated at. Tokens can be omitted or duplicated, and you can use tokens defined in article frontmatter.'
|
13
|
+
option :sources, '{year}-{month}-{day}-{title}.html', 'Pattern for matching source blog articles (no template extensions)'
|
14
|
+
option :taglink, 'tags/{tag}.html', 'Path tag pages are generated at.'
|
15
|
+
option :layout, 'layout', 'Article-specific layout'
|
16
|
+
option :summary_separator, /(READMORE)/, 'Regex or string that delimits the article summary from the rest of the article.'
|
17
|
+
option :summary_length, 250, 'Truncate summary to be <= this number of characters. Set to -1 to disable summary truncation.'
|
18
|
+
option :summary_generator, nil, 'A block that defines how summaries are extracted. It will be passed the rendered article content, max summary length, and ellipsis string as arguments.'
|
19
|
+
option :year_link, '/{year}.html', 'Path yearly archive pages are generated at.'
|
20
|
+
option :month_link, '/{year}/{month}.html', 'Path monthly archive pages are generated at.'
|
21
|
+
option :day_link, '/{year}/{month}/{day}.html', 'Path daily archive pages are generated at.'
|
22
|
+
option :calendar_template, nil, 'Template path (no template extension) for calendar pages (year/month/day archives).'
|
23
|
+
option :year_template, nil, 'Template path (no template extension) for yearly archive pages. Defaults to the :calendar_template.'
|
24
|
+
option :month_template, nil, 'Template path (no template extension) for monthly archive pages. Defaults to the :calendar_template.'
|
25
|
+
option :day_template, nil, 'Template path (no template extension) for daily archive pages. Defaults to the :calendar_template.'
|
26
|
+
option :tag_template, nil, 'Template path (no template extension) for tag archive pages.'
|
27
|
+
option :paginate, false, 'Whether to paginate lists of articles'
|
28
|
+
option :per_page, 10, 'Number of articles per page when paginating'
|
29
|
+
option :page_link, 'page/{num}', 'Path to append for additional pages when paginating'
|
30
|
+
option :publish_future_dated, false, 'Whether articles with a date in the future should be considered published'
|
31
|
+
option :custom_collections, {}, 'Hash of custom frontmatter properties to collect articles on and their options (link, template)'
|
32
|
+
option :preserve_locale, false, 'Use the global Middleman I18n.locale instead of the lang in the article\'s frontmatter'
|
33
|
+
option :new_article_template, File.expand_path('../commands/article.tt', __FILE__), 'Path (relative to project root) to an ERb template that will be used to generate new articles from the "middleman article" command.'
|
34
|
+
option :default_extension, '.markdown', 'Default template extension for articles (used by "middleman article")'
|
35
|
+
|
36
|
+
# @return [BlogData] blog data for this blog, which has all information about the blog articles
|
37
|
+
attr_reader :data
|
38
|
+
|
39
|
+
# @return [Symbol] the name of this blog (autogenerated if not provided).
|
40
|
+
attr_reader :name
|
41
|
+
|
42
|
+
# @return [TagPages] tag page handler for this blog
|
43
|
+
attr_reader :tag_pages
|
44
|
+
|
45
|
+
# @return [CalendarPages] calendar page handler for this blog
|
46
|
+
attr_reader :calendar_pages
|
47
|
+
|
48
|
+
# @return [Paginator] pagination handler for this blog
|
49
|
+
attr_reader :paginator
|
50
|
+
|
51
|
+
# @return [Hash<CustomPages>] custom pages handlers for this blog, indexed by property name
|
52
|
+
attr_reader :custom_pages
|
53
|
+
|
54
|
+
# Helpers for use within templates and layouts.
|
55
|
+
self.defined_helpers = [ Middleman::Blog::Helpers ]
|
56
|
+
|
57
|
+
def initialize(app, options_hash={}, &block)
|
58
|
+
super
|
59
|
+
|
60
|
+
@custom_pages = {}
|
61
|
+
|
62
|
+
# NAME is the name of this particular blog, and how you reference it from #blog_controller or frontmatter.
|
63
|
+
@name = options.name.to_sym if options.name
|
64
|
+
|
65
|
+
# Allow one setting to set all the calendar templates
|
66
|
+
if options.calendar_template
|
67
|
+
options.year_template ||= options.calendar_template
|
68
|
+
options.month_template ||= options.calendar_template
|
69
|
+
options.day_template ||= options.calendar_template
|
70
|
+
end
|
71
|
+
|
72
|
+
# If "prefix" option is specified, all other paths are relative to it.
|
73
|
+
if options.prefix
|
74
|
+
options.prefix = "/#{options.prefix}" unless options.prefix.start_with? '/'
|
75
|
+
options.permalink = File.join(options.prefix, options.permalink)
|
76
|
+
options.sources = File.join(options.prefix, options.sources)
|
77
|
+
options.taglink = File.join(options.prefix, options.taglink)
|
78
|
+
options.year_link = File.join(options.prefix, options.year_link)
|
79
|
+
options.month_link = File.join(options.prefix, options.month_link)
|
80
|
+
options.day_link = File.join(options.prefix, options.day_link)
|
81
|
+
|
82
|
+
options.custom_collections.each do |key, opts|
|
83
|
+
opts[:link] = File.join(options.prefix, opts[:link])
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def after_configuration
|
89
|
+
@name ||= :"blog#{@app.blog_instances.keys.length}"
|
90
|
+
|
91
|
+
# TODO: break up into private methods?
|
92
|
+
|
93
|
+
@app.ignore(options.calendar_template) if options.calendar_template
|
94
|
+
@app.ignore(options.year_template) if options.year_template
|
95
|
+
@app.ignore(options.month_template) if options.month_template
|
96
|
+
@app.ignore(options.day_template) if options.day_template
|
97
|
+
@app.ignore options.tag_template if options.tag_template
|
98
|
+
|
99
|
+
@app.blog_instances[@name] = self
|
100
|
+
|
101
|
+
# Make sure ActiveSupport's TimeZone stuff has something to work with,
|
102
|
+
# allowing people to set their desired time zone via Time.zone or
|
103
|
+
# set :time_zone
|
104
|
+
Time.zone = app.config[:time_zone] if app.config[:time_zone]
|
105
|
+
time_zone = Time.zone || 'UTC'
|
106
|
+
zone_default = Time.find_zone!(time_zone)
|
107
|
+
unless zone_default
|
108
|
+
raise 'Value assigned to time_zone not recognized.'
|
109
|
+
end
|
110
|
+
Time.zone_default = zone_default
|
111
|
+
|
112
|
+
# Initialize blog with options
|
113
|
+
@data = Blog::BlogData.new(@app, self, options)
|
114
|
+
|
115
|
+
@app.sitemap.register_resource_list_manipulator(:"blog_#{name}_articles", @data, false)
|
116
|
+
|
117
|
+
if options.tag_template
|
118
|
+
@app.ignore options.tag_template
|
119
|
+
|
120
|
+
require 'middleman-blog/tag_pages'
|
121
|
+
@tag_pages = Blog::TagPages.new(@app, self)
|
122
|
+
@app.sitemap.register_resource_list_manipulator(:"blog_#{name}_tags", @tag_pages, false)
|
123
|
+
end
|
124
|
+
|
125
|
+
if options.year_template || options.month_template || options.day_template
|
126
|
+
require 'middleman-blog/calendar_pages'
|
127
|
+
@calendar_pages = Blog::CalendarPages.new(@app, self)
|
128
|
+
@app.sitemap.register_resource_list_manipulator(:"blog_#{name}_calendar", @calendar_pages, false)
|
129
|
+
end
|
130
|
+
|
131
|
+
if options.paginate
|
132
|
+
require 'middleman-blog/paginator'
|
133
|
+
@paginator = Blog::Paginator.new(@app, self)
|
134
|
+
@app.sitemap.register_resource_list_manipulator(:"blog_#{name}_paginate", @paginator, false)
|
135
|
+
end
|
136
|
+
|
137
|
+
if options.custom_collections
|
138
|
+
require 'middleman-blog/custom_pages'
|
139
|
+
register_custom_pages
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
# Register any custom page collections that may be set in the config
|
146
|
+
#
|
147
|
+
# A custom resource list manipulator will be generated for each key in the
|
148
|
+
# custom collections hash.
|
149
|
+
#
|
150
|
+
# The following will collect posts on the "category" frontmatter property:
|
151
|
+
# ```
|
152
|
+
# activate :blog do |blog|
|
153
|
+
# blog.custom_collections = {
|
154
|
+
# category: {
|
155
|
+
# link: "/categories/:category.html",
|
156
|
+
# template: "/category.html"
|
157
|
+
# }
|
158
|
+
# }
|
159
|
+
# end
|
160
|
+
# ```
|
161
|
+
#
|
162
|
+
# Category pages in the example above will use the category.html as a template file
|
163
|
+
# and it will be ignored when building.
|
164
|
+
def register_custom_pages
|
165
|
+
options.custom_collections.each do |property, options|
|
166
|
+
@app.ignore options[:template]
|
167
|
+
|
168
|
+
@custom_pages[property] = Blog::CustomPages.new(property, @app, self, options)
|
169
|
+
@app.sitemap.register_resource_list_manipulator(:"blog_#{name}_#{property}", @custom_pages[property], false)
|
170
|
+
|
171
|
+
Blog::Helpers.generate_custom_helper(property)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|