main.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #!/usr/bin/env node
  2. // Imports
  3. const program = require('commander');
  4. const inquirer = require('inquirer');
  5. const file = require('./src/file');
  6. const cst = require('./src/constant');
  7. const timer = require('./src/timer');
  8. // Variables configs et globales
  9. let preprocessFile = './data/data.ppf';
  10. let verbose = false;
  11. // Parametrage CLI
  12. program.version('1.4.0');
  13. program
  14. .option('-n, --name <string>', 'Nom de l\'auteur dont il faut chercher les co-auteurs')
  15. .option('-f, --file <source>', 'Chemin vers le fichier à utiliser pour la recherche des co-auteurs', preprocessFile)
  16. .option('-p, --process <source>', 'Prepare le fichier source et effectue la recherche des co-auteurs')
  17. .option('-v, --verbose', 'Affiche plus d\'informations', verbose);
  18. program
  19. .command('prepare <source> [destination]')
  20. .description(`Prepare un fichier XML (source) pour la recherche des co-auteurs, le resultat est mis dans le fichier destination (default: "${preprocessFile}")`)
  21. .action((source, destination = preprocessFile) => {
  22. if (file.exist(source)) {
  23. verbose = true;
  24. parse(source, destination, () => {
  25. process.exit();
  26. });
  27. } else {
  28. console.error(cst.toString(cst.FILE_NOT_FOUND) + ': ' + source);
  29. process.exit(cst.FILE_NOT_FOUND);
  30. }
  31. });
  32. // Parse des arguments CLI
  33. program.parse(process.argv);
  34. // Si on est pas en train de preparer le fichier de pre traitement
  35. if (process.argv[2] !== 'prepare') {
  36. // Lecture des options
  37. const name = (program.name && typeof program.name === 'string') ? program.name : null;
  38. let source = (program.process) ? program.process : program.file;
  39. verbose = program.verbose;
  40. // Verification que le fichier du pre-traitement existe
  41. if (!file.exist(source)) {
  42. // Impossible de trouver le fichier XML à traiter
  43. if (program.process) {
  44. console.error(cst.toString(cst.FILE_NOT_FOUND) + ': ' + source);
  45. process.exit(cst.FILE_NOT_FOUND);
  46. }
  47. // Impossible de trouver le fichier resultant du pre-traitement
  48. else {
  49. console.error(cst.toString(cst.PREPROCESS_NOT_FOUND));
  50. process.exit(cst.PREPROCESS_NOT_FOUND);
  51. }
  52. }
  53. // En cas d'absence de nom on le demande
  54. if (name === null) {
  55. inquirer.prompt({
  56. type: 'input',
  57. name: 'name',
  58. message: 'Enter the name of the author whose co-authors you want to search for: >',
  59. }).then(answer => {
  60. // Lancement du prgramme
  61. if (program.process) {
  62. parse(source, preprocessFile, ppf => {
  63. find(ppf, name);
  64. });
  65. } else {
  66. find(source, answer.name);
  67. }
  68. });
  69. }
  70. // Sinon on lance le programme
  71. else {
  72. if (program.process) {
  73. parse(source, preprocessFile, ppf => {
  74. find(ppf, name);
  75. });
  76. } else {
  77. find(source, name);
  78. }
  79. }
  80. }
  81. /**
  82. * Prepare le document XML pour la recherche des co-auteurs
  83. * @param source Chemin vers le fichier XML
  84. * @param dest Chemin pour créer le fichier avec les données traitées
  85. * @param callback Fonction à appelet après l'analyse, prend en parametre le chemin vers le fichier .ppf
  86. */
  87. function parse(source, dest, callback = null) {
  88. // Verification que l'extension du fichier dest est bien .ppf
  89. if (file.getExtension(dest) !== 'ppf') {
  90. dest += '.ppf';
  91. }
  92. // Affichage si verbose des infos
  93. if (verbose) {
  94. console.info('Beginning of pre-processing...');
  95. timer.start();
  96. }
  97. // Analyse du fichier xml
  98. const parser = require('./src/parser').from(source).to(dest);
  99. parser.parse(dest => {
  100. if (verbose) {
  101. timer.stop();
  102. console.info(`Pre-processing file created at ${dest} in ${timer.time()}`);
  103. }
  104. if (callback !== null) {
  105. callback(dest);
  106. }
  107. });
  108. }
  109. /**
  110. * Cherche les co-auteurs d'un auteur dans un fichier crée par prepare
  111. * @param source Chemin vers le fichier crée par prepare
  112. * @param name Nom de l'auteur pour la recherche
  113. */
  114. function find(source, name) {
  115. name = name.trim();
  116. if (verbose) {
  117. console.info(`Search for ${name}'s co-authors...`);
  118. timer.start();
  119. }
  120. const finder = require('./src/finder');
  121. finder.in(source).find(name, (result) => {
  122. if (verbose) {
  123. timer.stop();
  124. console.info(`${name}'s co-authors find in ${timer.time()}`);
  125. }
  126. console.info(finder.print(result));
  127. });
  128. }