j1-template 2023.9.1 → 2023.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/assets/data/speak2me.html +9 -7
- data/assets/themes/j1/adapter/js/navigator.js +5 -2
- data/assets/themes/j1/adapter/js/speak2me.js +181 -46
- data/assets/themes/j1/core/js/template.js +107 -90
- data/assets/themes/j1/core/js/template.min.js +5 -5
- data/assets/themes/j1/core/js/template.min.js.map +1 -1
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/README.md +5 -5
- data/lib/starter_web/_config.yml +1 -1
- data/lib/starter_web/_data/modules/defaults/speak2me.yml +7 -4
- data/lib/starter_web/_data/templates/feed.xml +1 -1
- data/lib/starter_web/_plugins/asciidoctor/carousel-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/masterslider-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/slick-block.rb +1 -1
- data/lib/starter_web/_plugins/index/lunr.rb +1 -1
- data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +1 -1
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +44 -62
- data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +3093 -3104
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9b6f995afde1773f30da8ca14b395b5671e3cf0587bfd455b7a1d2df3fab4d2
|
4
|
+
data.tar.gz: 69c717035879827a595e080097b88cde053923fbd66348f800e94385ad3d9a31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5df11565f6d500fa76cf27e1bd64129cd4356ee0c0f37badd5238938bd3ed960a1cc15d948d0d06ab616e8442638b4897b0935b915cded2f06e43ebc10efd7b4
|
7
|
+
data.tar.gz: fb4582b5cda150586a0970000b7e8c27d1c82a06a1c5fd6716f76d4f6c2f17a0859feb0883d8ce7e212e7fb8b8875f38a0b8f05bb48c6167145fbc23523c31d8
|
data/assets/data/speak2me.html
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
187
|
-
|
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
|
-
|
194
|
-
|
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
|
-
|
201
|
-
|
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
|
-
}, speak2meOptions.chrome_pause_resume_cycle);
|
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
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
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
|
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
|
-
|
337
|
-
|
338
|
-
|
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
|
433
|
+
// Calls the 'pause' function of the converter
|
346
434
|
// -------------------------------------------------------------------------
|
347
435
|
pause: function () {
|
348
|
-
|
349
|
-
$(
|
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
|
462
|
+
// Calls the 'resume' function of the converter
|
355
463
|
// -------------------------------------------------------------------------
|
356
464
|
resume: function () {
|
357
|
-
$().
|
358
|
-
|
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
|
487
|
+
// Calls the 'stop' function of the converter
|
364
488
|
// -------------------------------------------------------------------------
|
365
489
|
stop: function () {
|
366
|
-
$().speak2me('stop')
|
367
|
-
|
368
|
-
|
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
|
-
|
505
|
+
|
371
506
|
}, // END stop
|
372
507
|
|
373
508
|
// -------------------------------------------------------------------------
|