rawfeed 0.3.1 → 1.0.1

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +25 -0
  3. data/.gitignore +19 -0
  4. data/.gitlab/ci/gitlab-pages.yml +51 -0
  5. data/.hidden +6 -0
  6. data/404.html +6 -0
  7. data/Gemfile +51 -0
  8. data/README.md +102 -26
  9. data/_config.yml +77 -0
  10. data/_data/generic.yml +29 -0
  11. data/_data/screen/blog.yml +46 -0
  12. data/_data/screen/contact.yml +31 -0
  13. data/_data/screen/donate.yml +45 -0
  14. data/_data/screen/footer.yml +17 -0
  15. data/_data/screen/head.yml +49 -0
  16. data/_data/screen/home.yml +24 -0
  17. data/_data/screen/maintenance.yml +8 -0
  18. data/_data/screen/navbar.yml +41 -0
  19. data/_data/screen/page.yml +12 -0
  20. data/_data/screen/pixels.yml +7 -0
  21. data/_data/screen/pub.yml +4 -0
  22. data/_data/{resume.yml → screen/resume.yml} +8 -8
  23. data/_data/screen/socials.yml +20 -0
  24. data/_includes/assigned +36 -0
  25. data/_includes/layout/blog_search.html +22 -15
  26. data/_includes/layout/disqus.html +7 -8
  27. data/_includes/layout/footer.html +43 -28
  28. data/_includes/layout/giscus.html +15 -19
  29. data/_includes/layout/head.html +97 -75
  30. data/_includes/layout/maintenance.html +14 -11
  31. data/_includes/layout/navbar.html +253 -0
  32. data/_includes/layout/paginator.html +12 -13
  33. data/_includes/{alert → markdown/alert} +2 -2
  34. data/_includes/{chart → markdown/chart} +3 -3
  35. data/_includes/{image → markdown/image} +4 -4
  36. data/_includes/{socials → markdown/socials} +5 -5
  37. data/_includes/{video → markdown/video} +2 -2
  38. data/_layouts/blog/index.html +53 -0
  39. data/_layouts/{post.html → blog/post.html} +50 -36
  40. data/_layouts/blog/posts_by_tag.html +27 -0
  41. data/_layouts/blog/tags.html +32 -0
  42. data/_layouts/contact.html +156 -114
  43. data/_layouts/default.html +53 -48
  44. data/_layouts/donate.html +112 -0
  45. data/_layouts/error.html +9 -7
  46. data/_layouts/home.html +22 -19
  47. data/_layouts/licenses.html +2 -2
  48. data/_layouts/page.html +18 -17
  49. data/_layouts/pixels/index.html +75 -0
  50. data/_layouts/{pixel.html → pixels/post.html} +5 -5
  51. data/_layouts/pub.html +50 -44
  52. data/_layouts/resume.html +308 -265
  53. data/_pages/any-page.md +336 -0
  54. data/_pages/contact.md +16 -0
  55. data/_pages/donate.md +16 -0
  56. data/_pages/licenses.md +17 -0
  57. data/_pages/resume.md +14 -0
  58. data/_pixels/2025-10-15-first-my-pixel.md +34 -0
  59. data/_posts/2025-09-20-welcome-to-jekyll.md +36 -0
  60. data/_posts/2025-09-25-this-post-demonstrates-post-codeblocks.md +141 -0
  61. data/_posts/2025-09-25-this-post-demonstrates-post-content-styles.md +133 -0
  62. data/_posts/2025-10-04-content-styles-and-codeblocks.md +330 -0
  63. data/_sass/components/_markdown.scss +2 -2
  64. data/_sass/includes/_index.scss +2 -2
  65. data/_sass/includes/{_header.scss → _navbar.scss} +2 -6
  66. data/_sass/includes/_toc.scss +146 -0
  67. data/_sass/layouts/_blog.scss +1 -1
  68. data/_sass/layouts/_index.scss +2 -2
  69. data/_sass/layouts/_page.scss +0 -5
  70. data/_sass/layouts/_post.scss +8 -138
  71. data/_sass/layouts/{_tag-posts.scss → _posts_by_tag.scss} +3 -3
  72. data/_sass/layouts/_resume.scss +1 -1
  73. data/_sass/layouts/{_tag.scss → _tags.scss} +10 -6
  74. data/_sass/main.scss +2 -2
  75. data/_sass/theme/_dark.scss +2 -2
  76. data/_sass/theme/_light.scss +1 -1
  77. data/assets/js/blog.js +52 -18
  78. data/assets/js/contact.js +21 -20
  79. data/assets/js/default.js +67 -50
  80. data/assets/js/discus.js +2 -2
  81. data/assets/js/{donation.js → donate.js} +10 -9
  82. data/assets/js/home.js +18 -16
  83. data/assets/js/page.js +50 -172
  84. data/assets/js/toc.js +133 -0
  85. data/assets/json/blog_search.json +6 -6
  86. data/assets/vendors/fuse.min.js +9 -0
  87. data/blog/index.md +14 -0
  88. data/blog/tags/index.md +12 -0
  89. data/exe/rawfeed +29 -0
  90. data/index.md +15 -0
  91. data/lib/rawfeed/build/cleaner.rb +60 -0
  92. data/lib/rawfeed/build/image_minifier.rb +163 -0
  93. data/lib/rawfeed/build/minifier.rb +89 -0
  94. data/lib/rawfeed/build.rb +9 -0
  95. data/lib/rawfeed/command/backup.rb +124 -0
  96. data/lib/rawfeed/command/cli.rb +118 -0
  97. data/lib/rawfeed/command/installer.rb +156 -0
  98. data/lib/rawfeed/command/tools.rb +138 -0
  99. data/lib/rawfeed/{author.rb → content/author.rb} +7 -7
  100. data/lib/rawfeed/content/contact.rb +51 -0
  101. data/lib/rawfeed/content/donate.rb +48 -0
  102. data/lib/rawfeed/{draft.rb → content/draft.rb} +5 -3
  103. data/lib/rawfeed/content/licenses.rb +46 -0
  104. data/lib/rawfeed/{page.rb → content/page.rb} +4 -3
  105. data/lib/rawfeed/{pixel.rb → content/pixel.rb} +7 -4
  106. data/lib/rawfeed/content/post.rb +107 -0
  107. data/lib/rawfeed/{resume.rb → content/resume.rb} +23 -19
  108. data/lib/rawfeed/{layout.rb → core/layout.rb} +1 -1
  109. data/lib/rawfeed/core/utils.rb +103 -0
  110. data/lib/rawfeed/{version.rb → core/version.rb} +1 -1
  111. data/lib/rawfeed/{datelang.rb → plugin/datelang.rb} +5 -6
  112. data/lib/rawfeed/{pub.rb → plugin/pub.rb} +33 -31
  113. data/lib/rawfeed/{reading_time.rb → plugin/reading_time.rb} +5 -4
  114. data/lib/rawfeed/root.rb +3 -0
  115. data/lib/rawfeed.rb +36 -14
  116. data/pixels/index.md +11 -0
  117. data/robots.txt +26 -0
  118. metadata +167 -119
  119. data/_data/options.yml +0 -329
  120. data/_includes/layout/data.liquid +0 -31
  121. data/_includes/layout/header.html +0 -173
  122. data/_layouts/blog.html +0 -52
  123. data/_layouts/donation.html +0 -113
  124. data/_layouts/pixels.html +0 -71
  125. data/_layouts/tag.html +0 -33
  126. data/_layouts/tag_posts.html +0 -28
  127. data/assets/vendor/simple-jekyll-search.js +0 -433
  128. data/assets/vendor/simple-jekyll-search.min.js +0 -6
  129. data/lib/rawfeed/installer.rb +0 -37
  130. data/lib/rawfeed/post.rb +0 -60
  131. data/lib/rawfeed/utils.rb +0 -75
  132. /data/_includes/{details → markdown/details} +0 -0
  133. /data/_includes/{enddetails → markdown/enddetails} +0 -0
  134. /data/_includes/{endtabs → markdown/endtabs} +0 -0
  135. /data/_includes/{tabs → markdown/tabs} +0 -0
  136. /data/assets/images/{avatar_back.png → avatars/back.png} +0 -0
  137. /data/assets/images/{avatar_dark.png → avatars/dark.png} +0 -0
  138. /data/assets/images/{avatar_light.png → avatars/light.png} +0 -0
  139. /data/assets/images/{icons → donate}/bitcoin.svg +0 -0
  140. /data/assets/images/{icons → donate}/card.svg +0 -0
  141. /data/assets/images/{icons → donate}/donation.svg +0 -0
  142. /data/assets/images/{icons → donate}/lightning_network.svg +0 -0
  143. /data/assets/images/{icons → donate}/paypal.svg +0 -0
  144. /data/assets/images/{icons → donate}/pix.svg +0 -0
  145. /data/assets/images/{qrcode_btc_binance.jpg → donate/qrcode_btc_binance.jpg} +0 -0
  146. /data/assets/images/{qrcode_inter.jpg → donate/qrcode_inter.jpg} +0 -0
  147. /data/assets/images/{qrcode_wos.jpg → donate/qrcode_wos.jpg} +0 -0
  148. /data/assets/images/{icons → donate}/wos.png +0 -0
  149. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css +0 -0
  150. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css.map +0 -0
  151. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css +0 -0
  152. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css.map +0 -0
  153. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css +0 -0
  154. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css.map +0 -0
  155. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css +0 -0
  156. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css.map +0 -0
  157. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css +0 -0
  158. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css.map +0 -0
  159. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css +0 -0
  160. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css.map +0 -0
  161. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css +0 -0
  162. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css.map +0 -0
  163. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css +0 -0
  164. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css.map +0 -0
  165. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css +0 -0
  166. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css.map +0 -0
  167. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css +0 -0
  168. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css.map +0 -0
  169. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css +0 -0
  170. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css.map +0 -0
  171. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css +0 -0
  172. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css.map +0 -0
  173. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css +0 -0
  174. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css.map +0 -0
  175. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css +0 -0
  176. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css.map +0 -0
  177. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css +0 -0
  178. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css.map +0 -0
  179. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css +0 -0
  180. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css.map +0 -0
  181. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js +0 -0
  182. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js.map +0 -0
  183. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js +0 -0
  184. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js.map +0 -0
  185. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js +0 -0
  186. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js.map +0 -0
  187. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js +0 -0
  188. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js.map +0 -0
  189. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js +0 -0
  190. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js.map +0 -0
  191. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js +0 -0
  192. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js.map +0 -0
  193. /data/lib/rawfeed/{csp_filters.rb → plugin/csp_filters.rb} +0 -0
  194. /data/lib/rawfeed/{typescript_liquid.rb → plugin/typescript_liquid.rb} +0 -0
  195. /data/lib/rawfeed/{with_class.rb → plugin/with_class.rb} +0 -0
