j1-template 2022.5.3 → 2022.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (369) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +61 -40
  3. data/_includes/themes/j1/layouts/content_generator_page.html +22 -22
  4. data/_includes/themes/j1/layouts/content_generator_post.html +1 -1
  5. data/_includes/themes/j1/layouts/layout_metadata_generator.html +5 -86
  6. data/_includes/themes/j1/modules/navigator/generator.html +1 -13
  7. data/_includes/themes/j1/modules/searcher/generator.html +61 -0
  8. data/_includes/themes/j1/modules/{navigator → searcher}/procedures/topsearch.proc +61 -40
  9. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/about_box.proc +0 -0
  10. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/contacts_box.proc +0 -0
  11. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/issue.proc +0 -0
  12. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/legal_statements.proc +0 -0
  13. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/links_box.proc +0 -0
  14. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/news_box.proc +0 -0
  15. data/_includes/themes/j1/{blocks → procedures/blocks}/footer/boxes/social_media_icons.proc +0 -0
  16. data/_includes/themes/j1/procedures/blocks/get_wave.proc +211 -0
  17. data/_includes/themes/j1/procedures/collections/create_collection_article_preview.proc +1 -1
  18. data/_includes/themes/j1/procedures/global/create_word_cloud.proc +1 -1
  19. data/_includes/themes/j1/procedures/posts/collate_timeline.proc +2 -2
  20. data/_includes/themes/j1/procedures/posts/pager.proc +9 -10
  21. data/_layouts/default.html +26 -13
  22. data/apps/private/README.txt +1 -0
  23. data/apps/protected/README.txt +1 -0
  24. data/apps/public/README.txt +1 -0
  25. data/assets/data/banner.html +38 -8
  26. data/assets/data/footer.html +31 -11
  27. data/assets/data/panel.html +118 -27
  28. data/assets/data/top_search_modal.0.html +142 -0
  29. data/assets/data/top_search_modal.html +121 -0
  30. data/assets/themes/j1/adapter/js/attic.js +4 -4
  31. data/assets/themes/j1/adapter/js/comments.js +18 -7
  32. data/assets/themes/j1/adapter/js/lunr.js +34 -1
  33. data/assets/themes/j1/adapter/js/navigator.js +8 -60
  34. data/assets/themes/j1/adapter/js/waves.js +227 -0
  35. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +10 -5
  36. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  37. data/assets/themes/j1/core/css/themes/theme_vapor/bootstrap.css +10 -5
  38. data/assets/themes/j1/core/css/themes/theme_vapor/bootstrap.min.css +1 -1
  39. data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +51 -128
  40. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +3 -3
  41. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +397 -197
  42. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +9 -9
  43. data/assets/themes/j1/core/css/vendor.css +11 -8
  44. data/assets/themes/j1/core/css/vendor.min.css +1 -1
  45. data/assets/themes/j1/core/fonts/fontawesome_5/LICENSE.txt +34 -0
  46. data/assets/themes/j1/core/fonts/material_design_icons/LICENSE.txt +97 -0
  47. data/assets/themes/j1/core/fonts/material_design_icons_light/LICENSE.txt +92 -0
  48. data/assets/themes/j1/core/fonts/roboto/LICENSE.txt +11 -0
  49. data/assets/themes/j1/core/js/template.js +405 -772
  50. data/assets/themes/j1/core/js/template.min.js +1 -1
  51. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  52. data/assets/themes/j1/modules/backstretch/js/backstretch.js +1 -1
  53. data/assets/themes/j1/modules/backstretch/js/backstretch.min.js +1 -1
  54. data/assets/themes/j1/modules/bokeh/LICENSE.txt +28 -0
  55. data/assets/themes/j1/modules/jquery/js/extensions/hasClass.js +17 -0
  56. data/assets/themes/j1/modules/jquery/js/extensions/hasClass.min.js +17 -0
  57. data/assets/themes/j1/modules/jquery/js/extensions/removeClass.js +18 -0
  58. data/assets/themes/j1/modules/jquery/js/extensions/removeClass.min.js +17 -0
  59. data/assets/themes/j1/modules/later/LICENSE.txt +21 -0
  60. data/assets/themes/j1/modules/log4javascript/license.txt +201 -0
  61. data/assets/themes/j1/modules/lunr/stopwords/de.txt +229 -0
  62. data/assets/themes/j1/modules/lunr/stopwords/en.txt +119 -0
  63. data/assets/themes/j1/modules/masterslider/LICENSE.txt +621 -0
  64. data/assets/themes/j1/modules/masterslider/README.txt +531 -0
  65. data/assets/themes/j1/modules/msDropdown/LICENSE.txt +20 -0
  66. data/assets/themes/j1/modules/nbinteract-core/LICENSE.txt +60 -0
  67. data/assets/themes/j1/modules/rouge/css/themes.txt +46 -0
  68. data/assets/themes/j1/modules/vega/LICENSE.txt +27 -0
  69. data/lib/j1/version.rb +1 -1
  70. data/lib/starter_web/Gemfile +20 -17
  71. data/lib/starter_web/README.md +5 -5
  72. data/lib/starter_web/_config.yml +234 -143
  73. data/lib/starter_web/_data/blocks/banner.yml +18 -2
  74. data/lib/starter_web/_data/blocks/defaults/footer.yml +3 -1
  75. data/lib/starter_web/_data/blocks/defaults/panel.yml +4 -0
  76. data/lib/starter_web/_data/blocks/footer.yml +12 -1
  77. data/lib/starter_web/_data/blocks/panel.yml +88 -19
  78. data/lib/starter_web/_data/layouts/collection.yml +0 -9
  79. data/lib/starter_web/_data/layouts/default.yml +16 -35
  80. data/lib/starter_web/_data/layouts/home.yml +21 -30
  81. data/lib/starter_web/_data/layouts/news_panel_posts.yml +0 -9
  82. data/lib/starter_web/_data/layouts/page.yml +0 -9
  83. data/lib/starter_web/_data/layouts/post.yml +0 -9
  84. data/lib/starter_web/_data/modules/blog_navigator.yml +6 -0
  85. data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +15 -8
  86. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +5 -4
  87. data/lib/starter_web/_data/modules/defaults/lunr.yml +21 -0
  88. data/lib/starter_web/_data/modules/defaults/navigator.yml +17 -18
  89. data/lib/starter_web/_data/modules/defaults/waves.yml +32 -0
  90. data/lib/starter_web/_data/modules/lunr.yml +7 -0
  91. data/lib/starter_web/_data/modules/navigator_menu.yml +48 -120
  92. data/lib/starter_web/_data/modules/waves.yml +32 -0
  93. data/lib/starter_web/_data/plugins/defaults/feed.yml +82 -0
  94. data/lib/starter_web/_data/plugins/defaults/seo-tags.yml +65 -0
  95. data/lib/starter_web/_data/plugins/defaults/sitemap.yml +66 -0
  96. data/lib/starter_web/_data/plugins/feed.yml +35 -0
  97. data/lib/starter_web/_data/plugins/seo-tags.yml +30 -0
  98. data/lib/starter_web/_data/plugins/sitemap.yml +30 -0
  99. data/lib/starter_web/_data/resources.yml +22 -0
  100. data/lib/starter_web/_data/templates/feed.xml +191 -0
  101. data/lib/starter_web/_data/templates/robots.txt +1 -0
  102. data/lib/starter_web/_data/templates/seo-tags.html +140 -0
  103. data/lib/starter_web/_data/templates/sitemap.xml +36 -0
  104. data/lib/starter_web/_includes/attributes.asciidoc +49 -47
  105. data/lib/starter_web/_includes/custom/static/bs5_accordion.html +84 -0
  106. data/lib/starter_web/_includes/custom/templates/bs5_accordion.html +103 -0
  107. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/admonition-block-answer.rb +0 -0
  108. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/admonition-block-question.rb +0 -0
  109. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/banner.rb +0 -0
  110. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/callout.rb +0 -0
  111. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/carousel-block.rb +0 -0
  112. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/conum.rb +0 -0
  113. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/fab-icon-inline.rb +0 -0
  114. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/fas-icon-inline.rb +0 -0
  115. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/flag-icon-inline.rb +0 -0
  116. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/gallery-block.rb +0 -0
  117. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/gist-block.rb +0 -0
  118. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/iconify-icon-inline.rb +0 -0
  119. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/lightbox-block.rb +0 -0
  120. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/lorem_inline.rb +0 -0
  121. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/masterslider-block.rb +0 -0
  122. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/mdi-icon-inline.rb +0 -0
  123. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/panel.rb +0 -0
  124. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/range-slider-block.rb +0 -0
  125. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/shout-block.rb +0 -0
  126. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/textbook-block.rb +0 -0
  127. data/lib/starter_web/_plugins/{asciidoctor-extensions → asciidoctor}/twitter-emoji-inline.rb +0 -0
  128. data/lib/starter_web/_plugins/{debug.rb → filter/debug.rb} +0 -0
  129. data/lib/starter_web/_plugins/{encodeBase64.rb → filter/encodeBase64.rb} +0 -0
  130. data/lib/starter_web/_plugins/{encryptAES.rb → filter/encryptAES.rb} +0 -0
  131. data/lib/starter_web/_plugins/{filters.rb → filter/filters.rb} +11 -0
  132. data/lib/starter_web/_plugins/{minifyJS.rb → filter/minifyJS.rb} +0 -0
  133. data/lib/starter_web/_plugins/{minifyJSON.rb → filter/minifyJSON.rb} +0 -0
  134. data/lib/starter_web/_plugins/{prettify.rb → filter/prettify.rb} +0 -0
  135. data/lib/starter_web/_plugins/filter/xml_prettify.rb +36 -0
  136. data/lib/starter_web/_plugins/{symlink_watcher.rb → helper/symlink_watcher.rb} +0 -0
  137. data/lib/starter_web/_plugins/{date-i18n.rb → i18n/date.rb} +1 -1
  138. data/lib/starter_web/_plugins/{lunr_index.rb → index/lunr.rb} +30 -30
  139. data/lib/starter_web/_plugins/seo/j1-feed.rb +268 -0
  140. data/lib/starter_web/_plugins/seo/j1-seo-tags.rb +717 -0
  141. data/lib/starter_web/_plugins/seo/j1-sitemap.rb +140 -0
  142. data/lib/starter_web/assets/images/banner/scalable/wave.svg +13 -0
  143. data/lib/starter_web/assets/images/blocks/waves/scalable/1280x100/wave-1.svg +63 -0
  144. data/lib/starter_web/assets/images/blocks/waves/scalable/1280x100/wave-2.svg +60 -0
  145. data/lib/starter_web/assets/images/blocks/waves/scalable/1280x100/wave-3.svg +64 -0
  146. data/lib/starter_web/assets/images/blocks/waves/scalable/1280x100/wave-4.svg +62 -0
  147. data/lib/starter_web/assets/images/blocks/waves/scalable/1920x100/wave-1.svg +64 -0
  148. data/lib/starter_web/assets/images/blocks/waves/scalable/1920x100/wave-2.svg +60 -0
  149. data/lib/starter_web/assets/images/blocks/waves/scalable/1920x100/wave-3.svg +65 -0
  150. data/lib/starter_web/assets/images/blocks/waves/scalable/1920x100/wave-4.svg +62 -0
  151. data/lib/starter_web/assets/images/collections/blog/featured/dynamic-web-access.png +0 -0
  152. data/lib/starter_web/assets/images/collections/blog/featured/jamstack-generators.png +0 -0
  153. data/lib/starter_web/assets/images/collections/blog/featured/static-web-access.png +0 -0
  154. data/lib/starter_web/assets/images/icons/jekyll/logo-2x.png +0 -0
  155. data/lib/starter_web/assets/images/icons/jekyll/octojekyll.png +0 -0
  156. data/lib/starter_web/assets/images/modules/attics/1280x800/j1-template.png +0 -0
  157. data/lib/starter_web/assets/images/modules/attics/1280x800/jekyll-generator.png +0 -0
  158. data/lib/starter_web/assets/images/modules/attics/1280x800jekyll-generator.jpg +0 -0
  159. data/lib/starter_web/assets/images/modules/attics/1920x1280/{ben-kolde.jpg → _ben-kolde.jpg} +0 -0
  160. data/lib/starter_web/assets/images/modules/attics/1920x1280/_moritz-kindler.jpg +0 -0
  161. data/lib/starter_web/assets/images/modules/attics/1920x1280/alina-grubnyak.jpg +0 -0
  162. data/lib/starter_web/assets/images/modules/attics/1920x1280/andrea-badino.jpg +0 -0
  163. data/lib/starter_web/assets/images/modules/attics/1920x1280/brad-neathery.jpg +0 -0
  164. data/lib/starter_web/assets/images/modules/attics/1920x1280/bruno-figueiredo.jpg +0 -0
  165. data/lib/starter_web/assets/images/modules/attics/1920x1280/fly-d.jpg +0 -0
  166. data/lib/starter_web/assets/images/modules/attics/1920x1280/guillaume-bolduc.jpg +0 -0
  167. data/lib/starter_web/assets/images/modules/attics/1920x1280/melanie-deziel.jpg +0 -0
  168. data/lib/starter_web/assets/images/modules/attics/1920x1280/milad-fakurian.jpg +0 -0
  169. data/lib/starter_web/assets/images/modules/attics/1920x1280/{_nasa.jpg → nasa.jpg} +0 -0
  170. data/lib/starter_web/assets/images/modules/attics/1920x1280/quino-al-2.jpg +0 -0
  171. data/lib/starter_web/assets/images/modules/attics/lunr-1280x800.jpg +0 -0
  172. data/lib/starter_web/assets/images/modules/attics/no-time-1920x1280.jpg +0 -0
  173. data/lib/starter_web/assets/images/modules/attics/{gift-from-hand-1920x1280.jpg → shutterstock_sponsor-1920x1280.jpg} +0 -0
  174. data/lib/starter_web/assets/images/modules/gallery/mega_cities/author.txt +75 -0
  175. data/lib/starter_web/assets/images/pages/egrid/bg.png +0 -0
  176. data/lib/starter_web/assets/images/pages/egrid/black_denim.png +0 -0
  177. data/lib/starter_web/assets/images/pages/egrid/explanation.png +0 -0
  178. data/lib/starter_web/assets/images/pages/egrid/html_markup.png +0 -0
  179. data/lib/starter_web/assets/images/pages/egrid/large/1.jpg +0 -0
  180. data/lib/starter_web/assets/images/pages/egrid/large/10.jpg +0 -0
  181. data/lib/starter_web/assets/images/pages/egrid/large/11.jpg +0 -0
  182. data/lib/starter_web/assets/images/pages/egrid/large/12.jpg +0 -0
  183. data/lib/starter_web/assets/images/pages/egrid/large/13.jpg +0 -0
  184. data/lib/starter_web/assets/images/pages/egrid/large/14.jpg +0 -0
  185. data/lib/starter_web/assets/images/pages/egrid/large/15.jpg +0 -0
  186. data/lib/starter_web/assets/images/pages/egrid/large/16.jpg +0 -0
  187. data/lib/starter_web/assets/images/pages/egrid/large/17.jpg +0 -0
  188. data/lib/starter_web/assets/images/pages/egrid/large/18.jpg +0 -0
  189. data/lib/starter_web/assets/images/pages/egrid/large/19.jpg +0 -0
  190. data/lib/starter_web/assets/images/pages/egrid/large/2.jpg +0 -0
  191. data/lib/starter_web/assets/images/pages/egrid/large/20.jpg +0 -0
  192. data/lib/starter_web/assets/images/pages/egrid/large/3.jpg +0 -0
  193. data/lib/starter_web/assets/images/pages/egrid/large/4.jpg +0 -0
  194. data/lib/starter_web/assets/images/pages/egrid/large/5.jpg +0 -0
  195. data/lib/starter_web/assets/images/pages/egrid/large/6.jpg +0 -0
  196. data/lib/starter_web/assets/images/pages/egrid/large/7.jpg +0 -0
  197. data/lib/starter_web/assets/images/pages/egrid/large/8.jpg +0 -0
  198. data/lib/starter_web/assets/images/pages/egrid/large/9.jpg +0 -0
  199. data/lib/starter_web/assets/images/pages/egrid/loading.gif +0 -0
  200. data/lib/starter_web/assets/images/pages/egrid/loading_dark.gif +0 -0
  201. data/lib/starter_web/assets/images/pages/egrid/nav-icon.png +0 -0
  202. data/lib/starter_web/assets/images/pages/egrid/nav.png +0 -0
  203. data/lib/starter_web/assets/images/pages/egrid/small/1.jpg +0 -0
  204. data/lib/starter_web/assets/images/pages/egrid/small/10.jpg +0 -0
  205. data/lib/starter_web/assets/images/pages/egrid/small/11.jpg +0 -0
  206. data/lib/starter_web/assets/images/pages/egrid/small/12.jpg +0 -0
  207. data/lib/starter_web/assets/images/pages/egrid/small/13.jpg +0 -0
  208. data/lib/starter_web/assets/images/pages/egrid/small/14.jpg +0 -0
  209. data/lib/starter_web/assets/images/pages/egrid/small/15.jpg +0 -0
  210. data/lib/starter_web/assets/images/pages/egrid/small/16.jpg +0 -0
  211. data/lib/starter_web/assets/images/pages/egrid/small/17.jpg +0 -0
  212. data/lib/starter_web/assets/images/pages/egrid/small/18.jpg +0 -0
  213. data/lib/starter_web/assets/images/pages/egrid/small/19.jpg +0 -0
  214. data/lib/starter_web/assets/images/pages/egrid/small/1a.jpg +0 -0
  215. data/lib/starter_web/assets/images/pages/egrid/small/2.jpg +0 -0
  216. data/lib/starter_web/assets/images/pages/egrid/small/20.jpg +0 -0
  217. data/lib/starter_web/assets/images/pages/egrid/small/3.jpg +0 -0
  218. data/lib/starter_web/assets/images/pages/egrid/small/4.jpg +0 -0
  219. data/lib/starter_web/assets/images/pages/egrid/small/5.jpg +0 -0
  220. data/lib/starter_web/assets/images/pages/egrid/small/6.jpg +0 -0
  221. data/lib/starter_web/assets/images/pages/egrid/small/7.jpg +0 -0
  222. data/lib/starter_web/assets/images/pages/egrid/small/8.jpg +0 -0
  223. data/lib/starter_web/assets/images/pages/egrid/small/9.jpg +0 -0
  224. data/lib/starter_web/assets/images/pages/roundtrip/500_themes/themes-menu-1280x800.jpg +0 -0
  225. data/lib/starter_web/assets/images/promo/home/screenshot.jpg +0 -0
  226. data/lib/starter_web/assets/images/promo/jekyll/jekyll-generator.png +0 -0
  227. data/lib/starter_web/assets/images/promo/jekyll/jekyll-og.png +0 -0
  228. data/lib/starter_web/collections/asciidoc_skeletons/simple-post/_posts/yyyy-mm-dd-your-post-name.asciidoc +13 -10
  229. data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +8 -3
  230. data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +11 -6
  231. data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-site-generators.adoc +13 -10
  232. data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +12 -9
  233. data/lib/starter_web/collections/posts/public/featured/_posts/_includes/attributes.asciidoc +2 -2
  234. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-wiki-series.adoc +13 -5
  235. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-wiki-series.adoc +14 -7
  236. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-wiki-series.adoc +13 -6
  237. data/lib/starter_web/index.html +90 -45
  238. data/lib/starter_web/package.json +1 -1
  239. data/lib/starter_web/pages/public/about/features.adoc +30 -27
  240. data/lib/starter_web/pages/public/about/reporting_issues.adoc +13 -11
  241. data/lib/starter_web/pages/public/about/site.adoc +2 -6
  242. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +8 -10
  243. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +8 -12
  244. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +8 -11
  245. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +9 -8
  246. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +9 -14
  247. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +9 -14
  248. data/lib/starter_web/pages/public/blog/navigator/{archive.html → archive/allview.html} +53 -26
  249. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +46 -21
  250. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +49 -19
  251. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +58 -54
  252. data/lib/starter_web/pages/public/blog/navigator/index.html +212 -35
  253. data/lib/starter_web/pages/public/features/general.adoc +12 -30
  254. data/lib/starter_web/pages/public/features/template.adoc +9 -33
  255. data/lib/starter_web/pages/public/learn/quickstart.adoc +10 -8
  256. data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +0 -7
  257. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_table_bs_modal_examples.asciidoc +2 -2
  258. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/themes_bootstrap.asciidoc +51 -0
  259. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/themes_rouge.asciidoc +110 -0
  260. data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +11 -9
  261. data/lib/starter_web/pages/public/learn/roundtrip/bootstrap_themes.adoc +80 -0
  262. data/lib/starter_web/pages/public/learn/roundtrip/icon_fonts.adoc +9 -7
  263. data/lib/starter_web/pages/public/learn/roundtrip/{quicksearch.adoc → lunr_search.adoc} +23 -18
  264. data/lib/starter_web/pages/public/learn/roundtrip/{bs_modals_extentions.adoc → modal_extentions.adoc} +23 -24
  265. data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +12 -11
  266. data/lib/starter_web/pages/public/learn/roundtrip/present_videos.adoc +14 -10
  267. data/lib/starter_web/pages/public/learn/roundtrip/{responsive_tables_extensions.adoc → responsive_tables.adoc} +16 -13
  268. data/lib/starter_web/pages/public/learn/roundtrip/{typography.adoc → template_typography.adoc} +8 -7
  269. data/lib/starter_web/pages/public/learn/where_to_go.adoc +12 -29
  270. data/lib/starter_web/pages/public/legal/de/100_copyright.adoc +1 -1
  271. data/lib/starter_web/pages/public/legal/de/100_impress.adoc +1 -1
  272. data/lib/starter_web/pages/public/legal/de/300_privacy.adoc +1 -1
  273. data/lib/starter_web/pages/public/legal/de/400_comment_policy.adoc +3 -1
  274. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +7 -5
  275. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +7 -5
  276. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +7 -5
  277. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +9 -5
  278. data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +11 -10
  279. data/lib/starter_web/pages/public/plans/plans.adoc +7 -4
  280. data/lib/starter_web/pages/public/previewer/preview_bootstrap_theme.adoc +16 -47
  281. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  282. data/lib/starter_web/utilsrv/package.json +1 -1
  283. metadata +176 -135
  284. data/_includes/themes/j1/blocks/footer/generator.html +0 -151
  285. data/_includes/themes/j1/layouts/content_generator_app.html +0 -32
  286. data/_includes/themes/j1/layouts/content_generator_article_navigator.html +0 -176
  287. data/_includes/themes/j1/layouts/content_generator_blog_archive.html +0 -251
  288. data/_layouts/app.html +0 -65
  289. data/_layouts/article_navigator.html +0 -66
  290. data/_layouts/blog_archive.html +0 -64
  291. data/assets/data/article_navigator/index.html +0 -51
  292. data/lib/starter_web/_data/layouts/app.yml +0 -172
  293. data/lib/starter_web/_data/layouts/article_navigator.yml +0 -173
  294. data/lib/starter_web/_data/layouts/blog_archive.yml +0 -191
  295. data/lib/starter_web/_includes/custom/static/custom_teaser.html +0 -64
  296. data/lib/starter_web/assets/images/banner/scalable/readme +0 -0
  297. data/lib/starter_web/assets/images/collections/blog/featured/dynamic-web-access.jpg +0 -0
  298. data/lib/starter_web/assets/images/collections/blog/featured/jamstack-generators-2.jpg +0 -0
  299. data/lib/starter_web/assets/images/collections/blog/featured/markus-spiske-2.jpg +0 -0
  300. data/lib/starter_web/assets/images/collections/blog/featured/static-web-access.jpg +0 -0
  301. data/lib/starter_web/assets/images/collections/blog/featured/welcome-to-j1-template.jpg +0 -0
  302. data/lib/starter_web/assets/images/collections/blog/featured/what-is-a-baseurl.jpg +0 -0
  303. data/lib/starter_web/assets/images/collections/blog/series/j1_using_docker/j1_docker_banner.1280x500.png +0 -0
  304. data/lib/starter_web/assets/images/collections/blog/series/j1_using_docker/kinematic_alpha.1280x600.png +0 -0
  305. data/lib/starter_web/assets/images/collections/blog/series/j1_using_docker/kinematic_j1.1280x300.png +0 -0
  306. data/lib/starter_web/assets/images/collections/blog/series/j1_using_docker/windows_docker_banner.1280x500.png +0 -0
  307. data/lib/starter_web/assets/images/modules/attics/1920x1280/braden-collum.jpg +0 -0
  308. data/lib/starter_web/assets/images/modules/attics/1920x1280/firmbee-com.jpg +0 -0
  309. data/lib/starter_web/assets/images/modules/attics/1920x1280/moritz-kindler.jpg +0 -0
  310. data/lib/starter_web/assets/images/modules/attics/1920x1280/spacex.jpg +0 -0
  311. data/lib/starter_web/assets/videos/gallery/dailymotion/meditation.jpg +0 -0
  312. data/lib/starter_web/assets/videos/gallery/dailymotion/pilates.jpg +0 -0
  313. data/lib/starter_web/assets/videos/gallery/html5/video1.mp4 +0 -0
  314. data/lib/starter_web/assets/videos/gallery/html5/video2.mp4 +0 -0
  315. data/lib/starter_web/assets/videos/gallery/kick-it-old-school-poster.jpg +0 -0
  316. data/lib/starter_web/assets/videos/gallery/nye-party-shop-poster.jpg +0 -0
  317. data/lib/starter_web/assets/videos/gallery/stay-colorful-poster.jpg +0 -0
  318. data/lib/starter_web/assets/videos/gallery/video1-poster.jpg +0 -0
  319. data/lib/starter_web/assets/videos/gallery/video1-thumb.jpg +0 -0
  320. data/lib/starter_web/assets/videos/gallery/video2-poster.jpg +0 -0
  321. data/lib/starter_web/assets/videos/gallery/video2-thumb.jpg +0 -0
  322. data/lib/starter_web/assets/videos/gallery/video_adele-poster.jpg +0 -0
  323. data/lib/starter_web/assets/videos/gallery/video_gaga-poster.jpg +0 -0
  324. data/lib/starter_web/assets/videos/gallery/video_gwen-poster.jpg +0 -0
  325. data/lib/starter_web/assets/videos/gallery/video_michelle-poster.jpg +0 -0
  326. data/lib/starter_web/assets/videos/gallery/vk/hai.jpg +0 -0
  327. data/lib/starter_web/assets/videos/gallery/vk/otter.jpg +0 -0
  328. data/lib/starter_web/assets/videos/gallery/voice_kids_de_2021/battle.jpg +0 -0
  329. data/lib/starter_web/assets/videos/gallery/voice_kids_de_2021/ben.jpg +0 -0
  330. data/lib/starter_web/assets/videos/gallery/voice_kids_de_2021/constance.jpg +0 -0
  331. data/lib/starter_web/assets/videos/gallery/voice_kids_de_2021/elisa.jpg +0 -0
  332. data/lib/starter_web/assets/videos/headers/present_videos/still/underground-broadway.jpg +0 -0
  333. data/lib/starter_web/assets/videos/headers/present_videos/underground-broadway.mp4 +0 -0
  334. data/lib/starter_web/assets/videos/tiktok/einhorn.jpg +0 -0
  335. data/lib/starter_web/assets/videos/tiktok/waluschka.jpg +0 -0
  336. data/lib/starter_web/pages/public/jupyter/examples/distributed/j1-circular-times-table.adoc +0 -142
  337. data/lib/starter_web/pages/public/jupyter/examples/distributed/j1-common-used-widgets.adoc +0 -232
  338. data/lib/starter_web/pages/public/jupyter/examples/distributed/j1-odes-in-python.adoc +0 -115
  339. data/lib/starter_web/pages/public/jupyter/examples/localized/j1_climate-change-forecast.adoc +0 -109
  340. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_circular_times_table.ipynb +0 -12382
  341. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +0 -1058
  342. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +0 -14478
  343. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_interactive_widgets.ipynb +0 -442
  344. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets.ipynb +0 -523
  345. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_bar_chart.ipynb +0 -89
  346. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_hist_chart.ipynb +0 -87
  347. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_line_chart.ipynb +0 -90
  348. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_question_multiple_choice.ipynb +0 -64
  349. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_question_short_answer.ipynb +0 -122
  350. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_scatter_chart.ipynb +0 -89
  351. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_nbi_widgets_scatter_drag_chart.ipynb +0 -87
  352. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_odes_in_python.ipynb +0 -15227
  353. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_circular_times_table.html +0 -747
  354. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_climate_change_forecast.html +0 -1250
  355. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_docs_example_dynamic.html +0 -186
  356. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +0 -512
  357. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets.html +0 -629
  358. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +0 -95
  359. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +0 -93
  360. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +0 -96
  361. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +0 -70
  362. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +0 -156
  363. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +0 -95
  364. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +0 -93
  365. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +0 -955
  366. data/lib/starter_web/pages/public/jupyter/where_to_go.adoc +0 -232
  367. data/lib/starter_web/pages/public/learn/roundtrip/_includes/google-ad.js +0 -130
  368. data/lib/starter_web/pages/public/learn/roundtrip/themes.adoc +0 -253
  369. data/lib/starter_web/pages/public/se/se-fake.adoc +0 -48
