dimples 8.0.0 → 10.0.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: 119a5b996b99fd1cf525e2928fcee146d226463d589d0c90cc8fc35234556006
4
- data.tar.gz: 7556145973db1abb0245c1684b600b162000806d13bd7a4074740f41b8581d52
3
+ metadata.gz: 18bfc09d96924fc5ed5ed12f9d939ad035feaa2ede3f67b0045bd524da5d0d66
4
+ data.tar.gz: 224f9dbecde7c7a57fc11d5843898fd2f3b553acc7448cd7639f73fb8c8d7fad
5
5
  SHA512:
6
- metadata.gz: 9f33146ac6dde0b55514b55e7abe3c39bb70c6d5c9d23faf1bf043ec9d16047c0b795b28693a00d0c570e42a6491e566043e4f0cc5a30fd8af502917e19b2f1b
7
- data.tar.gz: a6199859fa63efa39d2d4b772e2836b539ccc86c54b3a435fd791b9a97c90f6271f42e6020254cac735a159bfadc80f2c88d97b15dc4c2cdeca91e7054466256
6
+ metadata.gz: 6eb46d1192a47f326865c567372c1dc1a5d12f8c93a932d99c7d5c1f2269abbe5cef6a2511eab752938cabf276c92e21f4cf010fac6c206d71674cafd62213b9
7
+ data.tar.gz: 4d360af4ddf70adeea836fa311f63bdc14cc5184ecd042b30a7b88670523a1611db707bd42ea66e76494d4b46466c7cc693ee40391c6d9b7a97b74f94db5eae5
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
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,104 @@
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'
8
6
 
9
7
  module Dimples
8
+ # A class representing a single generated website.
10
9
  class Site
11
- DEFAULT_CONFIG = { overwrite_directory: false }
10
+ attr_accessor :config
12
11
 
13
- def self.generate(source_path, output_path, config)
14
- new(source_path, output_path, config).generate
12
+ def self.generate(config = {})
13
+ new(config).generate
15
14
  end
16
15
 
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
16
+ def initialize(config = {})
17
+ @config = Config.new(config)
35
18
  end
36
19
 
37
20
  def generate
38
- if Dir.exist?(@paths[:destination])
39
- unless @config[:overwrite_directory]
40
- raise GenerationError.new("The build directory (#{@paths[:destination]}) already exists.")
41
- end
42
-
43
- FileUtils.rm_rf(@paths[:destination])
44
- end
45
-
46
- Dir.mkdir(@paths[:destination])
21
+ prepare_output_directory
47
22
 
48
23
  generate_posts
49
- generate_pages
50
24
  generate_categories
25
+ generate_pages
51
26
 
52
27
  copy_assets
53
28
  end
54
29
 
55
- private
56
-
57
- def read_files(path)
58
- Dir[File.join(path, "**", "*.*")].sort
30
+ def posts
31
+ @posts ||= Dir.glob(File.join(@config[:sources][:posts], '**', '*.markdown')).map do |path|
32
+ Dimples::Sources::Post.new(self, path)
33
+ end.sort_by!(&:date).reverse!
59
34
  end
60
35
 
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
36
+ def pages
37
+ @pages ||= Dir.glob(File.join(@config[:sources][:pages], '**', '*.erb')).map do |path|
38
+ Dimples::Sources::Page.new(self, path)
72
39
  end
73
40
  end
74
41
 
75
- def scan_pages
76
- @pages = read_files(@paths[:pages]).map { |path| Dimples::Page.new(path) }
42
+ def layouts
43
+ @layouts ||= Dir.glob(File.join(@config[:sources][:layouts], '**', '*.erb')).to_h do |path|
44
+ [File.basename(path, '.erb'), Dimples::Sources::Layout.new(self, path)]
45
+ end
77
46
  end
78
47
 
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)
48
+ def categories
49
+ @categories ||= {}.tap do |categories|
50
+ posts.each do |post|
51
+ post.categories.each do |category|
52
+ categories[category] ||= []
53
+ categories[category].append(post)
85
54
  end
86
55
  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
56
  end
114
57
  end
115
58
 
116
- def generate_posts
117
- directory_path = File.join(@paths[:destination], @config.dig(:paths, :posts) || "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])
59
+ def metadata
60
+ @metadata ||= { posts: posts, categories: categories }
127
61
  end
128
62
 
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
63
+ private
137
64
 
138
- write_file(File.join(path, page.filename), render(page, page: page))
139
- end
65
+ def generate_posts
66
+ posts.each(&:write)
67
+ Pager.paginate(self, @config[:output][:posts].gsub(@config[:output][:root], '').concat('/'), posts)
68
+ generate_feed(@config[:output][:root], posts)
140
69
  end
141
70
 
142
71
  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)
72
+ categories.each do |category, posts|
73
+ metadata = { title: category.capitalize, category: category }
74
+ Pager.paginate(self, "/categories/#{category}/", posts, metadata)
75
+ generate_feed(File.join(@config[:output][:root], 'categories', category), posts)
148
76
  end
149
77
  end
150
78
 
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))
79
+ def generate_pages
80
+ pages.each(&:write)
154
81
  end
155
82
 
156
- def copy_assets
157
- return unless Dir.exist?(@paths[:static])
83
+ def generate_feed(output_path, posts)
84
+ return if layouts['feed'].nil?
158
85
 