@@ -3,11 +3,11 @@
3
3
  require "colorize"
4
4
  require "fileutils"
5
5
  require "rubygems"
6
- require_relative "utils"
6
+ require_relative "../core/utils"
7
7
 
8
8
  module Rawfeed
9
9
  class Resume
10
- def self.resume_page_create
10
+ def self.restore_page
11
11
  Rawfeed::Utils.create_directory(Rawfeed::CONFIG['PAGES_DIR'])
12
12
  slug = "resume"
13
13
  filepath = File.join(Rawfeed::CONFIG['PAGES_DIR'], "#{slug}.#{CONFIG['markdown_extension']}")
@@ -27,9 +27,13 @@ module Rawfeed
27
27
  file.puts("---")
28
28
  file.puts("layout: resume")
29
29
  file.puts("author: # \"Your Name\"")
30
- file.puts("order: 4")
31
30
  file.puts("title: Resume")
31
+ file.puts("order: 4")
32
+ file.puts("emoji: 📜")
33
+ file.puts("in_menu: true")
32
34
  file.puts("published: false")
35
+ file.puts("toc:")
36
+ file.puts(" enable: false")
33
37
  file.puts("permalink: /resume/")
34
38
  file.puts("---")
35
39
  file.puts("")
@@ -40,21 +44,21 @@ module Rawfeed
40
44
  puts "[!] Note: Remember to set \"published\" to \"true\" to publish.".yellow
