coauth.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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.6.0');
  13. program
  14. .option('-n, --name <string>', 'name of the author whose co-authors to search for')
  15. .option('-f, --file <source>', 'path to the file to use for the search of co-authors', preprocessFile)
  16. .option('-p, --process <source>', 'prepare the source file and search for co-authors')
  17. .option('-v, --verbose', 'displays more information', verbose);
  18. program
  19. .command('prepare <source> [destination]')
  20. .description(`Prepares an XML file (source) for the search of co-authors, the result is put in the destination file (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. preprocessFile = './tmp.ppf';
  63. parse(source, preprocessFile, ppf => {
  64. find(ppf, answer.name, () => {
  65. file.fs.unlinkSync(preprocessFile);
  66. });
  67. });
  68. } else {
  69. find(source, answer.name);
  70. }
  71. });
  72. }
  73. // Sinon on lance le programme
  74. else {
  75. if (program.process) {
  76. preprocessFile = './tmp.ppf';
  77. parse(source, preprocessFile, ppf => {
  78. find(ppf, name, () => {
  79. file.fs.unlinkSync(preprocessFile);
  80. });
  81. });
  82. } else {
  83. find(source, name);
  84. }
  85. }
  86. }
  87. /**
  88. * Prepare le document XML pour la recherche des co-auteurs
  89. * @param source Chemin vers le fichier XML
  90. * @param dest Chemin pour créer le fichier avec les données traitées
  91. * @param callback Fonction à appelet après l'analyse, prend en parametre le chemin vers le fichier .ppf
  92. */
  93. function parse(source, dest, callback = null) {
  94. // Verification que l'extension du fichier dest est bien .ppf
  95. if (file.getExtension(dest) !== 'ppf') {
  96. dest += '.ppf';
  97. }
  98. // Affichage si verbose des infos
  99. if (verbose) {
  100. console.info('Beginning of pre-processing...');
  101. timer.start();
  102. }
  103. // Analyse du fichier xml
  104. const parser = require('./src/coauth/parser').from(source).to(dest);
  105. parser.parse(dest => {
  106. if (verbose) {
  107. timer.stop();
  108. console.info(`Pre-processing file created at ${dest} in ${timer.time()}`);
  109. }
  110. if (callback !== null) {
  111. callback(dest);
  112. }
  113. });
  114. }
  115. /**
  116. * Cherche les co-auteurs d'un auteur dans un fichier crée par prepare
  117. * @param source Chemin vers le fichier crée par prepare
  118. * @param name Nom de l'auteur pour la recherche
  119. * @param callback Fonction à appelet après la recherche
  120. */
  121. function find(source, name, callback = null) {
  122. name = name.trim();
  123. if (verbose) {
  124. console.info(`Search for ${name}'s co-authors...`);
  125. timer.start();
  126. }
  127. const finder = require('./src/coauth/finder');
  128. finder.in(source).find(name, (result) => {
  129. if (verbose) {
  130. timer.stop();
  131. console.info(`${name}'s co-authors find in ${timer.time()}`);
  132. }
  133. console.info(finder.print(result));
  134. if (callback !== null) {
  135. callback();
  136. }
  137. });
  138. }