dimples 9.0.0 → 10.1.0

Sign up to get free protection for your applications and to get access to all the features.
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