@@ -0,0 +1,103 @@
1
+ <!--
2
+ # -----------------------------------------------------------------------------
3
+ # ~/assets/custom/content/templates/bs5_accordion.html
4
+ #
5
+ # Product/Info:
6
+ # http://jekyll.one
7
+ #
8
+ # Copyright (C) 2022 Juergen Adams
9
+ #
10
+ # J1 Template is licensed under the MIT License.
11
+ # See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
12
+ #
13
+ # -----------------------------------------------------------------------------
14
+ # NOTE:
15
+ # Find the accordion example @BS5:
16
+ # https://getbootstrap.com/docs/5.2/components/accordion/
17
+ # -----------------------------------------------------------------------------
18
+ # Test data:
19
+ # liquid_var: {{liquid_var | debug}}
20
+ # -----------------------------------------------------------------------------
21
+ -->
22
+
23
+ {% comment %} Process YAML config data
24
+ ================================================================================ {% endcomment %}
25
+
26
+ {% comment %} Set config data (page)
27
+ -------------------------------------------------------------------------------- {% endcomment %}
28
+ {% assign debug_enabled = page.accordion.debug %}
29
+ {% assign name = page.accordion.name %}
30
+ {% assign id = page.accordion.id %}
31
+ {% assign title = page.accordion.header.title %}
32
+ {% assign tagline = page.accordion.header.tagline %}
33
+ {% assign description = page.accordion.header.description %}
34
+
35
+
36
+ {% comment %} Main
37
+ -------------------------------------------------------------------------------- {% endcomment %}
38
+ <!-- Panel container settings -->
39
+ <section id="panel_{{name}}" class="g-2 elevated-z2">
40
+ <section id="{{name}}" class="container">
41
+ <div class="row mt-5 mb-5">
42
+
43
+ <!-- Panel Header -->
44
+ <div class="noclass">
45
+ <div>
46
+ <h2 class="g-font-weight-500 mb-0">{{title}}</h2>
47
+ <p class="tagline mb-0"><b>{{tagline}}</b></p>
48
+ <div class="d-inline-block g-width-50 g-height-2 bg-primary mb-2"></div>
49
+ </div>
50
+ <div class="mt-3 mb-3">{{description}}</div>
51
+ </div>
52
+ <!-- End Header -->
53
+
54
+ <!-- Dynamic Content -->
55
+ <div id="{{id}}" class="accordion mt-3">
56
+ {% for element in page.accordion.elements %}
57
+
58
+ {% if element.expanded %}
59
+ {% assign button_collapsed = '' %}
60
+ {% assign content_collapsed = 'collapse show' %}
61
+ {% assign aria_expanded = 'true' %}
62
+ {% else %}
63
+ {% assign button_collapsed = 'collapsed' %}
64
+ {% assign content_collapsed = 'collapse' %}
65
+ {% assign aria_expanded = 'false' %}
66
+ {% endif %}
67
+
68
+ {% if debug_enabled %}
69
+ button_collapsed: {{button_collapsed|debug}}
70
+ content_collapsed: {{content_collapsed|debug}}
71
+ aria_expanded: {{aria_expanded|debug}}
72
+ {% endif %}
73
+
74
+ <div class="accordion-item">
75
+ <h2 id="heading-{{forloop.index}}" class="accordion-header">
76
+ <button
77
+ class="accordion-button {{button_collapsed}}"
78
+ type="button"
79
+ data-bs-toggle="collapse"
80
+ data-bs-target="#collapse_{{forloop.index}}"
81
+ aria-expanded="{{aria_expanded}}"
82
+ aria-controls="collapse_{{forloop.index}}">
83
+ {{element.title}}
84
+ </button>
85
+ </h2>
86
+ <div
87
+ id="collapse_{{forloop.index}}"
88
+ class="accordion-collapse {{content_collapsed}}"
89
+ aria-labelledby="heading_{{forloop.index}}"
90
+ data-bs-parent="#{{id}}">
91
+ <div class="accordion-body">
92
+ {{element.content|markdownify}}
93
+ </div>
94
+ </div>
95
+ </div>
96
+ {% endfor %}
97
+ </div>
98
+ <!-- End Dynamic Content -->
99
+
100
+ </div>
101
+ </section>
102
+ </section>
103
+ <!-- End Panel container settings -->
@@ -50,6 +50,7 @@ module Jekyll
50
50
  module J1_Filters