41
45
 
42
46
  end
43
- def self.resume_create
44
- self.resume_page_create
45
- Rawfeed::Utils.create_directory(Rawfeed::CONFIG['RESUME_DIR'])
46
- spec = Gem::Specification.find_by_name("rawfeed")
47
- theme_path = spec.gem_dir
48
- src = File.join(theme_path, "_data", "resume.yml")
49
- dest = File.join(Dir.pwd, Rawfeed::CONFIG['RESUME_DIR'])
50
-
51
- if File.exist?(File.join(dest, "resume.yml"))
52
- answer = Rawfeed::Utils.confirm("File #{File.join(dest, "resume.yml")} already exists. Do you want to overwrite?")
53
- abort("Creation of #{File.join(dest, "resume.yml")} canceled by user!") if answer == 'n'
54
- end
55
- FileUtils.cp(src, dest)
56
- puts "[*] Created #{File.join(dest, "resume.yml")} successfully!".green
57
- puts "[!] Note: Configure your #{File.join(dest, "resume.yml")} settings".yellow
58
- end
47
+ # def self.restore
48
+ # self.restore_page
49
+ # Rawfeed::Utils.create_directory(Rawfeed::CONFIG['RESUME_DIR'])
50
+ # spec = Gem::Specification.find_by_name("rawfeed")
51
+ # theme_path = spec.gem_dir
52
+ # src = File.join(theme_path, "_data", "resume.yml")
53
+ # dest = File.join(Dir.pwd, Rawfeed::CONFIG['RESUME_DIR'])
54
+
55
+ # if File.exist?(File.join(dest, "resume.yml"))
56
+ # answer = Rawfeed::Utils.confirm("File #{File.join(dest, "resume.yml")} already exists. Do you want to overwrite?")
57
+ # abort("Creation of #{File.join(dest, "resume.yml")} canceled by user!") if answer == 'n'
58
+ # end
59
+ # FileUtils.cp(src, dest)
60
+ # puts "[*] Created #{File.join(dest, "resume.yml")} successfully!".green
61
+ # puts "[!] Note: Configure your #{File.join(dest, "resume.yml")} settings".yellow
62
+ # end
59
63
  end
