j1-template 2023.5.2 → 2023.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +11 -9
  3. data/_includes/themes/j1/layouts/content_generator_post.html +8 -6
  4. data/_includes/themes/j1/procedures/global/create_word_cloud.proc +1 -1
  5. data/_includes/themes/j1/procedures/layouts/module_writer.proc +1 -1
  6. data/_includes/themes/j1/procedures/posts/collate_timeline.proc +4 -4
  7. data/_includes/themes/j1/procedures/posts/pager.proc +1 -1
  8. data/_layouts/_home.html +88 -0
  9. data/_layouts/home.html +1 -1
  10. data/assets/data/banner.html +7 -7
  11. data/assets/data/panel.html +37 -25
  12. data/assets/data/quicklinks.html +40 -30
  13. data/assets/data/speak2me.html +219 -0
  14. data/assets/data/translator.html +32 -4
  15. data/assets/themes/j1/adapter/js/speak2me.js +425 -0
  16. data/assets/themes/j1/adapter/js/translator.js +10 -2
  17. data/assets/themes/j1/core/css/icon-fonts/mdib.css +21 -0
  18. data/assets/themes/j1/core/css/icon-fonts/mdib.min.css +1 -1
  19. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +34 -40
  20. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -2
  21. data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +77 -57
  22. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +2 -2
  23. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +176 -42
  24. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +3 -3
  25. data/assets/themes/j1/core/js/template.js +1658 -0
  26. data/assets/themes/j1/core/js/template.min.js +11 -5
  27. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  28. data/assets/themes/j1/modules/speak2me/LICENSE +21 -0
  29. data/assets/themes/j1/modules/speak2me/js/speak2me.js +947 -0
  30. data/assets/themes/j1/modules/speak2me/js/speak2me.min.js +26 -0
  31. data/assets/themes/j1/modules/translator/js/translator.js +30 -13
  32. data/assets/themes/j1/modules/translator/js/translator.min.js +1 -1
  33. data/lib/j1/version.rb +1 -1
  34. data/lib/starter_web/Gemfile +5 -5
  35. data/lib/starter_web/README.md +5 -5
  36. data/lib/starter_web/_config.yml +12 -44
  37. data/lib/starter_web/_data/blocks/banner.yml +7 -6
  38. data/lib/starter_web/_data/blocks/panel.yml +37 -39
  39. data/lib/starter_web/_data/layouts/home.yml +1 -1
  40. data/lib/starter_web/_data/modules/advertising.yml +10 -88
  41. data/lib/starter_web/_data/modules/buymeacoffee.yml +30 -0
  42. data/lib/starter_web/_data/modules/defaults/advertising.yml +3 -1
  43. data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +97 -164
  44. data/lib/starter_web/_data/modules/defaults/buymeacoffee.yml +30 -0
  45. data/lib/starter_web/_data/modules/defaults/navigator.yml +8 -4
  46. data/lib/starter_web/_data/modules/defaults/speak2me.yml +72 -0
  47. data/lib/starter_web/_data/modules/scroller.yml +1 -1
  48. data/lib/starter_web/_data/modules/speak2me.yml +33 -0
  49. data/lib/starter_web/_data/resources.yml +24 -1
  50. data/lib/starter_web/_data/templates/feed.xml +1 -1
  51. data/lib/starter_web/_includes/google/static/{google_ad_5128488466.html → google_ad__your-slot-id.html} +1 -1
  52. data/lib/starter_web/_plugins/asciidoctor/callout.rb +1 -1
  53. data/lib/starter_web/_plugins/asciidoctor/carousel-block.rb +2 -2
  54. data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +2 -2
  55. data/lib/starter_web/_plugins/asciidoctor/gist-block.rb +2 -2
  56. data/lib/starter_web/_plugins/asciidoctor/google-ad-block.rb +1 -1
  57. data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +2 -7
  58. data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +2 -3
  59. data/lib/starter_web/_plugins/asciidoctor/masterslider-block.rb +2 -2
  60. data/lib/starter_web/_plugins/asciidoctor/mdib-icon-inline.rb +43 -0
  61. data/lib/starter_web/_plugins/asciidoctor/mdil-icon-inline.rb +1 -1
  62. data/lib/starter_web/_plugins/asciidoctor/range-slider-block.rb +1 -1
  63. data/lib/starter_web/_plugins/asciidoctor/slick-block.rb +2 -2
  64. data/lib/starter_web/_plugins/asciidoctor/textbook-block.rb +1 -1
  65. data/lib/starter_web/_plugins/filter/liquify.rb +22 -22
  66. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  67. data/lib/starter_web/assets/images/collections/books/biography/a_life_in_questions.jpg +0 -0
  68. data/lib/starter_web/assets/images/collections/books/biography/becoming.jpg +0 -0
  69. data/lib/starter_web/assets/images/collections/books/biography/born_to_run.jpg +0 -0
  70. data/lib/starter_web/assets/images/collections/books/biography/forty_autumns.jpg +0 -0
  71. data/lib/starter_web/assets/images/collections/books/biography/not_dead_yet.jpg +0 -0
  72. data/lib/starter_web/assets/images/collections/books/biography/the_princess_diarist.jpg +0 -0
  73. data/lib/starter_web/assets/images/collections/books/biography/when_breath_becomes_air.jpg +0 -0
  74. data/lib/starter_web/assets/images/collections/books/fantasy/harry-potter-deathly-hallows.jpg +0 -0
  75. data/lib/starter_web/assets/images/collections/books/fantasy/harry-potter-philosophers-stone.jpg +0 -0
  76. data/lib/starter_web/assets/images/collections/books/fantasy/mistborn-trilogy.jpg +0 -0
  77. data/lib/starter_web/assets/images/collections/books/fantasy/ready-player-one.jpg +0 -0
  78. data/lib/starter_web/assets/images/collections/books/fantasy/sword-of-destiny.jpg +0 -0
  79. data/lib/starter_web/assets/images/collections/books/fantasy/terry-pratchet-diary.jpg +0 -0
  80. data/lib/starter_web/assets/images/collections/books/romance/breath-of-snow-and-ashes.jpg +0 -0
  81. data/lib/starter_web/assets/images/collections/books/romance/it-ends-with-us.jpg +0 -0
  82. data/lib/starter_web/assets/images/collections/books/romance/outlander-novel.jpg +0 -0
  83. data/lib/starter_web/assets/images/collections/books/romance/outlander-short-story.jpg +0 -0
  84. data/lib/starter_web/assets/images/collections/books/romance/the-fiery-cross.jpg +0 -0
  85. data/lib/starter_web/assets/images/collections/books/romance/the_dressmaker.jpg +0 -0
  86. data/lib/starter_web/collections/_biography/a-life-in-questions.adoc +13 -8
  87. data/lib/starter_web/collections/_biography/becoming.adoc +18 -12
  88. data/lib/starter_web/collections/_biography/born-to-run.adoc +17 -13
  89. data/lib/starter_web/collections/_biography/forty-autumns.adoc +14 -9
  90. data/lib/starter_web/collections/_biography/not-dead-yet.adoc +12 -7
  91. data/lib/starter_web/collections/_biography/princess-diarist-the.adoc +13 -8
  92. data/lib/starter_web/collections/_biography/when-breath-becomes-air.adoc +14 -9
  93. data/lib/starter_web/collections/_fantasy/harry-potter-deathly-hallows.adoc +13 -7
  94. data/lib/starter_web/collections/_fantasy/harry-potter-philosophers-stone.adoc +12 -8
  95. data/lib/starter_web/collections/_fantasy/mistborn-trilogy.adoc +14 -10
  96. data/lib/starter_web/collections/_fantasy/ready-player-one.adoc +12 -11
  97. data/lib/starter_web/collections/_fantasy/sword-of-destiny.adoc +15 -7
  98. data/lib/starter_web/collections/_fantasy/terry-pratchet-diary.adoc +11 -6
  99. data/lib/starter_web/collections/_romance/breath-of-snow-and-ashes.adoc +15 -10
  100. data/lib/starter_web/collections/_romance/it-ends-with-us.adoc +11 -6
  101. data/lib/starter_web/collections/_romance/outlander-novel.adoc +11 -6
  102. data/lib/starter_web/collections/_romance/{virgins-outlander-short-story.adoc → outlander-virgins-short-story.adoc} +11 -6
  103. data/lib/starter_web/collections/_romance/{dressmaker-the.adoc → the-dressmaker.adoc} +11 -6
  104. data/lib/starter_web/collections/_romance/{fiery-cross-the.adoc → the-fiery-cross.adoc} +11 -6
  105. data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +6 -6
  106. data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +12 -11
  107. data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-static-site-generators.adoc +9 -7
  108. data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +8 -8
  109. data/lib/starter_web/dot.ruby-version +1 -1
  110. data/lib/starter_web/index.html +10 -8
  111. data/lib/starter_web/package.json +1 -1
  112. data/lib/starter_web/pages/public/about/features.adoc +7 -1
  113. data/lib/starter_web/pages/public/about/reporting_issues.adoc +2 -0
  114. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +2 -0
  115. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +2 -0
  116. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +2 -0
  117. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/000_intro.asciidoc +1 -1
  118. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/112_getting_started.asciidoc +1 -0
  119. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/113_themes.asciidoc +1 -0
  120. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +2 -0
  121. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/_includes/documents/100_chapter.asciidoc +3 -1
  122. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/_includes/documents/200_chapter.asciidoc +1 -0
  123. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +2 -0
  124. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +6 -0
  125. data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +6 -13
  126. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +17 -11
  127. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +7 -8
  128. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +5 -7
  129. data/lib/starter_web/pages/public/blog/navigator/index.html +15 -14
  130. data/lib/starter_web/pages/public/features/general.adoc +7 -1
  131. data/lib/starter_web/pages/public/features/template.adoc +87 -128
  132. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_all_books.adoc +10 -2
  133. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_biography.adoc +8 -3
  134. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_fantasy.adoc +11 -4
  135. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_romance.adoc +11 -5
  136. data/lib/starter_web/pages/public/learn/bookshelf/jekyll_collections.adoc +24 -14
  137. data/lib/starter_web/pages/public/learn/bs_sass_variables/bs_sass_variables.adoc +4 -0
  138. data/lib/starter_web/pages/public/learn/core_web_vitals/core_web_vitals.adoc +8 -4
  139. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/100_gistblock.asciidoc +2 -1
  140. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/themes_bootstrap.asciidoc +27 -28
  141. data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +169 -155
  142. data/lib/starter_web/pages/public/learn/roundtrip/bootstrap_themes.adoc +28 -19
  143. data/lib/starter_web/pages/public/learn/roundtrip/highlghter_rouge.adoc +9 -5
  144. data/lib/starter_web/pages/public/learn/roundtrip/icon_fonts.adoc +67 -77
  145. data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.1.asciidoc +460 -0
  146. data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.adoc +12 -7
  147. data/lib/starter_web/pages/public/learn/roundtrip/modal_extentions.adoc +26 -19
  148. data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +470 -447
  149. data/lib/starter_web/pages/public/learn/roundtrip/present_videos.adoc +60 -59
  150. data/lib/starter_web/pages/public/learn/roundtrip/responsive_tables.adoc +51 -38
  151. data/lib/starter_web/pages/public/learn/roundtrip/typography.adoc +31 -25
  152. data/lib/starter_web/pages/public/learn/where_to_go.adoc +9 -4
  153. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +4 -0
  154. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +2 -0
  155. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +22 -3
  156. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +5 -0
  157. data/lib/starter_web/pages/public/manuals/speak2me.adoc +412 -0
  158. data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +27 -19
  159. data/lib/starter_web/pages/public/plans/plans.adoc +3 -0
  160. data/lib/starter_web/pages/public/tools/cheatsheet/gem.adoc +2 -0
  161. data/lib/starter_web/pages/public/tools/cheatsheet/git.adoc +2 -0
  162. data/lib/starter_web/pages/public/tools/cheatsheet/j1.adoc +2 -0
  163. data/lib/starter_web/pages/public/tools/cheatsheet/yaml.adoc +6 -0
  164. data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +17 -3
  165. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  166. data/lib/starter_web/utilsrv/package.json +1 -1
  167. metadata +38 -7
  168. data/lib/starter_web/_includes/google/static/google_ad_7284712660.html +0 -19
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  title: Privacy
3
3
  tagline: Your Personal Data
