rawfeed 0.3.1 → 1.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 +4 -4
- data/.editorconfig +25 -0
- data/.gitignore +19 -0
- data/.gitlab/ci/gitlab-pages.yml +51 -0
- data/.hidden +6 -0
- data/404.html +6 -0
- data/Gemfile +51 -0
- data/README.md +102 -26
- data/_config.yml +77 -0
- data/_data/generic.yml +29 -0
- data/_data/screen/blog.yml +46 -0
- data/_data/screen/contact.yml +31 -0
- data/_data/screen/donate.yml +45 -0
- data/_data/screen/footer.yml +17 -0
- data/_data/screen/head.yml +49 -0
- data/_data/screen/home.yml +24 -0
- data/_data/screen/maintenance.yml +8 -0
- data/_data/screen/navbar.yml +41 -0
- data/_data/screen/page.yml +12 -0
- data/_data/screen/pixels.yml +7 -0
- data/_data/screen/pub.yml +4 -0
- data/_data/{resume.yml → screen/resume.yml} +8 -8
- data/_data/screen/socials.yml +20 -0
- data/_includes/assigned +36 -0
- data/_includes/layout/blog_search.html +22 -15
- data/_includes/layout/disqus.html +7 -8
- data/_includes/layout/footer.html +43 -28
- data/_includes/layout/giscus.html +15 -19
- data/_includes/layout/head.html +97 -75
- data/_includes/layout/maintenance.html +14 -11
- data/_includes/layout/navbar.html +253 -0
- data/_includes/layout/paginator.html +12 -13
- data/_includes/{alert → markdown/alert} +2 -2
- data/_includes/{chart → markdown/chart} +3 -3
- data/_includes/{image → markdown/image} +4 -4
- data/_includes/{socials → markdown/socials} +5 -5
- data/_includes/{video → markdown/video} +2 -2
- data/_layouts/blog/index.html +53 -0
- data/_layouts/{post.html → blog/post.html} +50 -36
- data/_layouts/blog/posts_by_tag.html +27 -0
- data/_layouts/blog/tags.html +32 -0
- data/_layouts/contact.html +156 -114
- data/_layouts/default.html +53 -48
- data/_layouts/donate.html +112 -0
- data/_layouts/error.html +9 -7
- data/_layouts/home.html +22 -19
- data/_layouts/licenses.html +2 -2
- data/_layouts/page.html +18 -17
- data/_layouts/pixels/index.html +75 -0
- data/_layouts/{pixel.html → pixels/post.html} +5 -5
- data/_layouts/pub.html +50 -44
- data/_layouts/resume.html +308 -265
- data/_pages/any-page.md +336 -0
- data/_pages/contact.md +16 -0
- data/_pages/donate.md +16 -0
- data/_pages/licenses.md +17 -0
- data/_pages/resume.md +14 -0
- data/_pixels/2025-10-15-first-my-pixel.md +34 -0
- data/_posts/2025-09-20-welcome-to-jekyll.md +36 -0
- data/_posts/2025-09-25-this-post-demonstrates-post-codeblocks.md +141 -0
- data/_posts/2025-09-25-this-post-demonstrates-post-content-styles.md +133 -0
- data/_posts/2025-10-04-content-styles-and-codeblocks.md +330 -0
- data/_sass/components/_markdown.scss +2 -2
- data/_sass/includes/_index.scss +2 -2
- data/_sass/includes/{_header.scss → _navbar.scss} +2 -6
- data/_sass/includes/_toc.scss +146 -0
- data/_sass/layouts/_blog.scss +1 -1
- data/_sass/layouts/_index.scss +2 -2
- data/_sass/layouts/_page.scss +0 -5
- data/_sass/layouts/_post.scss +8 -138
- data/_sass/layouts/{_tag-posts.scss → _posts_by_tag.scss} +3 -3
- data/_sass/layouts/_resume.scss +1 -1
- data/_sass/layouts/{_tag.scss → _tags.scss} +10 -6
- data/_sass/main.scss +2 -2
- data/_sass/theme/_dark.scss +2 -2
- data/_sass/theme/_light.scss +1 -1
- data/assets/js/blog.js +52 -18
- data/assets/js/contact.js +21 -20
- data/assets/js/default.js +67 -50
- data/assets/js/discus.js +2 -2
- data/assets/js/{donation.js → donate.js} +10 -9
- data/assets/js/home.js +18 -16
- data/assets/js/page.js +50 -172
- data/assets/js/toc.js +133 -0
- data/assets/json/blog_search.json +5 -7
- data/assets/vendors/fuse.min.js +9 -0
- data/blog/index.md +14 -0
- data/blog/tags/index.md +12 -0
- data/exe/rawfeed +29 -0
- data/index.md +15 -0
- data/lib/rawfeed/build/cleaner.rb +60 -0
- data/lib/rawfeed/build/image_minifier.rb +163 -0
- data/lib/rawfeed/build/minifier.rb +89 -0
- data/lib/rawfeed/build.rb +9 -0
- data/lib/rawfeed/command/backup.rb +124 -0
- data/lib/rawfeed/command/cli.rb +118 -0
- data/lib/rawfeed/command/installer.rb +156 -0
- data/lib/rawfeed/command/tools.rb +138 -0
- data/lib/rawfeed/{author.rb → content/author.rb} +7 -7
- data/lib/rawfeed/content/contact.rb +51 -0
- data/lib/rawfeed/content/donate.rb +48 -0
- data/lib/rawfeed/{draft.rb → content/draft.rb} +5 -3
- data/lib/rawfeed/content/licenses.rb +46 -0
- data/lib/rawfeed/{page.rb → content/page.rb} +4 -3
- data/lib/rawfeed/{pixel.rb → content/pixel.rb} +7 -4
- data/lib/rawfeed/content/post.rb +107 -0
- data/lib/rawfeed/{resume.rb → content/resume.rb} +23 -19
- data/lib/rawfeed/{layout.rb → core/layout.rb} +1 -1
- data/lib/rawfeed/core/utils.rb +103 -0
- data/lib/rawfeed/{version.rb → core/version.rb} +1 -1
- data/lib/rawfeed/{datelang.rb → plugin/datelang.rb} +5 -6
- data/lib/rawfeed/{pub.rb → plugin/pub.rb} +33 -31
- data/lib/rawfeed/{reading_time.rb → plugin/reading_time.rb} +5 -4
- data/lib/rawfeed/root.rb +3 -0
- data/lib/rawfeed.rb +36 -14
- data/pixels/index.md +11 -0
- data/robots.txt +26 -0
- metadata +153 -195
- data/_data/options.yml +0 -329
- data/_includes/layout/data.liquid +0 -31
- data/_includes/layout/header.html +0 -173
- data/_layouts/blog.html +0 -52
- data/_layouts/donation.html +0 -113
- data/_layouts/pixels.html +0 -71
- data/_layouts/tag.html +0 -33
- data/_layouts/tag_posts.html +0 -28
- data/assets/vendor/simple-jekyll-search.js +0 -433
- data/assets/vendor/simple-jekyll-search.min.js +0 -6
- data/lib/rawfeed/installer.rb +0 -37
- data/lib/rawfeed/post.rb +0 -60
- data/lib/rawfeed/utils.rb +0 -75
- /data/_includes/{details → markdown/details} +0 -0
- /data/_includes/{enddetails → markdown/enddetails} +0 -0
- /data/_includes/{endtabs → markdown/endtabs} +0 -0
- /data/_includes/{tabs → markdown/tabs} +0 -0
- /data/assets/images/{avatar_back.png → avatars/back.png} +0 -0
- /data/assets/images/{avatar_dark.png → avatars/dark.png} +0 -0
- /data/assets/images/{avatar_light.png → avatars/light.png} +0 -0
- /data/assets/images/{icons → donate}/bitcoin.svg +0 -0
- /data/assets/images/{icons → donate}/card.svg +0 -0
- /data/assets/images/{icons → donate}/donation.svg +0 -0
- /data/assets/images/{icons → donate}/lightning_network.svg +0 -0
- /data/assets/images/{icons → donate}/paypal.svg +0 -0
- /data/assets/images/{icons → donate}/pix.svg +0 -0
- /data/assets/images/{qrcode_btc_binance.jpg → donate/qrcode_btc_binance.jpg} +0 -0
- /data/assets/images/{qrcode_inter.jpg → donate/qrcode_inter.jpg} +0 -0
- /data/assets/images/{qrcode_wos.jpg → donate/qrcode_wos.jpg} +0 -0
- /data/assets/images/{icons → donate}/wos.png +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js.map +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js +0 -0
- /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js.map +0 -0
- /data/lib/rawfeed/{csp_filters.rb → plugin/csp_filters.rb} +0 -0
- /data/lib/rawfeed/{typescript_liquid.rb → plugin/typescript_liquid.rb} +0 -0
- /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.
|
|
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.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
@@ -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
|
-
|
|
18
|
+
generic = site.data['generic']
|
|
18
19
|
|
|
19
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
#
|
|
20
|
-
#
|
|
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
|
-
#
|
|
24
|
+
# Title (optional, can be formatted in the layout)
|
|
24
25
|
self.data['title'] = File.basename(dir).capitalize
|
|
25
26
|
|
|
26
|
-
#
|
|
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
|
-
#
|
|
33
|
+
# The generator that performs the recursive scan.
|
|
33
34
|
class DirectoryListingGenerator < Generator
|
|
34
35
|
safe true
|
|
35
36
|
priority :normal
|
|
36
37
|
|
|
37
|
-
#
|
|
38
|
+
# Main directory you want to list
|
|
38
39
|
PUB_DIR = 'pub'
|
|
39
40
|
|
|
40
41
|
def generate(site)
|
|
41
|
-
#
|
|
42
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
50
|
-
|
|
51
|
-
next if
|
|
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
|
-
#
|
|
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
|
-
#
|
|
59
|
+
# Initialize the list if it's the first time.
|
|
58
60
|
directory_map[parent_dir] ||= []
|
|
59
61
|
|
|
60
|
-
#
|
|
62
|
+
# It determines the type and prepares the data.
|
|
61
63
|
if File.directory?(path)
|
|
62
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
77
|
+
# If it's a file
|
|
76
78
|
type = 'file'
|
|
77
79
|
url = "/#{path}"
|
|
78
|
-
size = File.size(path)
|
|
80
|
+
size = File.size(path)
|
|
79
81
|
date = File.mtime(path)
|
|
80
82
|
|
|
81
|
-
#
|
|
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
|
-
#
|
|
94
|
+
# Creates listing pages dynamically.
|
|
93
95
|
directory_map.each do |dir_path, contents|
|
|
94
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
109
|
+
# For all other subdirectories (e.g. pub/subfolder)
|
|
108
110
|
parent_dir = File.dirname(dir_path)
|
|
109
111
|
|
|
110
|
-
#
|
|
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
|
-
#
|
|
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
|
-
# #
|
|
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
|
-
#
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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]}"
|
data/lib/rawfeed/root.rb
ADDED
data/lib/rawfeed.rb
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
# author: William C. Canin
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
require_relative "rawfeed/
|
|
6
|
-
require_relative "rawfeed/
|
|
7
|
-
require_relative "rawfeed/
|
|
8
|
-
require_relative "rawfeed/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
require_relative "rawfeed/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
#
|
|
17
|
-
|
|
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
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
|