60
64
  end
@@ -21,7 +21,7 @@ module Rawfeed
21
21
  def self.home_blog
22
22
  file = "index.md"
23
23
  content = File.read(file)
24
- updated = content.gsub(/^layout:\s*\S+$/, "layout: blog")
24
+ updated = content.gsub(/^layout:\s*\S+$/, "layout: blog/index")
25
25
  File.write(file, updated)
26
26
 
27
27
  puts "Home page changed to 'blog' successfully!".green
@@ -0,0 +1,103 @@
1
+ require "colorize"
2
+ require "time"
3
+
4
+ module Rawfeed
5
+ CONFIG = {
6
+ 'DRAFTS_DIR' => File.join(".", "_drafts"),
7
+ 'POSTS_DIR' => File.join(".", "_posts"),
8
+ 'PIXELS_DIR' => File.join(".", "_pixels"),
9
+ 'PAGES_DIR' => File.join(".", "_pages"),
10
+ 'RESUME_DIR' => File.join(".", "_data"),
11
+ 'CONFIG_YML' => File.join(".", "_config.yml"),
12
+ 'markdown_extension' => "md"
13
+ }
14
+
15
+ # Utility methods for the Rawfeed framework.
16
+ # Provides helper functionality such as directory creation, slug generation,
17
+ # date formatting, user prompts, and file payload compilation.
18
+ class Utils
19
+ # Safely creates a directory if it does not already exist.
20
+ #
21
+ # @param path [String] The path of the directory to create.
22
+ # @return [void]
23
+ def self.create_directory(path)
24
+ unless File.directory?(path)
25
+ FileUtils.mkdir_p(path)
26
+ puts ":: Folder '#{path}', created!".green
27
+ end
28
+ end
29
+
30
+ # Generates a URL-friendly slug from a string.
31
+ # It converts the string to lowercase, strips whitespace, replaces spaces with
32
+ # hyphens, and removes any non-word characters (except hyphens).
33
+ #
34
+ # @param parameter [String] The input string to sluggify.
35
+ # @return [String] The generated slug.
36
+ def self.slug_generator(parameter)
37
+ parameter.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
38
+ end
39
+
40
+ # Generates a formatted datetime string.
41
+ # Uses the 'date' environment variable if present, otherwise uses the current time.
42
+ #
43
+ # @param parameter [String] The strftime formatting string.
44
+ # @return [String] The formatted time string.
45
+ def self.datetime_generator(parameter)
46
+ (ENV['date'] ? Time.parse(ENV['date']) : Time.now).strftime(parameter)
47
+ rescue ArgumentError
48
+ puts "[x] Error - date format must be YYYY-MM-DD, please check you typed it correctly!".red
49
+ exit 1
50
+ end
51
+
52
+ # Prompts the user for a Yes/No confirmation.
53
+ # Forces the user to input 'y' or 'n'.
54
+ #
55
+ # @param message [String] The message to display to the user.
56
+ # @return [String] Returns 'y' or 'n' based on user input.
57
+ def self.confirm(message)
58
+ print "#{message} [y/n]: ".blue
59
+ answer = STDIN.gets.chomp.downcase
60
+ until %w[y n].include?(answer)
61
+ print "[!] Please type 'y' or 'n': ".yellow
62
+ answer = STDIN.gets.chomp.downcase
63
+ end
64
+ answer
65
+ end
66
+
67
+ # Scaffolds a new content file (e.g., page, post) by asking the user for a title
68
+ # and generating the required slug and dates.
69
+ #
70
+ # @param directory [String] The directory where the file will be saved.
71
+ # @param message [String] The prompt message to ask the user for a title.
72
+ # @param type [String] The type of content ('page' or other for time-prefixed files).
73
+ # @return [Array<String>] An array containing [title, date, datetime, filename].
74
+ def self.engineer(directory, message, type)
75
+ self.create_directory(directory)
76
+ # abort("Rake aborted: #{directory} directory not found.") unless FileTest.directory?(directory)
77
+ begin
78
+ print "#{message}\n>>> ".blue
79
+ title = STDIN.gets.chomp
80
+ rescue Interrupt
81
+ puts "\n[!] Approached by the user".yellow
82
+ exit!
83
+ end
84
+
85
+ slug = slug_generator(title)
86
+ date = datetime_generator('%Y-%m-%d')
87
+ datetime = datetime_generator('%Y-%m-%d %R:%S')
88
+
89
+ if type == 'page'
90
+ filename = File.join(directory, "#{slug}.#{CONFIG['markdown_extension']}")
91
+ else
92
+ filename = File.join(directory, "#{date}-#{slug}.#{CONFIG['markdown_extension']}")
93
+ end
94
+
95
+ if File.exist?(filename)
96
+ answer = confirm("#{filename} already exists. Do you want to overwrite?")
97
+ abort("Action aborted by user!") if answer == 'n'
98
+ end
99
+
100
+ [title, date, datetime, filename]
101
+ end
102
+ end
103
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rawfeed
4
- VERSION = "0.3.1"
4
+ VERSION = "1.0.1"
5
5
  end