4
+
4
5
  date: 2023-01-01
5
6
  #last_modified: 2023-01-01
7
+
6
8
  description: >
7
9
  J1 Template is a Bootstrap V5 website template for the static
8
10
  site generator Jekyll.
@@ -87,14 +89,17 @@ the General Data Protection Regulation (GDPR) of the European Union.
87
89
  // Include sub-documents (if any)
88
90
  // -----------------------------------------------------------------------------
89
91
  ifeval::[{cookies} == true]
92
+ [role="mt-5"]
90
93
  == Cookies
91
94
 
92
95
  This website uses cookies and similar technologies for its operation
93
96
  this offer. You are free to give your consent, refuse, or revoke by clicking on
94
- the data protection dialog button. Subsequent changes are possible
95
- *at any time* by clicking on the icon mdi:cookie[18px, md-blue] placed in
96
- the *menu bar*.
97
+ the data protection dialog button.
98
+
99
+ Subsequent changes are possible *at any time* by clicking on the icon
100
+ mdi:cookie[24px, md-blue] placed top right in the *menu bar*.
97
101
 
102
+ [role="mb-4"]
98
103
  *Advanced* third-party cookies are only used with your consent. Additional
99
104
  cookies are used to analyze the website usage or to offer personalized content.
100
105
  The evaluation of this information gives you a better user experience of the