51
51
 
52
52
  EMPTY = ''
53
+ DOCTYPE_HTML = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">'
53
54
  # EMPTY_LINE = /^\s*\n/
54
55
  EMPTY_LINE = /^\s*$\n/
55
56
  MULTIPLE_SPACES = / +/
@@ -206,6 +207,16 @@ module Jekyll
206
207
  input.to_s.gsub(Regexp.new(COMMENT_LINE), NOTHING)
207
208
  end
208
209
 
210
+ # --------------------------------------------------------------------------
211
+ # strip_doctype_html:
212
+ #
213
+ # Example: stribg_var | strip_doctype_html
214
+ #
215
+ # --------------------------------------------------------------------------
216
+ def strip_doctype_html(input)
217
+ input.to_s.gsub(Regexp.new(DOCTYPE_HTML), NOTHING)
218
+ end
219
+
209
220
  # --------------------------------------------------------------------------
210
221
  # strip_html_comments:
211
222
  #
@@ -0,0 +1,36 @@
1
+ # ------------------------------------------------------------------------------
2
+ # ~/_plugins/xml_prettify.rb
3
+ # Liquid filter for J1 Template to beautify XML code
4
+ #
5
+ # Product/Info:
6
+ # http://jekyll.one
7
+ #
8
+ # Copyright (C) 2022 Juergen Adams
9
+ #
10
+ # J1 Template is licensed under the MIT License.
11
+ # See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
12
+ # ------------------------------------------------------------------------------
13
+ # NOTE:
14
+ # CustomFilters cannot be used in SAFE mode (e.g not usable for
15
+ # rendering pages with Jekyll on GitHub
16
+ #
17
+ # USAGE:
18
+ # {% capture cache_name %}
19
+ #
20
+ # liquid code to generate XML output goes here
21
+ #
22
+ # {% endcapture %}
23
+ # {{ cache_name | xml_pretty_print }}
24
+ # ------------------------------------------------------------------------------
25
+ require 'nokogiri'
26
+
27
+ module Jekyll
28
+ module XmlPrettyPrint
29
+ def xml_pretty_print(input)
30
+ # xml cleanup
31
+ Nokogiri::XML(input).root.to_xml
32
+ end
33
+ end
34
+ end
35
+
36
+ Liquid::Template.register_filter(Jekyll::XmlPrettyPrint)
@@ -47,7 +47,7 @@ module Jekyll
47
47
 
