function *createUtteranceItemGenerator(
utteranceArray,
analysisArray,
translationArray,
filesArray,
) {
let name, idx = -1;
// as long as an `utteranceArray` item exists ...
while (name = utteranceArray[++idx]) {
// ... create and yield an utterance item compound.
yield {
name,
analysis: analysisArray[idx],
translation: translationArray[idx],
url: filesArray[idx]
};
}
}
function renderNextUtteranceItem(item, elmNodes) {
const { name, analysis, translation, url } = item;
const { audio, label, caption } = elmNodes;
console.log({ item });
audio && (audio.src = url);
// audio && (audio.src = `audio/${ name }.mp3`);
label && (label.textContent = analysis);
caption && (caption.textContent = translation);
}
function handleNextUtteranceItem(generator, elmNodes) {
const item = generator.next();
if (item.done === false) {
renderNextUtteranceItem(item.value, elmNodes);
}
}
function init(config) {
const elmFigure = document.querySelector('figure');
const elmButton = elmFigure?.querySelector('button');
if (elmButton) {
const { utterances, analysis, translation, files } = config;
const generator =
createUtteranceItemGenerator(utterances, analysis, translation, files);
elmButton
.addEventListener(
'click',
(/* evt */) => handleNextUtteranceItem(generator, {
audio: elmFigure.querySelector('audio'),
label: elmFigure.querySelector('label'),
caption: elmFigure.querySelector('figcaption'),
}),
);
}
}
const files = [
'https://freesound.org/data/previews/46/46989_514283-lq.mp3',
'https://freesound.org/data/previews/46/46990_514283-lq.mp3',
'https://freesound.org/data/previews/46/46991_514283-lq.mp3'
];
const utterances = ['utt01', 'utt02', 'utt03'];
const analysis = ['try+ing', 'climb+ing', 'swimm+ing'];
const translation = ['trying', 'climbing', 'swimming'];
init({ utterances, analysis, translation, files });
* { margin: 0; padding: 0; }
figure button { display: block; margin-bottom: 5px; }
figure label { display: block; }
.as-console-wrapper {
left: auto!important;
width: 51%;
min-height: 100%!important;
}
<figure class="utterance">
<button>Next Utterance</button>
<label></label>
<figcaption></figcaption>
<audio src="" controls autoplay></audio>
</figure>