@@ -125,6 +130,7 @@ endif::[]
125
130
 
126
131
 
127
132
  ifeval::[{cookie-consent} == true]
133
+ [role="mt-5"]
128
134
  == Privacy and your settings
129
135
 
130
136
  If you want to set which *cookies* (and similar technologies) are used by
@@ -153,6 +159,7 @@ endif::[]
153
159
 
154
160
 
155
161
  ifeval::[{themes} == true]
162
+ [role="mt-5"]
156
163
  == Themes
157
164
 
158
165
  Themes for Bootstrap are used to customize the appearance of a website
@@ -174,6 +181,7 @@ endif::[]
174
181
 
175
182
 
176
183
  ifeval::[{logs-files} == true]
184
+ [role="mt-5"]
177
185
  == Log files
178
186
 
179
187
  We collect certain information automatically from our web servers and save them
@@ -195,6 +203,7 @@ endif::[]
195
203
 
196
204
 
197
205
  ifeval::[{google-analytics} == true]
206
+ [role="mt-5"]
198
207
  == Google Traffic analytics (GA)
199
208
 
200
209
  This website uses Google Analytics (GA), a data service for the analysis of
@@ -229,6 +238,7 @@ endif::[]
229
238
 
230
239
 
231
240
  ifeval::[{google-ads} == true]
241
+ [role="mt-5"]
232
242
  == Google Advertising (GAA)
233
243
 