48
48
  def load_translations
49
49
  return false unless I18n.backend.send(:translations).empty?
50
- filename = File.join(File.dirname(__FILE__), '../_data/locales/*.yml')
50
+ filename = File.join(File.dirname(__FILE__), '../../_data/locales/*.yml')
51
51
  I18n.backend.load_translations Dir[filename]
52
52
  end
53
53
 
@@ -1,6 +1,6 @@
1
1
  # ------------------------------------------------------------------------------
2
2
  # ~/_plugins/lunr_index.rb
3
- # Creates an Lunr index file (json) to be used by J1 Lunr
3
+ # Creates a index file (json) to be used by J1 Lunr
4
4
  #
5
5
  # Product/Info:
6
6
  # http://jekyll.one
@@ -16,10 +16,11 @@ require 'json'
16
16
  require 'uri'
17
17
  require 'execjs'
18
18
  require 'yaml'
19
+ require 'nokogiri'
19
20
 
20
21
  module Jekyll
21
22
  module J1LunrSearch
22
- #noinspection RubyTooManyInstanceVariablesInspection
23
+ #noinspection RubyTooManyInstanceVariablesInspection,RubyInterpreter
23
24
  class Indexer < Jekyll::Generator
24
25
  def initialize(config = {})
25
26
  super(config)
