rawfeed 0.3.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +25 -0
  3. data/.gitignore +19 -0
  4. data/.gitlab/ci/gitlab-pages.yml +51 -0
  5. data/.hidden +6 -0
  6. data/404.html +6 -0
  7. data/Gemfile +51 -0
  8. data/README.md +102 -26
  9. data/_config.yml +77 -0
  10. data/_data/generic.yml +29 -0
  11. data/_data/screen/blog.yml +46 -0
  12. data/_data/screen/contact.yml +31 -0
  13. data/_data/screen/donate.yml +45 -0
  14. data/_data/screen/footer.yml +17 -0
  15. data/_data/screen/head.yml +49 -0
  16. data/_data/screen/home.yml +24 -0
  17. data/_data/screen/maintenance.yml +8 -0
  18. data/_data/screen/navbar.yml +41 -0
  19. data/_data/screen/page.yml +12 -0
  20. data/_data/screen/pixels.yml +7 -0
  21. data/_data/screen/pub.yml +4 -0
  22. data/_data/{resume.yml → screen/resume.yml} +8 -8
  23. data/_data/screen/socials.yml +20 -0
  24. data/_includes/assigned +36 -0
  25. data/_includes/layout/blog_search.html +22 -15
  26. data/_includes/layout/disqus.html +7 -8
  27. data/_includes/layout/footer.html +43 -28
  28. data/_includes/layout/giscus.html +15 -19
  29. data/_includes/layout/head.html +97 -75
  30. data/_includes/layout/maintenance.html +14 -11
  31. data/_includes/layout/navbar.html +253 -0
  32. data/_includes/layout/paginator.html +12 -13
  33. data/_includes/{alert → markdown/alert} +2 -2
  34. data/_includes/{chart → markdown/chart} +3 -3
  35. data/_includes/{image → markdown/image} +4 -4
  36. data/_includes/{socials → markdown/socials} +5 -5
  37. data/_includes/{video → markdown/video} +2 -2
  38. data/_layouts/blog/index.html +53 -0
  39. data/_layouts/{post.html → blog/post.html} +50 -36
  40. data/_layouts/blog/posts_by_tag.html +27 -0
  41. data/_layouts/blog/tags.html +32 -0
  42. data/_layouts/contact.html +156 -114
  43. data/_layouts/default.html +53 -48
  44. data/_layouts/donate.html +112 -0
  45. data/_layouts/error.html +9 -7
  46. data/_layouts/home.html +22 -19
  47. data/_layouts/licenses.html +2 -2
  48. data/_layouts/page.html +18 -17
  49. data/_layouts/pixels/index.html +75 -0
  50. data/_layouts/{pixel.html → pixels/post.html} +5 -5
  51. data/_layouts/pub.html +50 -44
  52. data/_layouts/resume.html +308 -265
  53. data/_pages/any-page.md +336 -0
  54. data/_pages/contact.md +16 -0
  55. data/_pages/donate.md +16 -0
  56. data/_pages/licenses.md +17 -0
  57. data/_pages/resume.md +14 -0
  58. data/_pixels/2025-10-15-first-my-pixel.md +34 -0
  59. data/_posts/2025-09-20-welcome-to-jekyll.md +36 -0
  60. data/_posts/2025-09-25-this-post-demonstrates-post-codeblocks.md +141 -0
  61. data/_posts/2025-09-25-this-post-demonstrates-post-content-styles.md +133 -0
  62. data/_posts/2025-10-04-content-styles-and-codeblocks.md +330 -0
  63. data/_sass/components/_markdown.scss +2 -2
  64. data/_sass/includes/_index.scss +2 -2
  65. data/_sass/includes/{_header.scss → _navbar.scss} +2 -6
  66. data/_sass/includes/_toc.scss +146 -0
  67. data/_sass/layouts/_blog.scss +1 -1
  68. data/_sass/layouts/_index.scss +2 -2
  69. data/_sass/layouts/_page.scss +0 -5
  70. data/_sass/layouts/_post.scss +8 -138
  71. data/_sass/layouts/{_tag-posts.scss → _posts_by_tag.scss} +3 -3
  72. data/_sass/layouts/_resume.scss +1 -1
  73. data/_sass/layouts/{_tag.scss → _tags.scss} +10 -6
  74. data/_sass/main.scss +2 -2
  75. data/_sass/theme/_dark.scss +2 -2
  76. data/_sass/theme/_light.scss +1 -1
  77. data/assets/js/blog.js +52 -18
  78. data/assets/js/contact.js +21 -20
  79. data/assets/js/default.js +67 -50
  80. data/assets/js/discus.js +2 -2
  81. data/assets/js/{donation.js → donate.js} +10 -9
  82. data/assets/js/home.js +18 -16
  83. data/assets/js/page.js +50 -172
  84. data/assets/js/toc.js +133 -0
  85. data/assets/json/blog_search.json +6 -6
  86. data/assets/vendors/fuse.min.js +9 -0
  87. data/blog/index.md +14 -0
  88. data/blog/tags/index.md +12 -0
  89. data/exe/rawfeed +29 -0
  90. data/index.md +15 -0
  91. data/lib/rawfeed/build/cleaner.rb +60 -0
  92. data/lib/rawfeed/build/image_minifier.rb +163 -0
  93. data/lib/rawfeed/build/minifier.rb +89 -0
  94. data/lib/rawfeed/build.rb +9 -0
  95. data/lib/rawfeed/command/backup.rb +124 -0
  96. data/lib/rawfeed/command/cli.rb +118 -0
  97. data/lib/rawfeed/command/installer.rb +156 -0
  98. data/lib/rawfeed/command/tools.rb +138 -0
  99. data/lib/rawfeed/{author.rb → content/author.rb} +7 -7
  100. data/lib/rawfeed/content/contact.rb +51 -0
  101. data/lib/rawfeed/content/donate.rb +48 -0
  102. data/lib/rawfeed/{draft.rb → content/draft.rb} +5 -3
  103. data/lib/rawfeed/content/licenses.rb +46 -0
  104. data/lib/rawfeed/{page.rb → content/page.rb} +4 -3
  105. data/lib/rawfeed/{pixel.rb → content/pixel.rb} +7 -4
  106. data/lib/rawfeed/content/post.rb +107 -0
  107. data/lib/rawfeed/{resume.rb → content/resume.rb} +23 -19
  108. data/lib/rawfeed/{layout.rb → core/layout.rb} +1 -1
  109. data/lib/rawfeed/core/utils.rb +103 -0
  110. data/lib/rawfeed/{version.rb → core/version.rb} +1 -1
  111. data/lib/rawfeed/{datelang.rb → plugin/datelang.rb} +5 -6
  112. data/lib/rawfeed/{pub.rb → plugin/pub.rb} +33 -31
  113. data/lib/rawfeed/{reading_time.rb → plugin/reading_time.rb} +5 -4
  114. data/lib/rawfeed/root.rb +3 -0
  115. data/lib/rawfeed.rb +36 -14
  116. data/pixels/index.md +11 -0
  117. data/robots.txt +26 -0
  118. metadata +167 -119
  119. data/_data/options.yml +0 -329
  120. data/_includes/layout/data.liquid +0 -31
  121. data/_includes/layout/header.html +0 -173
  122. data/_layouts/blog.html +0 -52
  123. data/_layouts/donation.html +0 -113
  124. data/_layouts/pixels.html +0 -71
  125. data/_layouts/tag.html +0 -33
  126. data/_layouts/tag_posts.html +0 -28
  127. data/assets/vendor/simple-jekyll-search.js +0 -433
  128. data/assets/vendor/simple-jekyll-search.min.js +0 -6
  129. data/lib/rawfeed/installer.rb +0 -37
  130. data/lib/rawfeed/post.rb +0 -60
  131. data/lib/rawfeed/utils.rb +0 -75
  132. /data/_includes/{details → markdown/details} +0 -0
  133. /data/_includes/{enddetails → markdown/enddetails} +0 -0
  134. /data/_includes/{endtabs → markdown/endtabs} +0 -0
  135. /data/_includes/{tabs → markdown/tabs} +0 -0
  136. /data/assets/images/{avatar_back.png → avatars/back.png} +0 -0
  137. /data/assets/images/{avatar_dark.png → avatars/dark.png} +0 -0
  138. /data/assets/images/{avatar_light.png → avatars/light.png} +0 -0
  139. /data/assets/images/{icons → donate}/bitcoin.svg +0 -0
  140. /data/assets/images/{icons → donate}/card.svg +0 -0
  141. /data/assets/images/{icons → donate}/donation.svg +0 -0
  142. /data/assets/images/{icons → donate}/lightning_network.svg +0 -0
  143. /data/assets/images/{icons → donate}/paypal.svg +0 -0
  144. /data/assets/images/{icons → donate}/pix.svg +0 -0
  145. /data/assets/images/{qrcode_btc_binance.jpg → donate/qrcode_btc_binance.jpg} +0 -0
  146. /data/assets/images/{qrcode_inter.jpg → donate/qrcode_inter.jpg} +0 -0
  147. /data/assets/images/{qrcode_wos.jpg → donate/qrcode_wos.jpg} +0 -0
  148. /data/assets/images/{icons → donate}/wos.png +0 -0
  149. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css +0 -0
  150. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.css.map +0 -0
  151. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css +0 -0
  152. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.min.css.map +0 -0
  153. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css +0 -0
  154. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.css.map +0 -0
  155. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css +0 -0
  156. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-grid.rtl.min.css.map +0 -0
  157. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css +0 -0
  158. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.css.map +0 -0
  159. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css +0 -0
  160. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.min.css.map +0 -0
  161. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css +0 -0
  162. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.css.map +0 -0
  163. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css +0 -0
  164. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-reboot.rtl.min.css.map +0 -0
  165. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css +0 -0
  166. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.css.map +0 -0
  167. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css +0 -0
  168. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.min.css.map +0 -0
  169. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css +0 -0
  170. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.css.map +0 -0
  171. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css +0 -0
  172. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap-utilities.rtl.min.css.map +0 -0
  173. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css +0 -0
  174. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.css.map +0 -0
  175. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css +0 -0
  176. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.min.css.map +0 -0
  177. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css +0 -0
  178. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.css.map +0 -0
  179. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css +0 -0
  180. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/css/bootstrap.rtl.min.css.map +0 -0
  181. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js +0 -0
  182. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.js.map +0 -0
  183. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js +0 -0
  184. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.bundle.min.js.map +0 -0
  185. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js +0 -0
  186. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.js.map +0 -0
  187. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js +0 -0
  188. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.esm.min.js.map +0 -0
  189. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js +0 -0
  190. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.js.map +0 -0
  191. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js +0 -0
  192. /data/assets/{vendor/bootstrap → vendors/bootstrap-5.2.3}/js/bootstrap.min.js.map +0 -0
  193. /data/lib/rawfeed/{csp_filters.rb → plugin/csp_filters.rb} +0 -0
  194. /data/lib/rawfeed/{typescript_liquid.rb → plugin/typescript_liquid.rb} +0 -0
  195. /data/lib/rawfeed/{with_class.rb → plugin/with_class.rb} +0 -0
