dimples 9.0.0 → 10.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca018b45bc347dc68c099d77fe18cba848f878c9c79dd4cd094b7a84db01cb37
4
- data.tar.gz: 10e92c94c701b63a2d2d1c4c66087605b29b82f37d6f6bf99f5a5cf8f0b7ccf5
3
+ metadata.gz: fcf53e67d092ae60028fef082c0741343badb88483bc2d1c6b19fea30d0a5aca
4
+ data.tar.gz: bb884858e735d7e1c23c91a17c7f99ab8f4cddffa6b871530b85194147ac7fd4
5
5
  SHA512:
6
- metadata.gz: 29f96b52b84bcbc10cf7d46779573d87fb7ea6918d4767c0686e1eb98e079cfee9bae15859b793421375eb898e36eaadbc081814a82c87c9f948c1e5b0ab6cb8
7
- data.tar.gz: 730b91d62a8b121b0a43ba5d3e1183600381335195dc49934414dc06f3df75ffe1be458e960cc9e756259160f6a39dc34b3ca34a62e84983365769c4b1e0ed6e
6
+ metadata.gz: 8735afa42f1a1c921764bcc5a80babfa3620662c55beddd13f8825e19807bec00c5e1de835ff121221423b1c9dd04615456078461ba1be1ac28c85545b42af09
7
+ data.tar.gz: a0ee67d073361ad66fbfa49f545b39b9753571d053b3d4cbab1fbbb54a0799a46cb53569c03dd6c3bbcc506b501ba758a40554fcc4a1fecf4a1118c709a225f5
data/bin/dimples CHANGED
@@ -1,27 +1,26 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.unshift(File.join(__dir__, "..", "lib"))
4
+ $LOAD_PATH.unshift(File.join(__dir__, '..', 'lib'))
5
5
 
6
- require "dimples"
7
-
8
- source_path = ARGV[0]
9
- output_path = ARGV[1]
10
-
11
- config_path = File.join(Dir.pwd, "config.yml")
6
+ require 'dimples'
7
+ require 'yaml'
12
8
 
9
+ config_path = File.join(Dir.pwd, 'config.yml')
13
10
  config = {}
14
11
 
15
12
  if File.exist?(config_path)
16
- begin
17
- config = YAML.safe_load(File.read(config_path), symbolize_names: true)
13
+ config = begin
14
+ YAML.safe_load_file(config_path, symbolize_names: true)
18
15
  rescue YAML::Error
19
- puts "Error reading config file - reverting to defaults"
16
+ puts 'Failed to parse config - using defaults'
17
+ ensure
18
+ {}
20
19
  end
21
20
  end
22
21
 
23
22
  begin
24
- Dimples::Site.generate(source_path, output_path, config)
25
- rescue Dimples::Error => error
26
- puts "Error: #{error.message}"
23
+ Dimples::Site.generate(config)
24
+ rescue StandardError => e
25
+ puts "Error generating site: #{e}"
27
26
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ # Configuration settings for a site.
5
+ class Config
6
+ def self.defaults
7
+ {
8
+ sources: { root: '.', posts: './posts', pages: './pages', layouts: './layouts', static: './static' },
9
+ output: { root: './site', posts: './site/posts', categories: './site/categories' }
10
+ }
11
+ end
12
+
13
+ def initialize(options = {})
14
+ @options = Config.defaults
15
+
16
+ options&.each do |key, value|
17
+ @options[key]&.merge!(value)
18
+ end
19
+
20
+ %i[sources output].each do |type|
21
+ @options[type].each { |key, value| @options[type][key] = File.expand_path(value) }
22
+ end
23
+ end
24
+
25
+ def dig(*args)
26
+ @options.dig(*args)
27
+ end
28
+
29
+ def [](key)
30
+ @options[key]
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ # A class representing metadata passed into a template for rendering.
5
+ class Metadata
6
+ attr_reader :keys
7
+
8
+ def initialize(source)
9
+ source.each do |key, value|
10
+ self.class.send(:attr_reader, key)
11
+ instance_variable_set("@#{key}", build(value))
12
+ end
13
+
14
+ @keys = source.keys
15
+ end
16
+
17
+ def build(item)
18
+ case item
19
+ when Array
20
+ item.map { |i| build(i) }
21
+ when Hash
22
+ item.empty? ? item : Metadata.new(item)
23
+ else
24
+ item
25
+ end
26
+ end
27
+
28
+ def method_missing(_method_name, *_args)
29
+ nil
30
+ end
31
+
32
+ def respond_to_missing?(_method_name, _include_private)
33
+ true
34
+ end
35
+ end
36
+ end
data/lib/dimples/pager.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dimples
4
+ # A class for paginating a collection of posts.
4
5
  class Pager
