aardi 0.9.2 → 2.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aardi/abstract_blog.rb +9 -4
  3. data/lib/aardi/abstract_feed.rb +15 -3
  4. data/lib/aardi/abstract_page_support.rb +10 -4
  5. data/lib/aardi/archive.rb +24 -19
  6. data/lib/aardi/atom_feed.rb +11 -11
  7. data/lib/aardi/blog.rb +18 -12
  8. data/lib/aardi/config.rb +16 -12
  9. data/lib/aardi/content_hashes.rb +13 -6
  10. data/lib/aardi/custom_renderer.rb +2 -4
  11. data/lib/aardi/day.rb +6 -5
  12. data/lib/aardi/errors.rb +6 -0
  13. data/lib/aardi/file_target.rb +7 -8
  14. data/lib/aardi/folder.rb +7 -12
  15. data/lib/aardi/home.rb +14 -15
  16. data/lib/aardi/home_footer_links.rb +21 -0
  17. data/lib/aardi/init_files/config.yml +1 -0
  18. data/lib/aardi/json_feed.rb +6 -7
  19. data/lib/aardi/metadata.rb +36 -0
  20. data/lib/aardi/month.rb +12 -12
  21. data/lib/aardi/orphanage.rb +3 -3
  22. data/lib/aardi/page.rb +1 -1
  23. data/lib/aardi/page_content.rb +2 -2
  24. data/lib/aardi/page_target.rb +4 -6
  25. data/lib/aardi/path_servlet.rb +2 -2
  26. data/lib/aardi/post.rb +12 -21
  27. data/lib/aardi/post_bookmark_line.rb +26 -0
  28. data/lib/aardi/renderer.rb +42 -0
  29. data/lib/aardi/site.rb +11 -44
  30. data/lib/aardi/sitemap.rb +14 -8
  31. data/lib/aardi/tag_blog.rb +42 -0
  32. data/lib/aardi/tags.rb +61 -0
  33. data/lib/aardi/tasks/fixtimes.rake +2 -2
  34. data/lib/aardi/tasks/homepage.rake +2 -2
  35. data/lib/aardi/tasks/init.rake +24 -22
  36. data/lib/aardi/tasks/load_config.rake +1 -1
  37. data/lib/aardi/tasks/new.rake +2 -2
  38. data/lib/aardi/tasks/now.rake +1 -1
  39. data/lib/aardi/tasks/recent.rake +1 -1
  40. data/lib/aardi/tasks/render.rake +3 -1
  41. data/lib/aardi/tasks/server.rake +6 -6
  42. data/lib/aardi/tasks.rb +2 -2
  43. data/lib/aardi/template.rb +33 -19
  44. data/lib/aardi/timekeeper.rb +6 -13
  45. data/lib/aardi/version.rb +1 -1
  46. data/lib/aardi/year.rb +7 -6
  47. data/lib/aardi.rb +51 -41
  48. metadata +14 -144
  49. data/lib/aardi/ledger.rb +0 -15
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- desc("Render new or updated files [DEFAULT]")
3
+ desc('Render new or updated files [DEFAULT]')
4
4
  task render: [:load_config] do
5
5
  Aardi::Site.new.render
6
+ rescue Aardi::MissingPathError => e
7
+ abort e.message
6
8
  end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- desc("Run a server")
3
+ desc('Run a server')
4
4
  task :server do
5
- require "aardi/path_servlet"
5
+ require 'aardi/path_servlet'
6
6
 
7
7
  port = 8000
8
8
  url = "http://localhost:#{port}/"
9
- root = "."
9
+ root = '.'
10
10
  puts(url)
11
11
 
12
12
  server = WEBrick::HTTPServer.new(Port: port, DocumentRoot: root)
13
- server.mount("/", Aardi::PathServlet)
13
+ server.mount('/', Aardi::PathServlet)
14
14
 
15
- trap("INT") { server.shutdown }
16
- system("(open '#{url}')&")
15
+ trap('INT') { server.shutdown }
16
+ system('open', url)
17
17
  server.start
18
18
  end
data/lib/aardi/tasks.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "aardi"
3
+ require 'aardi'
4
4
 
5
- Dir[File.join(__dir__, "tasks", "*.rake")].each { |f| load f }
5
+ Dir[File.join(__dir__, 'tasks', '*.rake')].each { |f| load f }
@@ -3,39 +3,53 @@
3
3
  module Aardi
4
4
  # :reek:DataClump
5
5
  class Template
6
+ PLACEHOLDER_MAIN = '__PLACEHOLDER_MAIN__'
7
+ PLACEHOLDER_TITLE = '__PLACEHOLDER_TITLE__'
8
+ PLACEHOLDER_DESCRIPTION = '__PLACEHOLDER_DESCRIPTION__'
9
+
6
10
  def initialize(path)