@@ -2,6 +2,7 @@
2
2
  require "json"
3
3
  require "date"
4
4
  require "jekyll"
5
+ require "rawfeed/root"
5
6
 
6
7
  module Rawfeed
7
8
  module Datelang
@@ -14,21 +15,19 @@ module Rawfeed
14
15
  def render(context)
15
16
  site = context.registers[:site]
16
17
  page = context.registers[:page] || {}
17
- options = site.data['options']
18
+ generic = site.data['generic']
18
19
 
19
- locale = options.dig("datelang", "lang") || "en_US"
20
-
21
- json_path = File.join(site.source, "assets", "json", "datelang.json")
22
- json_path = File.expand_path("../../assets/json/datelang.json", __dir__) unless File.exist?(json_path)
20
+ json_path = File.join(Rawfeed::ROOT, "assets", "json", "datelang.json")
23
21
 
24
22
  return "[datelang error: datelang.json not found]" unless File.exist?(json_path)
25
23
 
26
24
  translations = JSON.parse(File.read(json_path))
25
+ locale = generic.dig("datelang", "lang") || "en_US"
27
26
  data = translations[locale] || translations["en_US"]
28
27
 
29
28
  args = parse_args(@markup, context)
30
29
  date_input = args[:date] || page["date"] || page[:date]
31
- format = args[:format] || "%b %-d, %Y"
30
+ format = args[:format] || generic.dig("datelang", "format") || "%b %-d, %Y"
32
31
 
33
32
  return "[datelang: no date]" unless date_input && date_input.to_s.strip != ""