5
6
  PER_PAGE = 5
6
7
 
@@ -8,18 +9,31 @@ module Dimples
8
9
 
9
10
  attr_reader :current_page, :previous_page, :next_page, :page_count
10
11
 
11
- def initialize(url, posts, options = {})
12
+ def self.paginate(site, url, posts, metadata = {})
13
+ new(site, url, posts).paginate(metadata)
14
+ end
15
+
16
+ def initialize(site, url, posts)
17
+ @site = site
12
18
  @url = url
13
19
  @posts = posts
14
- @per_page = options.fetch(:per_page, PER_PAGE)
15
- @page_prefix = options.fetch(:page_prefix, "page_")
20
+
21
+ @per_page = @site.config.dig(:pagination, :per_page) || PER_PAGE
22
+ @page_prefix = @site.config.dig(:pagination, :page_prefix) || 'page_'
16
23
  @page_count = (posts.length.to_f / @per_page.to_i).ceil
17
24
 
18
25
  step_to(1)
19
26
  end
20
27
 
21
- def each(&block)
22
- (1..@page_count).each { |index| block.yield step_to(index) }
28
+ def paginate(metadata)
29
+ (1..@page_count).each do |index|
30
+ step_to(index)
31
+
32
+ @site.layouts['posts']&.write(
33
+ File.join(@site.config[:output][:root], current_page_url, 'index.html'),
34
+ metadata.merge(pagination: self.metadata, url: current_page_url)
35
+ )
36
+ end
23
37
  end
24
38
 
25
39
  def step_to(page)
@@ -43,7 +57,7 @@ module Dimples
43
57
  end
44
58
 
45
59
  def current_page_url
46
- (@current_page != 1) ? "#{@url}#{@page_prefix}#{@current_page}" : @url
60
+ @current_page == 1 ? @url : "#{@url}#{@page_prefix}#{@current_page}"
47
61
  end
48
62
 
49
63
  def first_page_url
@@ -51,20 +65,30 @@ module Dimples
51
65
  end
52
66
 
53
67
  def last_page_url
54
- (@page_count != 1) ? "#{@url}#{@page_prefix}#{@page_count}" : @url
68
+ @page_count == 1 ? @url : "#{@url}#{@page_prefix}#{@page_count}"
55
69
  end
56
70
 
57
71
  def previous_page_url
58
72
  return unless @previous_page
59
73
 
60
- (@previous_page != 1) ? "#{@url}#{@page_prefix}#{@previous_page}" : @url
74
+ @previous_page == 1 ? @url : "#{@url}#{@page_prefix}#{@previous_page}"
61
75
  end
62
76
 
63
77
  def next_page_url
64
78
  "#{@url}#{@page_prefix}#{@next_page}" if @next_page
65
79
  end
66
80
 
67
- def to_context
81
+ def urls
82
+ {
83
+ current_page: current_page_url,
84
+ first_page: first_page_url,
85
+ last_page: last_page_url,
86
+ previous_page: previous_page_url,
87
+ next_page: next_page_url
88
+ }
89
+ end
90
+
91
+ def metadata
68
92
  {
69
93
  posts: posts_at(current_page),
70
94
  current_page: @current_page,
@@ -72,13 +96,7 @@ module Dimples
72
96
  post_count: @posts.count,
73
97
  previous_page: @previous_page,
74
98
  next_page: @next_page,
75
- urls: {
76
- current_page: current_page_url,
77
- first_page: first_page_url,
78
- last_page: last_page_url,
79
- previous_page: previous_page_url,
80
- next_page: next_page_url
81
- }
99
+ urls: urls
82
100
  }
83
101
  end
84
102
  end
data/lib/dimples/site.rb CHANGED
@@ -1,173 +1,105 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "pager"
4
-
5
- require "fileutils"
6
- require "tilt"
7
- require "date"
3
+ require 'fileutils'
4
+ require 'tilt'
5
+ require 'date'
6
+ require 'yaml'
8
7
 
9
8
  module Dimples
9
+ # A class representing a single generated website.
10
10
  class Site
11
- DEFAULT_CONFIG = { generation: { overwrite_directory: false }, paths: { posts: "posts" } }
11
+ attr_accessor :config
12
12
 
