j1-template 2023.9.0 → 2023.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_post.html +19 -49
  3. data/_includes/themes/j1/procedures/posts/collate_timeline.proc +185 -192
  4. data/_includes/themes/j1/procedures/posts/create_series_header.proc +1 -14
  5. data/_includes/themes/j1/procedures/posts/pager.proc +39 -46
  6. data/assets/data/speak2me.html +9 -7
  7. data/assets/themes/j1/adapter/js/navigator.js +5 -2
  8. data/assets/themes/j1/adapter/js/speak2me.js +181 -46
  9. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +3 -0
  10. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/js/template.js +165 -133
  12. data/assets/themes/j1/core/js/template.min.js +7 -7
  13. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  14. data/lib/j1/version.rb +1 -1
  15. data/lib/starter_web/README.md +5 -5
  16. data/lib/starter_web/_config.yml +1 -1
  17. data/lib/starter_web/_data/blocks/footer.yml +6 -4
  18. data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +89 -135
  19. data/lib/starter_web/_data/modules/defaults/speak2me.yml +8 -4
  20. data/lib/starter_web/_data/modules/navigator_menu.yml +14 -7
  21. data/lib/starter_web/_data/templates/feed.xml +1 -1
  22. data/lib/starter_web/_plugins/asciidoctor/carousel-block.rb +1 -1
  23. data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +1 -1
  24. data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +1 -1
  25. data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +1 -1
  26. data/lib/starter_web/_plugins/asciidoctor/masterslider-block.rb +1 -1
  27. data/lib/starter_web/_plugins/asciidoctor/slick-block.rb +1 -1
  28. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  29. data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +75 -71
  30. data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +110 -84
  31. data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-static-site-generators.adoc +49 -33
  32. data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +47 -26
  33. data/lib/starter_web/package.json +1 -1
  34. data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +66 -63
  35. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +76 -77
  36. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +63 -64
  37. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +79 -64
  38. data/lib/starter_web/pages/public/blog/navigator/index.html +55 -99
  39. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/themes_bootstrap.asciidoc +2 -1
  40. data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +39 -29
  41. data/lib/starter_web/pages/public/learn/roundtrip/bootstrap_themes.adoc +0 -3
  42. data/lib/starter_web/pages/public/learn/roundtrip/highlghter_rouge.adoc +1 -1
  43. data/lib/starter_web/pages/public/learn/roundtrip/icon_fonts.adoc +1 -0
  44. data/lib/starter_web/pages/public/learn/roundtrip/modal_extentions.adoc +1 -0
  45. data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +44 -62
  46. data/lib/starter_web/pages/public/learn/roundtrip/responsive_tables.adoc +1 -0
  47. data/lib/starter_web/pages/public/learn/where_to_go.adoc +24 -13
  48. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +4 -1
  49. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +4 -1
  50. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +632 -595
  51. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +12 -3
  52. data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +3093 -3104
  53. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  54. data/lib/starter_web/utilsrv/package.json +1 -1
  55. metadata +2 -2
@@ -42,61 +42,30 @@
42
42
  -------------------------------------------------------------------------------- {% endcomment %}
43
43
  {% assign blog_navigator_options = blog_navigator_defaults | merge: blog_navigator_settings %}
44
44
 
45
-
46
- {% comment %} Language detection
47
- -------------------------------------------------------------------------------- {% endcomment %}
48
- {% if {{site.language}} == "en" %}
49
- {% assign language = "en" %}
50
- {% elsif {{site.language}} == "de"%}
51
- {% assign language = "de" %}
52
- {% else %}
53
- {% assign language = "en" %}
54
- {% endif %}
55
-
56
- {% comment %} Set language specific button text
45
+ {% comment %} Set button text
57
46
  -------------------------------------------------------------------------------- {% endcomment %}