34
33
 
@@ -1,7 +1,7 @@
1
1
  # pub.rb
2
2
 
3
3
  module Jekyll
4
- # Define a página que será gerada dinamicamente para cada diretório
4
+ # Defines the page that will be dynamically generated for each directory.
5
5
  class DirectoryListingPage < Page
6
6
  def initialize(site, base, dir, files_and_dirs)
7
7
  @site = site
@@ -11,60 +11,62 @@ module Jekyll
11
11
  @layout_name = 'pub.html'
12
12
 
13
13
  self.process(@name)
14
- theme_layouts = File.join(site.theme.root, "_layouts")
14
+ theme_root = site.theme&.root || File.join(site.source, "_layouts")
15
+ theme_layouts = File.join(theme_root, "_layouts")
15
16
  self.read_yaml(theme_layouts, "pub.html")
16
17
  # # Note: This is for _plugins/
17
18
  # self.read_yaml(File.join(base, '_layouts'), 'pub.html')
18
19
 
19
- # Define o permalink correto para a página de índice
20
- # Garante que 'pub/sub/index.html' tenha o permalink '/pub/sub/'
20
+ # Defines the correct permalink for the index page
21
+ # Ensures that 'pub/sub/index.html' has the permalink '/pub/sub/'
21
22
  self.data['permalink'] = "/#{dir}/"
22
23
 
23
- # Título (opcional, pode ser formatado no layout)
24
+ # Title (optional, can be formatted in the layout)
24
25
  self.data['title'] = File.basename(dir).capitalize
25
26
 
26
- # A MÁGICA: Injeta a lista de conteúdo no objeto da página
27
+ # THE MAGIC: Injects the content list into the page object.
27
28
  self.data['directory_contents'] = files_and_dirs
28
29
  self.data['layout'] = 'pub'
29
30
  end
30
31
  end
31
32
 
32
- # O gerador que executa o escaneamento recursivo
33
+ # The generator that performs the recursive scan.
33
34
  class DirectoryListingGenerator < Generator
34
35
  safe true
35
36
  priority :normal
36
37
 
37
- # Diretório principal que você deseja listar
38
+ # Main directory you want to list
38
39
  PUB_DIR = 'pub'
39
40
 
40
41
  def generate(site)
41
- # Pega todos os arquivos e diretórios dentro de PUB_DIR
42
- # Exclui o PUB_DIR raiz em si.
42
+ # Extracts all files and directories within PUB_DIR
43
+ # Deletes the root PUB_DIR itself.
43
44
  all_paths = Dir.glob("#{PUB_DIR}/**/{" + '*' + ",.*}")
44
45
 
45
- # Itera sobre cada item encontrado e agrupa por diretório pai
46
+ # Iterates over each item found and groups by parent directory.
46
47
  directory_map = {}
47
48
 
48
49
  all_paths.each do |path|
49
- # Ignora arquivos/diretórios que o Jekyll processa ou ignora
50
- next if path.start_with?('_') || path.start_with?('.')
51
- next if File.basename(path) == 'index.html'
50
+ # It ignores files/directories that Jekyll already processes or ignores.
51
+ basename = File.basename(path)
52
+ next if basename.start_with?('_') || basename.start_with?('.')
53
+ next if basename == 'index.html'
52
54
 
53
- # Determina o diretório pai (o que vai ter o index.html gerado)
55
+ # Specifies the parent directory (the one where the generated index.html file will be located).
54
56
  parent_dir = File.dirname(path)
55
57
  parent_dir = PUB_DIR if parent_dir == '.'
56
58
 
57
- # Inicializa a lista se for a primeira vez
59
+ # Initialize the list if it's the first time.
58
60
  directory_map[parent_dir] ||= []
59
61
 
60
- # Determina o tipo e prepara os dados
62
+ # It determines the type and prepares the data.
61
63
  if File.directory?(path)
62
- # Se for um diretório, adiciona a barra final para URL
64
+ # If it's a directory, add the trailing slash for URL.
63
65
  type = 'directory'
64
66
  url = "/#{path}/"
65
67
  size = ''
66
68
  date = File.mtime(path)
