punctuation_renderer.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import * as EngineConst from '../common/engine_const.js';
  2. import { AbstractAudioRenderer } from './abstract_audio_renderer.js';
  3. import * as AudioUtil from './audio_util.js';
  4. export class PunctuationRenderer extends AbstractAudioRenderer {
  5. markup(descrs) {
  6. const markup = AudioUtil.personalityMarkup(descrs);
  7. let str = '';
  8. let pause = null;
  9. let span = false;
  10. for (let i = 0, descr; (descr = markup[i]); i++) {
  11. if (AudioUtil.isMarkupElement(descr)) {
  12. continue;
  13. }
  14. if (AudioUtil.isPauseElement(descr)) {
  15. pause = descr;
  16. continue;
  17. }
  18. if (pause) {
  19. str += this.pause(pause[EngineConst.personalityProps.PAUSE]);
  20. pause = null;
  21. }
  22. str += (span ? this.separator : '') + this.merge(descr.span);
  23. span = true;
  24. }
  25. return str;
  26. }
  27. pause(pause) {
  28. let newPause;
  29. if (typeof pause === 'number') {
  30. if (pause <= 250) {
  31. newPause = 'short';
  32. }
  33. else if (pause <= 500) {
  34. newPause = 'medium';
  35. }
  36. else {
  37. newPause = 'long';
  38. }
  39. }
  40. else {
  41. newPause = pause;
  42. }
  43. return PunctuationRenderer.PAUSE_PUNCTUATION.get(newPause) || '';
  44. }
  45. }
  46. PunctuationRenderer.PAUSE_PUNCTUATION = new Map([
  47. ['short', ','],
  48. ['medium', ';'],
  49. ['long', '.']
  50. ]);