in src/core/awspack/TextToSpeechUtils.js [34:106]
static autoGenerateSSMLMarks(text, map, randomMarks = []) {
if (typeof map !== 'object' || map === null) {
throw new Error(
`Cannot generate SSML marks for text "${text}" because map is not an object.`
);
}
// process the input map into an internal format
const internalMap = this._processInputMap(map);
const speakTags = ['<speak>', '</speak>'];
const ssmlMarkRegex = /<mark name=(?:"|')(.*?)(?:"|')\/>/;
const ssmlTagRegex = /<[^>]*>/g;
// Identify any existing SSML tags
const existingTags = [];
let result = ssmlTagRegex.exec(text);
while (result !== null) {
existingTags.push({
start: result.index,
end: result.index + result[0].length,
text: result[0],
});
result = ssmlTagRegex.exec(text);
}
const chunks = [];
let index = 0;
let ssmlMarkResult;
let duplicateMarkToCheck = [];
existingTags.forEach(existingTag => {
const substr = text.slice(index, existingTag.start);
if (substr !== '') {
// auto-mark non-tag text
chunks.push(
this._insertMarks(substr, internalMap, duplicateMarkToCheck)
);
duplicateMarkToCheck = [];
}
ssmlMarkResult = ssmlMarkRegex.exec(existingTag.text);
if (ssmlMarkResult !== null) {
const markText = ssmlMarkResult[1];
duplicateMarkToCheck.push(markText);
} else if (!speakTags.includes(existingTag.text)) {
chunks.push(existingTag.text);
}
// advance the index
index = existingTag.end;
});
chunks.push(
this._insertMarks(text.slice(index), internalMap, duplicateMarkToCheck)
);
let markedText = chunks.join('');
if (randomMarks && randomMarks.length > 0) {
// add random marks to any unmarked sentences
markedText = this.addMarksToUnmarkedSentences(
markedText,
randomMarks
);
}
return TextToSpeechUtils.validateText(markedText);
}