xml_renderer.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { SREError } from '../common/engine.js';
  2. import * as AudioUtil from './audio_util.js';
  3. import { MarkupRenderer } from './markup_renderer.js';
  4. export class XmlRenderer extends MarkupRenderer {
  5. markup(descrs) {
  6. this.setScaleFunction(-2, 2, -100, 100, 2);
  7. const markup = AudioUtil.personalityMarkup(descrs);
  8. const result = [];
  9. const currentOpen = [];
  10. for (let i = 0, descr; (descr = markup[i]); i++) {
  11. if (descr.span) {
  12. result.push(this.merge(descr.span));
  13. continue;
  14. }
  15. if (AudioUtil.isPauseElement(descr)) {
  16. result.push(this.pause(descr));
  17. continue;
  18. }
  19. if (descr.close.length) {
  20. for (let j = 0; j < descr.close.length; j++) {
  21. const last = currentOpen.pop();
  22. if (descr.close.indexOf(last) === -1) {
  23. throw new SREError('Unknown closing markup element: ' + last);
  24. }
  25. result.push(this.closeTag(last));
  26. }
  27. }
  28. if (descr.open.length) {
  29. const open = AudioUtil.sortClose(descr.open.slice(), markup.slice(i + 1));
  30. open.forEach((o) => {
  31. result.push(this.prosodyElement(o, descr[o]));
  32. currentOpen.push(o);
  33. });
  34. }
  35. }
  36. return result.join(' ');
  37. }
  38. }