13
- def self.generate(source_path, output_path, config)
14
- new(source_path, output_path, config).generate
13
+ def self.generate(config = {})
14
+ new(config).generate
15
15
  end
16
16
 
17
- attr_accessor :posts, :pages, :categories, :config
18
-
19
- def initialize(source_path, output_path, config)
20
- @paths = {
21
- source: File.expand_path(source_path || Dir.pwd),
22
- destination: File.expand_path(output_path || File.join(Dir.pwd, "site"))
23
- }
24
-
25
- @config = DEFAULT_CONFIG
26
- @config.merge!(config) if config&.is_a?(Hash)
27
-
28
- %w[pages posts static templates].each do |type|
29
- @paths[type.to_sym] = File.join(@paths[:source], type)
30
- end
31
-
32
- scan_posts
33
- scan_pages
34
- scan_templates
17
+ def initialize(config = {})
18
+ @config = Config.new(config)
35
19
  end
36
20
 
37
21
  def generate
38
- if Dir.exist?(@paths[:destination])
39
- unless @config.dig(:generation, :overwrite_directory)
40
- raise GenerationError.new("The site directory (#{@paths[:destination]}) already exists.")
41
- end
42
-
43
- FileUtils.rm_rf(@paths[:destination])
44
- end
45
-
46
- Dir.mkdir(@paths[:destination])
22
+ prepare_output_directory
47
23
 
48
24
  generate_posts
49
- generate_pages
50
25
  generate_categories
26
+ generate_pages
51
27
 
52
28
  copy_assets
53
29
  end
54
30
 
55
- private
56
-
57
- def read_files(path)
58
- Dir[File.join(path, "**", "*.*")].sort
31
+ def posts
32
+ @posts ||= Dir.glob(File.join(@config[:sources][:posts], '**', '*.markdown')).map do |path|
33
+ Dimples::Sources::Post.new(self, path)
34
+ end.sort_by!(&:date).reverse!
59
35
  end
60
36
 
61
- def scan_posts
62
- @posts = read_files(@paths[:posts]).map { |path| Dimples::Post.new(path) }
63
- @posts.sort_by!(&:date).reverse!
64
-
65
- @categories = {}
66
-
67
- @posts.each do |post|
68
- post.categories&.each do |category|
69
- @categories[category] ||= []
70
- @categories[category] << post
71
- end
37
+ def pages
38
+ @pages ||= Dir.glob(File.join(@config[:sources][:pages], '**', '*.erb')).map do |path|
39
+ Dimples::Sources::Page.new(self, path)
72
40
  end
73
41
  end
74
42
 
75
- def scan_pages
76
- @pages = read_files(@paths[:pages]).map { |path| Dimples::Page.new(path) }
43
+ def layouts
44
+ @layouts ||= Dir.glob(File.join(@config[:sources][:layouts], '**', '*.erb')).to_h do |path|
45
+ [File.basename(path, '.erb'), Dimples::Sources::Layout.new(self, path)]
46
+ end
77
47
  end
78
48
 
79
- def scan_templates
80
- @templates =
81
- {}.tap do |templates|
82
- read_files(@paths[:templates]).each do |path|
83
- key = File.basename(path, ".erb")
84
- templates[key] = Dimples::Template.new(path)
49
+ def categories
50
+ @categories ||= {}.tap do |categories|
51
+ posts.each do |post|
52
+ post.categories.each do |category|
53
+ categories[category] ||= []
54
+ categories[category].append(post)
85
55
  end
86
56
  end
87
- end
88
-
89
- def write_file(path, content)
90
- directory_path = File.dirname(path)
91
-
92
- Dir.mkdir(directory_path) unless Dir.exist?(directory_path)
93
- File.write(path, content)
94
- end
95
-
96
- def generate_paginated_posts(posts, path, context = {})
97
- pager = Dimples::Pager.new("#{path.sub(@paths[:destination], "")}/", posts)
98
-
99
- pager.each do |index|
100
- page = Dimples::Page.new(nil, layout: "posts")
101
-
102
- page_path =
103
- if index == 1
104
- path
105
- else
106
- File.join(path, "page_#{index}")
107
- end
108
-
109
- write_file(
110
- File.join(page_path, page.filename),
111
- render(page, context.merge!(pagination: pager.to_context))
112
- )
113
57
  end
114
58
  end
115
59
 