58
- {% if language == "en" %}
59
- {% assign pager_previous_button_text = blog_navigator_options.button_text.pager.previous.en %}
60
- {% assign pager_next_button_text = blog_navigator_options.button_text.pager.next.en %}
61
- {% assign pager_back_button_text = blog_navigator_options.button_text.pager.back.en %}
62
- {% assign pager_first_button_text = blog_navigator_options.button_text.pager.first.en %}
63
- {% assign pager_last_button_text = blog_navigator_options.button_text.pager.last.en %}
64
- {% endif %}
65
-
66
- {% if language == "de" %}
67
- {% assign pager_previous_button_text = blog_navigator_options.button_text.pager.previous.de %}
68
- {% assign pager_next_button_text = blog_navigator_options.button_text.pager.next.de %}
69
- {% assign pager_back_button_text = blog_navigator_options.button_text.pager.back.de %}
70
- {% assign pager_first_button_text = blog_navigator_options.button_text.pager.first.de %}
71
- {% assign pager_last_button_text = blog_navigator_options.button_text.pager.last.de %}
72
- {% endif %}
47
+ {% assign pager_home_button_text = blog_navigator_options.button_text.post_pager.home %}
48
+ {% assign pager_series_button_text = blog_navigator_options.button_text.post_pager.series %}
49
+ {% assign pager_back_button_text = blog_navigator_options.button_text.post_pager.back %}
50
+ {% assign pager_previous_button_text = blog_navigator_options.button_text.post_pager.previous %}
51
+ {% assign pager_next_button_text = blog_navigator_options.button_text.post_pager.next %}
52
+ {% assign pager_first_button_text = blog_navigator_options.button_text.post_pager.first %}
53
+ {% assign pager_last_button_text = blog_navigator_options.button_text.post_pager.last %}
73
54
 
74
55
 
75
56
  {% comment %} Main
76
57
  -------------------------------------------------------------------------------- {% endcomment %}
77
58
 
78
59
  <div class="paginator" data-speak2me-ignore>
79
- <ul class="pagination raised-z0">
80
60
 
81
- {% comment %} Set HOME page BUTTON (always)
82
- ---------------------------------------------------------------------------- {% endcomment %}
83
- <li class="page-item"><a class="page-link" href="/" title="Home">Home</a></li>
61
+ {% comment %} Generate posts pager
62
+ ------------------------------------------------------------------------------ {% endcomment %}
84
63
 
85
- {% comment %} Set PREVIOUS page BUTTON
86
- ---------------------------------------------------------------------------- {% endcomment %}
87
- {% if page.previous %}
88
- <li class="page-item"><a class="page-link" href="{{page.previous.url | absolute_url}}" title="{{page.previous.title}}">{{pager_previous_button_text}}</a></li>
89
- {% else %}
90
- <li class="page-item disabled"><a class="page-link">{{pager_first_button_text}}</a></li>
91
- {% endif %}
64
+ <ul class="pagination raised-z0">
92
65
 
93
- {% comment %} Set NEXT page BUTTON
66
+ {% comment %} Set HOME page BUTTON (always)
94
67
  ---------------------------------------------------------------------------- {% endcomment %}
95
- {% if page.next %}
96
- <li class="page-item"><a class="page-link" href="{{page.next.url | absolute_url}}" title="{{page.next.title}}">{{pager_next_button_text}}</a></li>
97
- {% else %}
98
- <li class="page-item disabled"><a class="page-link" href="#void">{{pager_last_button_text}}</a></li>
99
- {% endif %}
68
+ <li class="page-item"><a class="page-link" href="/" title="Back to {{pager_home_button_text}}">{{pager_home_button_text}}</a></li>
100
69
 
101
70
  {% comment %} Set BACK page (PagerURL) BUTTON
102
71
  ---------------------------------------------------------------------------- {% endcomment %}
@@ -111,15 +80,39 @@
111
80
 
112
81
  <!-- [INFO ] [procedures.global.pager.proc ] [Calculate BackURL from User State Cookie for page: {{page.title}}] -->
113
82
  if (re.test(last_pager)) {
114
- last_pager_url = '<li class="page-item"><a class="page-link" href="' + last_pager + '" title="Back to {{pager_back_button_text}}">{{pager_back_button_text}}</a></li>';
83
+ last_pager_url = '<li class="page-item"><a class="page-link" href="' + last_pager + '"title="Back to {{pager_back_button_text}}">{{pager_back_button_text}}</a></li>';
115
84
  } else {
116
- last_pager_url = '<li class="page-item disabled"><a class="page-link" title="Back to {{pager_back_button_text}}">{{pager_back_button_text}}</a></li>';
85
+ last_pager_url = '<li class="page-item"><a class="page-link disabled" title="Back to {{pager_back_button_text}}">{{pager_back_button_text}}</a></li>';
117
86
  }
