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.
- checksums.yaml +4 -4
- data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +11 -9
- data/_includes/themes/j1/layouts/content_generator_post.html +8 -6
- data/_includes/themes/j1/procedures/global/create_word_cloud.proc +1 -1
- data/_includes/themes/j1/procedures/layouts/module_writer.proc +1 -1
- data/_includes/themes/j1/procedures/posts/collate_timeline.proc +4 -4
- data/_includes/themes/j1/procedures/posts/pager.proc +1 -1
- data/_layouts/_home.html +88 -0
- data/_layouts/home.html +1 -1
- data/assets/data/banner.html +7 -7
- data/assets/data/panel.html +37 -25
- data/assets/data/quicklinks.html +40 -30
- data/assets/data/speak2me.html +219 -0
- data/assets/data/translator.html +32 -4
- data/assets/themes/j1/adapter/js/speak2me.js +425 -0
- data/assets/themes/j1/adapter/js/translator.js +10 -2
- data/assets/themes/j1/core/css/icon-fonts/mdib.css +21 -0
- data/assets/themes/j1/core/css/icon-fonts/mdib.min.css +1 -1
- data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +34 -40
- data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -2
- data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +77 -57
- data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +2 -2
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +176 -42
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +3 -3
- data/assets/themes/j1/core/js/template.js +1658 -0
- data/assets/themes/j1/core/js/template.min.js +11 -5
- data/assets/themes/j1/core/js/template.min.js.map +1 -1
- data/assets/themes/j1/modules/speak2me/LICENSE +21 -0
- data/assets/themes/j1/modules/speak2me/js/speak2me.js +947 -0
- data/assets/themes/j1/modules/speak2me/js/speak2me.min.js +26 -0
- data/assets/themes/j1/modules/translator/js/translator.js +30 -13
- data/assets/themes/j1/modules/translator/js/translator.min.js +1 -1
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/Gemfile +5 -5
- data/lib/starter_web/README.md +5 -5
- data/lib/starter_web/_config.yml +12 -44
- data/lib/starter_web/_data/blocks/banner.yml +7 -6
- data/lib/starter_web/_data/blocks/panel.yml +37 -39
- data/lib/starter_web/_data/layouts/home.yml +1 -1
- data/lib/starter_web/_data/modules/advertising.yml +10 -88
- data/lib/starter_web/_data/modules/buymeacoffee.yml +30 -0
- data/lib/starter_web/_data/modules/defaults/advertising.yml +3 -1
- data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +97 -164
- data/lib/starter_web/_data/modules/defaults/buymeacoffee.yml +30 -0
- data/lib/starter_web/_data/modules/defaults/navigator.yml +8 -4
- data/lib/starter_web/_data/modules/defaults/speak2me.yml +72 -0
- data/lib/starter_web/_data/modules/scroller.yml +1 -1
- data/lib/starter_web/_data/modules/speak2me.yml +33 -0
- data/lib/starter_web/_data/resources.yml +24 -1
- data/lib/starter_web/_data/templates/feed.xml +1 -1
- data/lib/starter_web/_includes/google/static/{google_ad_5128488466.html → google_ad__your-slot-id.html} +1 -1
- data/lib/starter_web/_plugins/asciidoctor/callout.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/carousel-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/gist-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/google-ad-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +2 -7
- data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +2 -3
- data/lib/starter_web/_plugins/asciidoctor/masterslider-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/mdib-icon-inline.rb +43 -0
- data/lib/starter_web/_plugins/asciidoctor/mdil-icon-inline.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/range-slider-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/slick-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/textbook-block.rb +1 -1
- data/lib/starter_web/_plugins/filter/liquify.rb +22 -22
- data/lib/starter_web/_plugins/index/lunr.rb +1 -1
- data/lib/starter_web/assets/images/collections/books/biography/a_life_in_questions.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/becoming.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/born_to_run.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/forty_autumns.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/not_dead_yet.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/the_princess_diarist.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/biography/when_breath_becomes_air.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/harry-potter-deathly-hallows.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/harry-potter-philosophers-stone.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/mistborn-trilogy.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/ready-player-one.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/sword-of-destiny.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/fantasy/terry-pratchet-diary.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/breath-of-snow-and-ashes.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/it-ends-with-us.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/outlander-novel.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/outlander-short-story.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/the-fiery-cross.jpg +0 -0
- data/lib/starter_web/assets/images/collections/books/romance/the_dressmaker.jpg +0 -0
- data/lib/starter_web/collections/_biography/a-life-in-questions.adoc +13 -8
- data/lib/starter_web/collections/_biography/becoming.adoc +18 -12
- data/lib/starter_web/collections/_biography/born-to-run.adoc +17 -13
- data/lib/starter_web/collections/_biography/forty-autumns.adoc +14 -9
- data/lib/starter_web/collections/_biography/not-dead-yet.adoc +12 -7
- data/lib/starter_web/collections/_biography/princess-diarist-the.adoc +13 -8
- data/lib/starter_web/collections/_biography/when-breath-becomes-air.adoc +14 -9
- data/lib/starter_web/collections/_fantasy/harry-potter-deathly-hallows.adoc +13 -7
- data/lib/starter_web/collections/_fantasy/harry-potter-philosophers-stone.adoc +12 -8
- data/lib/starter_web/collections/_fantasy/mistborn-trilogy.adoc +14 -10
- data/lib/starter_web/collections/_fantasy/ready-player-one.adoc +12 -11
- data/lib/starter_web/collections/_fantasy/sword-of-destiny.adoc +15 -7
- data/lib/starter_web/collections/_fantasy/terry-pratchet-diary.adoc +11 -6
- data/lib/starter_web/collections/_romance/breath-of-snow-and-ashes.adoc +15 -10
- data/lib/starter_web/collections/_romance/it-ends-with-us.adoc +11 -6
- data/lib/starter_web/collections/_romance/outlander-novel.adoc +11 -6
- data/lib/starter_web/collections/_romance/{virgins-outlander-short-story.adoc → outlander-virgins-short-story.adoc} +11 -6
- data/lib/starter_web/collections/_romance/{dressmaker-the.adoc → the-dressmaker.adoc} +11 -6
- data/lib/starter_web/collections/_romance/{fiery-cross-the.adoc → the-fiery-cross.adoc} +11 -6
- data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +6 -6
- data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +12 -11
- data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-static-site-generators.adoc +9 -7
- data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +8 -8
- data/lib/starter_web/dot.ruby-version +1 -1
- data/lib/starter_web/index.html +10 -8
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/pages/public/about/features.adoc +7 -1
- data/lib/starter_web/pages/public/about/reporting_issues.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/000_intro.asciidoc +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/112_getting_started.asciidoc +1 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/113_themes.asciidoc +1 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/_includes/documents/100_chapter.asciidoc +3 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/_includes/documents/200_chapter.asciidoc +1 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +2 -0
- data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +6 -0
- data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +6 -13
- data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +17 -11
- data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +7 -8
- data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +5 -7
- data/lib/starter_web/pages/public/blog/navigator/index.html +15 -14
- data/lib/starter_web/pages/public/features/general.adoc +7 -1
- data/lib/starter_web/pages/public/features/template.adoc +87 -128
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_all_books.adoc +10 -2
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_biography.adoc +8 -3
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_fantasy.adoc +11 -4
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_romance.adoc +11 -5
- data/lib/starter_web/pages/public/learn/bookshelf/jekyll_collections.adoc +24 -14
- data/lib/starter_web/pages/public/learn/bs_sass_variables/bs_sass_variables.adoc +4 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/core_web_vitals.adoc +8 -4
- data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/100_gistblock.asciidoc +2 -1
- data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/themes_bootstrap.asciidoc +27 -28
- data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +169 -155
- data/lib/starter_web/pages/public/learn/roundtrip/bootstrap_themes.adoc +28 -19
- data/lib/starter_web/pages/public/learn/roundtrip/highlghter_rouge.adoc +9 -5
- data/lib/starter_web/pages/public/learn/roundtrip/icon_fonts.adoc +67 -77
- data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.1.asciidoc +460 -0
- data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.adoc +12 -7
- data/lib/starter_web/pages/public/learn/roundtrip/modal_extentions.adoc +26 -19
- data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +470 -447
- data/lib/starter_web/pages/public/learn/roundtrip/present_videos.adoc +60 -59
- data/lib/starter_web/pages/public/learn/roundtrip/responsive_tables.adoc +51 -38
- data/lib/starter_web/pages/public/learn/roundtrip/typography.adoc +31 -25
- data/lib/starter_web/pages/public/learn/where_to_go.adoc +9 -4
- data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +4 -0
- data/lib/starter_web/pages/public/legal/en/200_impress.adoc +2 -0
- data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +22 -3
- data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +5 -0
- data/lib/starter_web/pages/public/manuals/speak2me.adoc +412 -0
- data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +27 -19
- data/lib/starter_web/pages/public/plans/plans.adoc +3 -0
- data/lib/starter_web/pages/public/tools/cheatsheet/gem.adoc +2 -0
- data/lib/starter_web/pages/public/tools/cheatsheet/git.adoc +2 -0
- data/lib/starter_web/pages/public/tools/cheatsheet/j1.adoc +2 -0
- data/lib/starter_web/pages/public/tools/cheatsheet/yaml.adoc +6 -0
- data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +17 -3
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +38 -7
- 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.
|
95
|
-
|
96
|
-
|
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
|
-
|
77
|
-
|
78
|
-
|
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
|
-
|
131
|
-
|
132
|
-
|
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
|
-
|
222
|
-
|
223
|
-
|
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.
|