index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const fs = require('fs-extra');
  2. const FileDetector = require('../../FileDetector');
  3. //порядок важен
  4. const convertClassFactory = [
  5. require('./ConvertEpub'),
  6. require('./ConvertPdf'),
  7. require('./ConvertRtf'),
  8. require('./ConvertDocX'),
  9. require('./ConvertDoc'),
  10. require('./ConvertMobi'),
  11. require('./ConvertFb2'),
  12. require('./ConvertSamlib'),
  13. require('./ConvertSites'),
  14. require('./ConvertHtml'),
  15. ];
  16. class BookConverter {
  17. constructor(config) {
  18. this.detector = new FileDetector();
  19. this.convertFactory = [];
  20. for (const convertClass of convertClassFactory) {
  21. this.convertFactory.push(new convertClass(config));
  22. }
  23. }
  24. async convertToFb2(inputFiles, outputFile, opts, callback) {
  25. const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
  26. const data = await fs.readFile(inputFiles.selectedFile);
  27. const convertOpts = Object.assign({}, opts, {inputFiles, callback, dataType: selectedFileType});
  28. let result = false;
  29. for (const convert of this.convertFactory) {
  30. result = await convert.run(data, convertOpts);
  31. if (result) {
  32. await fs.writeFile(outputFile, result);
  33. break;
  34. }
  35. }
  36. if (!result && inputFiles.nesting) {
  37. result = await this.convertToFb2(inputFiles.nesting, outputFile, opts, callback);
  38. }
  39. if (!result) {
  40. if (selectedFileType)
  41. throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
  42. else {
  43. throw new Error(`Не удалось определить формат файла: ${opts.url}`);
  44. }
  45. }
  46. callback(100);
  47. return result;
  48. }
  49. }
  50. module.exports = BookConverter;