87
+
118
88
  document.write( last_pager_url );
119
89
  j1.writeCookie({
120
90
  name: user_state_cookie_name,
121
91
  data: user_state
122
92
  });
123
93
  </script>
94
+
95
+ {% comment %} Set SERIES Button
96
+ ---------------------------------------------------------------------------- {% endcomment %}
97
+ {% if page.series %}
98
+ <a class="page-link" href="#offcanvasPostSeriesNavigation" title="Show Article {{pager_series_button_text}}" data-bs-toggle="offcanvas">{{pager_series_button_text}}</a>
99
+ {% endif %}
100
+
101
+ {% comment %} Set PREVIOUS page BUTTON
102
+ ---------------------------------------------------------------------------- {% endcomment %}
103
+ {% if page.previous %}
104
+ <li class="page-item"><a class="page-link" href="{{page.previous.url}}" title="Show {{pager_previous_button_text}} Article">{{pager_previous_button_text}}</a></li>
105
+ {% else %}
106
+ <li class="page-item"><a class="page-link disabled">{{pager_first_button_text}}</a></li>
107
+ {% endif %}
108
+
109
+ {% comment %} Set NEXT page BUTTON
110
+ ---------------------------------------------------------------------------- {% endcomment %}
111
+ {% if page.next %}
112
+ <li class="page-item"><a class="page-link" href="{{page.next.url}}" title="Show Next Article">{{pager_next_button_text}}</a></li>
113
+ {% else %}
114
+ <li class="page-item"><a class="page-link disabled" href="#" title="{{pager_last_button_text}} Article">{{pager_last_button_text}}</a></li>
115
+ {% endif %}
116
+
124
117
  </ul>
125
118
  </div>
@@ -146,7 +146,7 @@ exclude_from_search: true
146
146
  <button type="button"
147
147
  id="speak_button"
148
148
  class="btn btn-{{speak2me_options.modal.settings.speak_button_style}} btn-sm"
149
- style="min-width: 180px"
149
+ style="min-width: 180px;"
150
150
  onclick="j1.adapter.speak2me.speak('{{speak2me_options.speechSelector}}')"
151
151
  data-bs-dismiss="modal">
152
152
  <i class="mdib mdib-speaker mdib-sm mr-2"></i>
@@ -157,7 +157,7 @@ exclude_from_search: true
157
157
  <button type="button"
158
158
  id="stop_button"
159
159
  class="btn btn-{{speak2me_options.modal.settings.stop_button_style}} btn-sm"
160
- style="min-width: 180px"
160
+ style="min-width: 180px; display: none;"
161
161
  onclick="j1.adapter.speak2me.stop()"
162
162
  data-bs-dismiss="modal">
163
163
  <i class="mdib mdib-speaker-off mdib-sm mr-2"></i>
@@ -168,8 +168,9 @@ exclude_from_search: true
168
168
  <button type="button"
169
169
  id="pause_button"
170
170
  class="btn btn-{{speak2me_options.modal.settings.pause_button_style}} btn-sm"
171
- style="min-width: 180px"
172
- onclick="j1.adapter.speak2me.pause()">
171
+ style="min-width: 180px; display: none;"
172
+ onclick="j1.adapter.speak2me.pause()"
173
+ data-bs-dismiss="modal">
173
174
  <i class="mdib mdib-pause mdib-sm mr-2"></i>
174
175
  {{speak2me_options.modal.settings.pause_button_text}}
175
176
  </button>
@@ -178,8 +179,9 @@ exclude_from_search: true
178
179
  <button type="button"
179
180
  id="resume_button"
180
181
  class="btn btn-{{speak2me_options.modal.settings.resume_button_style}} btn-sm"