@@ -27,19 +28,17 @@ module Jekyll
27
28
  @mode = config['environment']
28
29
  @template = config['theme']
29
30
 
30
- @module_path = File.join(File.dirname(__FILE__))
31
- @module_path.slice! '_plugins'
32
- @module_config_path = File.join(@module_path, config['data_dir'], 'modules')
33
- @j1_config_path = config['data_dir']
34
-
35
- @j1_config = YAML::load(File.open(File.join(@j1_config_path, 'j1_config.yml')))
31
+ @project_path = File.join(File.dirname(__FILE__)).sub('_plugins/index', '')
32
+ @module_config_path = File.join(@project_path, config['data_dir'], 'modules')
33
+ @j1_config_path = config['data_dir']
36
34
 
37
- @module_config_default = YAML::load(File.open(File.join(@module_config_path, 'defaults', 'lunr.yml')))
38
- @module_config_user = YAML::load(File.open(File.join(@module_config_path,'lunr.yml')))
35
+ @j1_config = YAML::load(File.open(File.join(@j1_config_path, 'j1_config.yml')))
36
+ @module_config_default = YAML::load(File.open(File.join(@module_config_path, 'defaults', 'lunr.yml')))
37
+ @module_config_user = YAML::load(File.open(File.join(@module_config_path,'lunr.yml')))
39
38
 