7
11
  @path = path
8
- @content = File.read(path).strip
9
- @dom = Nokogiri::HTML5.parse(@content)
12
+ dom = Nokogiri::HTML5.parse(File.read(path).strip)
13
+ required(dom, 'main').add_child(PLACEHOLDER_MAIN)
14
+ required(dom, 'title').content += PLACEHOLDER_TITLE
15
+ update_description_if_present(dom.at_css('meta[name="description"]'))
16
+ @compiled = dom.to_html.strip
10
17
  end
11
18
 
12
- # :reek:TooManyStatements
13
19
  def render(src)
14
- Aardi.ledger[:custom_renderer].reset
15
- dom = @dom.clone
16
-
17
- add_main(dom, src)
18
- add_title(dom, src)
19
- add_description(dom, src)
20
-
21
- dom.to_html.strip
20
+ result = @compiled.dup
21
+ result.sub!(PLACEHOLDER_MAIN, Aardi.renderer.markup(src.content))
22
+ result.sub!(PLACEHOLDER_TITLE, " #{text_escape(src.title)}")
23
+ result.sub!(PLACEHOLDER_DESCRIPTION, description_value(src)) if @default_description
24
+ result
22
25
  end
23
26
 
24
27
  private
25
28
 
26
- def add_description(dom, src)
27
- description = src.metadata["Description"]
28
- return unless description
29
+ def description_value(src)
30
+ escape_attributes(src.metadata.description || @default_description)
31
+ end
29
32
 
30
- dom.at_css('meta[name="description"]')["content"] = description
33
+ def escape_attributes(str)
34
+ str.gsub('&', '&').gsub('"', '"')
31
35
  end
32
36
 
33
- def add_main(dom, src)
34
- dom.at_css("main").add_child(Aardi.ledger[:markdown_renderer].render(src.content))
37
+ def required(dom, selector)
38
+ dom.at_css(selector) ||
39
+ raise(MissingTemplateElementError,
40
+ "Template missing required <#{selector}> element in #{@path}")
35
41
  end
36
42
 
37
- def add_title(dom, src)
38
- dom.at_css("title").content += " #{src.title}"
43
+ def text_escape(str)
44
+ str.gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;')
45
+ end
46
+
47
+ # :reek:FeatureEnvy
48
+ def update_description_if_present(meta)
49
+ return unless meta
50
+
51
+ @default_description = meta['content'] || ''
52
+ meta['content'] = PLACEHOLDER_DESCRIPTION
39
53
  end
40
54
  end
41
55
  end
@@ -1,23 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "git"
3
+ require 'git'
4
4
 
5
5
  module Aardi
6
- # :reek:TooManyInstanceVariables
7
6
  class Timekeeper
8
7
  def initialize
9
- @repo = Git.open(Dir.pwd)
10
- @commit_log = @repo.log(:all).all
11
- @files = tracked_files_by_mtime
12
- @files_count = @files.count
8
+ repo = Git.open(Dir.pwd)
9
+ @commit_log = repo.log(:all).all
10
+ @files = repo.ls_files.keys.sort_by { |file| File.mtime(file) }.reverse!
13
11
  @updated = 0
14
12
  @prior_summary_length = 0
15
13
  end
16
14
 
17
15
  def run
18
- @files.each.with_index do |path, index|
16
+ @files.each_with_index do |path, index|
19
17
  @prior_summary_length = print_progress(index, path)
20
-
21
18
  commit_date = author_date(path)
22
19
  next unless commit_date
23
20
 
@@ -41,13 +38,9 @@ module Aardi
41
38
  end
42
39
 
43
40
  def print_progress(index, path)
44
- summary = "(#{index} / #{@files_count}) #{@updated}: #{path}"
41
+ summary = "(#{index} / #{@files.size}) #{@updated}: #{path}"
45
42
  print format("\r%-#{@prior_summary_length}s", summary)
46
43
  summary.length
47
44
  end
48
-
49
- def tracked_files_by_mtime
50
- @repo.ls_files.keys.sort_by { |file| File.mtime(file) }.reverse!
51
- end
52
45
  end
53
46
  end
data/lib/aardi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aardi
4
- VERSION = "0.9.2"
4
+ VERSION = '2.0.0'
5
5
  end
data/lib/aardi/year.rb CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
  module Aardi
4
4
  class Year < AbstractBlog
5
- def initialize(key, archive_path)
5
+ def initialize(key, archive_path, tag = nil)
6
6
  @key = key
7
7
  @archive_path = archive_path
8
- @index = Hash.new { |hash, month| hash[month] = Month.new(self, month, archive_path) }
8
+ @index = Hash.new { |hash, month| hash[month] = Month.new(self, month, archive_path, tag) }
9
+ @tag = tag
9
10
  end