116
- def generate_posts
117
- directory_path = File.join(@paths[:destination], @config.dig(:paths, :posts))
118
- Dir.mkdir(directory_path)
119
-
120
- @posts.each do |post|
121
- path = File.join(directory_path, post.slug, post.filename)
122
- write_file(path, render(post, post: post))
123
- end
124
-
125
- generate_paginated_posts(@posts, directory_path)
126
- generate_feed(@posts.slice(0, 10), @paths[:destination])
60
+ def metadata
61
+ @metadata ||= Metadata.new(posts: posts, categories: categories)
127
62
  end
128
63
 
129
- def generate_pages
130
- @pages.each do |page|
131
- path =
132
- if page.path
133
- File.dirname(page.path).sub(@paths[:pages], @paths[:destination])
134
- else
135
- @paths[:destination]
136
- end
64
+ private
137
65
 
138
- write_file(File.join(path, page.filename), render(page, page: page))
139
- end
66
+ def generate_posts
67
+ posts.each(&:write)
68
+ Pager.paginate(self, @config[:output][:posts].gsub(@config[:output][:root], '').concat('/'), posts)
69
+ generate_feed(@config[:output][:root], posts)
140
70
  end
141
71
 
142
72
  def generate_categories
143
- @categories.each do |category, posts|
144
- category_path = File.join(@paths[:destination], "categories", category)
145
-
146
- generate_paginated_posts(posts, category_path, category: category)
147
- generate_feed(posts.slice(0, 10), category_path)
73
+ categories.each do |category, posts|
74
+ metadata = { title: category.capitalize, category: category }
75
+ Pager.paginate(self, "/categories/#{category}/", posts, metadata)
76
+ generate_feed(File.join(@config[:output][:root], 'categories', category), posts)
148
77
  end
149
78
  end
150
79
 
151
- def generate_feed(posts, path)
152
- page = Dimples::Page.new(nil, layout: "feed")
153
- write_file(File.join(path, "feed.atom"), render(page, posts: posts))
80
+ def generate_pages
81
+ pages.each(&:write)
154
82
  end
155
83
 
156
- def copy_assets
157
- return unless Dir.exist?(@paths[:static])
84
+ def generate_feed(output_path, posts)
85
+ return if layouts['feed'].nil?
158
86
 
159
- FileUtils.cp_r(File.join(@paths[:static], "."), @paths[:destination])
87
+ layouts['feed'].write(
88
+ File.join(output_path, 'feed.atom'),
89
+ posts: posts.slice(0, 10)
90
+ )
160
91
  end
161
92
 
162
- def render(object, context = {}, content = nil)
163
- context[:site] ||= self
93
+ def prepare_output_directory
94
+ raise "The site directory (#{@config[:output][:root]}) already exists." if Dir.exist?(@config[:output][:root])
164
95
 
165
- output = object.render(context, content)
96
+ Dir.mkdir(@config[:output][:root])
97
+ end
166
98
 
167
- output = render(@templates[object.layout], context, output) if object.layout &&
168
- @templates[object.layout]
99
+ def copy_assets
100
+ return unless Dir.exist?(@config[:sources][:static])
169
101
 
170
- output
102
+ FileUtils.cp_r(File.join(@config[:sources][:static], '.'), @config[:output][:root])
171
103
  end
172
104
  end