40
39
  @module_config_default_settings = @module_config_default['defaults']
41
- @module_config_user_settings = @module_config_user['settings']
42
- @module_config = @module_config_default_settings.merge!(@module_config_user_settings)
40
+ @module_config_user_settings = @module_config_user['settings']
41
+ @module_config = @module_config_default_settings.merge!(@module_config_user_settings)
43
42
 
44
43
  @lunr_config = {
45
44
  'excludes' => [],
@@ -63,18 +62,18 @@ module Jekyll
63
62
  @index_name = @lunr_config['index_name']
64
63
 
65
64
  # calculate the module path
66
- # if NO template GEM is used (dev system), @module_path points
65
+ # if NO template GEM is used (dev system), @project_path points
67
66
  # in the project folder, otherwise (runtime system) to the Ruby
68
67
  # GEM installation folder!
69
68
  #
70
69
  if @template.nil?
71
- @module_path = File.join(File.dirname(__FILE__), '../', @module_dir)
70
+ @project_path = File.join(File.dirname(__FILE__), '../../', @module_dir)
72
71
  else
73
72
  @gem_path = `bundle info --path j1-template`
74
- @module_path = File.join(@gem_path.chomp, @module_dir)
73
+ @project_path = File.join(@gem_path.chomp, @module_dir)
75
74
  end
76
75
 
77
- @lunr_path = File.join(@module_path, 'lunr.min.js')
76
+ @lunr_path = File.join(@project_path, 'lunr.min.js')
78
77
  raise "Could not find #{@lunr_path}" unless File.exist?(@lunr_path)
79
78
 
80
79
  lunr_src = open(@lunr_path).read
@@ -112,7 +111,7 @@ module Jekyll
112
111
 
113
112
  if @module_config['rebuild'] == false
114
113
  if File.exist?(index_file)
115
- Jekyll.logger.info 'J1 Lunr:', 'recreate index disabled.'
114
+ Jekyll.logger.info 'J1 Lunr:', 'rebuild index disabled'
116
115
  # Keep the index file from being cleaned by Jekyll
117
116
  #
118
117
  site.static_files << SearchIndexFile.new(site, site.dest, '/', @module_config['index_file'])
@@ -120,7 +119,7 @@ module Jekyll
120
119
  end
121
120
  end
122
121
 
123
- Jekyll.logger.info 'J1 Lunr:', 'creating search index ...'
122
+ Jekyll.logger.info 'J1 Lunr:', 'generate search index'
124
123
 
125
124
  # gather posts and pages
126
125
  #
@@ -186,7 +185,7 @@ module Jekyll
186
185
  #
187
186
  FileUtils.mkdir_p(File.dirname(filepath))
188
187
  File.open(filepath, 'w') { |f| f.write(JSON.dump(total)) }
189
- Jekyll.logger.info 'J1 Lunr:', "finished, index ready."
188
+ # Jekyll.logger.info 'J1 Lunr:', "finished, index ready."
190
189
  added_files = [filename]
191
190
 
192
191
  # Keep the written files from being cleaned by Jekyll
@@ -236,7 +235,6 @@ module Jekyll
236
235
  end
237
236
  end
238
237
 
239
- require 'nokogiri'
240
238
  module Jekyll
241
239
  module J1LunrSearch
242
240
  class PageRenderer
@@ -276,7 +274,7 @@ module Jekyll
276
274
  end
277
275
  end
278
276
 
279
- require 'nokogiri'
277
+
280
278
  module Jekyll
281
279
  module J1LunrSearch
282
280
  #noinspection RubyTooManyInstanceVariablesInspection
@@ -302,16 +300,18 @@ module Jekyll
302
300
 
303
301
  if description.nil? || description.length == 0
304
302
  description = 'No description available.'
303
+ else
304
+ description, keywords = description.split(/~~~/)
305
305
  end
306
306
 
307
- if site.is_a?(Jekyll::Document)
308
- excerpt = extract_excerpt(site)
309
- unless excerpt.nil? || excerpt.length == 0
310
- description = excerpt
311
- end
312
- end
313
-
314
- description, keywords = description.split(/§/)
307
+ # Previous code used for Posts
308
+ #
309
+ # if site.is_a?(Jekyll::Document)
310
+ # excerpt = extract_excerpt(site)
311
+ # unless excerpt.nil? || excerpt.length == 0
312
+ # description = excerpt
313
+ # end
314
+ # end
315
315
 
316
316
  SearchEntry.new(title, tagline, url, date, tags, categories, description, is_post, body, renderer)
317
317
 
@@ -372,6 +372,6 @@ end
372
372
 
373
373
  module Jekyll
374
374
  module J1LunrSearch
375
- VERSION = '2022.5.3'
375
+ VERSION = '2022.6.1'
376
376
  end
377
377
  end
@@ -0,0 +1,268 @@
1
+ # ------------------------------------------------------------------------------
2
+ # ~/_plugins/j1-feed.rb
3
+ # Generate RSS feeds for all posts of a site
4
+ #
5
+ # Product/Info:
6
+ # http://jekyll.one
7
+ #
8
+ # Copyright (C) 2022 Ben Balter and Contributors
9
+ # Copyright (C) 2022 Juergen Adams
10
+ #
11
+ # J1 Template is licensed under the MIT License.
12
+ # See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
13
+ # ------------------------------------------------------------------------------
14
+ require 'jekyll'
15
+ require 'fileutils'
16
+
17
+ module J1Feed
18
+ class Generator < Jekyll::Generator
19
+ safe true
20
+ priority :lowest
21
+
22
+ # Main plugin action, called by Jekyll Core
23
+ #
24
+ def generate(site)
25
+ @site = site
26
+
27
+ @mode = site.config['environment']
28
+ @template = site.config['theme']
29
+ @project_path = File.join(File.dirname(__FILE__)).sub('_plugins/seo', '')
30
+ @plugin_data_path = File.join(@project_path, site.config['data_dir'])
31
+ @module_config_path = File.join(@project_path, site.config['data_dir'], 'plugins')
32
+
33
+ @module_config_default = YAML::load(File.open(File.join(@module_config_path, 'defaults', 'feed.yml')))
34
+ @module_config_user = YAML::load(File.open(File.join(@module_config_path, 'feed.yml')))
35
+
36
+ @module_config_default_settings = @module_config_default['defaults']
37
+ @module_config_user_settings = @module_config_user['settings']
38
+ @module_config = @module_config_default_settings.merge!(@module_config_user_settings)
39
+
40
+ @feed_generation_path = @module_config['path'].sub('feed.xml', 'for_categories')
41
+ @feed_generation_enabled = @module_config['enabled']
42
+
43
+ @template_source_folder = File.join(@project_path, @module_config['template_source_folder'])
44
+ @template_name = @module_config['template_name']
45
+ @feed_output = @module_config['feed_output']
46
+
47
+ if disabled_in_development?
48
+ Jekyll.logger.info "J1 Feed:", "generate feed skipped in mode development"
49
+ return
50
+ end
51
+
52
+ if plugin_disabled?
53
+ Jekyll.logger.info "J1 Feed:", "generate feed: disabled"
54
+ return
55
+ end
56
+
57
+ if @module_config['excerpt_only']
58
+ Jekyll.logger.info "J1 Feed:", "generate feed for: excerpts only"
59
+ end
60
+
61
+ if @module_config['posts_limit'] < 100
62
+ Jekyll.logger.info "J1 Feed:", "generate feed for: #posts of #{@module_config['posts_limit']}"
63
+ else
64
+ Jekyll.logger.info "J1 Feed:", "generate feed for: #posts of unlimited"
65
+ end
66
+
67
+ collections.each do |name, meta|
68
+ Jekyll.logger.info "J1 Feed:", "generate feed for: all #{name}"
69
+ (meta["categories"] + [nil]).each do |category|
70
+ Jekyll.logger.info "J1 Feed:", "generate feed for posts by category: #{category}" if category
71
+ path = feed_path(:collection => name, :category => category)
72
+
73
+ # rebuild the feed xml file?
74
+ #
75
+ unless @module_config['rebuild_feeds']
76
+ path = feed_path(:collection => name, :category => category)
77
+ if file_exists?(path)
78
+ Jekyll.logger.info "J1 Feed:", "feed already exist, skip rebuild"
79
+ next
80
+ end
81
+ end
82
+
83
+ @site.pages << make_page(path, :collection => name, :category => category)
84
+ end
85
+ end
86
+ generate_feed_by_tag if config['tags'] && !@site.tags.empty?
87
+ end
88
+
89
+ private
90
+
91
+ # Strip all whitespaces to minify the template.
92
+ # The regex matches all whitespace that follows
93
+ # '>' which match a closed XML tag
94
+ # '}' which match a closed Liquid tag
95
+ #
96
+ MINIFY_REGEX = %r!(?<=>|})\s+!.freeze
97
+
98
+ # Returns the plugin's config or an empty hash if not set
99
+ #
100
+ def config
101
+ @config ||= @module_config || {}
102
+ end
103
+
104
+ # Determines the destination path of a given feed as:
105
+ # 'collection', the name of a collection (example: 'posts')
106
+ # 'category', a category within that collection (example: 'news')
107
+ #
108
+ # Returns '/feed.xml' (default for posts) or the path specified in config
109
+ # Returns `/feed/category.xml` for post categories
110
+ # Returns `/feed/collection.xml` for other collections
111
+ # Returns `/feed/collection/category.xml` for other collection categories
112
+ #
113
+ def feed_path(collection: "posts", category: nil)
114
+ prefix = collection == "posts" ? "/feed" : "/feed/#{collection}"
115
+ return "#{@feed_generation_path}/#{category.downcase}.xml" if category
116
+
117
+ collections.dig(collection, "path") || "#{prefix}.xml"
118
+ end
119
+
120
+ # Returns a hash representing all collections to be processed
121
+ # and their metadata in the form of:
122
+ # { collection_name => { categories = [...], path = '...' } }
123
+ #
124
+ def collections
125
+ return @collections if defined?(@collections)
126
+
127
+ @collections = case config["collections"]
128
+ when Array
129
+ config["collections"].map { |c| [c, {}] }.to_h
130
+ when Hash
131
+ config["collections"]
132
+ else
133
+ {}
134
+ end
135
+
136
+ @collections = normalize_posts_meta(@collections)
137
+ @collections.each_value do |meta|
138
+ meta["categories"] = (meta["categories"] || []).to_set
139
+ end
140
+
141
+ @collections
142
+ end
143
+
144
+ def generate_feed_by_tag
145
+ tags_config = config['tags']
146
+ enabled = config['tags']['enabled']
147
+ tags_config = {} unless tags_config.is_a?(Hash)
148
+
149
+ except = tags_config["except"] || []
150
+ only = tags_config["only"] || @site.tags.keys
151
+ tags_pool = only - except
152
+ tags_path = tags_config["path"] || "/feed/by_tag/"
153
+
154
+ # enable|disable generation of feeds by tag
155
+ #
156
+ generate_tag_feed(tags_pool, tags_path) if enabled
157
+ end
158
+
159
+ def generate_tag_feed(tags_pool, tags_path)
160
+ tags_pool.each do |tag|
161
+ # allow only tags with basic alphanumeric characters and underscore
162
+ # to keep feed path simple.
163
+ #
164
+ # next if %r![^a-zA-Z0-9_]!.match?(tag)
165
+ next if %r!\W!.match?(tag)
166
+
167
+ Jekyll.logger.info "J1 Feed:", "generate feed for posts by tag: #{tag}" if tag
168
+ path = "#{tags_path}#{tag.downcase}.xml"
169
+ next if file_exists?(path)
170
+
171
+ @site.pages << make_page(path, :tags => tag)
172
+ end
173
+ end
174
+
175
+ # Path to the template file (feed.xml)
176
+ #
177
+ def feed_source_path
178
+ @feed_source_path ||= File.expand_path @template_name, @template_source_folder
179
+ end
180
+
181
+ def feed_template
182
+ @feed_template ||= File.read(feed_source_path).gsub(MINIFY_REGEX, "")
183
+ end
184
+
185
+ # Checks if a file already exists in the site source
186
+ #
187
+ def file_exists?(file_path)
188
+ File.exist? @site.in_source_dir(file_path)
189
+ end
190
+
191
+ # Generates contents for a file
192
+ #
193
+ def make_page(file_path, collection: "posts", category: nil, tags: nil)
194
+ PageWithoutAFile.new(@site, __dir__, "", file_path).tap do |file|
195
+ file.content = feed_template
196
+ file.data.merge!(
197
+ "layout" => nil,
198
+ "sitemap" => false,
199
+ "xsl" => file_exists?("feed.xslt.xml"),
200
+ "collection" => collection,
201
+ "category" => category,
202
+ "tags" => tags
203
+ )
204
+ file.output
205
+ end
206
+ end
207
+
208
+ # Special case the "posts" collection, which, for ease of use
209
+ # and backwards compatability, can be configured via top-level keys or
210
+ # directly as a collection
211
+ #
212
+ def normalize_posts_meta(hash)
213
+ hash["posts"] ||= {}
214
+ hash["posts"]["path"] ||= config["path"]
215
+ hash["posts"]["categories"] ||= config["categories"]
216
+ config["path"] ||= hash["posts"]["path"]
217
+ hash
218
+ end
219
+
220
+ # Check if plugin is enabled|disabled
221
+ #
222
+ def plugin_disabled?
223
+ if config['enabled']
224
+ false
225
+ else
226
+ true
227
+ end
228
+ end
229
+
230
+ def disabled_in_development?
231
+ config && config['disable_in_development'] && Jekyll.env == 'development'
232
+ end
233
+ end
234
+
235
+ class PageWithoutAFile < Jekyll::Page
236
+ def read_yaml(*)
237
+ @data ||= {}
238
+ end
239
+ end
240
+
241
+ class MetaTag < Liquid::Tag
242
+ # Use Jekyll's native relative_url filter
243
+ include Jekyll::Filters::URLFilters
244
+
245
+ def render(context)
246
+ # Jekyll::Filters::URLFilters requires `@context`
247
+ # to be set in the environment.
248
+ @context = context
249
+
250
+ config = context.registers[:site].config
251
+ path = config.dig("feed", "path") || "feed.xml"
252
+ title = config["title"] || config["name"]
253
+
254
+ attributes = {
255
+ :type => "application/atom+xml",
256
+ :rel => "alternate",
257
+ :href => absolute_url(path),
258
+ }
259
+ attributes[:title] = title if title
260
+
261
+ attrs = attributes.map { |k, v| "#{k}=#{v.to_s.encode(:xml => :attr)}" }.join(" ")
262
+ "<link #{attrs} />"
263
+ end
264
+ end
265
+
266
+ end
267
+
268
+ Liquid::Template.register_tag "feed_meta", J1Feed::MetaTag