10
11
 
11
12
  def <<(post)
12
- @index[post.month] << post
13
+ @index[post.creation.month] << post
13
14
  end
14
15
 
15
16
  def archive_row(year_fmt, month_fmt)
@@ -25,16 +26,16 @@ module Aardi
25
26
  "./#{@archive_path}/#{self}/index.html"
26
27
  end
27
28
 
28
- def title = to_s
29
-
30
29
  private
31
30
 
31
+ def base_title = to_s
32
+
32
33
  def children
33
34
  months
34
35
  end
35
36
 
36
37
  def month_link(month)
37
- "- [#{Date::MONTHNAMES[month.key]}](#{Aardi.config[:site_url]}/#{@archive_path}/#{self}/#{month}/)"
38
+ "- [#{Date::MONTHNAMES[month.key]}](#{Config[:site_url]}/#{@archive_path}/#{self}/#{month}/)"
38
39
  end
39
40
 
40
41
  def months
data/lib/aardi.rb CHANGED
@@ -1,54 +1,64 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "date"
4
- require "fileutils"
5
- require "json"
6
- require "yaml"
7
- require "zlib"
3
+ %w[
4
+ date
5
+ fileutils
6
+ json
7
+ yaml
8
+ zlib
9
+ nokogiri
10
+ rake
11
+ redcarpet
12
+ ].each { |lib| require lib }
8
13
 
9
- require "nokogiri"
10
- require "rake"
11
- require "redcarpet"
14
+ %w[
15
+ errors
16
+ version
17
+ config
18
+ metadata
19
+ content
20
+ content_hashes
21
+ custom_renderer
22
+ renderer
23
+ abstract_blog
24
+ abstract_page_support
25
+ abstract_feed
26
+ file_target
27
+ page_target
28
+ page_content
29
+ template
30
+ page
31
+ post_bookmark_line
32
+ post
33
+ day
34
+ month
35
+ year
36
+ archive
37
+ home_footer_links
38
+ home
39
+ tags
40
+ atom_feed
41
+ json_feed
42
+ blog
43
+ tag_blog
44
+ folder
45
+ sitemap
46
+ orphanage
47
+ site
48
+ ].each { |name| require_relative "aardi/#{name}" }
12
49
 
13
- require_relative "aardi/version"
14
- require_relative "aardi/config"
15
- require_relative "aardi/ledger"
16
- require_relative "aardi/content"
17
- require_relative "aardi/content_hashes"
18
- require_relative "aardi/custom_renderer"
19
- require_relative "aardi/abstract_blog"
20
- require_relative "aardi/abstract_page_support"
21
- require_relative "aardi/abstract_feed"
22
- require_relative "aardi/file_target"
23
- require_relative "aardi/page_target"
24
- require_relative "aardi/page_content"
25
- require_relative "aardi/template"
26
- require_relative "aardi/page"
27
- require_relative "aardi/post"
28
- require_relative "aardi/day"
29
- require_relative "aardi/month"
30
- require_relative "aardi/year"
31
- require_relative "aardi/archive"
32
- require_relative "aardi/home"
33
- require_relative "aardi/atom_feed"
34
- require_relative "aardi/json_feed"
35
- require_relative "aardi/blog"
36
- require_relative "aardi/folder"
37
- require_relative "aardi/sitemap"
38
- require_relative "aardi/orphanage"
39
- require_relative "aardi/site"
40
-
41
- RubyVM::YJIT.enable if RUBY_ENGINE == "ruby" && RUBY_VERSION.to_f >= 3.1
50
+ RubyVM::YJIT.enable if RUBY_ENGINE == 'ruby'
42
51
 
43
52
  module Aardi
44
53
  class << self
45
- def config = @config ||= Config.new
54
+ # :reek:Attribute
55
+ attr_writer :renderer
46
56
 
47
- def ledger = @ledger ||= Ledger.new
57
+ def renderer = @renderer ||= Renderer.new
48
58
 
49
59
  def reset!
50
- @config = Config.new
51
- @ledger = Ledger.new
60
+ Config.reset
61
+ @renderer = nil
52
62
  end
53
63
  end