234
244
  This website uses Google Ads (GAD), a data service for personalized
@@ -263,6 +273,7 @@ endif::[]
263
273
 
264
274
 
265
275
  ifeval::[{google-translator} == true]
276
+ [role="mt-5"]
266
277
  == Google Translation (GT)
267
278
 
268
279
  This website uses Google Google Translator (GT), a service to translate the
@@ -292,6 +303,7 @@ endif::[]
292
303
 
293
304
 
294
305
  ifeval::[{hyvor} == true]
306
+ [role="mt-5"]
295
307
  == Use of Comments (HT)
296
308
 
297
309
  On our pages, functions of the service *Hyvor Talk* (HT) may be embedded.
@@ -329,6 +341,7 @@ endif::[]
329
341
 
330
342
 
331
343
  ifeval::[{facebook} == true]
344
+ [role="mt-5"]
332
345
  == Use of the Facebook Integration
333
346
 
334
347
  On our pages, *functions* of the social network *Facebook* (HT) may be embedded.
@@ -365,6 +378,7 @@ endif::[]
365
378
 
366
379
 
367
380
  ifeval::[{twitter} == true]
381
+ [role="mt-5"]
368
382
  == Use of the Twitter Integration
369
383
 
370
384
  On our pages, *functions* of the news network *Twitter* may be embedded.
@@ -401,6 +415,7 @@ endif::[]
401
415
 
402
416
 
403
417
  ifeval::[{instagram} == true]
418
+ [role="mt-5"]
404
419
  == Use of the Instagram Integration
405
420
 
406
421
  On our pages, *functions* of the social network *Instagram* may be embedded.
@@ -437,6 +452,7 @@ endif::[]
437
452
 
438
453
 
439
454
  ifeval::[{youtube} == true]
455
+ [role="mt-5"]
440
456
  == Use of YouTube Videos (YTV)
441
457
 
442
458
  On our pages, *functions* (player) of the video platform *YouTube* (YT) may be
@@ -472,6 +488,7 @@ endif::[]
472
488
 
473
489
 
474
490
  ifeval::[{vimeo} == true]
491
+ [role="mt-5"]
475
492
  == Use of Vimeo Videos (VIV)
476
493
 
477
494
  On our pages, *functions* (player) of the video platform *Vimeo* (VI) may be
@@ -507,6 +524,7 @@ endif::[]
507
524
 
508
525
 
509
526
  ifeval::[{dailymotion} == true]
527
+ [role="mt-5"]
510
528
  == Use of DailyMotion Videos (DMV)
511
529
 
512
530
  On our pages, *functions* (player) of the video platform *DailyMotion* (DMV)
@@ -542,6 +560,7 @@ endif::[]
542
560
 
543
561
 
544
562
  ifeval::[{vk} == true]
563
+ [role="mt-5"]
545
564
  == Use of VK Videos (VKV)
546
565
 
547
566
  On our pages, *functions* (player) of the video platform *VK* (VKV) may be
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  title: Comment Policy
3
3
  tagline: Discuss With Respect
4
+
4
5
  date: 2021-03-30
5
6
  #last_modified: 2023-01-01
7
+
6
8
  description: >
7
9
  J1 Template is a Bootstrap V5 website template for the static
8
10
  site generator Jekyll.
@@ -96,6 +98,8 @@ various features, such as social integration and social networking to support
96
98
  your personal networks.
97
99
  endif::[]
98
100
 
101
+
102
+ [role="mt-5"]
99
103
  == Discuss with Respect
100
104
 
101
105
  One of the most important aspects of a helpful blog is the conversation
@@ -113,6 +117,7 @@ without notice.
113
117
 
114
118
  NOTE: This comment policy is subject to change at any time.
115
119
 
120
+ [role="mt-5"]
116
121
  Promotional::
117
122
  Comments deemed to be spam or solely promotional in nature will be
118
123
  deleted. Links to relevant content are permitted, but comments should be