67
- # Adiciona apenas se o diretório não estiver vazio
69
+ # It only adds if the directory is not empty.
68
70
  directory_map[parent_dir] << {
69
71
  'name' => File.basename(path),
70
72
  'type' => type,
@@ -72,13 +74,13 @@ module Jekyll
72
74
  'date' => date
73
75
  } unless Dir.empty?(path)
74
76
  else
75
- # Se for um arquivo
77
+ # If it's a file
76
78
  type = 'file'
77
79
  url = "/#{path}"
78
- size = File.size(path) # Tamanho em bytes
80
+ size = File.size(path)
79
81
  date = File.mtime(path)
80
82
 
81
- # Adiciona o item ao seu diretório pai
83
+ # Add the item to its parent directory.
82
84
  directory_map[parent_dir] << {
83
85
  'name' => File.basename(path),
84
86
  'type' => type,
@@ -89,25 +91,25 @@ module Jekyll
89
91
  end
90
92
  end
91
93
 
92
- # Cria as páginas de listagem dinamicamente
94
+ # Creates listing pages dynamically.
93
95
  directory_map.each do |dir_path, contents|
94
- # Classifica por tipo (diretórios primeiro), depois por nome
96
+ # Sort by type (directories first), then by name.
95
97
  sorted_contents = contents.sort_by do |item|
96
98
  [item['type'] == 'file' ? 1 : 0, item['name'].downcase]
97
99
  end
98
100
 
99
- # Lógica para a entrada de navegação '..'
101
+ # Logic for the navigation input '..'
100
102
  parent_url = nil
101
103
  parent_name = '../'
102
104
 
103
105
  if dir_path == PUB_DIR
104
- # Caso especial: se estiver na raiz 'pub/', o pai é a raiz do site '/'
106
+ # Special case: if it's in the root 'pub/', the parent is the root of the site '/'.
105
107
  parent_url = '/'
106
108
  else
107
- # Para todos os outros subdiretórios (ex: pub/subpasta)
109
+ # For all other subdirectories (e.g. pub/subfolder)
108
110
  parent_dir = File.dirname(dir_path)
109
111
 
110
- # Garante que 'pub' não se torne '.' e que o URL termine em barra
112
+ # Ensures that 'pub' doesn't become '.' and that the URL doesn't end in a slash.
111
113
  if parent_dir == PUB_DIR
112
114
  parent_url = "/#{PUB_DIR}/"
113
115
  else
@@ -115,14 +117,14 @@ module Jekyll
115
117
  end
116
118
  end
117
119
 
118
- # Adiciona a entrada de navegação para o diretório pai
120
+ # Adds the navigation entry for the parent directory.
119
121
  sorted_contents.unshift({
120
122
  'name' => parent_name,
121
123
  'type' => 'parent',
122
124
  'url' => parent_url
123
125
  })
124
126
 
125
- # # Adiciona a página ".." para navegar de volta, exceto para o pub/ raiz
127
+ # # Adds the ".." page for back navigation, except for the pub/root directory.
126
128
  # unless dir_path == PUB_DIR
127
129
  # parent_url = File.dirname(dir_path)
128
130
  # parent_url = '/' if parent_url == '.'
@@ -135,7 +137,7 @@ module Jekyll
135
137
  # })
136
138
  # end
137
139
 
138
- # Cria a nova página e a adiciona ao site
140
+ # Create the new page and add it to the website.
139
141
  page = DirectoryListingPage.new(site, site.source, dir_path, sorted_contents)
140
142
  site.pages << page
141
143
  end
@@ -4,10 +4,11 @@ module Rawfeed
4
4
  module ReadingTimeFilter
5
5
  def reading_time(input)
6
6
  site = Jekyll.sites.first rescue nil
7
- options_data = site&.data&.dig("options") rescue {}
8
- words_per_minute = options_data&.dig("reading_time", "words_per_minute") || 180
9
- message = options_data&.dig("reading_time", "message") || ["Read this post in", "Read this post in less than"]
10
- minutes_text = options_data&.dig("reading_time", "minutes_label") || ["minute", "minutes"]
7
+ # blog_data = site.data['screen', 'blog'] rescue {}
8
+ blog_data = site&.data&.dig("screen", "blog") rescue {}
9
+ words_per_minute = blog_data&.dig("post", "reading_time", "words_per_minute") || 180
10
+ message = blog_data&.dig("post", "reading_time", "message") || ["Read this post in", "Read this post in less than"]
11
+ minutes_text = blog_data&.dig("post", "reading_time", "minutes_label") || ["minute", "minutes"]
11
12
  words = input.split.size;
12
13
  minutes = ( words / words_per_minute ).floor
13
14
  minutes_label = minutes == 1 ? "#{minutes_text[0]}" : "#{minutes_text[1]}"
@@ -0,0 +1,3 @@
1
+ module Rawfeed
2
+ ROOT = File.expand_path("../..", __dir__)
3
+ end
data/lib/rawfeed.rb CHANGED
@@ -1,17 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
  # author: William C. Canin
3
3
 
4
- require_relative "rawfeed/version"
5
- require_relative "rawfeed/draft"
6
- require_relative "rawfeed/post"
7
- require_relative "rawfeed/page"
8
- require_relative "rawfeed/resume"
9
- require_relative "rawfeed/layout"
10
- require_relative "rawfeed/pixel"
11
- require_relative "rawfeed/author"
12
- require "rawfeed/datelang"
13
- require "rawfeed/reading_time"
14
- require "rawfeed/with_class"
15
- require "rawfeed/pub"
16
- # require "rawfeed/csp_filters"
17
- # require "rawfeed/typescript_liquid"
4
+ # Core
5
+ require_relative "rawfeed/core/version"
6
+ require_relative "rawfeed/core/utils"
7
+ require_relative "rawfeed/core/layout"
8
+ require_relative "rawfeed/build"
9
+
10
+ # Commands
11
+ require_relative "rawfeed/command/installer"
12
+ require_relative "rawfeed/command/cli"
13
+ require_relative "rawfeed/command/backup"
14
+ require_relative "rawfeed/command/tools"
15
+
16
+ # Content Generators
17
+ require_relative "rawfeed/content/author"
18
+ require_relative "rawfeed/content/draft"
19
+ require_relative "rawfeed/content/page"
20
+ require_relative "rawfeed/content/donate"
21
+ require_relative "rawfeed/content/contact"
22
+ require_relative "rawfeed/content/licenses"
23
+ require_relative "rawfeed/content/pixel"
24
+ require_relative "rawfeed/content/post"
25
+ require_relative "rawfeed/content/resume"
26
+
27
+ # Jekyll Plugins (optional for CLI-only usage)
28
+ begin
29
+ require "jekyll" unless defined?(Jekyll)
30
+ rescue LoadError
31
+ # Keep CLI features available even when Jekyll is not installed.
32
+ end
33
+
34
+ if defined?(Jekyll)
35
+ require_relative "rawfeed/plugin/datelang"
36
+ require_relative "rawfeed/plugin/pub"
37
+ require_relative "rawfeed/plugin/reading_time"
38
+ require_relative "rawfeed/plugin/with_class"
39
+ end
data/pixels/index.md ADDED
@@ -0,0 +1,11 @@
1
+ ---
2
+ layout: pixels/index
3
+ author: "William C. Canin"
4
+ title: "Pixels"
5
+ description: |
6
+ Here is my day to day life as a photographer
7
+ published: true
8
+ permalink: /pixels/
9
+ ---
10
+
11
+ <!-- There is no need to put anything here -->
data/robots.txt ADDED
@@ -0,0 +1,26 @@
1
+ # robots.tx default - Generated by rawfeed-jekyll
2
+ # Note: Add other pages you create here in Allow.
3
+ User-agent: *
4
+ Allow: /
5
+ Allow: /blog/
6
+ Allow: /contact/
7
+ Allow: /donate/
8
+ Allow: /licenses/
9
+ Allow: /pixels/
10
+ Allow: /resume/
11
+
12
+ # Block system files and licenses
13
+ Disallow: /LICENSE
14
+ Disallow: /README.md
15
+ Disallow: /CNAME
16
+ Disallow: /feed.xml
17
+
18
+ # Block assets that do not need to be indexed individually.
19
+ Disallow: /assets/js/
20
+ Disallow: /assets/css/
21
+
22
+ # Prevent indexing of error pages.
23
+ Disallow: /404.html
24
+
25
+ # Change the URL to your website's sitemap.xml.
26
+ Sitemap: http://your_website_URL/sitemap.xml