54
64
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aardi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Faisal N Jawdat
@@ -79,146 +79,6 @@ dependencies:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
- - !ruby/object:Gem::Dependency
83
- name: flog
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- type: :development
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- - !ruby/object:Gem::Dependency
97
- name: reek
98
- requirement: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: rubocop-minitest
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- type: :development
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '0'
124
- - !ruby/object:Gem::Dependency
125
- name: rubocop-ordered_methods
126
- requirement: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- type: :development
132
- prerelease: false
133
- version_requirements: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- - !ruby/object:Gem::Dependency
139
- name: rubocop-performance
140
- requirement: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- type: :development
146
- prerelease: false
147
- version_requirements: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - ">="
150
- - !ruby/object:Gem::Version
151
- version: '0'
152
- - !ruby/object:Gem::Dependency
153
- name: rubocop-rake
154
- requirement: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - ">="
157
- - !ruby/object:Gem::Version
158
- version: '0'
159
- type: :development
160
- prerelease: false
161
- version_requirements: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- - !ruby/object:Gem::Dependency
167
- name: rubocop-rubyfmt
168
- requirement: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - ">="
171
- - !ruby/object:Gem::Version
172
- version: '0'
173
- type: :development
174
- prerelease: false
175
- version_requirements: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- version: '0'
180
- - !ruby/object:Gem::Dependency
181
- name: rubocop
182
- requirement: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- version: '0'
187
- type: :development
188
- prerelease: false
189
- version_requirements: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - ">="
192
- - !ruby/object:Gem::Version
193
- version: '0'
194
- - !ruby/object:Gem::Dependency
195
- name: minitest
196
- requirement: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - ">="
199
- - !ruby/object:Gem::Version
200
- version: '0'
201
- type: :development
202
- prerelease: false
203
- version_requirements: !ruby/object:Gem::Requirement
204
- requirements:
205
- - - ">="
206
- - !ruby/object:Gem::Version
207
- version: '0'
208
- - !ruby/object:Gem::Dependency
209
- name: standard
210
- requirement: !ruby/object:Gem::Requirement
211
- requirements:
212
- - - ">="
213
- - !ruby/object:Gem::Version
214
- version: 1.35.1
215
- type: :development
216
- prerelease: false
217
- version_requirements: !ruby/object:Gem::Requirement
218
- requirements:
219
- - - ">="
220
- - !ruby/object:Gem::Version
221
- version: 1.35.1
222
82
  email: aardi@faisal.com
223
83
  executables: []
224
84
  extensions: []
@@ -236,12 +96,14 @@ files:
236
96
  - lib/aardi/content_hashes.rb
237
97
  - lib/aardi/custom_renderer.rb
238
98
  - lib/aardi/day.rb
99
+ - lib/aardi/errors.rb
239
100
  - lib/aardi/file_target.rb
240
101
  - lib/aardi/folder.rb
241
102
  - lib/aardi/home.rb
103
+ - lib/aardi/home_footer_links.rb
242
104
  - lib/aardi/init_files/config.yml
243
105
  - lib/aardi/json_feed.rb
244
- - lib/aardi/ledger.rb
106
+ - lib/aardi/metadata.rb
245
107
  - lib/aardi/month.rb
246
108
  - lib/aardi/orphanage.rb
247
109
  - lib/aardi/page.rb
@@ -249,8 +111,12 @@ files:
249
111
  - lib/aardi/page_target.rb
250
112
  - lib/aardi/path_servlet.rb
251
113
  - lib/aardi/post.rb
114
+ - lib/aardi/post_bookmark_line.rb
115
+ - lib/aardi/renderer.rb
252
116
  - lib/aardi/site.rb
253
117
  - lib/aardi/sitemap.rb
118
+ - lib/aardi/tag_blog.rb
119
+ - lib/aardi/tags.rb
254
120
  - lib/aardi/tasks.rb
255
121
  - lib/aardi/tasks/fixtimes.rake
256
122
  - lib/aardi/tasks/homepage.rake
@@ -265,10 +131,14 @@ files:
265
131
  - lib/aardi/timekeeper.rb
266
132
  - lib/aardi/version.rb
267
133
  - lib/aardi/year.rb
134
+ homepage: https://github.com/faisal/aardi
268
135
  licenses:
269
136
  - MIT
270
137
  metadata:
271
- source_code_uri: https://www.github.com/faisal/aardi
138
+ source_code_uri: https://github.com/faisal/aardi
139
+ bug_tracker_uri: https://github.com/faisal/aardi/issues
140
+ changelog_uri: https://github.com/faisal/aardi/blob/main/CHANGELOG.md
141
+ documentation_uri: https://github.com/faisal/aardi/blob/main/README.md
272
142
  rubygems_mfa_required: 'true'
273
143
  rdoc_options: []
274
144
  require_paths:
@@ -284,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
284
154
  - !ruby/object:Gem::Version
285
155
  version: '0'
286
156
  requirements: []
287
- rubygems_version: 4.0.9
157
+ rubygems_version: 4.0.12
288
158
  specification_version: 4
289
159
  summary: A static site generator.
290
160
  test_files: []
data/lib/aardi/ledger.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Aardi
4
- class Ledger
5
- def initialize
6
- @data = {}
7
- end
8
-
9
- def [](key) = @data[key]
10
-
11
- def []=(key, value)
12
- @data[key] = value
13
- end
14
- end
15
- end