rawfeed 0.3.0 → 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
data/_layouts/contact.html
CHANGED
|
@@ -2,91 +2,110 @@
|
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
{%- include
|
|
6
|
-
|
|
7
|
-
{%- if
|
|
8
|
-
|
|
9
|
-
<script
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
5
|
+
{%- include assigned -%}
|
|
6
|
+
|
|
7
|
+
{%- if head.google.recaptcha.pubkey and head.google.apps_script.url -%}
|
|
8
|
+
|
|
9
|
+
<script
|
|
10
|
+
src="https://www.google.com/recaptcha/api.js"
|
|
11
|
+
async
|
|
12
|
+
defer></script>
|
|
13
|
+
|
|
14
|
+
<div id="contact" class="contact{% if default.background_focus %} background_focus{% endif %} {% if default.rounding %} rounding{% endif %}">
|
|
15
|
+
|
|
16
|
+
<div
|
|
17
|
+
class="modal fade"
|
|
18
|
+
id="contactMessageModal"
|
|
19
|
+
tabindex="-1"
|
|
20
|
+
aria-labelledby="contactMessageModalLabel"
|
|
21
|
+
aria-hidden="true"
|
|
22
|
+
data-bs-backdrop="static"
|
|
23
|
+
data-bs-keyboard="false">
|
|
24
|
+
<div class="modal-dialog">
|
|
25
|
+
<div class="modal-content">
|
|
26
|
+
<div class="modal-header">
|
|
27
|
+
<h5 class="modal-title" id="contactMessageModalLabel"></h5>
|
|
28
|
+
<button
|
|
29
|
+
type="button"
|
|
30
|
+
class="btn-close"
|
|
31
|
+
data-bs-dismiss="modal"
|
|
32
|
+
aria-label="Close"></button>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="modal-body"></div>
|
|
25
35
|
</div>
|
|
26
|
-
<div class="modal-body"></div>
|
|
27
36
|
</div>
|
|
28
37
|
</div>
|
|
29
|
-
</div>
|
|
30
38
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
name="email"
|
|
45
|
-
type="email"
|
|
46
|
-
placeholder="{{ contact_.email.placeholder | default: 'Your best email address' }}"
|
|
47
|
-
class="form-control contact-form__email"
|
|
48
|
-
aria-describedby="emailHelp"
|
|
49
|
-
required>
|
|
50
|
-
<div id="emailHelp" class="form-text contact-form__help">
|
|
51
|
-
{{ contact_.email.help | default: "We'll never share your email with anyone else." }}
|
|
39
|
+
<div class="row">
|
|
40
|
+
<span class="contact-title">
|
|
41
|
+
<strong>[ {{ page.title | downcase }} ]</strong>
|
|
42
|
+
</span>
|
|
43
|
+
<form id="contactForm" class="mt-4 contact-form">
|
|
44
|
+
<div class="mb-3">
|
|
45
|
+
<input
|
|
46
|
+
id="inputName"
|
|
47
|
+
name="name"
|
|
48
|
+
type="text"
|
|
49
|
+
placeholder="{{ contact.name.placeholder | default: 'First and last name' }}"
|
|
50
|
+
class="form-control contact-form__name"
|
|
51
|
+
required>
|
|
52
52
|
</div>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
53
|
+
<div class="mb-3">
|
|
54
|
+
<input
|
|
55
|
+
id="inputEmail"
|
|
56
|
+
name="email"
|
|
57
|
+
type="email"
|
|
58
|
+
placeholder="{{ contact.email.placeholder | default: 'Your best email address' }}"
|
|
59
|
+
class="form-control contact-form__email"
|
|
60
|
+
aria-describedby="emailHelp"
|
|
61
|
+
required>
|
|
62
|
+
<div id="emailHelp" class="form-text contact-form__help">
|
|
63
|
+
{{ contact.email.help | default: "We'll never share your email with anyone else." }}
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
<textarea
|
|
67
|
+
id="textMessage"
|
|
68
|
+
name="message"
|
|
69
|
+
class="form-control contact-form__message"
|
|
70
|
+
placeholder="{{ contact.message.placeholder | default: 'Write your message here' }}"
|
|
71
|
+
style="min-height: 150px"
|
|
72
|
+
required></textarea>
|
|
73
|
+
<small style="display: block; font-size: 8pt; opacity: .6">{{ contact.message.characters.warning.content }}</small>
|
|
74
|
+
<!-- TODO: version: 0.3.0 Make reCaptcha change themes instantly -->
|
|
75
|
+
<div
|
|
76
|
+
id="g-recaptcha"
|
|
77
|
+
class="g-recaptcha mt-2"
|
|
78
|
+
data-sitekey="{{ head.google.recaptcha.pubkey }}"
|
|
79
|
+
style="display: inline-block; margin: 5px 0;"></div>
|
|
80
|
+
<div class="d-flex justify-content-end mb-5">
|
|
81
|
+
<button
|
|
82
|
+
id="submitButton"
|
|
83
|
+
type="submit"
|
|
84
|
+
class="btn contact-form__submit">
|
|
85
|
+
{{ contact.button.text | default: 'Send!' }}
|
|
86
|
+
</button>
|
|
87
|
+
</div>
|
|
88
|
+
</form>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="row">
|
|
91
|
+
<div class="contact-content">{{ content }}</div>
|
|
92
|
+
</div>
|
|
74
93
|
</div>
|
|
75
|
-
</div>
|
|
76
94
|
|
|
77
95
|
{%- else -%}
|
|
78
96
|
|
|
79
|
-
<div class="contact-disabled{% if
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
97
|
+
<div class="contact-disabled{% if default.background_focus %} background_focus{% endif %} {% if default.rounding %} rounding{% endif %}">
|
|
98
|
+
<h1 style="background-color: yellow;color: black;padding: 10px">Warning: Email form disabled</h1>
|
|
99
|
+
<p>To use the email submission form, you need to:</p>
|
|
100
|
+
<p>1 - Copy the script below and implement it in
|
|
101
|
+
<a href="https://script.google.com" target="_blank">Google Apps Script</a>:</p>
|
|
102
|
+
<blockquote>
|
|
103
|
+
<p>Note1: Don't forget to change the constants: TO_ADDRESS, SITE, LOGO_URL, MINIMUM_MESSAGE.</p>
|
|
104
|
+
<p>Note2: Without editing the script in Google Apps Script, you will need to redeploy it.</p>
|
|
105
|
+
</blockquote>
|
|
106
|
+
|
|
107
|
+
{% highlight javascript linenos %}
|
|
108
|
+
/**
|
|
90
109
|
* GOOGLE APPS SCRIPT - HYBRID VERSION (RECAPTCHA & TURNSTYLE)
|
|
91
110
|
* by William C. Canin
|
|
92
111
|
*/
|
|
@@ -106,8 +125,8 @@ layout: default
|
|
|
106
125
|
if (!str) return "";
|
|
107
126
|
let clean = str.trim();
|
|
108
127
|
if (isHeader) clean = clean.replace(/[\r\n]/g, "");
|
|
109
|
-
return clean.replace(/[&<>"']/g, function(m) {
|
|
110
|
-
return { '&': '&', '<':
|
|
128
|
+
return clean.replace(/[&<>"']/g, function(m) {
|
|
129
|
+
return { '&': '&', '<':'<','>': '>', '"': '"', "'": ''' }[m];
|
|
111
130
|
});
|
|
112
131
|
}
|
|
113
132
|
|
|
@@ -194,42 +213,54 @@ layout: default
|
|
|
194
213
|
let cleanMessage = escapedContent.replace(/```([\s\S]+?)```/g, function(match, code) {
|
|
195
214
|
const id = codeBlocks.length;
|
|
196
215
|
|
|
197
|
-
const codeHtml = `<pre style="background: #f6f8fa; color: #24292e; padding: 15px; border-radius: 6px; overflow-x: auto; font-family: 'Fira Code','Consolas',SFMono-Regular, SF Mono, Menlo, monospace; font-size: 15px; line-height: 1.85; border: 1px solid #d1d5da; border-bottom: 3px solid #a1a2a7; border-right: 1px solid #a1a2a7; border-top: 1px solid #a1a2a7; border-left: 1px solid #a1a2a7;">${code.trim()}</pre
|
|
216
|
+
const codeHtml = `<pre style="background: #f6f8fa; color: #24292e; padding: 15px; border-radius: 6px; overflow-x: auto; font-family: 'Fira Code','Consolas',SFMono-Regular, SF Mono, Menlo, monospace; font-size: 15px; line-height: 1.85; border: 1px solid #d1d5da; border-bottom: 3px solid #a1a2a7; border-right: 1px solid #a1a2a7; border-top: 1px solid #a1a2a7; border-left: 1px solid #a1a2a7;">${code.trim()}</pre>
|
|
217
|
+
`;
|
|
198
218
|
|
|
199
219
|
codeBlocks.push(codeHtml);
|
|
200
220
|
return placeholder + id + "___";
|
|
201
221
|
});
|
|
202
222
|
|
|
203
|
-
cleanMessage = cleanMessage.replace(/\n/g, '<br>');
|
|
223
|
+
cleanMessage = cleanMessage.replace(/\n/g, '<br>');
|
|
204
224
|
codeBlocks.forEach((block, index) => {
|
|
205
225
|
cleanMessage = cleanMessage.replace(placeholder + index + "___", block);
|
|
206
226
|
});
|
|
207
227
|
|
|
208
228
|
const subject = `Message from: ${name} (${SITE})`;
|
|
209
229
|
const htmlBody = `
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
<div style="font-family: sans-serif; color: #333; max-width: 820px; border: 1px solid #eee; padding: 20px;">
|
|
231
|
+
${LOGO_URL ? `
|
|
232
|
+
<div style="text-align: center; margin-bottom: 20px;">
|
|
233
|
+
<img
|
|
234
|
+
src="${LOGO_URL}"
|
|
235
|
+
alt="Logo"
|
|
236
|
+
style="width: 150px; padding: 10px; border-radius: 50%; border: 1px solid #ddd;">
|
|
237
|
+
</div>
|
|
238
|
+
` : ''}
|
|
239
|
+
|
|
240
|
+
<h2 style="color: #333; border-bottom: 2px solid #333; padding-bottom: 10px;"></h2>
|
|
241
|
+
|
|
242
|
+
<div style="margin-top: 20px;">
|
|
243
|
+
<p>
|
|
244
|
+
<b>Name:</b>
|
|
245
|
+
${name}</p>
|
|
246
|
+
<p>
|
|
247
|
+
<b>From:</b>
|
|
248
|
+
<a href="mailto:${email}">${email}</a>
|
|
249
|
+
</p>
|
|
250
|
+
<p>
|
|
251
|
+
<b>Message:</b>
|
|
252
|
+
</p>
|
|
253
|
+
<div style="background: #fff; font-size: 15px; color: black; border: 1px solid transparent; padding: 15px; border-radius: 5px;">
|
|
254
|
+
${cleanMessage}
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<footer style="margin-top: 30px; font-size: 12px; color: #888; border-top: 1px solid #eee; padding-top: 10px;">
|
|
259
|
+
This is an automated email sent by your form ${pageUrl} using ${antiRobot}/Google Script.<br>
|
|
260
|
+
© ${new Date().getFullYear()} ${SITE.replace('https://', '')} - ${new Date().toLocaleString('pt-BR')} -
|
|
261
|
+
<b>${locationInfo}</b>
|
|
262
|
+
</footer>
|
|
263
|
+
</div>`;
|
|
233
264
|
|
|
234
265
|
MailApp.sendEmail({ to: TO_ADDRESS, subject: subject, htmlBody: htmlBody, replyTo: email });
|
|
235
266
|
|
|
@@ -239,21 +270,32 @@ layout: default
|
|
|
239
270
|
return ContentService.createTextOutput(JSON.stringify({ 'result': 'error', 'debug': err.message })).setMimeType(ContentService.MimeType.JSON);
|
|
240
271
|
}
|
|
241
272
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
273
|
+
{% endhighlight %}
|
|
274
|
+
|
|
275
|
+
<p>2 - Create a
|
|
276
|
+
<a href="https://console.cloud.google.com/security/recaptcha" target="_blank">reCaptcha</a>
|
|
277
|
+
on Google and add the reCaptcha
|
|
278
|
+
<strong>PRIVATE</strong>
|
|
279
|
+
key to the
|
|
280
|
+
<strong>Google Apps Script</strong>
|
|
281
|
+
script property.</p>
|
|
282
|
+
<p>3 - Copy the reCaptcha
|
|
283
|
+
<strong>PUBLIC</strong>
|
|
284
|
+
key and the
|
|
285
|
+
<strong>Google Apps Script</strong>
|
|
286
|
+
URL and place them in
|
|
287
|
+
<strong>_config.yml:</strong>
|
|
288
|
+
</p>
|
|
289
|
+
|
|
290
|
+
{% highlight yml linenos %}
|
|
291
|
+
google:
|
|
250
292
|
###
|
|
251
293
|
###
|
|
252
294
|
apps_script:
|
|
253
295
|
url: "https://script.google.com/macros/s/BuD..."
|
|
254
296
|
recaptcha:
|
|
255
297
|
pubkey: "8Lci194rAAAAA70Sv..."
|
|
256
|
-
|
|
298
|
+
{% endhighlight %}
|
|
257
299
|
|
|
258
|
-
</div>
|
|
259
|
-
{%- endif -%}
|
|
300
|
+
</div>
|
|
301
|
+
{%- endif -%}
|
data/_layouts/default.html
CHANGED
|
@@ -1,62 +1,67 @@
|
|
|
1
1
|
<!-- Theme for Jekyll.rb by: © rawfeed <https://rawfeed.github.io> -->
|
|
2
|
-
{%- include
|
|
2
|
+
{%- include assigned -%}
|
|
3
3
|
|
|
4
|
-
{%- if
|
|
4
|
+
{%- if maintenance.enable != true -%}
|
|
5
|
+
{%- assign index = site.pages | where: 'path', 'index.md' | first -%}
|
|
5
6
|
|
|
6
|
-
{%-
|
|
7
|
+
{%- if home.terminal.enable and page.url == '/' and index.layout == 'home' -%}
|
|
8
|
+
{%- assign default_term = ' default-terminal' -%}
|
|
9
|
+
{%- assign default_style = '' -%}
|
|
10
|
+
{%- else -%}
|
|
11
|
+
{%- assign default_term = '' -%}
|
|
12
|
+
{%- assign width = default.width | default: '860' -%}
|
|
13
|
+
{%- assign default_style = 'max-width: ' | append: width | append: 'px !important;' -%}
|
|
14
|
+
{%- endif -%}
|
|
7
15
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
<!doctype html>
|
|
17
|
+
<html
|
|
18
|
+
id="top"
|
|
19
|
+
lang="{{ default.lang | default: 'en-US' }}"
|
|
20
|
+
data-theme="light">
|
|
21
|
+
<!-- head -->
|
|
22
|
+
{%- include layout/head.html -%}
|
|
23
|
+
<!-- head -->
|
|
16
24
|
|
|
17
|
-
|
|
18
|
-
<
|
|
25
|
+
<!-- body -->
|
|
26
|
+
<body
|
|
27
|
+
data-layout="{{ page.layout | default: '' }}"
|
|
28
|
+
data-terminal-enabled="{{ home.terminal.enable | default: false }}"
|
|
29
|
+
style="
|
|
30
|
+
font-family: {{ default.font.style }} !important;
|
|
31
|
+
font-size: {{ default.font.size }} !important;
|
|
32
|
+
letter-spacing: {{ default.font.spacing }} !important;
|
|
33
|
+
user-select: {{ default.user_select | default: 'none' }};
|
|
34
|
+
">
|
|
35
|
+
<!-- container -->
|
|
36
|
+
<div class="container-fluid">
|
|
37
|
+
{%- include layout/navbar.html -%}
|
|
19
38
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
39
|
+
<div class="default{{default_term}}" style="{{default_style}}">
|
|
40
|
+
<main class="content">{{ content }}</main>
|
|
41
|
+
</div>
|
|
23
42
|
|
|
24
|
-
|
|
25
|
-
<body data-layout="{{ page.layout | default: '' }}"
|
|
26
|
-
data-terminal-enabled="{{ home_.terminal.enable | default: false }}"
|
|
27
|
-
style="
|
|
28
|
-
font-family: {{ default_.font.style }} !important;
|
|
29
|
-
font-size: {{ default_.font.size }} !important;
|
|
30
|
-
letter-spacing: {{ default_.font.spacing }} !important;
|
|
31
|
-
user-select: {{ default_.user_select | default: 'none' }};">
|
|
32
|
-
|
|
33
|
-
<!-- container -->
|
|
34
|
-
<div class="container-fluid">
|
|
35
|
-
{%- include layout/header.html -%}
|
|
36
|
-
|
|
37
|
-
<div class="default{{default_term}}" style="{{default_style}}">
|
|
38
|
-
<main class="content">{{ content }}</main>
|
|
43
|
+
{%- include layout/footer.html -%}
|
|
39
44
|
</div>
|
|
45
|
+
<!-- container -->
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<script src="{{ '/assets/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<script src="{{ '/assets/js/donation.js' | relative_url }}"></script>
|
|
47
|
+
<!-- scripts -->
|
|
48
|
+
<script src="{{ '/assets/vendors/bootstrap-5.2.3/js/bootstrap.bundle.min.js' | relative_url }}"></script>
|
|
49
|
+
<script src="{{ '/assets/js/default.js' | relative_url }}"></script>
|
|
50
|
+
{%- if page.url contains '/blog/' -%}
|
|
51
|
+
<script src="{{ '/assets/vendors/fuse.min.js' | relative_url }}" defer></script>
|
|
52
|
+
{%- endif -%}
|
|
53
|
+
<script src="{{ '/assets/js/blog.js' | relative_url }}"></script>
|
|
54
|
+
<script src="{{ '/assets/js/home.js' | relative_url }}"></script>
|
|
55
|
+
<script src="{{ '/assets/js/page.js' | relative_url }}"></script>
|
|
56
|
+
<script src="{{ '/assets/js/contact.js' | relative_url }}"></script>
|
|
57
|
+
<script src="{{ '/assets/js/donate.js' | relative_url }}"></script>
|
|
58
|
+
{%- if page.toc.enable -%}
|
|
59
|
+
<script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
|
|
60
|
+
{%- endif -%}
|
|
56
61
|
<!-- scripts -->
|
|
57
|
-
|
|
62
|
+
</body>
|
|
58
63
|
<!-- body -->
|
|
59
|
-
</html>
|
|
64
|
+
</html>
|
|
60
65
|
|
|
61
66
|
{%- else -%}
|
|
62
67
|
{%- include layout/maintenance.html -%}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
---
|
|
4
|
+
{%- include assigned -%}
|
|
5
|
+
|
|
6
|
+
<div id="donation" class="donation py-5{% if default.background_focus %} background_focus{% endif %}{% if default.rounding %} rounding{% endif %}">
|
|
7
|
+
<div class="container">
|
|
8
|
+
{%- if donate.title or donate.description -%}
|
|
9
|
+
<div class="row justify-content-center mb-5">
|
|
10
|
+
<div class="col-lg-8 text-center">
|
|
11
|
+
<h1 class="display-5 fw-bold mb-3 donation__title">{{ donate.title }}</h1>
|
|
12
|
+
<p class="mb-0 donation__description">
|
|
13
|
+
{{ donate.description }}
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
{%- endif -%}
|
|
18
|
+
|
|
19
|
+
<div class="row mt-5">
|
|
20
|
+
<div class="col donation__content">
|
|
21
|
+
{{ content }}
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div class="donation-list d-flex flex-column gap-4">
|
|
26
|
+
{%- for service in donate.services -%}
|
|
27
|
+
<div class="donation__box">
|
|
28
|
+
<div class="row align-items-center g-4">
|
|
29
|
+
<!-- LOGO -->
|
|
30
|
+
<div class="col-md-2 col-12 text-center">
|
|
31
|
+
<img
|
|
32
|
+
src="{{ service.logo | relative_url }}"
|
|
33
|
+
class="img-fluid donation__logo"
|
|
34
|
+
alt="{{ service.name }}">
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<!-- INFO -->
|
|
38
|
+
<div class="col-md-7 col-12">
|
|
39
|
+
<h1 class="mb-2 text-capitalize donation__service__name">{{ service.name }}</h1>
|
|
40
|
+
<p class="mb-4 donation__service__description">
|
|
41
|
+
{{ service.description | markdownify }}
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
{%- unless service.name contains 'bitcoin' or service.name == 'pix' -%}
|
|
45
|
+
<div class="row">
|
|
46
|
+
<div class="col">
|
|
47
|
+
<a
|
|
48
|
+
class="fw-bold donation__btn"
|
|
49
|
+
href="{{ service.address }}"
|
|
50
|
+
target="_blank"
|
|
51
|
+
rel="noopener">
|
|
52
|
+
Open
|
|
53
|
+
</a>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
{%- endunless -%}
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<!-- QR CODE -->
|
|
60
|
+
<div class="col-md-3 col-12 text-center">
|
|
61
|
+
{%- if service.qrcode -%}
|
|
62
|
+
<img
|
|
63
|
+
src="{{ service.qrcode | relative_url }}"
|
|
64
|
+
class="img-fluid clickable-qr donation__qr"
|
|
65
|
+
alt="QR {{ service.name }}"
|
|
66
|
+
data-bs-toggle="modal"
|
|
67
|
+
data-bs-target="#qrModal"
|
|
68
|
+
data-qr="{{ service.qrcode | relative_url }}">
|
|
69
|
+
{%- endif -%}
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div class="row">
|
|
74
|
+
<div class="col-12 mt-4 donation__offset_input">
|
|
75
|
+
{%- if service.name == 'pix' or service.name contains 'bitcoin' -%}
|
|
76
|
+
<div class="row">
|
|
77
|
+
<div class="input-group">
|
|
78
|
+
{%- if service.name contains 'pix' -%}
|
|
79
|
+
<span class="input-group-text donation__input__label">{{ donate.input.label.key }}</span>
|
|
80
|
+
{%- else -%}
|
|
81
|
+
<span class="input-group-text donation__input__label">{{ donate.input.label.address }}</span>
|
|
82
|
+
{%- endif -%}
|
|
83
|
+
<input
|
|
84
|
+
type="text"
|
|
85
|
+
class="form-control donation__address"
|
|
86
|
+
value="{{ service.address }}"
|
|
87
|
+
readonly>
|
|
88
|
+
<button class="fw-bold donation__btn donation__btn--copy" data-copy="{{ service.address }}">
|
|
89
|
+
{{ donate.copy_button.text }}
|
|
90
|
+
</button>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
{%- endif -%}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
{%- endfor -%}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<!-- QR Modal -->
|
|
103
|
+
<div
|
|
104
|
+
class="modal fade"
|
|
105
|
+
id="qrModal"
|
|
106
|
+
tabindex="-1">
|
|
107
|
+
<div class="modal-dialog modal-dialog-centered modal-lg">
|
|
108
|
+
<div class="modal-content bg-transparent border-0 text-center">
|
|
109
|
+
<img id="qrModalImg" class="img-fluid rounded shadow">
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
data/_layouts/error.html
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
|
-
|
|
5
|
-
{%- include layout/data.liquid -%}
|
|
4
|
+
{%- include assigned -%}
|
|
6
5
|
|
|
7
6
|
<div class="container error">
|
|
8
7
|
<div class="row">
|
|
9
8
|
<div class="col-sm text-center">
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
{%- if page_data.error.image -%}
|
|
10
|
+
<img
|
|
11
|
+
class="error-image"
|
|
12
|
+
src="{{ page_data.error.image }}"
|
|
13
|
+
alt="error 404">
|
|
14
|
+
{%- endif -%}
|
|
15
|
+
<h1 class="error-title">{{ page_data.error.title | escape }}</h1>
|
|
16
|
+
<h2 class="error-description">{{ page_data.error.message | markdownify }}</h2>
|
|
15
17
|
</div>
|
|
16
18
|
</div>
|
|
17
19
|
</div>
|