bunto 3.2.1 → 3.4.5
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/.rubocop.yml +21 -4
- data/LICENSE +1 -1
- data/README.markdown +20 -25
- data/exe/bunto +1 -1
- data/lib/bunto.rb +10 -4
- data/lib/bunto/collection.rb +11 -4
- data/lib/bunto/commands/build.rb +17 -2
- data/lib/bunto/commands/doctor.rb +1 -1
- data/lib/bunto/commands/new.rb +35 -5
- data/lib/bunto/commands/new_theme.rb +4 -2
- data/lib/bunto/commands/serve.rb +45 -15
- data/lib/bunto/commands/serve/servlet.rb +1 -1
- data/lib/bunto/configuration.rb +9 -7
- data/lib/bunto/converters/markdown/kramdown_parser.rb +2 -2
- data/lib/bunto/converters/markdown/redcarpet_parser.rb +1 -1
- data/lib/bunto/convertible.rb +21 -82
- data/lib/bunto/desktop.ini +1 -1
- data/lib/bunto/document.rb +118 -81
- data/lib/bunto/drops/bunto_drop.rb +1 -1
- data/lib/bunto/drops/static_file_drop.rb +11 -0
- data/lib/bunto/drops/url_drop.rb +5 -0
- data/lib/bunto/entry_filter.rb +9 -10
- data/lib/bunto/excerpt.rb +2 -3
- data/lib/bunto/external.rb +1 -1
- data/lib/bunto/filters.rb +10 -32
- data/lib/bunto/filters/grouping_filters.rb +63 -0
- data/lib/bunto/filters/url_filters.rb +40 -0
- data/lib/bunto/frontmatter_defaults.rb +1 -1
- data/lib/bunto/hooks.rb +9 -9
- data/lib/bunto/log_adapter.rb +1 -1
- data/lib/bunto/page.rb +8 -4
- data/lib/bunto/plugin.rb +1 -1
- data/lib/bunto/reader.rb +2 -1
- data/lib/bunto/readers/data_reader.rb +9 -10
- data/lib/bunto/readers/post_reader.rb +1 -1
- data/lib/bunto/readers/theme_assets_reader.rb +47 -0
- data/lib/bunto/regenerator.rb +1 -1
- data/lib/bunto/related_posts.rb +3 -9
- data/lib/bunto/renderer.rb +26 -6
- data/lib/bunto/site.rb +12 -7
- data/lib/bunto/static_file.rb +20 -9
- data/lib/bunto/tags/highlight.rb +3 -3
- data/lib/bunto/tags/include.rb +9 -5
- data/lib/bunto/tags/link.rb +4 -2
- data/lib/bunto/tags/post_url.rb +4 -2
- data/lib/bunto/theme.rb +8 -4
- data/lib/bunto/theme_builder.rb +2 -2
- data/lib/bunto/url.rb +31 -8
- data/lib/bunto/utils.rb +16 -2
- data/lib/bunto/utils/ansi.rb +1 -1
- data/lib/bunto/utils/exec.rb +25 -0
- data/lib/bunto/utils/platforms.rb +52 -2
- data/lib/bunto/utils/win_tz.rb +73 -0
- data/lib/bunto/version.rb +1 -1
- data/lib/site_template/_config.yml +8 -3
- data/lib/site_template/_posts/0000-00-00-welcome-to-bunto.markdown.erb +4 -4
- data/lib/site_template/about.md +1 -1
- data/lib/site_template/index.md +6 -0
- data/lib/theme_template/LICENSE.txt.erb +1 -1
- data/lib/theme_template/README.md.erb +4 -4
- data/lib/theme_template/gitignore.erb +1 -0
- data/lib/theme_template/theme.gemspec.erb +3 -2
- metadata +55 -40
- data/lib/site_template/css/main.scss +0 -39
- data/lib/site_template/feed.xml +0 -30
- data/lib/site_template/index.html +0 -23
@@ -0,0 +1,11 @@
|
|
1
|
+
module Bunto
|
2
|
+
module Drops
|
3
|
+
class StaticFileDrop < Drop
|
4
|
+
extend Forwardable
|
5
|
+
def_delegators :@obj, :name, :extname, :modified_time, :basename
|
6
|
+
def_delegator :@obj, :relative_path, :path
|
7
|
+
def_delegator :@obj, :data, :fallback_data
|
8
|
+
def_delegator :@obj, :type, :collection
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/bunto/drops/url_drop.rb
CHANGED
data/lib/bunto/entry_filter.rb
CHANGED
@@ -2,7 +2,7 @@ module Bunto
|
|
2
2
|
class EntryFilter
|
3
3
|
attr_reader :site
|
4
4
|
SPECIAL_LEADING_CHARACTERS = [
|
5
|
-
".", "_", "#", "~"
|
5
|
+
".", "_", "#", "~",
|
6
6
|
].freeze
|
7
7
|
|
8
8
|
def initialize(site, base_directory = nil)
|
@@ -36,8 +36,7 @@ module Bunto
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def included?(entry)
|
39
|
-
glob_include?(site.include,
|
40
|
-
entry)
|
39
|
+
glob_include?(site.include, entry)
|
41
40
|
end
|
42
41
|
|
43
42
|
def special?(entry)
|
@@ -50,14 +49,14 @@ module Bunto
|
|
50
49
|
end
|
51
50
|
|
52
51
|
def excluded?(entry)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
glob_include?(site.exclude, relative_to_source(entry)).tap do |excluded|
|
53
|
+
if excluded
|
54
|
+
Bunto.logger.debug(
|
55
|
+
"EntryFilter:",
|
56
|
+
"excluded #{relative_to_source(entry)}"
|
57
|
+
)
|
58
|
+
end
|
59
59
|
end
|
60
|
-
excluded
|
61
60
|
end
|
62
61
|
|
63
62
|
# --
|
data/lib/bunto/excerpt.rb
CHANGED
@@ -30,8 +30,7 @@ module Bunto
|
|
30
30
|
@data
|
31
31
|
end
|
32
32
|
|
33
|
-
def trigger_hooks(*)
|
34
|
-
end
|
33
|
+
def trigger_hooks(*); end
|
35
34
|
|
36
35
|
# 'Path' of the excerpt.
|
37
36
|
#
|
@@ -118,7 +117,7 @@ module Bunto
|
|
118
117
|
if tail.empty?
|
119
118
|
head
|
120
119
|
else
|
121
|
-
"" << head << "\n\n" << tail.scan(%r
|
120
|
+
"" << head << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n")
|
122
121
|
end
|
123
122
|
end
|
124
123
|
end
|
data/lib/bunto/external.rb
CHANGED
@@ -48,7 +48,7 @@ In order to use Bunto as currently configured, you'll need to install this gem.
|
|
48
48
|
|
49
49
|
The full error message from Ruby is: '#{e.message}'
|
50
50
|
|
51
|
-
If you run into trouble, you can find helpful resources at
|
51
|
+
If you run into trouble, you can find helpful resources at https://buntorb.com/help/!
|
52
52
|
MSG
|
53
53
|
raise Bunto::Errors::MissingDependencyException, name
|
54
54
|
end
|
data/lib/bunto/filters.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
require "uri"
|
1
|
+
require "addressable/uri"
|
2
2
|
require "json"
|
3
3
|
require "date"
|
4
4
|
require "liquid"
|
5
5
|
|
6
|
+
require_all "bunto/filters"
|
7
|
+
|
6
8
|
module Bunto
|
7
9
|
module Filters
|
10
|
+
include URLFilters
|
11
|
+
include GroupingFilters
|
12
|
+
|
8
13
|
# Convert a Markdown string into HTML output.
|
9
14
|
#
|
10
15
|
# input - The Markdown String to convert.
|
@@ -147,7 +152,7 @@ module Bunto
|
|
147
152
|
#
|
148
153
|
# Returns the escaped String.
|
149
154
|
def uri_escape(input)
|
150
|
-
URI.
|
155
|
+
Addressable::URI.normalize_component(input)
|
151
156
|
end
|
152
157
|
|
153
158
|
# Replace any whitespace in the input string with a single space
|
@@ -172,6 +177,7 @@ module Bunto
|
|
172
177
|
# word "and" for the last one.
|
173
178
|
#
|
174
179
|
# array - The Array of Strings to join.
|
180
|
+
# connector - Word used to connect the last 2 items in the array
|
175
181
|
#
|
176
182
|
# Examples
|
177
183
|
#
|
@@ -179,8 +185,7 @@ module Bunto
|
|
179
185
|
# # => "apples, oranges, and grapes"
|
180
186
|
#
|
181
187
|
# Returns the formatted String.
|
182
|
-
def array_to_sentence_string(array)
|
183
|
-
connector = "and"
|
188
|
+
def array_to_sentence_string(array, connector = "and")
|
184
189
|
case array.length
|
185
190
|
when 0
|
186
191
|
""
|
@@ -202,29 +207,6 @@ module Bunto
|
|
202
207
|
as_liquid(input).to_json
|
203
208
|
end
|
204
209
|
|
205
|
-
# Group an array of items by a property
|
206
|
-
#
|
207
|
-
# input - the inputted Enumerable
|
208
|
-
# property - the property
|
209
|
-
#
|
210
|
-
# Returns an array of Hashes, each looking something like this:
|
211
|
-
# {"name" => "larry"
|
212
|
-
# "items" => [...] } # all the items where `property` == "larry"
|
213
|
-
def group_by(input, property)
|
214
|
-
if groupable?(input)
|
215
|
-
input.group_by { |item| item_property(item, property).to_s }
|
216
|
-
.each_with_object([]) do |item, array|
|
217
|
-
array << {
|
218
|
-
"name" => item.first,
|
219
|
-
"items" => item.last,
|
220
|
-
"size" => item.last.size
|
221
|
-
}
|
222
|
-
end
|
223
|
-
else
|
224
|
-
input
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
210
|
# Filter an array of objects
|
229
211
|
#
|
230
212
|
# input - the object array
|
@@ -378,11 +360,6 @@ module Bunto
|
|
378
360
|
end.localtime
|
379
361
|
end
|
380
362
|
|
381
|
-
private
|
382
|
-
def groupable?(element)
|
383
|
-
element.respond_to?(:group_by)
|
384
|
-
end
|
385
|
-
|
386
363
|
private
|
387
364
|
def item_property(item, property)
|
388
365
|
if item.respond_to?(:to_liquid)
|
@@ -433,6 +410,7 @@ module Bunto
|
|
433
410
|
|
434
411
|
condition
|
435
412
|
end
|
413
|
+
|
436
414
|
end
|
437
415
|
end
|
438
416
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Bunto
|
2
|
+
module Filters
|
3
|
+
module GroupingFilters
|
4
|
+
# Group an array of items by a property
|
5
|
+
#
|
6
|
+
# input - the inputted Enumerable
|
7
|
+
# property - the property
|
8
|
+
#
|
9
|
+
# Returns an array of Hashes, each looking something like this:
|
10
|
+
# {"name" => "larry"
|
11
|
+
# "items" => [...] } # all the items where `property` == "larry"
|
12
|
+
def group_by(input, property)
|
13
|
+
if groupable?(input)
|
14
|
+
groups = input.group_by { |item| item_property(item, property).to_s }
|
15
|
+
grouped_array(groups)
|
16
|
+
else
|
17
|
+
input
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Group an array of items by an expression
|
22
|
+
#
|
23
|
+
# input - the object array
|
24
|
+
# variable - the variable to assign each item to in the expression
|
25
|
+
# expression -a Liquid comparison expression passed in as a string
|
26
|
+
#
|
27
|
+
# Returns the filtered array of objects
|
28
|
+
def group_by_exp(input, variable, expression)
|
29
|
+
return input unless groupable?(input)
|
30
|
+
|
31
|
+
parsed_expr = parse_expression(expression)
|
32
|
+
@context.stack do
|
33
|
+
groups = input.group_by do |item|
|
34
|
+
@context[variable] = item
|
35
|
+
parsed_expr.render(@context)
|
36
|
+
end
|
37
|
+
grouped_array(groups)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def parse_expression(str)
|
43
|
+
Liquid::Variable.new(str, {})
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def groupable?(element)
|
48
|
+
element.respond_to?(:group_by)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def grouped_array(groups)
|
53
|
+
groups.each_with_object([]) do |item, array|
|
54
|
+
array << {
|
55
|
+
"name" => item.first,
|
56
|
+
"items" => item.last,
|
57
|
+
"size" => item.last.size,
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "addressable/uri"
|
2
|
+
|
3
|
+
module Bunto
|
4
|
+
module Filters
|
5
|
+
module URLFilters
|
6
|
+
# Produces an absolute URL based on site.url and site.baseurl.
|
7
|
+
#
|
8
|
+
# input - the URL to make absolute.
|
9
|
+
#
|
10
|
+
# Returns the absolute URL as a String.
|
11
|
+
def absolute_url(input)
|
12
|
+
return if input.nil?
|
13
|
+
site = @context.registers[:site]
|
14
|
+
return relative_url(input).to_s if site.config["url"].nil?
|
15
|
+
Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
# Produces a URL relative to the domain root based on site.baseurl.
|
19
|
+
#
|
20
|
+
# input - the URL to make relative to the domain root
|
21
|
+
#
|
22
|
+
# Returns a URL relative to the domain root as a String.
|
23
|
+
def relative_url(input)
|
24
|
+
return if input.nil?
|
25
|
+
site = @context.registers[:site]
|
26
|
+
parts = [site.config["baseurl"], input]
|
27
|
+
Addressable::URI.parse(
|
28
|
+
parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join
|
29
|
+
).normalize.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def ensure_leading_slash(input)
|
34
|
+
return input if input.nil? || input.empty? || input.start_with?("/")
|
35
|
+
"/#{input}"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/bunto/hooks.rb
CHANGED
@@ -6,7 +6,7 @@ module Bunto
|
|
6
6
|
PRIORITY_MAP = {
|
7
7
|
:low => 10,
|
8
8
|
:normal => 20,
|
9
|
-
:high => 30
|
9
|
+
:high => 30,
|
10
10
|
}.freeze
|
11
11
|
|
12
12
|
# initial empty hooks
|
@@ -17,26 +17,26 @@ module Bunto
|
|
17
17
|
:post_read => [],
|
18
18
|
:pre_render => [],
|
19
19
|
:post_render => [],
|
20
|
-
:post_write => []
|
20
|
+
:post_write => [],
|
21
21
|
},
|
22
22
|
:pages => {
|
23
23
|
:post_init => [],
|
24
24
|
:pre_render => [],
|
25
25
|
:post_render => [],
|
26
|
-
:post_write => []
|
26
|
+
:post_write => [],
|
27
27
|
},
|
28
28
|
:posts => {
|
29
29
|
:post_init => [],
|
30
30
|
:pre_render => [],
|
31
31
|
:post_render => [],
|
32
|
-
:post_write => []
|
32
|
+
:post_write => [],
|
33
33
|
},
|
34
34
|
:documents => {
|
35
35
|
:post_init => [],
|
36
36
|
:pre_render => [],
|
37
37
|
:post_render => [],
|
38
|
-
:post_write => []
|
39
|
-
}
|
38
|
+
:post_write => [],
|
39
|
+
},
|
40
40
|
}
|
41
41
|
|
42
42
|
# map of all hooks and their priorities
|
@@ -54,7 +54,7 @@ module Bunto
|
|
54
54
|
|
55
55
|
# Ensure the priority is a Fixnum
|
56
56
|
def self.priority_value(priority)
|
57
|
-
return priority if priority.is_a?(
|
57
|
+
return priority if priority.is_a?(Integer)
|
58
58
|
PRIORITY_MAP[priority] || DEFAULT_PRIORITY
|
59
59
|
end
|
60
60
|
|
@@ -64,7 +64,7 @@ module Bunto
|
|
64
64
|
:post_init => [],
|
65
65
|
:pre_render => [],
|
66
66
|
:post_render => [],
|
67
|
-
:post_write => []
|
67
|
+
:post_write => [],
|
68
68
|
}
|
69
69
|
|
70
70
|
unless @registry[owner][event]
|
@@ -80,7 +80,7 @@ module Bunto
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def self.insert_hook(owner, event, priority, &block)
|
83
|
-
@hook_priority[block] =
|
83
|
+
@hook_priority[block] = [-priority, @hook_priority.size]
|
84
84
|
@registry[owner][event] << block
|
85
85
|
end
|
86
86
|
|
data/lib/bunto/log_adapter.rb
CHANGED
data/lib/bunto/page.rb
CHANGED
@@ -40,7 +40,11 @@ module Bunto
|
|
40
40
|
@base = base
|
41
41
|
@dir = dir
|
42
42
|
@name = name
|
43
|
-
@path = site.
|
43
|
+
@path = if site.in_theme_dir(base) == base # we're in a theme
|
44
|
+
site.in_theme_dir(base, dir, name)
|
45
|
+
else
|
46
|
+
site.in_source_dir(base, dir, name)
|
47
|
+
end
|
44
48
|
|
45
49
|
process(name)
|
46
50
|
read_yaml(File.join(base, dir), name)
|
@@ -54,7 +58,7 @@ module Bunto
|
|
54
58
|
|
55
59
|
# The generated directory into which the page will be placed
|
56
60
|
# upon generation. This is derived from the permalink or, if
|
57
|
-
# permalink is absent,
|
61
|
+
# permalink is absent, will be '/'
|
58
62
|
#
|
59
63
|
# Returns the String destination directory.
|
60
64
|
def dir
|
@@ -94,7 +98,7 @@ module Bunto
|
|
94
98
|
@url ||= URL.new({
|
95
99
|
:template => template,
|
96
100
|
:placeholders => url_placeholders,
|
97
|
-
:permalink => permalink
|
101
|
+
:permalink => permalink,
|
98
102
|
}).to_s
|
99
103
|
end
|
100
104
|
|
@@ -104,7 +108,7 @@ module Bunto
|
|
104
108
|
{
|
105
109
|
:path => @dir,
|
106
110
|
:basename => basename,
|
107
|
-
:output_ext => output_ext
|
111
|
+
:output_ext => output_ext,
|
108
112
|
}
|
109
113
|
end
|
110
114
|
|
data/lib/bunto/plugin.rb
CHANGED
data/lib/bunto/reader.rb
CHANGED
@@ -18,6 +18,7 @@ module Bunto
|
|
18
18
|
sort_files!
|
19
19
|
@site.data = DataReader.new(site).read(site.config["data_dir"])
|
20
20
|
CollectionReader.new(site).read
|
21
|
+
ThemeAssetsReader.new(site).read
|
21
22
|
end
|
22
23
|
|
23
24
|
# Sorts posts, pages, and static files.
|
@@ -70,7 +71,7 @@ module Bunto
|
|
70
71
|
#
|
71
72
|
# Returns nothing.
|
72
73
|
def retrieve_dirs(_base, dir, dot_dirs)
|
73
|
-
dot_dirs.
|
74
|
+
dot_dirs.each do |file|
|
74
75
|
dir_path = site.in_source_dir(dir, file)
|
75
76
|
rel_path = File.join(dir, file)
|
76
77
|
unless @site.dest.sub(%r!/$!, "") == dir_path
|