@@ -1,113 +0,0 @@
1
- ---
2
- layout: default
3
- ---
4
-
5
- {%- include layout/data.liquid -%}
6
-
7
- <div id="donation" class="donation py-5{% if default_.background_focus %} background_focus{% endif %}{% if default_.rounding %} rounding{% endif %}">
8
-
9
- <div class="container">
10
-
11
- {% if donation_.title or donation_.description %}
12
- <div class="row justify-content-center mb-5">
13
- <div class="col-lg-8 text-center">
14
- <h1 class="display-5 fw-bold mb-3 donation__title">{{ donation_.title }}</h1>
15
- <p class="mb-0 donation__description">
16
- {{ donation_.description }}
17
- </p>
18
- </div>
19
- </div>
20
- {% endif %}
21
-
22
-
23
- <div class="row mt-5">
24
- <div class="col donation__content">
25
- {{ content }}
26
- </div>
27
- </div>
28
-
29
- <div class="donation-list d-flex flex-column gap-4">
30
-
31
- {%- for service in donation_.services -%}
32
- <div class="donation__box">
33
- <div class="row align-items-center g-4">
34
-
35
- <!-- LOGO -->
36
- <div class="col-md-2 col-12 text-center">
37
- <img src="{{ service.logo | relative_url }}"
38
- class="img-fluid donation__logo"
39
- alt="{{ service.name }}">
40
- </div>
41
-
42
- <!-- INFO -->
43
- <div class="col-md-7 col-12">
44
-
45
- <h1 class="mb-2 text-capitalize donation__service__name">{{ service.name }}</h1>
46
- <p class="mb-4 donation__service__description">
47
- {{ service.description | markdownify }}
48
- </p>
49
-
50
- {%- unless service.name contains "bitcoin" or service.name == "pix" -%}
51
- <div class="row">
52
- <div class="col">
53
- <a class="fw-bold donation__btn" href="{{ service.address }}"
54
- target="_blank"
55
- rel="noopener">
56
- Open
57
- </a>
58
- </div>
59
- </div>
60
- {%- endunless -%}
61
-
62
- </div>
63
-
64
- <!-- QR CODE -->
65
- <div class="col-md-3 col-12 text-center">
66
- {%- if service.qrcode -%}
67
- <img src="{{ service.qrcode | relative_url }}"
68
- class="img-fluid clickable-qr donation__qr"
69
- alt="QR {{ service.name }}"
70
- data-bs-toggle="modal"
71
- data-bs-target="#qrModal"
72
- data-qr="{{ service.qrcode | relative_url }}">
73
- {%- endif -%}
74
- </div>
75
-
76
- </div>
77
-
78
- <div class="row">
79
- <div class="col-12 mt-4 donation__offset_input">
80
- {% if service.name == "pix" or service.name contains "bitcoin" %}
81
- <div class="row">
82
- <div class="input-group">
83
- {% if service.name contains "pix" %}
84
- <span class="input-group-text donation__input__label">Key</span>
85
- {% else %}
86
- <span class="input-group-text donation__input__label">Address</span>
87
- {% endif %}
88
- <input type="text" class="form-control donation__address"
89
- value="{{ service.address }}" readonly>
90
- <button class="fw-bold donation__btn donation__btn--copy" data-copy="{{ service.address }}">
91
- {{ donation_.copy_button.text }}
92
- </button>
93
- </div>
94
- </div>
95
- {% endif %}
96
- </div>
97
- </div>
98
- </div>
99
- {%- endfor -%}
100
-
101
- </div>
102
-
103
- </div>
104
- </div>
105
-
106
- <!-- QR Modal -->
107
- <div class="modal fade" id="qrModal" tabindex="-1">
108
- <div class="modal-dialog modal-dialog-centered modal-lg">
109
- <div class="modal-content bg-transparent border-0 text-center">
110
- <img id="qrModalImg" class="img-fluid rounded shadow">
111
- </div>
112
- </div>
113
- </div>
data/_layouts/pixels.html DELETED
@@ -1,71 +0,0 @@
1
- {%- include layout/data.liquid -%}
2
-
3
- {%- if maintenance_.enable != true -%}
4
-
5
- {%- for _ in site.pixels -%}
6
- {%- capture count_pixels -%} {{ count_pixels | plus: 1 }} {%- endcapture -%}
7
- {%- endfor -%}
8
-
9
- <!DOCTYPE html>
10
- <html id="top" lang="{{ default_.lang | default: 'en-US' }}" data-theme="light">
11
-
12
- <!-- head -->
13
- {%- include layout/head.html -%}
14
- <!-- head -->
15
- <body style="font-family: {{ default_.font.style }} !important; font-size: {{ default_.font.size }} !important; letter-spacing: {{ default_.font.spacing }} !important;">
16
-
17
- <div class="container-fluid">
18
- {%- include layout/header.html -%}
19
-
20
- <div class="default" style="max-width: {{ pixels_.layout.width | default: "860" }}px !important;">
21
- <main class="pixels{% if default_.background_focus %} background_focus{% endif %}{% if default_.rounding %} rounding{% endif %}">
22
- <div class="row">
23
- {%- if page.description -%}
24
- <div class="pixels-description"><span>»&nbsp;</span>{{ page.description | markdownify }}</div>
25
- {%- endif -%}
26
- </div>
27
-
28
- <div class="row d-flex justify-content-center">
29
- {%- if pixels_.title -%}
30
- <h1 class="pixels-title">[&nbsp;{{ pixels_.title | default: "pixels" }}:&nbsp;&nbsp;{{ count_pixels }}&nbsp;]</h1>
31
- {%- endif -%}
32
- </div>
33
-
34
- <div class="pixels-grid">
35
- {%- for item in site.pixels -%}
36
- {%- if item.image.path -%}
37
- <a href="{{ item.url | relative_url }}">
38
- <div class="pixels-item{% if default_.rounding %} rounding{% endif %}">
39
- <div class="pixels-overlay-card">
40
- <img src="{{ item.image.path | relative_url }}" alt="{{ item.title }}">
41
- <div class="overlay">
42
- <div class="text-center overlay-content">
43
- <small class="date">{% datelang item.date format:datelang_.format %}</small>
44
- <p class="mb-0 desc">{{ item.content | strip_html | truncate: 50 }}</p>
45
- </div>
46
- </div>
47
- </div>
48
- </div>
49
- </a>
50
- {%- endif -%}
51
- {%- endfor -%}
52
- </div>
53
-
54
- </main>
55
- </div>
56
- </div>
57
-
58
- {%- include layout/footer.html -%}
59
-
60
- </body>
61
-
62
- <!-- Scripts -->
63
- <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
64
- <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
65
- <!-- Scripts -->
66
-
67
- </html>
68
-
69
- {%- else -%}
70
- {%- include layout/maintenance.html -%}
71
- {%- endif -%}
data/_layouts/tag.html DELETED
@@ -1,33 +0,0 @@
1
- ---
2
- layout: default
3
- ---
4
-
5
- {%- include layout/data.liquid -%}
6
-
7
- {%- assign menu_separator = default_.separator -%}
8
-
9
- <div class="container tag{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
10
- {%- if page.description -%}
11
- <div class="row">
12
- <div class="tag-description"><span>»&nbsp;</span>{{ page.description }}</div>
13
- </div>
14
- {%- endif -%}
15
-
16
- <div class="row">
17
- <h1 class="tag-title">[&nbsp;tags&nbsp;]</h1>
18
-
19
- <ul class="tag-list">
20
- {%- assign tags = site.tags | sort -%}
21
- {%- for tag in tags -%}
22
- {%- assign tag_name = tag[0] -%}
23
- <li class="tag-list__item">
24
- <a class="tag-list__link" href="{{ '/blog/tags/' | append: tag_name | relative_url }}">
25
- {% comment %} {{ tag_name }} [{{ tag[1].size }}] {% endcomment %}
26
- {{ tag_name }}
27
- </a>
28
- </li><strong class="separator">{{menu_separator}}</strong>
29
- {%- endfor -%}
30
- </ul>
31
-
32
- </div>
33
- </div>
@@ -1,28 +0,0 @@
1
- ---
2
- layout: default
3
- ---
4
-
5
- {%- include layout/data.liquid -%}
6
-
7
- <div class="container tag-posts{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
8
- <div class="row">
9
- <h1 class="tag-posts-title"><span>[&nbsp;{{ blog_.post.tags_posts.title }}:&nbsp;</span>{{ page.title }}<span>&nbsp;]</span></h1>
10
-
11
- <ul class="row tag-posts-list">
12
- {%- for post in page.posts -%}
13
- <li class="tag-posts-list__item">
14
- <span class="tag-posts-list__meta">{% datelang post.date format:datelang_.format %}</span>&nbsp;»&nbsp;
15
- <a class="tag-posts-list__link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
16
- {%- if post.draft -%}
17
- <span class="draft-badge">[&nbsp;this is a draft&nbsp;]</span>
18
- {%- endif -%}
19
- </li>
20
- {%- endfor -%}
21
- </ul>
22
-
23
- </div>
24
- </div>
25
-
26
-
27
-
28
-
@@ -1,433 +0,0 @@
1
- /*!
2
- * Simple-Jekyll-Search
3
- * Copyright 2015-2020, Christian Fei
4
- * Licensed under the MIT License.
5
- */
6
-
7
- (function(){
8
- 'use strict'
9
-
10
- var _$Templater_7 = {
11
- compile: compile,
12
- setOptions: setOptions
13
- }
14
-
15
- const options = {}
16
- options.pattern = /\{(.*?)\}/g
17
- options.template = ''
18
- options.middleware = function () {}
19
-
20
- function setOptions (_options) {
21
- options.pattern = _options.pattern || options.pattern
22
- options.template = _options.template || options.template
23
- if (typeof _options.middleware === 'function') {
24
- options.middleware = _options.middleware
25
- }
26
- }
27
-
28
- function compile (data) {
29
- return options.template.replace(options.pattern, function (match, prop) {
30
- const value = options.middleware(prop, data[prop], options.template)
31
- if (typeof value !== 'undefined') {
32
- return value
33
- }
34
- return data[prop] || match
35
- })
36
- }
37
-
38
- 'use strict';
39
-
40
- function fuzzysearch (needle, haystack) {
41
- var tlen = haystack.length;
42
- var qlen = needle.length;
43
- if (qlen > tlen) {
44
- return false;
45
- }
46
- if (qlen === tlen) {
47
- return needle === haystack;
48
- }
49
- outer: for (var i = 0, j = 0; i < qlen; i++) {
50
- var nch = needle.charCodeAt(i);
51
- while (j < tlen) {
52
- if (haystack.charCodeAt(j++) === nch) {
53
- continue outer;
54
- }
55
- }
56
- return false;
57
- }
58
- return true;
59
- }
60
-
61
- var _$fuzzysearch_1 = fuzzysearch;
62
-
63
- 'use strict'
64
-
65
- /* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
66
-
67
- var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
68
-
69
- function FuzzySearchStrategy () {
70
- this.matches = function (string, crit) {
71
- return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
72
- }
73
- }
74
-
75
- 'use strict'
76
-
77
- var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
78
-
79
- function LiteralSearchStrategy () {
80
- this.matches = function (str, crit) {
81
- if (!str) return false
82
-
83
- str = str.trim().toLowerCase()
84
- crit = crit.trim().toLowerCase()
85
-
86
- return crit.split(' ').filter(function (word) {
87
- return str.indexOf(word) >= 0
88
- }).length === crit.split(' ').length
89
- }
90
- }
91
-
92
- 'use strict'
93
-
94
- var _$Repository_4 = {
95
- put: put,
96
- clear: clear,
97
- search: search,
98
- setOptions: __setOptions_4
99
- }
100
-
101
- /* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
102
- /* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
103
-
104
- function NoSort () {
105
- return 0
106
- }
107
-
108
- const data = []
109
- let opt = {}
110
-
111
- opt.fuzzy = false
112
- opt.limit = 10
113
- opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
114
- opt.sort = NoSort
115
- opt.exclude = []
116
-
117
- function put (data) {
118
- if (isObject(data)) {
119
- return addObject(data)
120
- }
121
- if (isArray(data)) {
122
- return addArray(data)
123
- }
124
- return undefined
125
- }
126
- function clear () {
127
- data.length = 0
128
- return data
129
- }
130
-
131
- function isObject (obj) {
132
- return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
133
- }
134
-
135
- function isArray (obj) {
136
- return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
137
- }
138
-
139
- function addObject (_data) {
140
- data.push(_data)
141
- return data
142
- }
143
-
144
- function addArray (_data) {
145
- const added = []
146
- clear()
147
- for (let i = 0, len = _data.length; i < len; i++) {
148
- if (isObject(_data[i])) {
149
- added.push(addObject(_data[i]))
150
- }
151
- }
152
- return added
153
- }
154
-
155
- function search (crit) {
156
- if (!crit) {
157
- return []
158
- }
159
- return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
160
- }
161
-
162
- function __setOptions_4 (_opt) {
163
- opt = _opt || {}
164
-
165
- opt.fuzzy = _opt.fuzzy || false
166
- opt.limit = _opt.limit || 10
167
- opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
168
- opt.sort = _opt.sort || NoSort
169
- opt.exclude = _opt.exclude || []
170
- }
171
-
172
- function findMatches (data, crit, strategy, opt) {
173
- const matches = []
174
- for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
175
- const match = findMatchesInObject(data[i], crit, strategy, opt)
176
- if (match) {
177
- matches.push(match)
178
- }
179
- }
180
- return matches
181
- }
182
-
183
- function findMatchesInObject (obj, crit, strategy, opt) {
184
- for (const key in obj) {
185
- if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
186
- return obj
187
- }
188
- }
189
- }
190
-
191
- function isExcluded (term, excludedTerms) {
192
- for (let i = 0, len = excludedTerms.length; i < len; i++) {
193
- const excludedTerm = excludedTerms[i]
194
- if (new RegExp(excludedTerm).test(term)) {
195
- return true
196
- }
197
- }
198
- return false
199
- }
200
-
201
- /* globals ActiveXObject:false */
202
-
203
- 'use strict'
204
-
205
- var _$JSONLoader_2 = {
206
- load: load
207
- }
208
-
209
- function load (location, callback) {
210
- const xhr = getXHR()
211
- xhr.open('GET', location, true)
212
- xhr.onreadystatechange = createStateChangeListener(xhr, callback)
213
- xhr.send()
214
- }
215
-
216
- function createStateChangeListener (xhr, callback) {
217
- return function () {
218
- if (xhr.readyState === 4 && xhr.status === 200) {
219
- try {
220
- callback(null, JSON.parse(xhr.responseText))
221
- } catch (err) {
222
- callback(err, null)
223
- }
224
- }
225
- }
226
- }
227
-
228
- function getXHR () {
229
- return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
230
- }
231
-
232
- 'use strict'
233
-
234
- var _$OptionsValidator_3 = function OptionsValidator (params) {
235
- if (!validateParams(params)) {
236
- throw new Error('-- OptionsValidator: required options missing')
237
- }
238
-
239
- if (!(this instanceof OptionsValidator)) {
240
- return new OptionsValidator(params)
241
- }
242
-
243
- const requiredOptions = params.required
244
-
245
- this.getRequiredOptions = function () {
246
- return requiredOptions
247
- }
248
-
249
- this.validate = function (parameters) {
250
- const errors = []
251
- requiredOptions.forEach(function (requiredOptionName) {
252
- if (typeof parameters[requiredOptionName] === 'undefined') {
253
- errors.push(requiredOptionName)
254
- }
255
- })
256
- return errors
257
- }
258
-
259
- function validateParams (params) {
260
- if (!params) {
261
- return false
262
- }
263
- return typeof params.required !== 'undefined' && params.required instanceof Array
264
- }
265
- }
266
-
267
- 'use strict'
268
-
269
- var _$utils_9 = {
270
- merge: merge,
271
- isJSON: isJSON
272
- }
273
-
274
- function merge (defaultParams, mergeParams) {
275
- const mergedOptions = {}
276
- for (const option in defaultParams) {
277
- mergedOptions[option] = defaultParams[option]
278
- if (typeof mergeParams[option] !== 'undefined') {
279
- mergedOptions[option] = mergeParams[option]
280
- }
281
- }
282
- return mergedOptions
283
- }
284
-
285
- function isJSON (json) {
286
- try {
287
- if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
288
- return true
289
- }
290
- return false
291
- } catch (err) {
292
- return false
293
- }
294
- }
295
-
296
- var _$src_8 = {};
297
- (function (window) {
298
- 'use strict'
299
-
300
- let options = {
301
- searchInput: null,
302
- resultsContainer: null,
303
- json: [],
304
- success: Function.prototype,
305
- searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
306
- templateMiddleware: Function.prototype,
307
- sortMiddleware: function () {
308
- return 0
309
- },
310
- noResultsText: 'No results found',
311
- limit: 10,
312
- fuzzy: false,
313
- debounceTime: null,
314
- exclude: []
315
- }
316
-
317
- let debounceTimerHandle
318
- const debounce = function (func, delayMillis) {
319
- if (delayMillis) {
320
- clearTimeout(debounceTimerHandle)
321
- debounceTimerHandle = setTimeout(func, delayMillis)
322
- } else {
323
- func.call()
324
- }
325
- }
326
-
327
- const requiredOptions = ['searchInput', 'resultsContainer', 'json']
328
-
329
- /* removed: const _$Templater_7 = require('./Templater') */;
330
- /* removed: const _$Repository_4 = require('./Repository') */;
331
- /* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
332
- const optionsValidator = _$OptionsValidator_3({
333
- required: requiredOptions
334
- })
335
- /* removed: const _$utils_9 = require('./utils') */;
336
-
337
- window.SimpleJekyllSearch = function (_options) {
338
- const errors = optionsValidator.validate(_options)
339
- if (errors.length > 0) {
340
- throwError('You must specify the following required options: ' + requiredOptions)
341
- }
342
-
343
- options = _$utils_9.merge(options, _options)
344
-
345
- _$Templater_7.setOptions({
346
- template: options.searchResultTemplate,
347
- middleware: options.templateMiddleware
348
- })
349
-
350
- _$Repository_4.setOptions({
351
- fuzzy: options.fuzzy,
352
- limit: options.limit,
353
- sort: options.sortMiddleware,
354
- exclude: options.exclude
355
- })
356
-
357
- if (_$utils_9.isJSON(options.json)) {
358
- initWithJSON(options.json)
359
- } else {
360
- initWithURL(options.json)
361
- }
362
-
363
- const rv = {
364
- search: search
365
- }
366
-
367
- typeof options.success === 'function' && options.success.call(rv)
368
- return rv
369
- }
370
-
371
- function initWithJSON (json) {
372
- _$Repository_4.put(json)
373
- registerInput()
374
- }
375
-
376
- function initWithURL (url) {
377
- _$JSONLoader_2.load(url, function (err, json) {
378
- if (err) {
379
- throwError('failed to get JSON (' + url + ')')
380
- }
381
- initWithJSON(json)
382
- })
383
- }
384
-
385
- function emptyResultsContainer () {
386
- options.resultsContainer.innerHTML = ''
387
- }
388
-
389
- function appendToResultsContainer (text) {
390
- options.resultsContainer.innerHTML += text
391
- }
392
-
393
- function registerInput () {
394
- options.searchInput.addEventListener('input', function (e) {
395
- if (isWhitelistedKey(e.which)) {
396
- emptyResultsContainer()
397
- debounce(function () { search(e.target.value) }, options.debounceTime)
398
- }
399
- })
400
- }
401
-
402
- function search (query) {
403
- if (isValidQuery(query)) {
404
- emptyResultsContainer()
405
- render(_$Repository_4.search(query), query)
406
- }
407
- }
408
-
409
- function render (results, query) {
410
- const len = results.length
411
- if (len === 0) {
412
- return appendToResultsContainer(options.noResultsText)
413
- }
414
- for (let i = 0; i < len; i++) {
415
- results[i].query = query
416
- appendToResultsContainer(_$Templater_7.compile(results[i]))
417
- }
418
- }
419
-
420
- function isValidQuery (query) {
421
- return query && query.length > 0
422
- }
423
-
424
- function isWhitelistedKey (key) {
425
- return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
426
- }
427
-
428
- function throwError (message) {
429
- throw new Error('SimpleJekyllSearch --- ' + message)
430
- }
431
- })(window)
432
-
433
- }());
@@ -1,6 +0,0 @@
1
- /*!
2
- * Simple-Jekyll-Search
3
- * Copyright 2015-2020, Christian Fei
4
- * Licensed under the MIT License.
5
- */
6
- !function(){"use strict";var f={compile:function(r){return i.template.replace(i.pattern,function(t,e){var n=i.middleware(e,r[e],i.template);return void 0!==n?n:r[e]||t})},setOptions:function(t){i.pattern=t.pattern||i.pattern,i.template=t.template||i.template,"function"==typeof t.middleware&&(i.middleware=t.middleware)}};const i={pattern:/\{(.*?)\}/g,template:"",middleware:function(){}};var n=function(t,e){var n=e.length,r=t.length;if(n<r)return!1;if(r===n)return t===e;t:for(var i=0,o=0;i<r;i++){for(var u=t.charCodeAt(i);o<n;)if(e.charCodeAt(o++)===u)continue t;return!1}return!0},e=new function(){this.matches=function(t,e){return n(e.toLowerCase(),t.toLowerCase())}},r=new function(){this.matches=function(e,t){return!!e&&(e=e.trim().toLowerCase(),(t=t.trim().toLowerCase()).split(" ").filter(function(t){return 0<=e.indexOf(t)}).length===t.split(" ").length)}},d={put:function(t){if(l(t))return a(t);if(function(t){return Boolean(t)&&"[object Array]"===Object.prototype.toString.call(t)}(t))return function(n){const r=[];s();for(let t=0,e=n.length;t<e;t++)l(n[t])&&r.push(a(n[t]));return r}(t);return undefined},clear:s,search:function(t){return t?function(e,n,r,i){const o=[];for(let t=0;t<e.length&&o.length<i.limit;t++){var u=function(t,e,n,r){for(const i in t)if(!function(n,r){for(let t=0,e=r.length;t<e;t++){var i=r[t];if(new RegExp(i).test(n))return!0}return!1}(t[i],r.exclude)&&n.matches(t[i],e))return t}(e[t],n,r,i);u&&o.push(u)}return o}(u,t,c.searchStrategy,c).sort(c.sort):[]},setOptions:function(t){c=t||{},c.fuzzy=t.fuzzy||!1,c.limit=t.limit||10,c.searchStrategy=t.fuzzy?e:r,c.sort=t.sort||o,c.exclude=t.exclude||[]}};function o(){return 0}const u=[];let c={};function s(){return u.length=0,u}function l(t){return Boolean(t)&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return u.push(t),u}c.fuzzy=!1,c.limit=10,c.searchStrategy=c.fuzzy?e:r,c.sort=o,c.exclude=[];var p={load:function(t,e){const n=window.XMLHttpRequest?new window.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");n.open("GET",t,!0),n.onreadystatechange=h(n,e),n.send()}};function h(e,n){return function(){if(4===e.readyState&&200===e.status)try{n(null,JSON.parse(e.responseText))}catch(t){n(t,null)}}}var m=function y(t){if(!(e=t)||!("undefined"!=typeof e.required&&e.required instanceof Array))throw new Error("-- OptionsValidator: required options missing");var e;if(!(this instanceof y))return new y(t);const r=t.required;this.getRequiredOptions=function(){return r},this.validate=function(e){const n=[];return r.forEach(function(t){"undefined"==typeof e[t]&&n.push(t)}),n}},w={merge:function(t,e){const n={};for(const r in t)n[r]=t[r],"undefined"!=typeof e[r]&&(n[r]=e[r]);return n},isJSON:function(t){try{return t instanceof Object&&JSON.parse(JSON.stringify(t))?!0:!1}catch(e){return!1}}};!function(t){let i={searchInput:null,resultsContainer:null,json:[],success:Function.prototype,searchResultTemplate:'<li><a href="{url}" title="{desc}">{title}</a></li>',templateMiddleware:Function.prototype,sortMiddleware:function(){return 0},noResultsText:"No results found",limit:10,fuzzy:!1,debounceTime:null,exclude:[]},n;const e=function(t,e){e?(clearTimeout(n),n=setTimeout(t,e)):t.call()};var r=["searchInput","resultsContainer","json"];const o=m({required:r});function u(t){d.put(t),i.searchInput.addEventListener("input",function(t){-1===[13,16,20,37,38,39,40,91].indexOf(t.which)&&(c(),e(function(){l(t.target.value)},i.debounceTime))})}function c(){i.resultsContainer.innerHTML=""}function s(t){i.resultsContainer.innerHTML+=t}function l(t){var e;(e=t)&&0<e.length&&(c(),function(e,n){var r=e.length;if(0===r)return s(i.noResultsText);for(let t=0;t<r;t++)e[t].query=n,s(f.compile(e[t]))}(d.search(t),t))}function a(t){throw new Error("SimpleJekyllSearch --- "+t)}t.SimpleJekyllSearch=function(t){var n;0<o.validate(t).length&&a("You must specify the following required options: "+r),i=w.merge(i,t),f.setOptions({template:i.searchResultTemplate,middleware:i.templateMiddleware}),d.setOptions({fuzzy:i.fuzzy,limit:i.limit,sort:i.sortMiddleware,exclude:i.exclude}),w.isJSON(i.json)?u(i.json):(n=i.json,p.load(n,function(t,e){t&&a("failed to get JSON ("+n+")"),u(e)}));t={search:l};return"function"==typeof i.success&&i.success.call(t),t}}(window)}();