@@ -0,0 +1,412 @@
1
+ ---
2
+ title: Speak2Me
3
+ title_extention: J1 Module for Speech Synthesise (TTS)
4
+ tagline: Screen Reader for J1 Template
5
+
6
+ date: 2023-07-26
7
+ #last_modified: 2023-01-01
8
+
9
+ description: >
10
+ Speak2Me for J1 Template is a speech synthesise module that enables a
11
+ so-called screen reader. The reader functionality allows users to sit back
12
+ and listen to the browser read aloud the important contents on a Web page.
13
+ keywords: >
14
+ open source, free, template, jekyll, jekyllone, web,
15
+ sites, static, jamstack, bootstrap,
16
+ speech, synthesise, sst, j1 module, jquery
17
+
18
+ categories: [ Module ]
19
+ tags: [ Speech Synthesise, jQuery ]
20
+
21
+ regenerate: true
22
+ permalink: /pages/public/modules/speak2me/
23
+
24
+ resources: [ animate, clipboard, lightbox, rouge ]
25
+ resource_options:
26
+ - attic:
27
+ slides:
28
+ - url: /assets/images/pages/roundtrip/images-1920x1280-bw.jpg
29
+ alt: Photo by Ricardo Gomez Angel on Unsplash
30
+ badge:
31
+ type: unsplash
32
+ author: Ricardo Gomez Angel
33
+ href: https://unsplash.com/@ripato/portfolio
34
+ ---
35
+
36
+ // Page Initializer
37
+ // =============================================================================
38
+ // Enable the Liquid Preprocessor
39
+ :page-liquid:
40
+
41
+ // Set (local) page attributes here
42
+ // -----------------------------------------------------------------------------
43
+ // :page--attr: <attr-value>
44
+
45
+ // Load Liquid procedures
46
+ // -----------------------------------------------------------------------------
47
+ {% capture load_attributes %}themes/{{site.template.name}}/procedures/global/attributes_loader.proc{%endcapture%}
48
+
49
+ // Load page attributes
50
+ // -----------------------------------------------------------------------------
51
+ {% include {{load_attributes}} scope="none" %}
52
+
53
+ // Page content
54
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55
+ // https://github.com/mdn/dom-examples/tree/main/web-speech-api
56
+ // https://mdn.github.io/dom-examples/web-speech-api/speak-easy-synthesis/
57
+ // https://stackoverflow.com/questions/11279291/a-good-text-to-speech-javascript-library
58
+ // https://codepen.io/meetselva/pen/EVaLmP
59
+ // https://dev.to/jankapunkt/cross-browser-speech-synthesis-the-hard-way-and-the-easy-way-353
60
+ //
61
+ [role="dropcap"]
62
+ Speech synthesis is an application programming interface (API) in web
63
+ development that allows web browsers to generate synthesized speech,
64
+ commonly known as text-to-speech (TTS). It enables developers to incorporate
65
+ speech synthesis functionality into web pages, applications, and other
66
+ online experiences.
67
+
68
+ With the speech synthesis API, you can convert text into speech, and the
69
+ synthesized speech can then be played through the user's speakers or
70
+ headphones. Spoken content is especially useful for making web content
71
+ more accessible to individuals with visual impairments and for adding
72
+ interactive voice elements to web applications.
73
+
74
+ // Include sub-documents (if any)
75
+ // -----------------------------------------------------------------------------
76
+ [role="mt-5"]
77
+ == Installation
78
+
79
+ Speak2Me is a jQuery plugin that enables developers, with as little as
80
+ one line of code, to create links that allow users to click, sit back, and
81
+ listen to the browser read aloud the important content on a Web page.
82
+ In some ways, it can turn a thoughtful essay or article into a mini podcast.
83
+ And because it uses built-in JavaScript functionality, no browser extensions
84
+ or other system software is needed.
85
+
86
+ Simply include the `speak2me.js` or `speak2me.min.js` file in your project.
87
+
88
+ [role="mt-5"]
89
+ == API Reference
90
+
91
+ Leverage the powerful selector options of jQuery to specify which parts
92
+ of the Web page that you want spoken. For example, depending on how you
93
+ have the Web page organized, a single line of code, like the following,
94
+ can direct Speak2Me to speak the entire contents of an article or a
95
+ blog post.
96
+
97
+ [source, javascript]
98
+ ----
99
+ $('article').speak2me('speak')
100
+ ----
101
+
102
+ Or how about only the primary headers and paragraphs
103
+
104
+ [source, javascript]
105
+ ----
106
+ $('h1,h2,p').speak2me('speak')
107
+ ----
108
+
109
+ NOTE: Internally, Speak2Me clones the matched set of elements and all
110
+ their descendant elements and text nodes. It then parses this clone
111
+ using a default set of rules, deciding what should be spoken and
112
+ ignored, then adding the appropriate pauses to make everything sound
113
+ more like a narrative.
114
+
115
+ === Examples
116
+
117
+ Do not speak the content of `<h5>`, `<h6>`, and `<em>` tags.
118
+ [source, javascript]
119
+ ----
120
+ $().speak2me('ignore','h5','h6','em')
121
+ ----
122
+
123
+ Speak the content of `<button>` and `<code>` tags.
124
+ [source, javascript]
125
+ ----
126
+ $().speak2me('recognize','button','code')
127
+ ----
128
+
129
+ When `i.e.` is encountered, say `That is`.
130
+ [source, javascript]
131
+ ----
132
+ $().speak2me('replace','i.e.','That is')
133
+ ----
134
+
135
+ Change default intro text spoken when an HTML tga `<img>` is
136
+ encountered.
137
+ [source, javascript]
138
+ ----
139
+ $().speak2me('customize','img','Embedded')
140
+ ----
141
+
142
+ Change default intro and outro text spoken when an HTML tag `<ol>`
143
+ is encountered.
144
+ [source, javascript]
145
+ ----
146
+ $().speak2me('customize','ol','Start of numbered List.','End of Numbered List')
147
+ ----
148
+
149
+ === Base Functions
150
+
151
+ [cols="6a,6a", options="header", width="100%", role="rtable"]
152
+ |===
153
+ |Method |Description
154
+
155
+ |`$(selector).speak2me('speak')`
156
+ |Speaks aloud the specified DOM element(s) and their descendants.
157
+
158
+ |`$().speak2me('pause')`
159
+ |Pauses the speaking.
160
+
161
+ |`$().speak2me('resume')`
162
+ |Resumes the speaking after it has been paused.
163
+
164
+ |`$().speak2me('stop')`
165
+ |Stops the speaking permanently.
166
+
167
+ |===
168
+
169
+ === Voice Parameters
170
+
171
+ [cols="4a,5a,3", options="header", width="100%", role="rtable"]
172
+ |===
173
+ |Method |Description |Default\|Range
174
+
175
+ |`$().speak2me('rate', number)`
176
+ |Sets the rate of the speaking voice.
177
+ |Default: 1.1 +
178
+ Range: [0.1 - 10.0]
179
+
180
+ |`$().speak2me('pitch', number)`
181
+ |Sets the pitch of the speaking voice.
182
+ |Default: 1.0 +
183
+ Range: [0.0 - 2.0]
184
+
185
+ |`$().speak2me('volume', number)`
186
+ |Sets the volume of the speaking voice.
187
+ |Default: 1.0 +
188
+ Range: [0.0 - 1.0]
189
+ |===
190
+
191
+ NOTE: Omitting number resets the parameter to its default value;
192
+ changes take effect only when next speak call is made
193
+
194
+ === Read-Only Attributes
195
+
196
+ [cols="6a,6a", options="header", width="100%", role="rtable"]
197
+ |===
198
+ |Method |Description
199
+ |`$().speak2me('enabled')`
200
+ |Returns `true`\|`false` specifying whether the browser supports
201
+ the Web *Speech API*.
202
+
203
+ |`$().speak2me('isSpeaking')`
204
+ |Returns `true`\|`false` specifying whether speaking has not
205
+ yet been completed or stopped.
206
+
207
+ |`$().speak2me('isPaused')`
208
+ |Returns `true`\|`false` specifying whether speaking is paused.
209
+ |===
210
+
211
+ NOTE: `$().speak2me('isSpeaking')` returns the value of true even
212
+ when paused
213
+
214
+ === Get and Set Voices
215
+
216
+ NOTE: Language codes consist of two-characters that specify the
217
+ language, followed by a hyphen, followed by additional characters that
218
+ specify the particular country or regional dialect of that language. For
219
+ example, the codes ``en-US'' and ``en-GB'' are both English language,
220
+ but each represent a different country.
221
+
222
+ [cols="6a,6a", options="header", width="100%", role="rtable"]
223
+ |===
224
+ |Method |Description
225
+
226
+ |`$().speak2me('getVoices')`
227
+ |Returns an array of voice objects; each object has two properties:
228
+ `name` and `language`
229
+
230
+ |`$().speak2me('getVoices',selector,text)`
231
+ |Populates the DOM element(s) _selector_ with a dropdown menu for
232
+ voice selection; optional _text_ overwrites default dropdown menu instruction
233
+
234
+ |`$().speak2me('setVoice','name',voice)`
235
+ |Sets the voice. Must exactly match one of the names returned
236
+ when using `getVoices`.
237
+
238
+ |`$().speak2me('setVoice','language',twoDigit)`
239
+ |Sets the voice by finding the first voice that matches the _two digit_
240
+ language code (case-insensitive).
241
+
242
+ |`$().speak2me('setVoice','language',code)`
243
+ |Sets the voice by finding the first voice that exactly matches the
244
+ complete language code
245
+ |===
246
+
247
+ .Setting a Voice
248
+ [TIP]
249
+ ====
250
+ Setting a voice by specifying only a two-digit language code is
251
+ useful for when you have text on the page in another language, but don’t
252
+ want to bother checking to see if that language is available. For
253
+ example, a page otherwise in English may have a paragraph in German that
254
+ you want spoken. That paragraph can have a link like this:
255
+
256
+ `$('p').speak2me('setVoice','language','de').speak2me('speak')`
257
+ ====
258
+
259
+ If the German language is available, it will be appropriately spoken. If
260
+ not, the current voice will remain.
261
+
262
+ === Text Manipulation
263
+
264
+ [cols="6a,6a", options="header", width="100%", role="rtable"]
265
+ |===
266
+ |Method |Description
267
+
268
+ |`$().speak2me('ignore',tagName,tagName,...)`
269
+ |Adds one or more *HTML tags* to the default array of ignored HTML tags.
270
+ Omitting _tagName_ clears the array of user-specified ignored HTML tags. +
271
+ See Reference Information below
272
+
273
+ |`$().speak2me('recognize',tagName,tagName,...)`
274
+ |Removes one or more *HTML tags* from the default array of ignored
275
+ HTML tags. Omitting _tagName_ clears the array of user-specified
276
+ recognized HTML tags. +
277
+ See Reference Information below
278
+
279
+ |`$().speak2me('replace',oldText,newText,...)`
280
+ |Replaces _oldText_ with _newText_ when speaking. This is case-insensitive
281
+ Multiple pairs of text can be specified. Omitting parameters deletes previous
282
+ replace commands
283
+
284
+ |`$().speak2me('customize',tagName,prepend)`
285
+ |Replaces default text spoken prior to the description of the *HTML tags*
286
+ `<img>`, `<table>`, and `<figure>`. Omitting parameters reverts values to
287
+ its defaults. +
288
+ See Reference Information below
289
+
290
+ |`$().speak2me('customize',tagName,prepend,append)`
291
+ |Replaces default text spoken prior to and after the content of the
292
+ *HTML tags* `<q>`, `<ol>`, `<ul>`, and `<blockquote>`. +
293
+ Omitting parameters reverts values to its defaults. +
294
+ See Reference Information below
295
+ |===
296
+
297
+ === HTML Data Attributes
298
+
299
+ [cols="6a,6a", options="header", width="100%", role="rtable"]
300
+ |===
301
+ |Data Attribute |Description
302
+
303
+ |`data-speak2me-ignore`
304
+ |Content from that DOM element and its descendents are ignored.
305
+
306
+ |`data-speak2me-recognize`
307
+ |Content from that DOM element is spoken, overriding the default.
308
+
309
+ |`data-speak2me-spell`
310
+ |Content from that DOM element is spelled out.
311
+
312
+ |`data-speak2me-prepend=text`
313
+ |Specified _text_ is spoken prior to the content of its DOM element.
314
+
315
+ |`data-speak2me-append=text`
316
+ |Specified _text_ is spoken after to the content of its DOM element.
317
+
318
+ |`data-speak2me-swap=text`
319
+ |Specified _text_ is spoken in place of the content of its DOM element.
320
+ |===
321
+
322
+ === Reference Information
323
+
324
+ Chaining calls is acceptable. For example, the following works just
325
+ fine.
326
+ [source, javascript]
327
+ ----
328
+ $('article').speak2me('rate',1.3).speak2me('speak');
329
+ ----
330
+
331
+ CAUTION: *Ignored Tags:* audio, button, canvas, code, del, dialog, dl, embed,
332
+ form, head, iframe, meter, nav, noscript, object, s, script, select,
333
+ style, textarea, video
334
+
335
+ [cols=",,", options="header", width="100%", role="rtable"]
336
+ |===
337
+ |HTML Tag |Default Prepend Text |Default Append Text
338
+ |`<img>` |There’s an embedded image with the description, |n/a
339
+ |`<table>` |There’s an embedded table with the caption, |n/a
340
+ |`<figure>` |There’s an embedded figure with the caption, |n/a
341
+ |`<q>` and “ ” |Quote, |, Unquote,
342
+ |`<ol>` |Start of list. |End of list.
343
+ |`<ul>` |Start of list. |End of list.
344
+ |`<blockquote>` |Blockquote start. |Blockquote end.
345
+ |===
346
+
347
+ IMPORTANT: A comma `,` followed by a space results in a pause when
348
+ spoken. A period `.` results in a *slightly* longer *pause*.
349
+
350
+
351
+ [role="mt-5"]
352
+ == Issues
353
+
354
+ === Issues can't be fixed with JavaScript
355
+
356
+ Some issues are platform-specific. You need to your app in a way to avoid
357
+ these issues, where possible:
358
+
359
+ * All browsers on Android actually do a cancel/stop when calling
360
+ `peechSynthesis.pause`; pause is simply not supported on Android
361
+
362
+ * There are *no* voices on *Chromium-Ubuntu* and Ubuntu-derivatives
363
+ unless the browser is started with a flag
364
+ * If on Chromium-Desktop Ubuntu and the very first page wants to load
365
+ speech synthesis, then there are no voices ever loaded until the
366
+ page is refreshed or a new page is entered. This can be fixed with
367
+ JavaScript but it can lead to very bad UX to auto-refresh the page.
368
+ * If voices are not installed on the host-OS and there are no voices
369
+ loaded from remote by the browser, then there are no voices and
370
+ thus no speech synthesis
371
+ * There is no chance to just instant-load custom voices from remote
372
+ and use them as a shim in case there are no voices
373
+ * If the installed voices are just bad users have to manually install
374
+ better voices
375
+
376
+ === Chrome-specific fix
377
+
378
+ Longer texts on Chrome-Desktop will be cancelled automatically after
379
+ *15 seconds*. This can be fixed by either chunking the texts or by
380
+ using an interval of "zero"-latency pause/resume combination. At the
381
+ same time this fix breaks on *Android*, since Android devices don't implement
382
+ speechSynthesis.pause() as pause but as cancel:
383
+
384
+ [source, javascript]
385
+ ----
386
+ let timer
387
+
388
+ utterance.onstart = () => {
389
+ // detection is up to you for this article as
390
+ // this is an own huge topic for itself
391
+ if (!isAndroid) {
392
+ resumeInfinity(utterance)
393
+ }
394
+ }
395
+
396
+ const clear = () => { clearTimeout(timer) }
397
+
398
+ utterance.onerror = clear
399
+ utterance.onend = clear
400
+
401
+ const resumeInfinity = (target) => {
402
+ // prevent memory-leak in case utterance is deleted, while this is ongoing
403
+ if (!target && timer) { return clear() }
404
+
405
+ speechSynthesis.pause()
406
+ speechSynthesis.resume()
407
+
408
+ timer = setTimeout(function () {
409
+ resumeInfinity(target)
410
+ }, 5000)
411
+ }
412
+ ----
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  title: J1 Template
3
3
  tagline: Creating Responsive Websites
