srt.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use strict';
  2. var xml2js = require('xml2js');
  3. /**
  4. * Converts an input buffer to a SRT subtitle.
  5. * @param {Buffer|string} input
  6. * @param {function(Error, string=)} done
  7. */
  8. module.exports = function(input, done) {
  9. if (typeof buffer !== 'string') input = input.toString();
  10. xml2js.parseString(input, {
  11. explicitArray: false,
  12. explicitRoot: false
  13. }, function(err, xml) {
  14. try {
  15. if (err) return done(err);
  16. done(undefined, xml.events.event.map(_convert).join('\n'));
  17. } catch(err) {
  18. done(err);
  19. }
  20. });
  21. };
  22. /**
  23. * Converts an event.
  24. * @param {Object} event
  25. * @param {number} index
  26. * @returns {string}
  27. */
  28. function _convert(event, index) {
  29. var attributes = event.$;
  30. return (index + 1) + '\n' +
  31. _time(attributes.start) + ' --> ' + _time(attributes.end) + '\n' +
  32. _text(attributes.text) + '\n';
  33. }
  34. /**
  35. * Prefixes a value.
  36. * @param {string} value
  37. * @param {number} length
  38. * @returns {string}
  39. */
  40. function _prefix(value, length) {
  41. while (value.length < length) value = '0' + value;
  42. return value;
  43. }
  44. /**
  45. * Suffixes a value.
  46. * @param {string} value
  47. * @param {number} length
  48. * @returns {string}
  49. */
  50. function _suffix(value, length) {
  51. while (value.length < length) value = value + '0';
  52. return value;
  53. }
  54. /**
  55. * Formats a text value.
  56. * @param {string} text
  57. * @returns {string}
  58. */
  59. function _text(text) {
  60. return text.replace(/{[^}]+}/g, '').replace(/\\n/ig, '\n');
  61. }
  62. /**
  63. * Formats a time stamp.
  64. * @param {string} time
  65. * @returns {string}
  66. */
  67. function _time(time) {
  68. var all = time.match(/^([0-9]+):([0-9]+):([0-9]+)\.([0-9]+)$/);
  69. if (!all) throw new Error('Invalid time.');
  70. var hours = _prefix(all[1], 2);
  71. var minutes = _prefix(all[2], 2);
  72. var seconds = _prefix(all[3], 2);
  73. var milliseconds = _suffix(all[4], 3);
  74. return hours + ':' + minutes + ':' + seconds + ',' + milliseconds;
  75. }