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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7403410bc5164f3be23c22494a716fe7af6d6e805fc38ddb12c920bed918dba7
4
- data.tar.gz: ebb064928f3295b914609a9751c11cf663ae54af6671b655def56f5d03dab93e
3
+ metadata.gz: 6d3848687ae065595e19f5b75bb50927318e81df6d6b878541b2ef44138f9d31
4
+ data.tar.gz: 7a48ab3c689dcbb886f2441216750729ec892e40d6dc0a39197fba17eb9c4ab2
5
5
  SHA512:
6
- metadata.gz: 866d33fea5f99757f5a5a01254769ba4a1527341f0f68df03c0daeda38fc642a5177c011d18a902937b72027c2061f92efb0eddea765eae295b520c562188f74
7
- data.tar.gz: 802638fe184d75b2596bfbb378e02fe8de985bfdda46463dcba009937493faef442c65280307a7d3d25fd3ecbc762584846d305f3e7ceb2cf4bf4949cfe5d057
6
+ metadata.gz: '039d5ae09373d249e90fd850e7bd68970ae5ad3c394ed452016e4acaca4df5063d1aab818a09f9a365af9e3277b777257c27d2c4cc365b7d8daafcb33842e8a3'
7
+ data.tar.gz: 6246274ed1209a20819616480c7a1ffde1422b1a68bf5e728a3b637e61ac8675e2bc8fafa8a003cedac455e11ca21e5f22ef9039de96d95f1fc5dcab0f93111b
data/.rubocop.yml CHANGED
@@ -30,7 +30,7 @@ Metrics/BlockLength:
30
30
  Max: 150
31
31
 
32
32
  Metrics/ClassLength:
33
- Max: 150
33
+ Max: 200
34
34
 
35
35
  Metrics/CyclomaticComplexity:
36
36
  Max: 10
data/Gemfile CHANGED
@@ -7,4 +7,4 @@ gemspec
7
7
 
8
8
  gem 'rake', '~> 13.0'
9
9
  gem 'rspec', '~> 3.0'
10
- gem 'rubocop', '~> 1.22', require: false
10
+ gem 'rubocop', '~> 1.23', require: false
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.7'
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
@@ -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
- File.join(@config.root, @config.pages_dir), '%s.liquid'
29
+ pages_dir, '%s.liquid'
34
30
  )
35
- @variables = {}
36
31
  @object_types = {}
37
32
  @page_templates = {}
38
- @dynamic_pages = Set.new
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
- File.join(@config.root, @config.pages_dir), '_%s.liquid'
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 update_pages
61
- do_update_pages(File.join(@config.root, @config.pages_dir))
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
- @dynamic_pages.include? File.basename(file, '.liquid')
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 update_objects
100
- do_update_objects(File.join(@config.root,
101
- @config.objects_dir))
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 do_update_objects(dir)
138
+ def objects_for_template(template_path)
105
139
  objects = {}
106
- @object_types.each do |name, definition|
107
- objects[name] = {}
108
- obj_dir = File.join(dir, name)
109
- if File.directory? obj_dir
110
- Dir.foreach(obj_dir) do |file|
111
- if file.end_with? '.toml'
112
- object = Tomlrb.load_file(File.join(
113
- obj_dir, file
114
- ))
115
- object[:name] =
116
- File.basename(file, '.toml')
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[name] = sort_objects(objects[name])
153
+ objects[type] = sort_objects(objects[type])
125
154
  end
126
- @variables['objects'] = objects
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
- template.render(@variables)
162
- end
163
-
164
- def render_dynamic(page, obj)
165
- template = @dynamic_templates[page]
166
- template.render(@variables.merge({ page => obj }))
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
- @dynamic_pages.each do |page|
182
- out_dir = File.join(@config.build_dir, page)
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
- objects = @variables['objects'][page]
185
- objects.each do |obj|
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(page, obj))
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
- FileUtils.copy_entry File.join(@config.root, asset_dir),
198
- File.join(@config.build_dir, asset_dir)
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
 
@@ -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
- updated_pages = []
17
- updated_objects = []
18
- updated_assets = []
19
- (modified + added + removed).each do |file|
20
- case change_type(file)
21
- when :pages
22
- updated_pages << file
23
- when :objects
24
- updated_objects << file
25
- when :assets
26
- updated_assets << file
27
- end
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
- @server.refresh_client if rebuild?(builder, updated_objects,
30
- updated_pages, updated_assets)
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
- # layout and other assets. For now, this is everything.
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
- return :assets if child?(File.join(@config.root, 'layout'), file)
61
- return :assets if ['manifest.toml',
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, updated_objects, updated_pages, updated_assets)
68
- if updated_pages.empty? && updated_objects.empty? && updated_assets.empty?
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
- builder.update_objects if updated_objects.length
74
- builder.update_pages if updated_pages.length
75
- builder.full_rebuild if updated_assets.length
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Archival
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.8'
5
5
  end
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
- raise "Layout dir #{layout_path} not found" unless File.exist? layout_path
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
- raise "More than one layout named #{layout_name} found." if found_layout
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
- raise "No layouts named #{layout_name} found." if found_layout.nil?
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archival",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "An incredibly simple CMS for durable websites",
5
5
  "bin": "build.rb",
6
6
  "directories": {
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.7
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-14 00:00:00.000000000 Z
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: