archival 0.0.7 → 0.0.8
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 +1 -1
- data/Gemfile +1 -1
- data/archival.gemspec +5 -1
- data/lib/archival/builder.rb +108 -80
- data/lib/archival/listen.rb +42 -24
- data/lib/archival/markdown_renderer.rb +33 -0
- data/lib/archival/parser.rb +33 -0
- data/lib/archival/version.rb +1 -1
- data/lib/archival.rb +10 -0
- data/lib/tags/asset.rb +51 -0
- data/lib/tags/layout.rb +14 -5
- data/package.json +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d3848687ae065595e19f5b75bb50927318e81df6d6b878541b2ef44138f9d31
|
4
|
+
data.tar.gz: 7a48ab3c689dcbb886f2441216750729ec892e40d6dc0a39197fba17eb9c4ab2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '039d5ae09373d249e90fd850e7bd68970ae5ad3c394ed452016e4acaca4df5063d1aab818a09f9a365af9e3277b777257c27d2c4cc365b7d8daafcb33842e8a3'
|
7
|
+
data.tar.gz: 6246274ed1209a20819616480c7a1ffde1422b1a68bf5e728a3b637e61ac8675e2bc8fafa8a003cedac455e11ca21e5f22ef9039de96d95f1fc5dcab0f93111b
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/archival.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'archival'
|
5
|
-
s.version = '0.0.
|
5
|
+
s.version = '0.0.8'
|
6
6
|
s.summary = 'An incredibly simple CMS for durable websites'
|
7
7
|
s.description = 'https://jesseditson.com/the-simplest-cms-part-1'
|
8
8
|
s.authors = ['Jesse Ditson']
|
@@ -26,4 +26,8 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_dependency 'listen', '~> 3.7.0'
|
27
27
|
s.add_dependency 'redcarpet', '~> 3.5.1'
|
28
28
|
s.add_dependency 'tomlrb', '~> 2.0.1'
|
29
|
+
|
30
|
+
s.metadata = {
|
31
|
+
'rubygems_mfa_required' => 'true'
|
32
|
+
}
|
29
33
|
end
|
data/lib/archival/builder.rb
CHANGED
@@ -2,12 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'liquid'
|
4
4
|
require 'tomlrb'
|
5
|
-
require 'tags/layout'
|
6
5
|
require 'redcarpet'
|
7
6
|
|
8
|
-
Liquid::Template.error_mode = :strict
|
9
|
-
Liquid::Template.register_tag('layout', Layout)
|
10
|
-
|
11
7
|
module Archival
|
12
8
|
class DuplicateKeyError < StandardError
|
13
9
|
end
|
@@ -17,38 +13,33 @@ module Archival
|
|
17
13
|
|
18
14
|
def initialize(config, *_args)
|
19
15
|
@config = config
|
20
|
-
@markdown = Redcarpet::Markdown.new(
|
21
|
-
Redcarpet::Render::HTML.new(prettify: true,
|
22
|
-
hard_wrap: true), no_intra_emphasis: true,
|
23
|
-
fenced_code_blocks: true,
|
24
|
-
autolink: true,
|
25
|
-
strikethrough: true,
|
26
|
-
underline: true
|
27
|
-
)
|
28
16
|
refresh_config
|
29
17
|
end
|
30
18
|
|
19
|
+
def pages_dir
|
20
|
+
File.join(@config.root, @config.pages_dir)
|
21
|
+
end
|
22
|
+
|
23
|
+
def objects_dir
|
24
|
+
File.join(@config.root, @config.objects_dir)
|
25
|
+
end
|
26
|
+
|
31
27
|
def refresh_config
|
32
28
|
@file_system = Liquid::LocalFileSystem.new(
|
33
|
-
|
29
|
+
pages_dir, '%s.liquid'
|
34
30
|
)
|
35
|
-
@variables = {}
|
36
31
|
@object_types = {}
|
37
32
|
@page_templates = {}
|
38
|
-
@
|
33
|
+
@dynamic_types = Set.new
|
39
34
|
@dynamic_templates = {}
|
35
|
+
@parser = Archival::Parser.new(pages_dir)
|
40
36
|
|
41
37
|
Liquid::Template.file_system = Liquid::LocalFileSystem.new(
|
42
|
-
|
38
|
+
pages_dir, '_%s.liquid'
|
43
39
|
)
|
44
40
|
|
45
|
-
objects_definition_file = File.join(@config.root,
|
46
|
-
'objects.toml')
|
47
|
-
if File.file? objects_definition_file
|
48
|
-
@object_types = Tomlrb.load_file(objects_definition_file)
|
49
|
-
end
|
41
|
+
@objects_definition_file = File.join(@config.root, 'objects.toml')
|
50
42
|
|
51
|
-
update_objects
|
52
43
|
update_pages
|
53
44
|
end
|
54
45
|
|
@@ -57,12 +48,40 @@ module Archival
|
|
57
48
|
refresh_config
|
58
49
|
end
|
59
50
|
|
60
|
-
def
|
61
|
-
|
51
|
+
def update_objects(_updated_objects = nil)
|
52
|
+
@object_types = {}
|
53
|
+
if File.file? @objects_definition_file
|
54
|
+
@object_types = Tomlrb.load_file(@objects_definition_file)
|
55
|
+
end
|
56
|
+
@dynamic_types = Set.new
|
57
|
+
@object_types.each do |_name, definition|
|
58
|
+
is_template = definition.key? 'template'
|
59
|
+
@dynamic_types << definition['template'] if is_template
|
60
|
+
end
|
61
|
+
# TODO: remove deleted dynamic pages
|
62
|
+
end
|
63
|
+
|
64
|
+
def update_pages(_updated_pages = nil, _updated_objects = nil)
|
65
|
+
update_objects
|
66
|
+
# TODO: remove deleted pages
|
67
|
+
do_update_pages(pages_dir)
|
68
|
+
end
|
69
|
+
|
70
|
+
def update_assets(changes)
|
71
|
+
changes.each do |change|
|
72
|
+
asset_path = File.join(@config.build_dir, change.path)
|
73
|
+
case change.type
|
74
|
+
when :removed
|
75
|
+
FileUtils.rm_rf asset_path
|
76
|
+
else
|
77
|
+
puts change.path
|
78
|
+
FileUtils.copy_entry File.join(@config.root, change.path), asset_path
|
79
|
+
end
|
80
|
+
end
|
62
81
|
end
|
63
82
|
|
64
83
|
def dynamic?(file)
|
65
|
-
@
|
84
|
+
@dynamic_types.include? File.basename(file, '.liquid')
|
66
85
|
end
|
67
86
|
|
68
87
|
def template_for_page(template_file)
|
@@ -96,34 +115,44 @@ module Archival
|
|
96
115
|
end
|
97
116
|
end
|
98
117
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
118
|
+
def read_objects(type)
|
119
|
+
obj_dir = File.join(objects_dir, type)
|
120
|
+
return unless File.directory? obj_dir
|
121
|
+
|
122
|
+
Dir.foreach(obj_dir) do |file|
|
123
|
+
if file.end_with? '.toml'
|
124
|
+
object = Tomlrb.load_file(File.join(
|
125
|
+
obj_dir, file
|
126
|
+
))
|
127
|
+
object[:name] =
|
128
|
+
File.basename(file, '.toml')
|
129
|
+
yield object[:name], object
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def path_for_template(name, type)
|
135
|
+
Pathname.new(File.join(pages_dir, type, "#{name}.html"))
|
102
136
|
end
|
103
137
|
|
104
|
-
def
|
138
|
+
def objects_for_template(template_path)
|
105
139
|
objects = {}
|
106
|
-
@object_types.each do |
|
107
|
-
objects[
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
objects[name][object[:name]] = parse_object(object, definition)
|
118
|
-
if definition.key? 'template'
|
119
|
-
@dynamic_pages << definition['template']
|
120
|
-
end
|
121
|
-
end
|
140
|
+
@object_types.each do |type, definition|
|
141
|
+
objects[type] = {}
|
142
|
+
is_dynamic = @dynamic_types.include? type
|
143
|
+
read_objects type do |name, object|
|
144
|
+
objects[type][name] = @parser.parse_object(
|
145
|
+
object, definition, template_path
|
146
|
+
)
|
147
|
+
if is_dynamic
|
148
|
+
path = path_for_template(name, type)
|
149
|
+
objects[type][name]['path'] =
|
150
|
+
path.relative_path_from(File.dirname(template_path)).to_s
|
122
151
|
end
|
123
152
|
end
|
124
|
-
objects[
|
153
|
+
objects[type] = sort_objects(objects[type])
|
125
154
|
end
|
126
|
-
|
155
|
+
objects
|
127
156
|
end
|
128
157
|
|
129
158
|
def sort_objects(objects)
|
@@ -142,28 +171,28 @@ module Archival
|
|
142
171
|
sorted_objects
|
143
172
|
end
|
144
173
|
|
145
|
-
def parse_object(object, definition)
|
146
|
-
definition.each do |name, type|
|
147
|
-
case type
|
148
|
-
when 'markdown'
|
149
|
-
object[name] = @markdown.render(object[name]) if object[name]
|
150
|
-
end
|
151
|
-
end
|
152
|
-
object
|
153
|
-
end
|
154
|
-
|
155
|
-
def set_var(name, value)
|
156
|
-
@variables[name] = value
|
157
|
-
end
|
158
|
-
|
159
174
|
def render(page)
|
175
|
+
dir = File.join(pages_dir, File.dirname(page))
|
160
176
|
template = @page_templates[page]
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
177
|
+
template_path = File.join(dir, page)
|
178
|
+
parsed_objects = objects_for_template(template_path)
|
179
|
+
template.render('objects' => parsed_objects,
|
180
|
+
'template_path' => template_path)
|
181
|
+
end
|
182
|
+
|
183
|
+
def render_dynamic(type, name)
|
184
|
+
dir = File.join(pages_dir, type)
|
185
|
+
template = @dynamic_templates[type]
|
186
|
+
template_path = File.join(dir, name)
|
187
|
+
parsed_objects = objects_for_template(template_path)
|
188
|
+
obj = parsed_objects[type][name]
|
189
|
+
vars = {}
|
190
|
+
.merge(
|
191
|
+
'objects' => parsed_objects,
|
192
|
+
'template_path' => template_path
|
193
|
+
)
|
194
|
+
.merge({ type => obj })
|
195
|
+
template.render(vars)
|
167
196
|
end
|
168
197
|
|
169
198
|
def write_all
|
@@ -172,30 +201,29 @@ module Archival
|
|
172
201
|
out_dir = File.join(@config.build_dir,
|
173
202
|
File.dirname(template))
|
174
203
|
Dir.mkdir(out_dir) unless File.exist? out_dir
|
175
|
-
out_path = File.join(out_dir,
|
176
|
-
"#{template}.html")
|
204
|
+
out_path = File.join(out_dir, "#{template}.html")
|
177
205
|
File.open(out_path, 'w+') do |file|
|
178
206
|
file.write(render(template))
|
179
207
|
end
|
180
208
|
end
|
181
|
-
@
|
182
|
-
out_dir = File.join(@config.build_dir,
|
209
|
+
@dynamic_types.each do |type|
|
210
|
+
out_dir = File.join(@config.build_dir, type)
|
183
211
|
Dir.mkdir(out_dir) unless File.exist? out_dir
|
184
|
-
|
185
|
-
|
186
|
-
out_path = File.join(out_dir, "#{obj[:name]}.html")
|
187
|
-
obj['path'] = out_path
|
212
|
+
read_objects(type) do |name|
|
213
|
+
out_path = File.join(out_dir, "#{name}.html")
|
188
214
|
File.open(out_path, 'w+') do |file|
|
189
|
-
file.write(render_dynamic(
|
215
|
+
file.write(render_dynamic(type, name))
|
190
216
|
end
|
191
217
|
end
|
192
218
|
end
|
193
|
-
return if @config.dev_mode
|
194
219
|
|
195
|
-
# in production, also copy all assets to the dist folder.
|
220
|
+
# in production (or init), also copy all assets to the dist folder.
|
221
|
+
# in dev, they will be copied as they change.
|
196
222
|
@config.assets_dirs.each do |asset_dir|
|
197
|
-
|
198
|
-
|
223
|
+
asset_path = File.join(@config.build_dir, asset_dir)
|
224
|
+
next if @config.dev_mode || !File.exist?(asset_path)
|
225
|
+
|
226
|
+
FileUtils.copy_entry File.join(@config.root, asset_dir), asset_path
|
199
227
|
end
|
200
228
|
end
|
201
229
|
|
data/lib/archival/listen.rb
CHANGED
@@ -4,6 +4,8 @@ require 'listen'
|
|
4
4
|
require 'pathname'
|
5
5
|
|
6
6
|
module Archival
|
7
|
+
Change = Struct.new(:path, :type)
|
8
|
+
|
7
9
|
def listen(config = {})
|
8
10
|
@config = Config.new(config.merge(dev_mode: true))
|
9
11
|
builder = Builder.new(@config)
|
@@ -13,21 +15,27 @@ module Archival
|
|
13
15
|
ignore = %r{/dist/}
|
14
16
|
listener = Listen.to(@config.root,
|
15
17
|
ignore: ignore) do |modified, added, removed|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
changes = {
|
19
|
+
pages: [],
|
20
|
+
objects: [],
|
21
|
+
assets: [],
|
22
|
+
layout: [],
|
23
|
+
config: []
|
24
|
+
}
|
25
|
+
add_change = lambda { |file, type|
|
26
|
+
c_type = change_type(file)
|
27
|
+
changes[c_type] << change(file, type) unless c_type == :none
|
28
|
+
}
|
29
|
+
added.each do |file|
|
30
|
+
add_change.call(file, :added)
|
31
|
+
end
|
32
|
+
modified.each do |file|
|
33
|
+
add_change.call(file, :modified)
|
28
34
|
end
|
29
|
-
|
30
|
-
|
35
|
+
removed.each do |file|
|
36
|
+
add_change.call(file, :removed)
|
37
|
+
end
|
38
|
+
@server.refresh_client if rebuild?(builder, changes)
|
31
39
|
end
|
32
40
|
listener.start
|
33
41
|
serve_helpers
|
@@ -45,6 +53,13 @@ module Archival
|
|
45
53
|
false
|
46
54
|
end
|
47
55
|
|
56
|
+
def change(file, type)
|
57
|
+
c = Change.new
|
58
|
+
c.path = Pathname.new(file).relative_path_from(@config.root)
|
59
|
+
c.type = type
|
60
|
+
c
|
61
|
+
end
|
62
|
+
|
48
63
|
def change_type(file)
|
49
64
|
# a page was modified, rebuild the pages.
|
50
65
|
return :pages if child?(File.join(@config.root, @config.pages_dir),
|
@@ -53,26 +68,29 @@ module Archival
|
|
53
68
|
return :objects if child?(File.join(@config.root, @config.objects_dir),
|
54
69
|
file)
|
55
70
|
|
56
|
-
#
|
71
|
+
# an asset was changed, which just means to copy or delete it
|
57
72
|
@config.assets_dirs.each do |dir|
|
58
73
|
return :assets if child?(File.join(@config.root, dir), file)
|
59
74
|
end
|
60
|
-
|
61
|
-
return :
|
75
|
+
# other special files
|
76
|
+
return :layout if child?(File.join(@config.root, 'layout'), file)
|
77
|
+
return :config if ['manifest.toml',
|
62
78
|
'objects.toml'].include? File.basename(file)
|
63
79
|
|
64
80
|
:none
|
65
81
|
end
|
66
82
|
|
67
|
-
def rebuild?(builder,
|
68
|
-
|
69
|
-
return false
|
70
|
-
end
|
83
|
+
def rebuild?(builder, changes)
|
84
|
+
return false if changes.values.all?(&:empty?)
|
71
85
|
|
72
86
|
Logger.benchmark('rebuilt') do
|
73
|
-
|
74
|
-
|
75
|
-
|
87
|
+
if changes[:pages].length || changes[:objects].length
|
88
|
+
builder.update_pages(changes[:pages], changes[:objects])
|
89
|
+
end
|
90
|
+
builder.update_assets(changes[:assets]) if changes[:assets].length
|
91
|
+
if changes[:assets].length || changes[:layouts] || changes[:config]
|
92
|
+
builder.full_rebuild
|
93
|
+
end
|
76
94
|
builder.write_all
|
77
95
|
end
|
78
96
|
true
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'redcarpet'
|
4
|
+
|
5
|
+
module Archival
|
6
|
+
class MarkdownRenderer < Redcarpet::Render::HTML
|
7
|
+
def autolink(link, _link_type, _opts)
|
8
|
+
# TODO: handle link_type?
|
9
|
+
"<a href=\"#{rewrite_link(link)}\">#{rewrite_link(link)}</a>"
|
10
|
+
end
|
11
|
+
|
12
|
+
def link(link, title, content)
|
13
|
+
"<a href=\"#{rewrite_link(link)}\" title=\"#{title}\">#{content}</a>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def image(link, title, alt_text)
|
17
|
+
"<img src=\"#{rewrite_link(link)}\" \
|
18
|
+
title=\"#{title}\" alt=\"#{alt_text}\"/>"
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def rewrite_link(link)
|
24
|
+
if link.start_with?('http') || link.start_with?('mailto') ||
|
25
|
+
link.start_with?('www') || link.start_with?('/')
|
26
|
+
link
|
27
|
+
end
|
28
|
+
template_dir = File.dirname(@options[:template_file])
|
29
|
+
resolved_link = Pathname.new(File.join(@options[:pages_root], link))
|
30
|
+
resolved_link.relative_path_from(template_dir)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'liquid'
|
4
|
+
require 'redcarpet'
|
5
|
+
|
6
|
+
module Archival
|
7
|
+
class Parser
|
8
|
+
def initialize(pages_root)
|
9
|
+
@pages_root = pages_root
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_object(object, definition, template_file)
|
13
|
+
markdown = Redcarpet::Markdown.new(
|
14
|
+
Archival::MarkdownRenderer.new(prettify: true,
|
15
|
+
hard_wrap: true),
|
16
|
+
no_intra_emphasis: true,
|
17
|
+
fenced_code_blocks: true,
|
18
|
+
autolink: true,
|
19
|
+
strikethrough: true,
|
20
|
+
underline: true,
|
21
|
+
template_file: template_file,
|
22
|
+
pages_root: @pages_root
|
23
|
+
)
|
24
|
+
definition.each do |name, type|
|
25
|
+
case type
|
26
|
+
when 'markdown'
|
27
|
+
object[name] = markdown.render(object[name]) if object.key? name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
object
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/archival/version.rb
CHANGED
data/lib/archival.rb
CHANGED
@@ -1,13 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'liquid'
|
4
|
+
require 'tags/layout'
|
5
|
+
require 'tags/asset'
|
6
|
+
|
3
7
|
module Archival
|
4
8
|
# Main Archival module. See https://archival.dev for docs.
|
5
9
|
end
|
6
10
|
|
11
|
+
Liquid::Template.error_mode = :strict
|
12
|
+
Liquid::Template.register_tag('layout', Layout)
|
13
|
+
Liquid::Template.register_tag('asset', Asset)
|
14
|
+
|
7
15
|
require 'archival/version'
|
8
16
|
require 'archival/template_array'
|
9
17
|
require 'archival/logger'
|
10
18
|
require 'archival/config'
|
19
|
+
require 'archival/markdown_renderer'
|
11
20
|
require 'archival/helper_server'
|
21
|
+
require 'archival/parser'
|
12
22
|
require 'archival/builder'
|
13
23
|
require 'archival/listen'
|
data/lib/tags/asset.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'liquid'
|
4
|
+
|
5
|
+
class Asset < Liquid::Tag
|
6
|
+
# Adds an `asset` tag to liquid. Usage:
|
7
|
+
#
|
8
|
+
# {% asset "path/to/asset.png" %}
|
9
|
+
#
|
10
|
+
# This will replace the tag with a relative path to the asset from the
|
11
|
+
# current template. Using normal tags will work from the root, but when
|
12
|
+
# building dynamic pages or reusing layouts, asset paths are dynamic and
|
13
|
+
# will need to be rewritten.
|
14
|
+
|
15
|
+
prepend Liquid::Tag::Disableable
|
16
|
+
|
17
|
+
SYNTAX = /(#{Liquid::QuotedFragment}+)/o.freeze
|
18
|
+
|
19
|
+
def initialize(tag_name, markup, tokens)
|
20
|
+
super
|
21
|
+
raise AssetError, 'Invalid layout syntax' unless markup =~ SYNTAX
|
22
|
+
|
23
|
+
@path = parse_expression(Regexp.last_match(1))
|
24
|
+
# This is defaulted to the pages dir, because it represents the structure
|
25
|
+
# of our website. Asset directories are copied as siblings at runtime.
|
26
|
+
@@root_dir ||= File.join(Dir.pwd, 'pages')
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.root_dir=(dir)
|
30
|
+
@@root_dir = dir
|
31
|
+
end
|
32
|
+
|
33
|
+
def render_to_output_buffer(context, output)
|
34
|
+
unless @@root_dir
|
35
|
+
raise AssetError,
|
36
|
+
'root_dir must be set on Archival::Asset'
|
37
|
+
end
|
38
|
+
|
39
|
+
unless context.key? 'template_path'
|
40
|
+
raise AssetError,
|
41
|
+
'template_path must be provided to parse when using assets'
|
42
|
+
end
|
43
|
+
template_path = File.dirname(context['template_path'])
|
44
|
+
abs_asset_path = Pathname.new(File.join(@@root_dir, @path))
|
45
|
+
output << abs_asset_path.relative_path_from(template_path).to_s
|
46
|
+
output
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class AssetError < Liquid::Error
|
51
|
+
end
|
data/lib/tags/layout.rb
CHANGED
@@ -25,7 +25,7 @@ class Layout < Liquid::Tag
|
|
25
25
|
super
|
26
26
|
|
27
27
|
@page_content = []
|
28
|
-
raise 'Invalid layout syntax' unless markup =~ SYNTAX
|
28
|
+
raise LayoutError, 'Invalid layout syntax' unless markup =~ SYNTAX
|
29
29
|
|
30
30
|
layout_name = Regexp.last_match(1)
|
31
31
|
@layout_name_expr = parse_expression(layout_name)
|
@@ -40,7 +40,9 @@ class Layout < Liquid::Tag
|
|
40
40
|
base_path = Dir.pwd
|
41
41
|
layout_dir = 'layout'
|
42
42
|
layout_path = File.join(base_path, layout_dir)
|
43
|
-
|
43
|
+
unless File.exist? layout_path
|
44
|
+
raise LayoutError, "Layout dir #{layout_path} not found"
|
45
|
+
end
|
44
46
|
|
45
47
|
layout_path
|
46
48
|
end
|
@@ -55,11 +57,15 @@ class Layout < Liquid::Tag
|
|
55
57
|
)
|
56
58
|
|
57
59
|
next unless File.basename(f, '.*') == layout_name
|
58
|
-
|
60
|
+
if found_layout
|
61
|
+
raise LayoutError, "More than one layout named #{layout_name} found."
|
62
|
+
end
|
59
63
|
|
60
64
|
found_layout = File.join(layout_path, f)
|
61
65
|
end
|
62
|
-
|
66
|
+
if found_layout.nil?
|
67
|
+
raise LayoutError, "No layouts named #{layout_name} found."
|
68
|
+
end
|
63
69
|
|
64
70
|
layout = File.read(found_layout)
|
65
71
|
@@layout_cache[layout_name] =
|
@@ -77,7 +83,7 @@ class Layout < Liquid::Tag
|
|
77
83
|
|
78
84
|
def render_to_output_buffer(context, output)
|
79
85
|
layout_name = context.evaluate(@layout_name_expr)
|
80
|
-
raise 'Bad layout name argument' unless layout_name
|
86
|
+
raise LayoutError, 'Bad layout name argument' unless layout_name
|
81
87
|
|
82
88
|
layout = load_layout(layout_name)
|
83
89
|
|
@@ -104,3 +110,6 @@ class Layout < Liquid::Tag
|
|
104
110
|
output
|
105
111
|
end
|
106
112
|
end
|
113
|
+
|
114
|
+
class LayoutError < Liquid::Error
|
115
|
+
end
|
data/package.json
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: archival
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Ditson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -104,15 +104,19 @@ files:
|
|
104
104
|
- lib/archival/helper_server.rb
|
105
105
|
- lib/archival/listen.rb
|
106
106
|
- lib/archival/logger.rb
|
107
|
+
- lib/archival/markdown_renderer.rb
|
108
|
+
- lib/archival/parser.rb
|
107
109
|
- lib/archival/rake_tasks.rb
|
108
110
|
- lib/archival/template_array.rb
|
109
111
|
- lib/archival/version.rb
|
112
|
+
- lib/tags/asset.rb
|
110
113
|
- lib/tags/layout.rb
|
111
114
|
- package.json
|
112
115
|
homepage: https://archival.dev
|
113
116
|
licenses:
|
114
117
|
- Unlicense
|
115
|
-
metadata:
|
118
|
+
metadata:
|
119
|
+
rubygems_mfa_required: 'true'
|
116
120
|
post_install_message:
|
117
121
|
rdoc_options: []
|
118
122
|
require_paths:
|