173
105
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ module Sources
5
+ # A base class representing a source file with frontmatter metadata that can be rendered.
6
+ class Base
7
+ FRONT_MATTER_PATTERN = /^(-{3}\n.*?\n?)^(-{3}*$\n?)/m
8
+
9
+ attr_accessor :path, :metadata, :contents
10
+
11
+ def initialize(site, path)
12
+ @site = site
13
+ @path = File.expand_path(path)
14
+
15
+ @metadata = default_metadata
16
+ @contents = File.read(@path)
17
+
18
+ parse_metadata(@contents)
19
+ end
20
+
21
+ def parse_metadata(contents)
22
+ matches = contents.match(FRONT_MATTER_PATTERN)
23
+ return unless matches
24
+
25
+ @metadata.merge!(YAML.safe_load(matches[1], symbolize_names: true, permitted_classes: [Date]))
26
+ @contents = matches.post_match.strip
27
+
28
+ @metadata.each_key do |key|
29
+ self.class.send(:define_method, key.to_sym) { @metadata[key] }
30
+ end
31
+ end
32
+
33
+ def write(output_path = nil, metadata = {})
34
+ output = render(metadata)
35
+
36
+ output_path = File.join(output_directory, filename) if output_path.nil?
37
+ output_dir = File.dirname(output_path)
38
+
39
+ FileUtils.mkdir_p(output_dir) unless File.directory?(output_dir)
40
+ File.write(output_path, output)
41
+ end
42
+
43
+ def render(render_metadata = {}, body = nil)
44
+ render_metadata[:site] ||= @site.metadata
45
+ render_metadata[:page] ||= metadata
46
+
47
+ output = template.render(Metadata.new(render_metadata)) { body }
48
+ return output unless @metadata[:layout] && @site.layouts[@metadata[:layout]]
49
+
50
+ @site.layouts[@metadata[:layout]].render(render_metadata, output)
51
+ end
52
+
53
+ def output_directory
54
+ @site.config[:output][:root]
55
+ end
56
+
57
+ def url
58
+ @metadata[:url] || output_directory.gsub(@site.config[:output][:root], '')
59
+ end
60
+
61
+ def template
62
+ raise NotImplementedError, 'You must set a Tilt template for this class.'
63
+ end
64
+
65
+ private
66
+
67
+ def default_metadata
68
+ {
69
+ layout: nil,
70
+ filename: 'index.html'
71
+ }
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ module Sources
5
+ # A class for a single layout used on a site.
6
+ class Layout < Base
7
+ def template
8
+ @template ||= Tilt::ERBTemplate.new { @contents }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ module Sources
5
+ # A single page on a site.
6
+ class Page < Base
7
+ def output_directory
8
+ @output_directory ||= File.dirname(@path).gsub(
9
+ @site.config[:sources][:pages],
10
+ @site.config[:output][:root]
11
+ ).concat('/')
12
+ end
13
+
14
+ def url
15
+ @metadata[:url] || super.tap do |url|
16
+ url.concat(filename) unless filename == 'index.html'
17
+ end
18
+ end
19
+
20
+ def template
21
+ @template ||= Tilt::ERBTemplate.new { @contents }
22
+ end
23
+
24
+ private
25
+
26
+ def default_metadata
27
+ super.merge!(layout: 'page')
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dimples
4
+ module Sources
5
+ # A page from a site with a date.
6
+ class Post < Base
7
+ def output_directory
8
+ @output_directory ||= File.dirname(@path).gsub(
9
+ @site.config[:sources][:posts],
10
+ @site.config[:output][:posts]
11
+ ).concat("/#{@metadata[:slug]}/")
12
+ end
13
+
14
+ def template
15
+ @template ||= Tilt::RedcarpetTemplate.new { @contents }
16
+ end
17
+
18
+ private
19
+
20
+ def default_metadata
21
+ super.tap do |defaults|
22
+ defaults[:layout] = 'post'
23
+ defaults[:slug] = File.basename(@path, '.markdown')
24
+ defaults[:date] = File.birthtime(@path)
25
+ defaults[:categories] = []
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dimples
4
- VERSION = "9.0.0"
4
+ VERSION = '10.1.0'
5
5
  end
data/lib/dimples.rb CHANGED
@@ -2,8 +2,12 @@
2
2
 
3
3
  $LOAD_PATH.unshift(__dir__)
4
4
 
5
- require "dimples/errors"
6
- require "dimples/page"
7
- require "dimples/post"
8
- require "dimples/template"
9
- require "dimples/site"
5
+ require 'dimples/config'
6
+ require 'dimples/metadata'
7
+ require 'dimples/pager'
8
+ require 'dimples/site'
9
+
10
+ require 'dimples/sources/base'
11
+ require 'dimples/sources/page'
12
+ require 'dimples/sources/post'
13
+ require 'dimples/sources/layout'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dimples
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.0.0
4
+ version: 10.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bogan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-27 00:00:00.000000000 Z
11
+ date: 2024-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubi
@@ -16,98 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.10'
19
+ version: '1.12'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.10'
26
+ version: '1.12'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: redcarpet
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.5'
33
+ version: '3.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.5'
40
+ version: '3.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: tilt
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: '2.3'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '13.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '13.0'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.12'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.12'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop-rspec
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '2.22'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '2.22'
97
- - !ruby/object:Gem::Dependency
98
- name: standard
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.28'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.28'
54
+ version: '2.3'
111
55
  description: A simple tool for building static websites.
112
56
  email:
113
57
  - d+dimples@waferbaby.com
@@ -118,20 +62,21 @@ extra_rdoc_files: []
118
62
  files:
119
63
  - bin/dimples
120
64
  - lib/dimples.rb
121
- - lib/dimples/document.rb
122
- - lib/dimples/errors.rb
123
- - lib/dimples/frontmatter.rb
124
- - lib/dimples/page.rb
65
+ - lib/dimples/config.rb
66
+ - lib/dimples/metadata.rb
125
67
  - lib/dimples/pager.rb