4
+
4
5
  date: 2020-11-03
5
6
  #last_modified: 2023-01-01
7
+
6
8
  description: >
7
9
  J1 Template is a Bootstrap V5 website template for the static
8
10
  site generator Jekyll.
@@ -68,16 +70,18 @@ resource_options:
68
70
  // Include sub-documents (if any)
69
71
  // -----------------------------------------------------------------------------
70
72
  [[responsive-design]]
73
+ [role="mt-5"]
71
74
  == Full Responsive
72
75
 
76
+ A good user experience browsing a Web site is one of the most important
77
+ features a website offers as a must, besides excellent content.
78
+
73
79
  [role="mb-3"]
74
80
  image::/assets/images/pages/panels/responsive-text-1920x800.jpg[{{page.title}}, width=1280]
75
81
 
76
- A good user experience browsing a Web site is one of the most important
77
- features a website offers as a must, besides excellent content. Presenting
78
- content at its best on all devices for all window sizes makes a great Web
79
- brilliant. J1 Template supports your Web for full responsiveness, for the
80
- best user experience on all modern devices.
82
+ Presenting content at its best on all devices for all window sizes makes
83
+ a great Web brilliant. J1 Template supports your Web for full responsiveness,
84
+ for the best user experience on all modern devices.
81
85
 
