rawfeed 0.1.4 → 0.2.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/LICENSE.txt +20 -21
- data/README.md +12 -130
- data/_data/options.yml +270 -0
- data/_data/resume.yml +8 -8
- data/_includes/alert +3 -1
- data/_includes/chart +13 -32
- data/_includes/details +1 -57
- data/_includes/image +12 -4
- data/_includes/layout/blog_search.html +6 -4
- data/_includes/layout/data.liquid +21 -3
- data/_includes/layout/disqus.html +12 -26
- data/_includes/layout/footer.html +33 -17
- data/_includes/layout/giscus.html +27 -19
- data/_includes/layout/head.html +41 -41
- data/_includes/layout/header.html +127 -101
- data/_includes/layout/maintenance.html +6 -10
- data/_includes/layout/paginator.html +6 -4
- data/_includes/socials +7 -5
- data/_includes/tabs +1 -94
- data/_includes/toc +11 -194
- data/_includes/video +4 -1
- data/_layouts/blog.html +8 -7
- data/_layouts/contact.html +90 -196
- data/_layouts/default.html +42 -341
- data/_layouts/error.html +6 -4
- data/_layouts/home.html +45 -36
- data/_layouts/licenses.html +10 -0
- data/_layouts/page.html +4 -4
- data/_layouts/pixel.html +48 -0
- data/_layouts/pixels.html +71 -1
- data/_layouts/post.html +28 -29
- data/_layouts/resume.html +41 -34
- data/_layouts/tag.html +14 -3
- data/_layouts/tag_posts.html +3 -3
- data/_sass/base/_index.scss +39 -3
- data/_sass/components/_badges.scss +10 -0
- data/_sass/components/_markdown.scss +8 -5
- data/_sass/includes/_footer.scss +5 -2
- data/_sass/includes/_header.scss +23 -19
- data/_sass/includes/_highlight.scss +20 -7
- data/_sass/includes/_maintenance.scss +2 -3
- data/_sass/includes/_terminal.scss +35 -12
- data/_sass/layouts/_blog.scss +13 -9
- data/_sass/layouts/_contact.scss +6 -5
- data/_sass/layouts/_default.scss +5 -5
- data/_sass/layouts/_index.scss +3 -0
- data/_sass/layouts/_licenses.scss +7 -0
- data/_sass/layouts/_page.scss +1 -0
- data/_sass/layouts/_pixel.scss +61 -0
- data/_sass/layouts/_pixels.scss +86 -0
- data/_sass/layouts/_post.scss +4 -11
- data/_sass/layouts/_resume.scss +16 -3
- data/_sass/layouts/_tag-posts.scss +1 -2
- data/_sass/layouts/_tag.scss +12 -1
- data/_sass/main.scss +16 -1
- data/_sass/theme/_dark.scss +8 -1
- data/_sass/theme/_light.scss +8 -1
- data/assets/images/blog/.keep +0 -0
- data/assets/images/pixels/luffy.jpg +0 -0
- data/assets/js/blog.coffee +102 -0
- data/assets/js/contact.coffee +105 -0
- data/assets/js/default.coffee +172 -0
- data/assets/js/discus.coffee +30 -0
- data/assets/js/fallback/README.md +3 -0
- data/assets/js/fallback/blog.js +113 -0
- data/assets/js/fallback/contact.js +116 -0
- data/assets/js/{default.js → fallback/default.js} +50 -0
- data/assets/js/fallback/discus.js +32 -0
- data/{_includes/layout/google_analytics.html → assets/js/fallback/google_analytics.js} +7 -3
- data/assets/js/fallback/home.js +275 -0
- data/assets/js/fallback/no_inframe.js +4 -0
- data/assets/js/fallback/page.js +423 -0
- data/assets/js/fallback/pixels.js +1 -0
- data/assets/js/fallback/resume.js +13 -0
- data/assets/js/fallback/tags.js +1 -0
- data/{_includes/layout/capture_scripts.liquid → assets/js/fallback/theme_load.js} +0 -2
- data/assets/js/google_analytics.coffee +24 -0
- data/assets/js/home.coffee +250 -0
- data/assets/js/no_inframe.coffee +9 -0
- data/assets/js/page.coffee +379 -0
- data/assets/js/pixels.coffee +2 -0
- data/assets/js/resume.coffee +9 -0
- data/assets/js/tags.coffee +2 -0
- data/assets/js/theme_load.coffee +6 -0
- data/assets/json/blog_search.json +2 -2
- data/lib/rawfeed/author.rb +59 -0
- data/lib/rawfeed/csp_filters.rb +3 -0
- data/lib/rawfeed/draft.rb +1 -1
- data/lib/rawfeed/layout.rb +7 -0
- data/lib/rawfeed/page.rb +2 -2
- data/lib/rawfeed/pixel.rb +32 -0
- data/lib/rawfeed/post.rb +2 -2
- data/lib/rawfeed/resume.rb +1 -0
- data/lib/rawfeed/typescript_liquid.rb +172 -0
- data/lib/rawfeed/utils.rb +1 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed/with_class.rb +20 -0
- data/lib/rawfeed.rb +5 -1
- metadata +44 -12
- data/assets/js/avatar.js +0 -59
- data/assets/js/terminal.js +0 -18
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
layout: none
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
{%-
|
|
5
|
+
{%- include layout/data.liquid -%}
|
|
6
6
|
|
|
7
7
|
[
|
|
8
8
|
{% for post in site.posts %}
|
|
@@ -10,7 +10,7 @@ layout: none
|
|
|
10
10
|
"title" : "{{ post.title | escape }}",
|
|
11
11
|
"tags" : "{{ post.tags | join: ', ' }}",
|
|
12
12
|
"url" : "{{ site.baseurl }}{{ post.url }}",
|
|
13
|
-
"date" : "{% datelang post.date format:
|
|
13
|
+
"date" : "{% datelang post.date format:datelang_.format %}"
|
|
14
14
|
} {% unless forloop.last %},{% endunless %}
|
|
15
15
|
{% endfor %}
|
|
16
16
|
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "jekyll"
|
|
4
|
+
require "fileutils"
|
|
5
|
+
require "yaml"
|
|
6
|
+
|
|
7
|
+
module Jekyll
|
|
8
|
+
class AuthorGenerator < Generator
|
|
9
|
+
safe true
|
|
10
|
+
priority :low
|
|
11
|
+
|
|
12
|
+
def generate(site)
|
|
13
|
+
options_yml = File.join(site.source, "_data", "options.yml")
|
|
14
|
+
|
|
15
|
+
unless File.exist?(options_yml)
|
|
16
|
+
Jekyll.logger.error "[AuthorPlugin]", "File _data/options.yml not found!"
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
options_data = YAML.load_file(options_yml)
|
|
21
|
+
author_value = options_data["author"]
|
|
22
|
+
|
|
23
|
+
unless author_value
|
|
24
|
+
Jekyll.logger.warn "[AuthorPlugin]", "Field 'author' not found in options.yml."
|
|
25
|
+
return
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
targets = [
|
|
29
|
+
"index.md",
|
|
30
|
+
"blog/index.md",
|
|
31
|
+
"blog/tags/index.md",
|
|
32
|
+
"pixels/index.md"
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
targets.each do |relative_path|
|
|
36
|
+
abs_path = File.join(site.source, relative_path)
|
|
37
|
+
next unless File.exist?(abs_path)
|
|
38
|
+
|
|
39
|
+
content = File.read(abs_path)
|
|
40
|
+
updated = nil
|
|
41
|
+
|
|
42
|
+
if content =~ /^author:\s*.+$/
|
|
43
|
+
updated = content.gsub(/^author:\s*.+$/, "author: \"#{author_value}\"")
|
|
44
|
+
elsif content =~ /\A---\s*\n/ # insere logo depois do primeiro ---
|
|
45
|
+
updated = content.sub(/\A(---\s*\n)/, "\\1author: \"#{author_value}\"\n")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
if updated && updated != content
|
|
49
|
+
File.write(abs_path, updated)
|
|
50
|
+
Jekyll.logger.info "[AuthorPlugin]", "Updated #{relative_path} → author: #{author_value}"
|
|
51
|
+
else
|
|
52
|
+
Jekyll.logger.debug "[AuthorPlugin]", "No changes to #{relative_path}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
rescue StandardError => e
|
|
56
|
+
Jekyll.logger.error "[AuthorPlugin]", "Error: #{e.message}"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/lib/rawfeed/csp_filters.rb
CHANGED
|
@@ -2,6 +2,9 @@ require "jekyll"
|
|
|
2
2
|
require 'digest'
|
|
3
3
|
require 'base64'
|
|
4
4
|
|
|
5
|
+
# TODO: Note: If you have an inline script, generate a hash of it for CSP
|
|
6
|
+
# By default, this functionality is not being used because the project does not have any
|
|
7
|
+
# inline scripts. Module disabled!
|
|
5
8
|
module Rawfeed
|
|
6
9
|
module CspFilters
|
|
7
10
|
# Generates a SHA256 hash and encodes it in Base64, ready for use in a CSP.
|
data/lib/rawfeed/draft.rb
CHANGED
|
@@ -13,9 +13,9 @@ module Rawfeed
|
|
|
13
13
|
File.open(array[3], 'w') do |file|
|
|
14
14
|
file.puts("---")
|
|
15
15
|
file.puts("layout: post")
|
|
16
|
+
file.puts("author: # \"Your Name\"")
|
|
16
17
|
file.puts("title: \"#{array[0]}\"")
|
|
17
18
|
file.puts("description: \"Description of your post\"")
|
|
18
|
-
file.puts("author: \"Your Name\"")
|
|
19
19
|
file.puts("date: #{array[2]} -0300")
|
|
20
20
|
file.puts("update_date: ")
|
|
21
21
|
file.puts("comments: false")
|
data/lib/rawfeed/layout.rb
CHANGED
|
@@ -127,6 +127,13 @@ module Rawfeed
|
|
|
127
127
|
File.write(file, updated)
|
|
128
128
|
end
|
|
129
129
|
|
|
130
|
+
def self.pixels_index(value)
|
|
131
|
+
file = "pixels/index.md"
|
|
132
|
+
content = File.read(file)
|
|
133
|
+
updated = content.gsub(/^published:\s*\S+$/, "published: #{value}")
|
|
134
|
+
File.write(file, updated)
|
|
135
|
+
end
|
|
136
|
+
|
|
130
137
|
def self.tags_index(value)
|
|
131
138
|
file = "blog/tags/index.md"
|
|
132
139
|
content = File.read(file)
|
data/lib/rawfeed/page.rb
CHANGED
|
@@ -14,10 +14,10 @@ module Rawfeed
|
|
|
14
14
|
File.open(array[3], 'w') do |file|
|
|
15
15
|
file.puts("---")
|
|
16
16
|
file.puts("layout: page")
|
|
17
|
-
file.puts("
|
|
17
|
+
file.puts("author: # \"Your Name\"")
|
|
18
18
|
file.puts("title: \"#{array[0]}\"")
|
|
19
|
+
file.puts("order: #number")
|
|
19
20
|
file.puts("emoji: 😃 # Add an emoji to the page menu or leave it blank")
|
|
20
|
-
file.puts("author: \"Your Name\"")
|
|
21
21
|
file.puts("date: #{array[2]} -0300")
|
|
22
22
|
file.puts("update_date: ")
|
|
23
23
|
file.puts("in_menu: true")
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require "colorize"
|
|
4
|
+
require_relative "utils"
|
|
5
|
+
|
|
6
|
+
module Rawfeed
|
|
7
|
+
class Pixel
|
|
8
|
+
def self.pixel_create
|
|
9
|
+
array = Rawfeed::Utils.enginer(Rawfeed::CONFIG['PIXELS_DIR'], 'Enter new pixel title:', 'pixel')
|
|
10
|
+
|
|
11
|
+
puts "Creating new pixel: #{array[3]}"
|
|
12
|
+
|
|
13
|
+
File.open(array[3], 'w') do |file|
|
|
14
|
+
file.puts("---")
|
|
15
|
+
file.puts("layout: pixel")
|
|
16
|
+
file.puts("author: # \"Your Name\"")
|
|
17
|
+
file.puts("title: \"#{array[0]}\"")
|
|
18
|
+
file.puts("description: \"Description of your post\"")
|
|
19
|
+
file.puts("image:")
|
|
20
|
+
file.puts(" path: # /assets/images/pixels/example.jpg")
|
|
21
|
+
file.puts(" caption: ")
|
|
22
|
+
file.puts("date: #{array[2]} -0300")
|
|
23
|
+
file.puts("---")
|
|
24
|
+
file.puts("")
|
|
25
|
+
file.puts "<!-- Write from here your post !!! -->"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
puts "Created successfully!"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
data/lib/rawfeed/post.rb
CHANGED
|
@@ -5,7 +5,7 @@ require_relative "utils"
|
|
|
5
5
|
|
|
6
6
|
module Rawfeed
|
|
7
7
|
class Post
|
|
8
|
-
def self.
|
|
8
|
+
def self.post
|
|
9
9
|
drafts = Dir.glob(File.join(Rawfeed::CONFIG['DRAFTS_DIR'], "*.#{Rawfeed::CONFIG['markdown_extension']}"))
|
|
10
10
|
|
|
11
11
|
if drafts.empty?
|
|
@@ -13,7 +13,7 @@ module Rawfeed
|
|
|
13
13
|
return
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
puts "Select the file to move:\n".
|
|
16
|
+
puts "Select the file to move:\n".cyan
|
|
17
17
|
|
|
18
18
|
drafts.each_with_index do |file, index|
|
|
19
19
|
puts "#{index + 1} - #{File.basename(file)}"
|
data/lib/rawfeed/resume.rb
CHANGED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "jekyll"
|
|
3
|
+
require "open3"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
require "tempfile"
|
|
6
|
+
require "fileutils"
|
|
7
|
+
require "shellwords"
|
|
8
|
+
require "json"
|
|
9
|
+
|
|
10
|
+
# TODO: Note: A functional module for writing TypeScript with Liquid support. The project currently uses CoffeeScript, so this module is disabled.
|
|
11
|
+
|
|
12
|
+
# Install: npm install --save-dev typescript
|
|
13
|
+
#
|
|
14
|
+
# Default tsconfig.json:
|
|
15
|
+
# {
|
|
16
|
+
# "compilerOptions": {
|
|
17
|
+
# "target": "es6",
|
|
18
|
+
# "strict": true
|
|
19
|
+
# },
|
|
20
|
+
# "exclude": [
|
|
21
|
+
# "node_modules",
|
|
22
|
+
# ".bundle-cache",
|
|
23
|
+
# "tmp",
|
|
24
|
+
# "tools",
|
|
25
|
+
# "_site",
|
|
26
|
+
# ]
|
|
27
|
+
# }
|
|
28
|
+
|
|
29
|
+
module Jekyll
|
|
30
|
+
class TypeScriptGenerator < Generator
|
|
31
|
+
safe true
|
|
32
|
+
priority :low
|
|
33
|
+
|
|
34
|
+
def generate(site)
|
|
35
|
+
Jekyll.logger.info "[PLUGIN TS] Plugin TypeScript carregado!"
|
|
36
|
+
ts_config_path = File.join(site.source, "tsconfig.json")
|
|
37
|
+
|
|
38
|
+
unless File.exist?(ts_config_path)
|
|
39
|
+
Jekyll.logger.error "[PLUGIN TS]", "tsconfig.json não encontrado!"
|
|
40
|
+
return
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
source_dir = File.join(site.source, "assets", "ts")
|
|
44
|
+
output_dir_source = File.join(site.source, "assets", "js") # escreve no source para ser copiado
|
|
45
|
+
FileUtils.mkdir_p(output_dir_source)
|
|
46
|
+
|
|
47
|
+
unless Dir.exist?(source_dir)
|
|
48
|
+
Jekyll.logger.info "[PLUGIN TS] nenhum diretório assets/ts encontrado (procure por #{source_dir})"
|
|
49
|
+
return
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
Dir.glob(File.join(source_dir, "**", "*.ts")).each do |ts_file|
|
|
53
|
+
process_ts_file(site, ts_config_path, ts_file, source_dir, output_dir_source)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def process_ts_file(site, ts_config_path, ts_file, source_dir, output_dir_source)
|
|
60
|
+
rel_path = ts_file.sub(/^#{Regexp.escape(source_dir)}\//, "")
|
|
61
|
+
js_rel = rel_path.sub(/\.ts$/, ".js")
|
|
62
|
+
js_output_path_source = File.join(output_dir_source, js_rel)
|
|
63
|
+
FileUtils.mkdir_p(File.dirname(js_output_path_source))
|
|
64
|
+
|
|
65
|
+
Jekyll.logger.info "[PLUGIN TS] processando #{rel_path}"
|
|
66
|
+
|
|
67
|
+
raw_content = File.read(ts_file)
|
|
68
|
+
|
|
69
|
+
# --- 1) remove front matter do arquivo ORIGINAL (antes do render)
|
|
70
|
+
# isto garante que o bloco ---...--- não chegue ao conteúdo final
|
|
71
|
+
content_without_fm = raw_content.sub(/\A---\s*\n.*?\n---\s*\n/m, "")
|
|
72
|
+
|
|
73
|
+
# --- 2) renderiza o Liquid usando o motor do Jekyll (includes, assigns, etc)
|
|
74
|
+
# usamos PageWithoutAFile para obter o contexto completo do site
|
|
75
|
+
liquid_page = Jekyll::PageWithoutAFile.new(site, site.source, File.dirname(ts_file), File.basename(ts_file))
|
|
76
|
+
liquid_page.content = content_without_fm
|
|
77
|
+
# renderiza com o payload do site (disponibiliza includes, site.data, etc)
|
|
78
|
+
liquid_page.render({}, site.site_payload)
|
|
79
|
+
processed_content = liquid_page.output.to_s
|
|
80
|
+
|
|
81
|
+
# --- 3) remove qualquer linha que contenha somente '---' (proteção extra)
|
|
82
|
+
# (remove linhas contendo apenas traços e espaços)
|
|
83
|
+
processed_content = processed_content.gsub(/^\s*-{3,}\s*$\r?\n?/, "")
|
|
84
|
+
|
|
85
|
+
# também remove possíveis linhas vazias no início
|
|
86
|
+
processed_content = processed_content.sub(/\A\s*\r?\n/, "")
|
|
87
|
+
|
|
88
|
+
# debug: mostra as primeiras linhas do que será compilado
|
|
89
|
+
# Jekyll.logger.debug "[PLUGIN TS] preview do conteúdo final:\n#{processed_content.lines.first(12).join}"
|
|
90
|
+
|
|
91
|
+
# --- 4) grava o .ts temporário (no tmpdir)
|
|
92
|
+
tmp_dir = Dir.mktmpdir("jekyll_ts_")
|
|
93
|
+
begin
|
|
94
|
+
tmp_ts = File.join(tmp_dir, File.basename(ts_file))
|
|
95
|
+
|
|
96
|
+
# 1) remove qualquer front matter inicial
|
|
97
|
+
processed_content = processed_content.sub(/\A\s*---\s*\n?/, "")
|
|
98
|
+
|
|
99
|
+
# 2) remove linhas isoladas com apenas ---
|
|
100
|
+
processed_content = processed_content.gsub(/^\s*-{3,}\s*$\r?\n?/, "")
|
|
101
|
+
|
|
102
|
+
File.write(tmp_ts, processed_content)
|
|
103
|
+
File.chmod(0644, tmp_ts) rescue nil
|
|
104
|
+
Jekyll.logger.debug "[PLUGIN TS] tmp ts criado em #{tmp_ts}"
|
|
105
|
+
|
|
106
|
+
# detecta comando tsc como antes (array de tokens)
|
|
107
|
+
tsc_cmd_tokens = detect_tsc_command_tokens(site.source)
|
|
108
|
+
unless tsc_cmd_tokens
|
|
109
|
+
Jekyll.logger.error "[PLUGIN TS] compilador TypeScript não encontrado. Rode `npm install typescript --save-dev` ou assegure npx/tsc no PATH."
|
|
110
|
+
return
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# monta e executa comando com array (evita problemas de escape)
|
|
114
|
+
ts_config = JSON.parse(File.read(ts_config_path))
|
|
115
|
+
target = ts_config.dig("compilerOptions", "target") || "ES5"
|
|
116
|
+
strict = ts_config.dig("compilerOptions", "strict") || false
|
|
117
|
+
cmd_array = tsc_cmd_tokens + ["--target", "#{target}", "--strict", "#{strict}", "--outFile", js_output_path_source, tmp_ts]
|
|
118
|
+
Jekyll.logger.info "[PLUGIN TS] Running → #{cmd_array.shelljoin}"
|
|
119
|
+
|
|
120
|
+
stdout, stderr, status = Open3.capture3(*cmd_array)
|
|
121
|
+
if status.success?
|
|
122
|
+
Jekyll.logger.info "[PLUGIN TS] OK: #{rel_path} -> assets/js/#{js_rel}"
|
|
123
|
+
Jekyll.logger.debug stdout unless stdout.to_s.strip.empty?
|
|
124
|
+
else
|
|
125
|
+
Jekyll.logger.error "[PLUGIN TS] tsc falhou para #{rel_path}:"
|
|
126
|
+
puts stderr.to_s
|
|
127
|
+
puts stdout.to_s unless stdout.to_s.strip.empty?
|
|
128
|
+
end
|
|
129
|
+
ensure
|
|
130
|
+
FileUtils.remove_entry(tmp_dir) if tmp_dir && Dir.exist?(tmp_dir)
|
|
131
|
+
end
|
|
132
|
+
rescue => e
|
|
133
|
+
Jekyll.logger.error "[PLUGIN TS] erro processando #{ts_file}: #{e.class}: #{e.message}"
|
|
134
|
+
puts e.backtrace.join("\n")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def remove_front_matter(content)
|
|
138
|
+
# remove o bloco YAML inicial (--- ... ---) se existir
|
|
139
|
+
content.sub(/\A---\s*\n.*?\n---\s*\n/m, "")
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def render_liquid(site, content)
|
|
143
|
+
# render no contexto do site para que {{ site.url }} e afins sejam resolvidos
|
|
144
|
+
Liquid::Template.parse(content).render(site.site_payload)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Retorna um array de tokens do comando tsc, por exemplo:
|
|
148
|
+
# - ["/path/to/node_modules/.bin/tsc"]
|
|
149
|
+
# - ["/path/to/node_modules/.bin/npx", "tsc"]
|
|
150
|
+
# - ["npx", "tsc"]
|
|
151
|
+
# - ["tsc"]
|
|
152
|
+
def detect_tsc_command_tokens(root)
|
|
153
|
+
local_tsc = File.join(root, "node_modules", ".bin", "tsc")
|
|
154
|
+
return [local_tsc] if File.exist?(local_tsc) && File.executable?(local_tsc)
|
|
155
|
+
|
|
156
|
+
npx_local = File.join(root, "node_modules", ".bin", "npx")
|
|
157
|
+
if File.exist?(npx_local) && File.executable?(npx_local)
|
|
158
|
+
return [npx_local, "tsc"]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# fallback para npx no PATH
|
|
162
|
+
which_npx = `which npx`.strip
|
|
163
|
+
return ["npx", "tsc"] unless which_npx.empty?
|
|
164
|
+
|
|
165
|
+
# fallback para tsc global
|
|
166
|
+
which_tsc = `which tsc`.strip
|
|
167
|
+
return ["tsc"] unless which_tsc.empty?
|
|
168
|
+
|
|
169
|
+
nil
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
data/lib/rawfeed/utils.rb
CHANGED
|
@@ -5,6 +5,7 @@ module Rawfeed
|
|
|
5
5
|
CONFIG = {
|
|
6
6
|
'DRAFTS_DIR' => File.join(".", "_drafts"),
|
|
7
7
|
'POSTS_DIR' => File.join(".", "_posts"),
|
|
8
|
+
'PIXELS_DIR' => File.join(".", "_pixels"),
|
|
8
9
|
'PAGES_DIR' => File.join(".", "_pages"),
|
|
9
10
|
'RESUME_DIR' => File.join(".", "_data"),
|
|
10
11
|
'CONFIG_YML' => File.join(".", "_config.yml"),
|
data/lib/rawfeed/version.rb
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "jekyll"
|
|
2
|
+
require 'digest'
|
|
3
|
+
require 'base64'
|
|
4
|
+
|
|
5
|
+
# Usage: {{ content | wrap_with_class: 'your-class' }}
|
|
6
|
+
|
|
7
|
+
module Rawfeed
|
|
8
|
+
module AddClassHtml
|
|
9
|
+
def with_class(input, class_name)
|
|
10
|
+
return input if input.to_s.strip.empty?
|
|
11
|
+
html_output = "<span class=\"#{class_name}\">#{input.to_s}</span>"
|
|
12
|
+
return html_output
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
alias_method :add_class_html, :with_class
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Liquid::Template.register_filter(Rawfeed::AddClassHtml)
|
data/lib/rawfeed.rb
CHANGED
|
@@ -7,6 +7,10 @@ require_relative "rawfeed/post"
|
|
|
7
7
|
require_relative "rawfeed/page"
|
|
8
8
|
require_relative "rawfeed/resume"
|
|
9
9
|
require_relative "rawfeed/layout"
|
|
10
|
+
require_relative "rawfeed/pixel"
|
|
11
|
+
require_relative "rawfeed/author"
|
|
10
12
|
require "rawfeed/datelang"
|
|
11
13
|
require "rawfeed/reading_time"
|
|
12
|
-
require "rawfeed/
|
|
14
|
+
require "rawfeed/with_class"
|
|
15
|
+
# require "rawfeed/csp_filters"
|
|
16
|
+
# require "rawfeed/typescript_liquid"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rawfeed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- William C. Canin
|
|
@@ -30,19 +30,19 @@ dependencies:
|
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: '5.0'
|
|
32
32
|
- !ruby/object:Gem::Dependency
|
|
33
|
-
name: jekyll-
|
|
33
|
+
name: jekyll-coffeescript
|
|
34
34
|
requirement: !ruby/object:Gem::Requirement
|
|
35
35
|
requirements:
|
|
36
36
|
- - "~>"
|
|
37
37
|
- !ruby/object:Gem::Version
|
|
38
|
-
version: 2.
|
|
38
|
+
version: 2.0.0
|
|
39
39
|
type: :runtime
|
|
40
40
|
prerelease: false
|
|
41
41
|
version_requirements: !ruby/object:Gem::Requirement
|
|
42
42
|
requirements:
|
|
43
43
|
- - "~>"
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
|
-
version: 2.
|
|
45
|
+
version: 2.0.0
|
|
46
46
|
- !ruby/object:Gem::Dependency
|
|
47
47
|
name: jekyll-sitemap
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -135,6 +135,7 @@ extra_rdoc_files: []
|
|
|
135
135
|
files:
|
|
136
136
|
- LICENSE.txt
|
|
137
137
|
- README.md
|
|
138
|
+
- _data/options.yml
|
|
138
139
|
- _data/resume.yml
|
|
139
140
|
- _includes/alert
|
|
140
141
|
- _includes/chart
|
|
@@ -143,12 +144,10 @@ files:
|
|
|
143
144
|
- _includes/endtabs
|
|
144
145
|
- _includes/image
|
|
145
146
|
- _includes/layout/blog_search.html
|
|
146
|
-
- _includes/layout/capture_scripts.liquid
|
|
147
147
|
- _includes/layout/data.liquid
|
|
148
148
|
- _includes/layout/disqus.html
|
|
149
149
|
- _includes/layout/footer.html
|
|
150
150
|
- _includes/layout/giscus.html
|
|
151
|
-
- _includes/layout/google_analytics.html
|
|
152
151
|
- _includes/layout/head.html
|
|
153
152
|
- _includes/layout/header.html
|
|
154
153
|
- _includes/layout/maintenance.html
|
|
@@ -162,7 +161,9 @@ files:
|
|
|
162
161
|
- _layouts/default.html
|
|
163
162
|
- _layouts/error.html
|
|
164
163
|
- _layouts/home.html
|
|
164
|
+
- _layouts/licenses.html
|
|
165
165
|
- _layouts/page.html
|
|
166
|
+
- _layouts/pixel.html
|
|
166
167
|
- _layouts/pixels.html
|
|
167
168
|
- _layouts/post.html
|
|
168
169
|
- _layouts/resume.html
|
|
@@ -192,7 +193,10 @@ files:
|
|
|
192
193
|
- _sass/layouts/_error.scss
|
|
193
194
|
- _sass/layouts/_home.scss
|
|
194
195
|
- _sass/layouts/_index.scss
|
|
196
|
+
- _sass/layouts/_licenses.scss
|
|
195
197
|
- _sass/layouts/_page.scss
|
|
198
|
+
- _sass/layouts/_pixel.scss
|
|
199
|
+
- _sass/layouts/_pixels.scss
|
|
196
200
|
- _sass/layouts/_post.scss
|
|
197
201
|
- _sass/layouts/_resume.scss
|
|
198
202
|
- _sass/layouts/_tag-posts.scss
|
|
@@ -205,10 +209,34 @@ files:
|
|
|
205
209
|
- assets/images/avatar_back.png
|
|
206
210
|
- assets/images/avatar_dark.png
|
|
207
211
|
- assets/images/avatar_light.png
|
|
212
|
+
- assets/images/blog/.keep
|
|
208
213
|
- assets/images/favicon.png
|
|
209
|
-
- assets/
|
|
210
|
-
- assets/js/
|
|
211
|
-
- assets/js/
|
|
214
|
+
- assets/images/pixels/luffy.jpg
|
|
215
|
+
- assets/js/blog.coffee
|
|
216
|
+
- assets/js/contact.coffee
|
|
217
|
+
- assets/js/default.coffee
|
|
218
|
+
- assets/js/discus.coffee
|
|
219
|
+
- assets/js/fallback/README.md
|
|
220
|
+
- assets/js/fallback/blog.js
|
|
221
|
+
- assets/js/fallback/contact.js
|
|
222
|
+
- assets/js/fallback/default.js
|
|
223
|
+
- assets/js/fallback/discus.js
|
|
224
|
+
- assets/js/fallback/google_analytics.js
|
|
225
|
+
- assets/js/fallback/home.js
|
|
226
|
+
- assets/js/fallback/no_inframe.js
|
|
227
|
+
- assets/js/fallback/page.js
|
|
228
|
+
- assets/js/fallback/pixels.js
|
|
229
|
+
- assets/js/fallback/resume.js
|
|
230
|
+
- assets/js/fallback/tags.js
|
|
231
|
+
- assets/js/fallback/theme_load.js
|
|
232
|
+
- assets/js/google_analytics.coffee
|
|
233
|
+
- assets/js/home.coffee
|
|
234
|
+
- assets/js/no_inframe.coffee
|
|
235
|
+
- assets/js/page.coffee
|
|
236
|
+
- assets/js/pixels.coffee
|
|
237
|
+
- assets/js/resume.coffee
|
|
238
|
+
- assets/js/tags.coffee
|
|
239
|
+
- assets/js/theme_load.coffee
|
|
212
240
|
- assets/json/blog_search.json
|
|
213
241
|
- assets/json/datelang.json
|
|
214
242
|
- assets/vendor/bootstrap/css/bootstrap-grid.css
|
|
@@ -258,24 +286,28 @@ files:
|
|
|
258
286
|
- assets/vendor/simple-jekyll-search.js
|
|
259
287
|
- assets/vendor/simple-jekyll-search.min.js
|
|
260
288
|
- lib/rawfeed.rb
|
|
289
|
+
- lib/rawfeed/author.rb
|
|
261
290
|
- lib/rawfeed/csp_filters.rb
|
|
262
291
|
- lib/rawfeed/datelang.rb
|
|
263
292
|
- lib/rawfeed/draft.rb
|
|
264
293
|
- lib/rawfeed/installer.rb
|
|
265
294
|
- lib/rawfeed/layout.rb
|
|
266
295
|
- lib/rawfeed/page.rb
|
|
296
|
+
- lib/rawfeed/pixel.rb
|
|
267
297
|
- lib/rawfeed/post.rb
|
|
268
298
|
- lib/rawfeed/reading_time.rb
|
|
269
299
|
- lib/rawfeed/resume.rb
|
|
300
|
+
- lib/rawfeed/typescript_liquid.rb
|
|
270
301
|
- lib/rawfeed/utils.rb
|
|
271
302
|
- lib/rawfeed/version.rb
|
|
272
|
-
|
|
303
|
+
- lib/rawfeed/with_class.rb
|
|
304
|
+
homepage: https://rawfeed.github.io/rawfeed-jekyll
|
|
273
305
|
licenses:
|
|
274
306
|
- MIT
|
|
275
307
|
metadata:
|
|
276
308
|
allowed_push_host: https://rubygems.org
|
|
277
|
-
source_code_uri: https://github.
|
|
278
|
-
changelog_uri: https://github.
|
|
309
|
+
source_code_uri: https://rawfeed.github.io/rawfeed-jekyll
|
|
310
|
+
changelog_uri: https://rawfeed.github.io/rawfeed-jekyll/blob/main/CHANGELOG.md
|
|
279
311
|
rdoc_options: []
|
|
280
312
|
require_paths:
|
|
281
313
|
- lib
|
data/assets/js/avatar.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/* TODO: Colocar cada script para página ideal, por exemplo:
|
|
2
|
-
home: home.js [terminal]
|
|
3
|
-
blog: blog.js
|
|
4
|
-
tag: tag.js
|
|
5
|
-
default.js será script que contem em todas páginas. [botão de top]
|
|
6
|
-
post: post.js [toc]
|
|
7
|
-
page: page.js
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
11
|
-
// O alvo do clique agora é o contêiner INTERATIVO
|
|
12
|
-
const flipperAvatars = document.querySelectorAll('.avatar-flipper__open-true');
|
|
13
|
-
const modalEl = document.getElementById('avatarModal');
|
|
14
|
-
const modalAvatar = document.getElementById('modalAvatar');
|
|
15
|
-
const header = document.querySelector('.header');
|
|
16
|
-
const bsModal = new bootstrap.Modal(modalEl);
|
|
17
|
-
|
|
18
|
-
flipperAvatars.forEach((flipper) => {
|
|
19
|
-
// Escuta o clique no contêiner inteiro
|
|
20
|
-
flipper.addEventListener("click", () => {
|
|
21
|
-
// Encontra o card que realmente anima
|
|
22
|
-
const card = flipper.querySelector('.avatar-card');
|
|
23
|
-
// Encontra a imagem de TRÁS e pega o seu src ANTES da animação
|
|
24
|
-
const backImage = flipper.querySelector('.avatar-back img');
|
|
25
|
-
const backImageSrc = backImage.src;
|
|
26
|
-
|
|
27
|
-
// Adiciona a classe de animação ao card
|
|
28
|
-
card.classList.add("flip-avatar");
|
|
29
|
-
|
|
30
|
-
card.addEventListener(
|
|
31
|
-
"animationend",
|
|
32
|
-
() => {
|
|
33
|
-
card.classList.remove("flip-avatar");
|
|
34
|
-
|
|
35
|
-
// Usa o src da imagem de trás que guardamos
|
|
36
|
-
modalAvatar.src = backImageSrc;
|
|
37
|
-
|
|
38
|
-
bsModal.show();
|
|
39
|
-
},
|
|
40
|
-
{ once: true }
|
|
41
|
-
);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// quando o modal está visível, escondemos os contêineres (esta parte já estava correta)
|
|
46
|
-
modalEl.addEventListener("shown.bs.modal", () => {
|
|
47
|
-
modalAvatar.classList.remove("modal-avatar");
|
|
48
|
-
void modalAvatar.offsetWidth;
|
|
49
|
-
modalAvatar.classList.add("modal-avatar");
|
|
50
|
-
header.classList.remove("modal-active");
|
|
51
|
-
|
|
52
|
-
flipperAvatars.forEach((flipper) => flipper.classList.add("hidden"));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// quando o modal é fechado, mostramos os contêineres (esta parte já estava correta)
|
|
56
|
-
modalEl.addEventListener("hidden.bs.modal", () => {
|
|
57
|
-
flipperAvatars.forEach((flipper) => flipper.classList.remove("hidden"));
|
|
58
|
-
});
|
|
59
|
-
});
|
data/assets/js/terminal.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
-
/* effects terminal: maximize
|
|
3
|
-
--------------------------------------------------------------------------------------------------
|
|
4
|
-
*/
|
|
5
|
-
const terminal = document.getElementById("terminal");
|
|
6
|
-
|
|
7
|
-
if (!terminal) return;
|
|
8
|
-
|
|
9
|
-
const btnMax = terminal.querySelector(".terminal-header__max");
|
|
10
|
-
|
|
11
|
-
let isFullscreen = false;
|
|
12
|
-
|
|
13
|
-
// maximize/restore
|
|
14
|
-
btnMax.addEventListener("click", () => {
|
|
15
|
-
isFullscreen = !isFullscreen;
|
|
16
|
-
terminal.classList.toggle("terminal-fullscreen", isFullscreen);
|
|
17
|
-
});
|
|
18
|
-
});
|