static autoGenerateSSMLMarks()

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);
  }