159
- FileUtils.cp_r(File.join(@paths[:static], "."), @paths[:destination])
86
+ layouts['feed'].write(
87
+ File.join(output_path, 'feed.atom'),
88
+ posts: posts.slice(0, 10)
89
+ )
160
90
  end
161
91
 
162
- def render(object, context = {}, content = nil)
163
- context[:site] ||= self
92
+ def prepare_output_directory
93
+ raise "The site directory (#{@config[:output][:root]}) already exists." if Dir.exist?(@config[:output][:root])
164
94
 
165
- output = object.render(context, content)
95
+ Dir.mkdir(@config[:output][:root])
96
+ end
166
97
 
167
- output = render(@templates[object.layout], context, output) if object.layout &&
168
- @templates[object.layout]
98
+ def copy_assets
99
+ return unless Dir.exist?(@config[:sources][:static])
169
100
 
170
- output
101
+ FileUtils.cp_r(File.join(@config[:sources][:static], '.'), @config[:output][:root])
171
102
  end
172
103
  end
173
104
  end
@@ -0,0 +1,85 @@
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
+ matches = @contents.match(FRONT_MATTER_PATTERN)
19
+ return unless matches
20
+
21
+ @metadata.merge!(YAML.safe_load(matches[1], symbolize_names: true, permitted_classes: [Date]))
22
+ @contents = matches.post_match.strip
23
+ end
24
+
25
+ def write(output_path = nil, metadata = {})
26
+ metadata[:site] ||= @site
27
+ metadata[context_key] ||= self
28
+
29
+ output = render(metadata)
30
+
31
+ output_path = File.join(output_directory, filename) if output_path.nil?
32
+ output_dir = File.dirname(output_path)
33
+
34
+ FileUtils.mkdir_p(output_dir) unless File.directory?(output_dir)
35
+ File.write(output_path, output)
36
+ end
37
+
38
+ def render(metadata = {}, body = nil)
39
+ output = template.render(context(metadata)) { body }
40
+ return output unless @metadata[:layout] && @site.layouts[@metadata[:layout]]
41
+
42
+ @site.layouts[@metadata[:layout]].render(metadata, output)
43
+ end
44
+
45
+ def context(metadata)
46
+ Object.new.tap do |context|
47
+ metadata.each { |key, variable| context.instance_variable_set("@#{key}", variable) }
48
+ end
49
+ end
50
+
51
+ def default_metadata
52
+ {
53
+ layout: nil,
54
+ filename: 'index.html'
55
+ }
56
+ end
57
+
58
+ def output_directory
59
+ @site.config[:output][:root]
60
+ end
61
+
62
+ def url
63
+ @metadata[:url] || output_directory.gsub(@site.config[:output][:root], '')
64
+ end
65
+
66
+ def template
67
+ raise NotImplementedError, 'You must set a Tilt template for this class.'
68
+ end
69
+
70
+ private
71
+
72
+ def context_key
73
+ :page
74
+ end
75
+
76
+ def method_missing(method_name, *_args)
77
+ @metadata[method_name] if @metadata.key?(method_name)
78
+ end
79
+
80
+ def respond_to_missing?(method_name, include_private)
81
+ @metadata.key?(method_name) || super
82
+ end
83
+ end
84
+ end
85
+ 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,34 @@
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 context_key
21
+ :post
22
+ end
23
+
24
+ def default_metadata
25
+ super.tap do |defaults|
26
+ defaults[:layout] = 'post'
27
+ defaults[:slug] = File.basename(@path, '.markdown')
28
+ defaults[:date] = File.birthtime(@path)
29
+ defaults[:categories] = []
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dimples
4
- VERSION = "8.0.0"
4
+ VERSION = '10.0.0'
5
5
  end
data/lib/dimples.rb CHANGED
@@ -2,8 +2,11 @@
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/pager'
7
+ require 'dimples/site'
8
+
9
+ require 'dimples/sources/base'
10
+ require 'dimples/sources/page'
11
+ require 'dimples/sources/post'
12
+ 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: 8.0.0
4
+ version: 10.0.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-26 00:00:00.000000000 Z
11
+ date: 2024-02-03 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,20 @@ 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
125
66
  - lib/dimples/pager.rb
126
- - lib/dimples/post.rb
127
67
  - lib/dimples/site.rb
128
- - lib/dimples/template.rb
68
+ - lib/dimples/sources/base.rb
69
+ - lib/dimples/sources/layout.rb
70
+ - lib/dimples/sources/page.rb
71
+ - lib/dimples/sources/post.rb
129
72
  - lib/dimples/version.rb
130
73
  homepage: http://github.com/waferbaby/dimples
131
74
  licenses:
132
75
  - MIT
133
- metadata: {}
134
- post_install_message:
76
+ metadata:
77
+ rubygems_mfa_required: 'true'
78
+ post_install_message:
135
79
  rdoc_options: []
136
80
  require_paths:
137
81
  - lib
@@ -139,15 +83,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
83
  requirements:
140
84
  - - ">"
141
85
  - !ruby/object:Gem::Version
142
- version: '2.7'
86
+ version: '3.0'
143
87
  required_rubygems_version: !ruby/object:Gem::Requirement
144
88
  requirements:
145
89
  - - ">="
146
90
  - !ruby/object:Gem::Version
147
91
  version: '0'
148
92
  requirements: []
149
- rubygems_version: 3.3.7
150
- signing_key:
93
+ rubygems_version: 3.4.10
94
+ signing_key:
151
95
  specification_version: 4
152
96
  summary: A basic static site generator
153
97
  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