Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. 'use strict';
  2.  
  3. const Fs = require('fs');
  4. const Util = require('util');
  5.  
  6. const Xml2js = require('xml2js');
  7. const XmlNodes = require('xml-nodes');
  8. const Miss = require('mississippi');
  9.  
  10. const internals = {};
  11.  
  12. module.exports = async ({
  13. filePath,
  14. fileExtension,
  15. targetNode,
  16. rootNode = 'root',
  17. splitOnNumber = 400,
  18. nodeFilter
  19. }) => {
  20.  
  21. if (!filePath || !fileExtension) {
  22. throw new Error('Invalid arguments: filePath, fileExtension are required');
  23. }
  24.  
  25. const { filterNodes } = internals;
  26.  
  27. const fileStream = Fs.createReadStream(`${filePath}.${fileExtension}`);
  28.  
  29. const xmlHead = '<?xml version="1.0" encoding="UTF-8"?>';
  30.  
  31. let currentFile = '';
  32. let fileCount = 0;
  33. let currentFileTargetNodeCount = 0;
  34.  
  35. const passThrough = (nodeAsStr, enc, next) => next(null, nodeAsStr);
  36.  
  37. const processNode = async (nodeAsStr, enc, next) => {
  38.  
  39. currentFile += nodeAsStr;
  40. currentFileTargetNodeCount++;
  41.  
  42. if (currentFileTargetNodeCount < splitOnNumber) {
  43. return next();
  44. }
  45.  
  46. currentFileTargetNodeCount = 0;
  47. const newXmlFile = `${xmlHead}\n<${rootNode}>\n${currentFile}\n</${rootNode}>`;
  48. currentFile = '';
  49. try {
  50. await Util.promisify(Fs.writeFile)(`${filePath}-${fileCount++}.${fileExtension}`, newXmlFile);
  51. next();
  52. }
  53. catch (err) {
  54. next(err);
  55. }
  56. };
  57.  
  58. await Util.promisify(Miss.pipe)(
  59. fileStream,
  60. XmlNodes(targetNode),
  61. nodeFilter ? Miss.through(filterNodes(nodeFilter)) : Miss.through(passThrough),
  62. Miss.through(processNode)
  63. );
  64.  
  65. // Create file for remainder
  66. if (currentFileTargetNodeCount > 0) {
  67. const newXmlFile = `${xmlHead}\n<${rootNode}>\n${currentFile}\n</${rootNode}>`;
  68. await Util.promisify(Fs.writeFile)(`${filePath}-${fileCount++}.${fileExtension}`, newXmlFile);
  69. }
  70.  
  71. return fileCount;
  72. };
  73.  
  74. internals.filterNodes = (filterFunc) => {
  75.  
  76. return async (nodeAsStr, enc, next) => {
  77.  
  78. const xmlParser = new Xml2js.Parser();
  79.  
  80. try {
  81. const keep = await filterFunc(await xmlParser.parseStringPromise(nodeAsStr));
  82. // Let it pass on thru or not
  83. keep ? next(null, nodeAsStr) : next();
  84. }
  85. catch (err) {
  86. next(err);
  87. }
  88. };
  89. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement