myapp4.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. // programme de scraping des données de Maine.edu
  2. var jsdom = require("jsdom");
  3. const {
  4. JSDOM
  5. } = jsdom;
  6. // librairie de gestion des répertoires et fichiers
  7. const fs = require("fs");
  8. const path = require("path");
  9. // librairie de gestion des arguments de la ligne de commande
  10. var argv = require("optimist").argv;
  11. // librairie base de données sqlite
  12. const sq = require("better-sqlite3");
  13. // librairie de traitement du pinyin
  14. const pinyinizer = require('pinyinizer');
  15. // librairie de gestion des fichiers xml
  16. const builder = require('xmlbuilder');
  17. // librairie de gestion du hanzi
  18. const opencc = require('node-opencc');
  19. // temporaire
  20. var prompt = require('prompt');
  21. prompt.start();
  22. //
  23. // données de stockage
  24. var fichierXml = "MaineEdu-datas.xml";
  25. var fichierJson = "MaineEdu-datas.json";
  26. var baseDeDonnées = "MaineEdu-datas.db";
  27. var fichierCSV = "MaineEdu-datas.csv";
  28. // données en mémoire
  29. // le fichier complet en mémoire
  30. var maineeduObj = {
  31. "maineedu": []
  32. };
  33. var phraseObj = {
  34. "phrase": {
  35. "topic": "",
  36. "hanzi": {
  37. "simplified": "",
  38. "traditional": ""
  39. },
  40. "pinyin": "",
  41. "translations": [],
  42. "recordings": []
  43. }
  44. }
  45. // fichier des locuteurs
  46. var locuteurs = [];
  47. // un locuteur
  48. var locuteur = {
  49. "nom": "",
  50. "langue": ""
  51. }
  52. var tab = "\t";
  53. var endLine = "\n";
  54. // fin des données en mémoire
  55. // données calculées
  56. var repertoireInitial = "";
  57. var repertoireCourant = "";
  58. var fichierCourant = "";
  59. // fin des données calculées
  60. // fonctions utilitaires
  61. // reset d'un enregistrement
  62. function reset(p) {
  63. phraseObj = {
  64. "phrase": {
  65. "topic": "",
  66. "hanzi": {
  67. "simplified": "",
  68. "traditional": ""
  69. },
  70. "pinyin": "",
  71. "translations": [],
  72. "recordings": []
  73. }
  74. }
  75. }
  76. // fin du reste d'un enregistrement
  77. // détermination du répertoire de travail et mise à jour des variables
  78. repertoireInitial = path.resolve(path.join("./",argv._[0]));
  79. // DEBUG
  80. // console.log("réperoire initial:", repertoireInitial); // OK
  81. fichierXml = path.join(repertoireInitial,"MaineEdu-datas.xml");
  82. fichierJson = path.join(repertoireInitial,"MaineEdu-datas.json");
  83. baseDeDonnées = path.join(repertoireInitial,"MaineEdu-datas.db");
  84. fichierCSV = path.join(repertoireInitial,"MaineEdu-datas.csv");
  85. // DEBUG
  86. // console.log(fichierXml," ",fichierJson, " ",baseDeDonnées, " ",fichierCSV); // OK
  87. // fin de la détermination du répertoire de travail
  88. // fin des fonctions utilitaires
  89. // fonctions de traitement des fichiers html, c. douying et douzhong
  90. // traitement des fichiers c
  91. // fin du traitement des fichiers c
  92. // traitement des fichiers douying
  93. // fin du traitement des fichiers douying
  94. // traitement de fichiers douzhong
  95. // fin du traitement des fichiers douzhong
  96. // fin du traitement des fichiers html
  97. // on crée le fichier xml
  98. var feed = builder.create('maineedu', {
  99. version: '1.0',
  100. encoding: 'UTF-8',
  101. standalone: true
  102. });
  103. // on crée le fichier csv
  104. var csv = fs.createWriteStream(fichierCSV);
  105. // on parcours l'arborescence
  106. var repertoires = fs.readdirSync(repertoireInitial);
  107. repertoires.forEach(function(repertoire) {
  108. // gestion des répertoires
  109. repertoire = path.join(repertoireInitial,repertoire);
  110. // DEBUG console.log("%s", repertoire); // OK
  111. if (fs.statSync(repertoire).isDirectory()) {
  112. // On traite chaque répertoire
  113. // DEBUG console.log("%s", repertoire); // OK
  114. repertoireCourant = path.basename(repertoire);
  115. // DEBUG console.log(repertoireCourant); // OK
  116. // Recherche des fichiers c*.html
  117. ffiles = fs.readdirSync(repertoire);
  118. var fichiers = ffiles.filter((ffile) => ffile[0] == "c" );
  119. // DEBUG console.log( repertoireCourant, " ", fichiers);
  120. if (fichiers == "") {
  121. // console.log("pas de fichiers c");
  122. fichiers = ffiles.filter((ffile) => ffile == "douying.html" );
  123. // DEBUG console.log( repertoireCourant, " ", fichiers);
  124. if (fichiers == "") {
  125. // console.log("pas de fichiers douying");
  126. fichiers = ffiles.filter((ffile) => ffile == "douzhong.html" );
  127. // DEBUG console.log( repertoireCourant, " ", fichiers);
  128. if (fichiers != "") {
  129. // traitement des douzhong
  130. }
  131. } else {
  132. // traitement des douying
  133. }
  134. } else {
  135. // traitement des fichiers c
  136. fichiers.forEach(function(fffile) {
  137. fichierCourant = path.join(repertoireInitial, repertoireCourant, fffile);
  138. // DEBUG
  139. console.log(fichierCourant);
  140. //************************* traitement de chaque fichier
  141. // fonction de scraping des fichiers c*.html
  142. var html = fs.readFileSync(fichierCourant, "UTF-8");
  143. dom = new JSDOM(html);
  144. var $ = require('jquery')(dom.window);
  145. // on traite le topic
  146. var $header = $.find("#header H1");
  147. // DEBUG console.log("Le header est: " + $($header).text());
  148. var topic = $($header).text();
  149. // on traite les "rows"
  150. $z = dom.window.$(".row ").each(function(index, element) {
  151. // le topic
  152. phraseObj.phrase.topic = topic;
  153. var ligneCSV = "";
  154. var csv1 = "";
  155. var csv2 = "";
  156. //traitement des données textuelles : Hanzi, Pinyin et traduction en anglais
  157. //c'est la seule partie qui change entre les différents fichiers.
  158. // on retrouve le texte en chinois
  159. // DEBUG console.log("index: " + index + " texte en hanzi: " + $(element).find("p .chinese").text());
  160. var hanzi = $(element).find("p .chinese").text();
  161. var traditional = opencc.simplifiedToTraditional(hanzi);
  162. phraseObj.phrase.hanzi.simplified = hanzi;
  163. phraseObj.phrase.hanzi.traditional = traditional;
  164. csv1 = hanzi + tab + traditional + tab;
  165. // on retrouve le texte en anglais et pinyin
  166. // DEBUG console.log("texte en pinyin et traduction en anglais");
  167. // l'anglais
  168. var anglais = $(element).find(".indented img:first").attr("title");
  169. // DEBUG console.log(anglais);
  170. var translationObj = {
  171. "translation": {}
  172. };
  173. translationObj.translation.langue = "en";
  174. translationObj.translation.texte = anglais;
  175. phraseObj.phrase.translations.push(translationObj);
  176. // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents
  177. var pinyin = $(element).find(".indented img:nth-child(2)").attr("title");
  178. pinyin = pinyin.toLowerCase();
  179. // on va tester ça ...
  180. try {
  181. phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
  182. }
  183. catch(err) {
  184. console.log("Erreur: " + pinyin);
  185. phraseObj.phrase.pinyin = pinyin;
  186. }
  187. // modif pour court-circuiter pinyinise
  188. //phraseObj.phrase.pinyin = pinyin;
  189. csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab;
  190. // DEBUG $(element).find(".indented img").each(function(index, letexte) {
  191. // console.log("---->" + $(this).attr("title"));
  192. // });
  193. // // traitement des données audio en anglais et en chinois
  194. // // on retrouve les enregistrements
  195. var $t = $(element).find(".speech_samples:first");
  196. // // prononctation en chinois
  197. // DEBUG console.log("--> Prononciation en chinois");
  198. $t.find("tr:first td a:nth-child(2)").each(function(index, audio) {
  199. // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  200. var recordingObject = {
  201. "recording": {}
  202. };
  203. recordingObject.recording.langue = "zh";
  204. recordingObject.recording.locuteur = $(this).text();
  205. recordingObject.recording.audio = $(this).attr("href");
  206. // transformation de l'url du fichier son: ../../Language/Sound19b/19103sjx.wav => [sound:MaineEdu-19103sjx.mp3]
  207. var xx = recordingObject.recording.audio;
  208. xx = path.basename(xx,".wav");
  209. xx = "[sound:MaineEdu-" + xx + ".mp3]";
  210. recordingObject.recording.audio = xx;
  211. // fin de transformation
  212. phraseObj.phrase.recordings.push(recordingObject);
  213. // on crée la ligne csv à écrire dans le fichier
  214. csv2 = recordingObject.recording.locuteur + tab + recordingObject.recording.audio;
  215. ligneCSV = csv1 + csv2 + tab + topic + tab + "MaineEdu" + endLine;
  216. csv.write(ligneCSV);
  217. });
  218. // prononciation en anglais
  219. // DEBUG console.log("--> Prononciation en anglais");
  220. $t.find("tr:nth-child(2) td a:nth-child(2)").each(function(index, audio) {
  221. // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  222. var recordingObject = {
  223. "recording": {}
  224. };
  225. recordingObject.recording.langue = "en";
  226. recordingObject.recording.locuteur = $(this).text();
  227. recordingObject.recording.audio = $(this).attr("href");
  228. phraseObj.phrase.recordings.push(recordingObject);
  229. });
  230. // DEBUG console.log(JSON.stringify(phraseObj));
  231. maineeduObj.maineedu.push(phraseObj);
  232. var ele = feed.ele(phraseObj);
  233. reset(phraseObj);
  234. });
  235. //************************* fin du traitement de chaque fichier
  236. });
  237. }
  238. };
  239. });
  240. // fin du parcours de l'arborescence
  241. // on ferme le fichier CSV
  242. csv.end();
  243. // on écrit le fichier xml
  244. fs.writeFileSync(fichierXml, feed.end({
  245. pretty: true
  246. }));
  247. // on écrit le fichier Json
  248. fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
  249. // DEBUG console.log(JSON.stringify(maineeduObj));