82
86
  // [role="skiptranslate"]
83
87
  === Bootstrap Integration
@@ -122,15 +126,17 @@ modifications; your unique design.
122
126
 
123
127
 
124
128
  [[current-technology]]
129
+ [role="mt-5"]
125
130
  == HTML5 · CSS3 · JS
131
+ The Internet is a rapidly changing world. Like the fashion industries, new
132
+ trends are set every year.
126
133
 
127
134
  [role="mb-3"]
128
135
  image::/assets/images/pages/panels/florian-olivo-1920x800.jpg[{{page.title}}, width=1280]
129
136
 
130
- The Internet is a rapidly changing world. Like the fashion industries, new
131
- trends are set every year. J1 Template combines modern technologies for the
132
- world of static Webs to make a site unique using current standards in terms
133
- of web development, languages, and tools.
137
+ J1 Template combines modern technologies for the world of static Webs to
138
+ make a site unique using current standards in terms of web development,
139
+ languages, and tools.
134
140
 
135
141
  === Coding web pages
136
142
 
@@ -180,17 +186,16 @@ viewed on all current devices like Mobiles, Tablets, or the classic Desktop
180
186
  PC. The new HTML5 elements plus CSS3 modules can replace proprietary
181
187
  solutions like Adobe Flash to build modern web pages based on open standards.
