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.
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 +5 -7
  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 +153 -195
  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
@@ -2,91 +2,110 @@
2
2
  layout: default
3
3
  ---
4
4
 
5
- {%- include layout/data.liquid -%}
6
-
7
- {%- if head_.google.recaptcha.pubkey and head_.google.apps_script.url -%}
8
-
9
- <script src="https://www.google.com/recaptcha/api.js" async defer></script>
10
-
11
- <div id="contact" class="contact{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
12
-
13
- <div class="modal fade"
14
- id="contactMessageModal"
15
- tabindex="-1"
16
- aria-labelledby="contactMessageModalLabel"
17
- aria-hidden="true"
18
- data-bs-backdrop="static"
19
- data-bs-keyboard="false">
20
- <div class="modal-dialog">
21
- <div class="modal-content">
22
- <div class="modal-header">
23
- <h5 class="modal-title" id="contactMessageModalLabel"></h5>
24
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
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
- <div class="row">
32
- <span class="contact-title"><strong>[&nbsp;{{ page.title | downcase }}&nbsp;]</strong></span>
33
- <form id="contactForm" class="mt-4 contact-form">
34
- <div class="mb-3">
35
- <input id="inputName"
36
- name="name"
37
- type="text"
38
- placeholder="{{ contact_.name.placeholder | default: 'First and last name' }}"
39
- class="form-control contact-form__name"
40
- required>
41
- </div>
42
- <div class="mb-3">
43
- <input id="inputEmail"
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>[&nbsp;{{ page.title | downcase }}&nbsp;]</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
- </div>
54
- <textarea id="textMessage"
55
- name="message"
56
- class="form-control contact-form__message"
57
- placeholder="{{ contact_.message.placeholder | default: 'Write your message here' }}"
58
- style="min-height: 150px"
59
- required></textarea>
60
- <small style="display: block; font-size: 8pt; opacity: .6">{{ contact_.message.caracters.warning.content }}</small>
61
- <!-- TODO: version: 0.3.0 Make reCaptcha change themes instantly -->
62
- <div id="g-recaptcha" class="g-recaptcha mt-2" data-sitekey="{{ head_.google.recaptcha.pubkey }}" style="display: inline-block; margin: 5px 0;"></div>
63
- <div class="d-flex justify-content-end mb-5">
64
- <button id="submitButton"
65
- type="submit"
66
- class="btn contact-form__submit">
67
- {{ contact_.button.text | default: 'Send!' }}
68
- </button>
69
- </div>
70
- </form>
71
- </div>
72
- <div class="row">
73
- <div class="contact-content">{{ content }}</div>
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 default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
80
- <h1 style="background-color: yellow;color: black;padding: 10px">Warning: Email form disabled</h1>
81
- <p>To use the email submission form, you need to:</p>
82
- <p>1 - Copy the script below and implement it in <a href="https://script.google.com" target="_blank">Google Apps Script</a>:</p>
83
- <blockquote>
84
- <p>Note1: Don't forget to change the constants: TO_ADDRESS, SITE, LOGO_URL, MINIMUM_MESSAGE.</p>
85
- <p>Note2: Without editing the script in Google Apps Script, you will need to redeploy it.</p>
86
- </blockquote>
87
-
88
- {% highlight javascript linenos %}
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 { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;' }[m];
128
+ return clean.replace(/[&<>"']/g, function(m) {
129
+ return { '&': '&amp;', '<':'&lt;','>': '&gt;', '"': '&quot;', "'": '&#039;' }[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
- <div style="font-family: sans-serif; color: #333; max-width: 820px; border: 1px solid #eee; padding: 20px;">
211
- ${LOGO_URL ? `
212
- <div style="text-align: center; margin-bottom: 20px;">
213
- <img src="${LOGO_URL}" alt="Logo" style="width: 150px; padding: 10px; border-radius: 50%; border: 1px solid #ddd;">
214
- </div>
215
- ` : ''}
216
-
217
- <h2 style="color: #333; border-bottom: 2px solid #333; padding-bottom: 10px;"></h2>
218
-
219
- <div style="margin-top: 20px;">
220
- <p><b>Name:</b> ${name}</p>
221
- <p><b>From:</b> <a href="mailto:${email}">${email}</a></p>
222
- <p><b>Message:</b></p>
223
- <div style="background: #fff; font-size: 15px; color: black; border: 1px solid transparent; padding: 15px; border-radius: 5px;">
224
- ${cleanMessage}
225
- </div>
226
- </div>
227
-
228
- <footer style="margin-top: 30px; font-size: 12px; color: #888; border-top: 1px solid #eee; padding-top: 10px;">
229
- This is an automated email sent by your form ${pageUrl} using ${antiRobot}/Google Script.<br>
230
- &copy; ${new Date().getFullYear()} ${SITE.replace('https://', '')} - ${new Date().toLocaleString('pt-BR')} - <b>${locationInfo}</b>
231
- </footer>
232
- </div>`;
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
+ &copy; ${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
- {% endhighlight %}
243
-
244
- <p>2 - Create a <a href="https://console.cloud.google.com/security/recaptcha" target="_blank">reCaptcha</a>
245
- on Google and add the reCaptcha <strong>PRIVATE</strong> key to the <strong>Google Apps Script</strong> script property.</p>
246
- <p>3 - Copy the reCaptcha <strong>PUBLIC</strong> key and the <strong>Google Apps Script</strong> URL and place them in <strong>_config.yml:</strong></p>
247
-
248
- {% highlight yml linenos %}
249
- google:
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
- {% endhighlight %}
298
+ {% endhighlight %}
257
299
 
258
- </div>
259
- {%- endif -%}
300
+ </div>
301
+ {%- endif -%}
@@ -1,62 +1,67 @@
1
1
  <!-- Theme for Jekyll.rb by: © rawfeed <https://rawfeed.github.io> -->
2
- {%- include layout/data.liquid -%}
2
+ {%- include assigned -%}
3
3
 
4
- {%- if maintenance_.enable != true -%}
4
+ {%- if maintenance.enable != true -%}
5
+ {%- assign index = site.pages | where: 'path', 'index.md' | first -%}
5
6
 
6
- {%- assign index = site.pages | where: "path", "index.md" | first -%}
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
- {%- if home_.terminal.enable and page.url == "/" and index.layout == "home" -%}
9
- {%- assign default_term = " default-terminal" -%}
10
- {%- assign default_style = "" -%}
11
- {%- else -%}
12
- {%- assign default_term = "" -%}
13
- {%- assign width = default_.width | default: '860' -%}
14
- {%- assign default_style = "max-width: " | append: width | append: "px !important;" -%}
15
- {%- endif -%}
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
- <!DOCTYPE html>
18
- <html id="top" lang="{{ default_.lang | default: 'en-US' }}" data-theme="light">
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
- <!-- head -->
21
- {%- include layout/head.html -%}
22
- <!-- head -->
39
+ <div class="default{{default_term}}" style="{{default_style}}">
40
+ <main class="content">{{ content }}</main>
41
+ </div>
23
42
 
24
- <!-- body -->
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
- {%- include layout/footer.html -%}
42
- </div>
43
- <!-- container -->
44
-
45
- <!-- scripts -->
46
- <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
47
- <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
48
- {%- if page.url contains '/blog/' -%}
49
- <script src="{{ '/assets/vendor/simple-jekyll-search.min.js' | relative_url }}"></script>
50
- {%- endif -%}
51
- <script src="{{ '/assets/js/blog.js' | relative_url }}"></script>
52
- <script src="{{ '/assets/js/home.js' | relative_url }}"></script>
53
- <script src="{{ '/assets/js/page.js' | relative_url }}"></script>
54
- <script src="{{ '/assets/js/contact.js' | relative_url }}"></script>
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
- </body>
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
- {%- if page_.error.image -%}
11
- <img class="error-image" src="{{ page_.error.image }}" alt="error 404">
12
- {%- endif -%}
13
- <h1 class="error-title">{{ page_.error.title | escape }}</h1>
14
- <h2 class="error-description">{{ page_.error.message | markdownify }}</h2>
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>