181
- style="min-width: 180px"
182
- onclick="j1.adapter.speak2me.resume()">
182
+ style="min-width: 180px; display: none;"
183
+ onclick="j1.adapter.speak2me.resume()"
184
+ data-bs-dismiss="modal">
183
185
  <i class="mdib mdib-play-pause mdib-sm mr-2"></i>
184
186
  {{speak2me_options.modal.settings.resume_button_text}}
185
187
  </button>
@@ -188,7 +190,7 @@ exclude_from_search: true
188
190
  <button type="button"
189
191
  id="exit_button"
190
192
  class="btn btn-{{speak2me_options.modal.settings.exit_button_style}} btn-sm"
191
- style="min-width: 180px"
193
+ style="min-width: 180px;"
192
194
  data-bs-dismiss="modal">
193
195
  <i class="mdib mdib-close mdib-sm mr-2"></i>
194
196
  {{speak2me_options.modal.settings.exit_button_text}}
@@ -877,7 +877,9 @@ j1.adapter.navigator = (function (j1, window) {
877
877
  // jadams, 2023-02-26: navicon settings
878
878
  style = '<style>';
879
879
  style += ' .nav-icon {';
880
- style += ' color: ' + navQuicklinksOptions.icon_color + ' !important;';
880
+ // style += ' color: ' + navQuicklinksOptions.icon_color + ' !important;';
881
+ style += ' color: ' + navQuicklinksOptions.icon_color + ';';
882
+ quicklinks
881
883
  style += ' }';
882
884
  style += '</style>';
883
885
  $('head').append(style);
@@ -885,7 +887,8 @@ j1.adapter.navigator = (function (j1, window) {
885
887
  // jadams, 2023-02-26: navicon settings
886
888
  style = '<style>';
887
889
  style += ' .nav-icon:hover {';
888
- style += ' color: ' + navQuicklinksOptions.icon_color_hover + ' !important;';
890
+ // style += ' color: ' + navQuicklinksOptions.icon_color_hover + ' !important;';
891
+ style += ' color: ' + navQuicklinksOptions.icon_color_hover + ';';
889
892
  style += ' }';
890
893
  style += '</style>';
891
894
  $('head').append(style);
@@ -78,6 +78,11 @@ regenerate: true
78
78
  # -----------------------------------------------------------------------------
79
79
  */
80
80
 
81
+ /* Further reading
82
+ https://dev.to/jankapunkt/cross-browser-speech-synthesis-the-hard-way-and-the-easy-way-353
83
+ https://github.com/jankapunkt/easy-speech
84
+ */
85
+
81
86
  // -----------------------------------------------------------------------------
82
87
  // ESLint shimming
83
88
  // -----------------------------------------------------------------------------
@@ -99,9 +104,16 @@ var isOpera = /OPR/i.test(navigator.userAgent);
99
104
  var isAvast = /Avast/i.test(navigator.userAgent);
100
105
  var isChrome = ((chrome) && (!isEdge));
101
106
  var ttsDisabled = false;
107
+ var mobilesDisabled = false;
108
+ var browsersDisabled = [];
102
109
  var isMobile = (window.orientation !== undefined) ? true :false; // NOTE: window.orientation is DEPRECATED
103
110
  // var isMobile = (screen.orientation.type == 'portrait-secondary') ? true : false;
104
111
 
112
+ // synthetic puase
113
+ var isPaused = false;
114
+ var lastSpokenChunk = false;
115
+ var lastScrollPosition = false;
116
+
105
117
  var frontmatterOptions;
106
118
  var speak2meDefaults;
107
119
  var speak2meSettings;
@@ -110,10 +122,21 @@ var speak2meModal;
110
122
  var _this;
111
123
  var logger;
112
124
  var logText;
125
+ var chromeWorkaround;
126
+ var chromeWorkaroundPause
127
+ var chromeWorkaroundResume;
128
+ var $buttonPause;
129
+ var $buttonResume;
130
+
131
+ let isRunning = true;
132
+ let intervalId;
113
133
 
114
- // -------------------------------------------------------------------------
134
+ const scrollBehavior = 'smooth';
135
+
136
+
137
+ // -----------------------------------------------------------------------------
115
138
  // global event handler
116
- // -------------------------------------------------------------------------
139
+ // -----------------------------------------------------------------------------
117
140
  var Events = {
118
141
  documentReady: function (onDocumentReady) {
119
142
  if (document.readyState !== 'loading') {
@@ -149,7 +172,7 @@ var Events = {
149
172
 
150
173
  // create settings object from frontmatter
151
174
  //
152
- frontmatterOptions = options != null ? $.extend({}, options) : {};
175
+ frontmatterOptions = options != null ? $.extend({}, options) : {};
153
176
 
154
177
  // create settings object from module options
155
178
  //
@@ -158,6 +181,8 @@ var Events = {
158
181
  speak2meOptions = $.extend(true, {}, speak2meDefaults, speak2meSettings, frontmatterOptions);
159
182
 
160
183
  ttsDisabled = (speak2meOptions.tts == "false") ? true : false;
184
+ mobilesDisabled = (speak2meOptions.mobilesDisabled == "false") ? true : false;
185
+ browsersDisabled = speak2meOptions.browsersDisabled;
161
186
 
162
187
  _this = j1.adapter.speak2me;
163
188
  logger = log4javascript.getLogger('j1.adapter.speak2me');
@@ -176,43 +201,38 @@ var Events = {
176
201
 
177
202
  if (j1.getState() === 'finished' && pageVisible && atticFinished) {
178
203
 
179
- if (isMobile) {
180
- console.log('module speak2me is currently not supported for the Opera browser');
204
+ if (mobilesDisabled && isMobile) {
205
+ console.log('speak: module speak2me is disabled for mobile browsers');
181
206
  $('#quickLinksSpeakButton').hide();
182
207
  clearInterval(dependencies_met_page_ready);
183
208
  return;
184
209
  }
185
210
 
186
- if (isOpera) {
187
- console.log('module speak2me is currently not supported for the Firefox browser');
211
+ var operaDisabled = (browsersDisabled.includes('Opera')) ? true : false;
212
+ if (operaDisabled && isOpera) {
213
+ console.log('speak: module speak2me is disabled for the Opera browser');
188
214
  $('#quickLinksSpeakButton').hide();
189
215
  clearInterval(dependencies_met_page_ready);
190
216
  return;
191
217
  }
192
218
 
193
- if (isAvast) {
194
- console.log('module speak2me is currently not supported for the Avast Secure browser');
219
+ var firefoxDisabled = (browsersDisabled.includes('Firefox')) ? true : false;
220
+ if (firefoxDisabled && isFirefox) {
221
+ console.log('speak: module speak2me is disabled for the Firefox browser');
195
222
  $('#quickLinksSpeakButton').hide();
196
223
  clearInterval(dependencies_met_page_ready);
197
224
  return;
198
225
  }
199
226
 
200
- if (isFirefox) {
201
- console.log('module speak2me is currently not supported on mobile devices');
227
+ // Avast Secure Browser always disabled
228
+ //
229
+ if (isAvast) {
230
+ console.log('module speak2me is not supported for the Avast Secure browser');
202
231
  $('#quickLinksSpeakButton').hide();
203
232
  clearInterval(dependencies_met_page_ready);
204
233
  return;
205
234
  }
206
235
 
207
- if (isChrome) {
208
- var chromeWorkaround = setInterval(function () {
209
- if ($().speak2me('isSpeaking')) {
210
- $().speak2me('pause').speak2me('resume');
211
- logger.debug('\n' + 'speak: send pause-resumed');
212
- }
213
- }, 10000);
214
- }
215
-
216
236
  if (ttsDisabled) {
217
237
  logger.warn('\n' + 'tts detected: disabled');
218
238
  $('#quickLinksSpeakButton').hide();
@@ -245,21 +265,66 @@ var Events = {
245
265
  // on 'show'
246
266
  // -------------------------------------------------------------------
247
267
  $('#speak2me_container').on('show.bs.modal', function () {
248
- if (isChrome || isEdge) {
249
- logger.warn('\n' + 'chromium browser detected: pause|resume buttons disabled');
250
- $('#pause_button').hide();
251
- $('#resume_button').hide();
252
- }
253
268
  _this.create('#voiceSelector');
254
269
  }); // END modal on 'show'
255
270
 
256
271
  // -------------------------------------------------------------------
257
272
  // on 'shown'
258
273
  // -------------------------------------------------------------------
259
- // $('#speak2me_container').on('shown.bs.modal', function () {
260
- // // do something here
261
- // return;
262
- // }); // END modal on 'shown'
274
+ $('#speak2me_container').on('shown.bs.modal', function () {
275
+ this.$buttonSpeak = $('#speak_button');
276
+ this.$buttonStop = $('#stop_button');
277
+
278
+ // setup workaround for chromium based browsers
279
+ // to enable infinite speech output
280
+ //
281
+ this.$buttonSpeak.click(function () {
282
+ if (isChrome) {
283
+ logger.info('\n' + 'speak: setup pause workaround for chromium based browsers');
284
+ chromeWorkaround = setInterval(function () {
285
+ var isSpeaking = $().speak2me('isSpeaking');
286
+
287
+ logger.info('\n' + 'speak: isSpeaking|isPaused: ' + isSpeaking + '|' + isPaused);
288
+ if (isSpeaking) {
289
+ $().speak2me('pause').speak2me('resume');
290
+ logger.info('\n' + 'speak: send pause-resumed');
291
+ } else {
292
+ $().speak2me('resume');
293
+ logger.info('\n' + 'speak: send resumed');
294
+ }
295
+
296
+ }, speak2meOptions.chrome_pause_resume_cycle);
297
+ }
298
+ });
299
+
300
+ // stop workaround for chromium based browsers
301
+ //
302
+ this.$buttonStop.click(function () {
303
+ logger.info('\n' + 'speak: remove pause workaround for chromium based browsers');
304
+ // wait 3 sec to make sure speech output is stopped
305
+ setTimeout (function() {
306
+ var isSpeaking = $().speak2me('isSpeaking');
307
+ var isPaused = $().speak2me('isPaused');
308
+
309
+ // remove pause indication
310
+ $('.mdib-speaker').removeClass('md-orange');
311
+
312
+ if (!isSpeaking && !isPaused) {
313
+ clearInterval(chromeWorkaround);
314
+ }
315
+ }, 3000);
316
+ });
317
+
318
+ }); // END modal on 'shown'
319
+
320
+ // -------------------------------------------------------------------
321
+ // on 'hidden' (close)
322
+ // -------------------------------------------------------------------
323
+ $('#speak2me_container').on('hidden.bs.modal', function () {
324
+ //
325
+ // do something here
326
+ //
327
+ }); // END modal on 'hidden'
263
328
 
264
329
  _this.setState('finished');
265
330
  logger.debug('\n' + 'state: ' + _this.getState());
@@ -316,7 +381,7 @@ var Events = {
316
381
 
317
382
  // -------------------------------------------------------------------------
318
383
  // speak()
319
- // calls the 'speak' functiion of the screen reader
384
+ // calls the 'speak' functiion of the converter
320
385
  // -------------------------------------------------------------------------
321
386
  speak: function (obj) {
322
387
  // Get the parameter values from the input sliders
@@ -329,45 +394,115 @@ var Events = {
329
394
  // chained together as demonstrated below
330
395
  //
331
396
  $(obj).speak2me('rate', rate).speak2me('pitch', pitch).speak2me('volume', volume);
397
+
332
398
  // $(obj).speak2me('ignore', 'h2','h3');
333
- var speaker = $(obj).speak2me('speak');
334
- $(".mdib-speaker").addClass("mdib-spin");
335
399
 
336
- // just for debugging completeness, no errors seem to be thrown though
337
- speaker.addEventListener('error', (event) => {
338
- console.log('speak2me error:', event);
400
+ var paused;
401
+ if (!lastSpokenChunk) {
402
+ paused = false;
403
+ } else {
404
+ paused = true;
405
+ }
406
+
407
+ var speaker = $(obj).speak2me('speak', {
408
+ isPaused: paused,
409
+ lastChunk: lastSpokenChunk,
410
+ lastScrollPosition: lastScrollPosition,
339
411
  });
340
412
 
413
+ // set speak indication;
414
+ $('.mdib-speaker').addClass('mdib-spin');
415
+
416
+ $('#stop_button').show();
417
+ $('#pause_button').show();
418
+
419
+ // hide buttons NOT needed
420
+ //
421
+ $('#speak_button').hide();
422
+ $('#resume_button').hide();
423
+
424
+ // just for debugging completeness, no errors seem to be thrown though
425
+ // speaker.addEventListener('error', (event) => {
426
+ // console.log('speak2me error:', event);
427
+ // });
428
+
341
429
  }, // END speak
342
430
 
343
431
  // -------------------------------------------------------------------------
344
432
  // pause()
345
- // Calls the 'pause' function of rge screen reader
433
+ // Calls the 'pause' function of the converter
346
434
  // -------------------------------------------------------------------------
347
435
  pause: function () {
348
- $().speak2me('pause');
349
- $(".mdib-speaker").removeClass("mdib-spin");
436
+ // remove speak indication;
437
+ $('.mdib-speaker').removeClass('mdib-spin');
438
+
439
+ // set pause indication
440
+ $('.mdib-speaker').addClass('md-orange');
441
+
442
+ if (!isChrome) {
443
+ $().speak2me('pause');
444
+ } else {
445
+ // synthetic pause-resume for chromium-based browsers
446
+ //
447
+ lastSpokenChunk = $().speak2me('isSpoken');
448
+ lastScrollPosition = $().speak2me('isScrolled');
449
+ $().speak2me('stop');
450
+ }
451
+
452
+ $('#resume_button').show();
453
+
454
+ // hide buttons NOT needed
455
+ //
456
+ $('#pause_button').hide();
457
+
350
458
  }, // END pause
351
459
 
352
460
  // -------------------------------------------------------------------------
353
461
  // resume()
354
- // Calls the 'resume' function of rge screen reader
462
+ // Calls the 'resume' function of the converter
355
463
  // -------------------------------------------------------------------------
356
464
  resume: function () {
357
- $().speak2me('resume');
358
- $(".mdib-speaker").addClass("mdib-spin");
465
+ $('.mdib-speaker').addClass('mdib-spin');
466
+ if (!isChrome) {
467
+ $().speak2me('resume');
468
+ } else {
469
+ // synthetic pause-resume for chromium-based browsers
470
+ //
471
+ _this.speak('{{speak2me_options.speechSelector}}');
472
+ }
473
+
474
+ $('#pause_button').show();
475
+
476
+ // hide buttons NOT needed
477
+ //
478
+ $('#resume_button').hide();
479
+
480
+ // remove pause indication
481
+ $('.mdib-speaker').removeClass('md-orange');
482
+
359
483
  }, // END resume
360
484
 
361
485
  // -------------------------------------------------------------------------
362
486
  // stop()
363
- // Calls the 'stop' function of rge screen reader
487
+ // Calls the 'stop' function of the converter
364
488
  // -------------------------------------------------------------------------
365
489
  stop: function () {
366
- $().speak2me('stop');
367
- $(".mdib-speaker").removeClass("mdib-spin");
368
- // potential workaround, when selected language in voice
490
+ $().speak2me('stop')
491
+ // remove speak indication;
492
+ $('.mdib-speaker').removeClass('mdib-spin');
493
+ // remove pause indication
494
+ $('.mdib-speaker').removeClass('md-orange');
495
+
496
+ $('#speak_button').show();
497
+
498
+ // jadams, 2023-09-28;
499
+ // workaroud: reload page to reset TTS dialog (buttons)
500
+ location.reload();
501
+
502
+ // jadams, 2023-09-28;
503
+ // solution required, when selected language in voice
369
504
  // selector (dialog) has NOT changed if translation was changed
370
- // location.reload();
505
+
371
506
  }, // END stop
372
507
 
373
508
  // -------------------------------------------------------------------------
@@ -12733,6 +12733,9 @@ li > a:hover {
12733
12733
  text-decoration: none;
12734
12734
  color: rgba(0, 0, 0, 0.8) !important; }
12735
12735
 
12736
+ .page-link.disabled {
12737
+ background-color: #e0e0e0; }
12738
+
12736
12739
  .page-link:hover, .page-link:focus {
12737
12740
  border: 1px solid !important;
12738
12741
  background-color: #757575 !important;