182
188
 
183
-
184
189
  === Javascript
185
190
 
186
- [role="mb-3"]
187
- image::/assets/images/pages/panels/modules-apps-1920x800.jpg[{{page.title}}, width=1280]
188
-
189
191
  JavaScript is a text-based programming language used on the client-side and
190
192
  server-side to make web pages interactive. HTML and CSS are languages that
191
193
  give structure and style to web pages, and JavaScript provides web pages
192
194
  interactive elements that engage a user.
193
195
 
196
+ [role="mb-3"]
197
+ image::/assets/images/pages/panels/modules-apps-1920x800.jpg[{{page.title}}, width=1280]
198
+
194
199
  Content placement and basic methods for the dynamic of elements can be done
195
200
  using pure HTML5 and CSS3. For more complex solutions like *modules* (to
196
201
  provide dynamic, interactive features), the support of *Javascript* for a
@@ -212,18 +217,21 @@ website, e.g., by a powerful navigation system, for presenting image data
212
217
  in galleries, lightboxes, and so on. The good news is: no programming
213
218
  JavaScript is needed to use the build-in JS-based modules.
214
219
 
220
+
215
221
  [[launch-ready]]
222
+ [role="mt-5"]
216
223
  == Start in No Time
217
224
 
225
+ The base idea of the J1 Template is to give all people a toolset at their
226
+ hands to create a website with no need to start by web development or
227
+ web design from the beginning.
228
+
218
229
  [role="mb-3"]
219
230
  image::/assets/images/pages/panels/no-time-1920x800.jpg[{{page.title}}, width=1280]
220
231
 
221
- The base idea of the J1 Template is to give all people a toolset at their
222
- hands to create a website with no need to start by web development or
223
- web design from the beginning. A website based on J1 is using build-in
224
- templates and engines. As a result, the process to generate HTML code from
225
- your content is done automatically and allows you to concentrate on what
226
- truly matters: your content.
232
+ A website based on J1 is using build-in templates and engines. As a result,
233
+ the process to generate HTML code from your content is done automatically
234
+ and allows you to concentrate on what truly matters: your content.
227
235
 
228
236
  Using J1, you can instantly start a web project by creating your content and
229
237
  not earning the deep of web development technologies.