126
- - lib/dimples/post.rb
127
68
  - lib/dimples/site.rb
128
- - lib/dimples/template.rb
69
+ - lib/dimples/sources/base.rb
70
+ - lib/dimples/sources/layout.rb
71
+ - lib/dimples/sources/page.rb
72
+ - lib/dimples/sources/post.rb
129
73
  - lib/dimples/version.rb
130
74
  homepage: http://github.com/waferbaby/dimples
131
75
  licenses:
132
76
  - MIT
133
- metadata: {}
134
- post_install_message:
77
+ metadata:
78
+ rubygems_mfa_required: 'true'
79
+ post_install_message:
135
80
  rdoc_options: []
136
81
  require_paths:
137
82
  - lib
@@ -139,15 +84,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
84
  requirements:
140
85
  - - ">"
141
86
  - !ruby/object:Gem::Version
142
- version: '2.7'
87
+ version: '3.0'
143
88
  required_rubygems_version: !ruby/object:Gem::Requirement
144
89
  requirements:
145
90
  - - ">="
146
91
  - !ruby/object:Gem::Version
147
92
  version: '0'
148
93
  requirements: []
149
- rubygems_version: 3.3.7
150
- signing_key:
94
+ rubygems_version: 3.4.10
95
+ signing_key:
151
96
  specification_version: 4
152
97
  summary: A basic static site generator
153
98
  test_files: []
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "frontmatter"
4
-
5
- module Dimples
6
- class Document
7
- attr_accessor :metadata, :contents, :path, :rendered_contents
8
-
9
- def initialize(path = nil, metadata = {})
10
- @path = path
11
-
12
- if @path
13
- @metadata, @contents = Dimples::FrontMatter.parse(File.read(path))
14
- else
15
- @metadata = {}
16
- @contents = ""
17
- end
18
-
19
- @metadata.merge!(metadata)
20
- end
21
-
22
- def filename
23
- "#{basename}.#{extension}"
24
- end
25
-
26
- def basename
27
- @metadata.fetch(:filename, "index")
28
- end
29
-
30
- def extension
31
- @metadata.fetch(:extension, "html")
32
- end
33
-
34
- def layout
35
- @metadata.fetch(:layout, nil)
36
- end
37
-
38
- def render(context = {}, content = "")
39
- context_obj = Object.new
40
- context.each do |key, value|
41
- context_obj.instance_variable_set("@#{key}", value)
42
- end
43
-
44
- @rendered_contents = renderer.render(context_obj) { content }
45
- end
46
-
47
- private
48
-
49
- def renderer
50
- @renderer ||= begin
51
- callback = proc { contents }
52
-
53
- if @path
54
- Tilt.new(@path, {}, &callback)
55
- else
56
- Tilt::StringTemplate.new(&callback)
57
- end
58
- end
59
- end
60
-
61
- def method_missing(method_name, *_args)
62
- @metadata[method_name] if @metadata.key?(method_name)
63
- end
64
-
65
- def respond_to_missing?(method_name, include_private)
66
- @metadata.key?(method_name) || super
67
- end
68
- end
69
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dimples
4
- class Error < StandardError
5
- end
6
-
7
- class GenerationError < Error
8
- end
9
-
10
- class RenderingError < Error
11
- end
12
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module Dimples
6
- module FrontMatter
7
- PATTERN = /^(-{3}\n.*?\n?)^(-{3}*$\n?)/m.freeze
8
-
9
- def self.parse(contents)
10
- metadata = {}
11
-
12
- if (matches = contents.match(PATTERN))
13
- metadata = YAML.safe_load(matches[1], symbolize_names: true, permitted_classes: [Date])
14
- contents = matches.post_match.strip
15
- end
16
-
17
- [metadata, contents]
18
- end
19
- end
20
- end
data/lib/dimples/page.rb DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "document"
4
-
5
- module Dimples
6
- class Page < Document
7
- end
8
- end
data/lib/dimples/post.rb DELETED
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "document"
4
-
5
- require "date"
6
-
7
- module Dimples
8
- class Post < Document
9
- def date
10
- @metadata.fetch(:date, DateTime.now)
11
- end
12
-
13
- def layout
14
- @metadata.fetch(:layout, "post")
15
- end
16
-
17
- def slug
18
- File.basename(@path, ".markdown")
19
- end
20
- end
21
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "document"
4
-
5
- module Dimples
6
- class Template < Document
7
- end
8
- end