ConvertFb2.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. const ConvertBase = require('./ConvertBase');
  2. const iconv = require('iconv-lite');
  3. class ConvertFb2 extends ConvertBase {
  4. check(data, opts) {
  5. const {dataType} = opts;
  6. return (dataType && dataType.ext == 'xml' && data.toString().indexOf('<FictionBook') >= 0);
  7. }
  8. async run(data, opts) {
  9. if (!this.check(data, opts))
  10. return false;
  11. return this.checkEncoding(data);
  12. }
  13. checkEncoding(data) {
  14. let result = data;
  15. const left = data.indexOf('<?xml version="1.0"');
  16. if (left >= 0) {
  17. const right = data.indexOf('?>', left);
  18. if (right >= 0) {
  19. const head = data.slice(left, right + 2).toString();
  20. const m = head.match(/encoding="(.*)"/);
  21. if (m) {
  22. let encoding = m[1].toLowerCase();
  23. if (encoding != 'utf-8') {
  24. result = iconv.decode(data, encoding);
  25. result = Buffer.from(result.toString().replace(m[0], 'encoding="utf-8"'));
  26. }
  27. }
  28. }
  29. }
  30. return result;
  31. }
  32. }
  33. module.exports = ConvertFb2;