myapp3.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. // programme de scraping des données de Maine.edu
  2. // douzhong
  3. var jsdom = require("jsdom");
  4. const {
  5. JSDOM
  6. } = jsdom;
  7. const fs = require("fs");
  8. var argv = require("optimist").argv;
  9. const sq = require("better-sqlite3");
  10. const pinyinizer = require('pinyinizer');
  11. const builder = require('xmlbuilder');
  12. const opencc = require('node-opencc');
  13. // données de stockage
  14. var fichier = argv._[0];
  15. var fichierXml = "datas.xml";
  16. var fichierJson = "datas.json";
  17. var baseDeDonnées = "datas.db";
  18. var fichierCSV = "datas.csv";
  19. // données en mémoire
  20. // le fichier complet en mémoire
  21. var maineeduObj = {
  22. "maineedu": []
  23. };
  24. var phraseObj = {
  25. "phrase": {
  26. "topic": "",
  27. "hanzi": {
  28. "simplified": "",
  29. "traditional": ""
  30. },
  31. "pinyin": "",
  32. "explications": "",
  33. "translations": [],
  34. "recordings": []
  35. }
  36. }
  37. // fichier des locuteurs
  38. var locuteurs = [];
  39. // un locuteur
  40. var locuteur = {
  41. "nom": "",
  42. "langue": ""
  43. }
  44. var tab = "\t";
  45. var endLine = "\n";
  46. // on crée le fichier xml
  47. var feed = builder.create('maineedu', {
  48. version: '1.0',
  49. encoding: 'UTF-8',
  50. standalone: true
  51. });
  52. // on crée le fichier csv
  53. var csv = fs.createWriteStream(fichierCSV);
  54. var html = fs.readFileSync(fichier, "UTF-8");
  55. dom = new JSDOM(html);
  56. var $ = require('jquery')(dom.window);
  57. function reset(p) {
  58. phraseObj = {
  59. "phrase": {
  60. "topic": "",
  61. "hanzi": {
  62. "simplified": "",
  63. "traditional": ""
  64. },
  65. "pinyin": "",
  66. "explications": "",
  67. "translations": [],
  68. "recordings": []
  69. }
  70. }
  71. }
  72. // fonction de scraping des fichiers c*.html
  73. // on traite le topic
  74. var $header = $.find("title");
  75. console.log("Le header est: " + $($header).text() + "\n\n");
  76. var topic = $($header).text();
  77. // on traite les ul
  78. var $z = dom.window.$("ul input").parent().each(function(index, element) {
  79. //DEBUG console.log("numéro élément: " + index);
  80. // le topic
  81. phraseObj.phrase.topic = topic;
  82. var ligneCSV = "";
  83. var csv1 = "";
  84. var csv2 = "";
  85. //DEBUG console.log("*****************");
  86. // le hanzi
  87. var hanzi = $(element).find("font:first").text();
  88. var traditional = opencc.simplifiedToTraditional(hanzi);
  89. phraseObj.phrase.hanzi.simplified = hanzi;
  90. phraseObj.phrase.hanzi.traditional = traditional;
  91. csv1 = hanzi + tab + traditional + tab;
  92. // on retrouve le texte en anglais et pinyin et les explications
  93. var secondul = $(element).find("ul:first");
  94. var jumeaux = $(secondul).find("font").siblings();
  95. var pinyin = $(jumeaux).first().text();
  96. var anglais = $(jumeaux).next("font:first").text();
  97. var explications = $(secondul).find("ul").text().trim();
  98. // l'anglais
  99. var translationObj = {
  100. "translation": {}
  101. };
  102. translationObj.translation.langue = "en";
  103. translationObj.translation.texte = anglais;
  104. phraseObj.phrase.translations.push(translationObj);
  105. // le pinyin
  106. // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents
  107. pinyin = pinyin.toLowerCase();
  108. try {
  109. phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
  110. }
  111. catch(err) {
  112. console.log("Erreur: " + pinyin);
  113. phraseObj.phrase.pinyin = pinyin;
  114. }
  115. // on continue à construire la ligne csv
  116. csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab + explications + tab;
  117. // DEBUG console.log(csv1);
  118. // traitement des enregistrements ... chinois et anglais
  119. // le chinois :) et l'anglais ...
  120. var $x = $(secondul).find("a[href]").each(function(index, element) {
  121. var $b = $(element).find("img[SRC='../tingsmgl.jpg']");
  122. if ($b.length == 1) {
  123. // DEBUGconsole.log(index, $b);
  124. // DEBUGconsole.log($(element).attr("href"));
  125. // DEBUGconsole.log($(element).text());
  126. var recordingObject = {
  127. "recording": {}
  128. };
  129. recordingObject.recording.langue = "zh";
  130. recordingObject.recording.locuteur = $(element).text().trim();
  131. recordingObject.recording.audio = $(element).attr("href");
  132. phraseObj.phrase.recordings.push(recordingObject);
  133. // on crée la ligne csv à écrire dans le fichier
  134. csv2 = recordingObject.recording.locuteur + tab + recordingObject.recording.audio;
  135. ligneCSV = csv1 + csv2 + tab + topic + tab + "MaineEdu" + endLine;
  136. csv.write(ligneCSV);
  137. maineeduObj.maineedu.push(phraseObj);
  138. var ele = feed.ele(phraseObj);
  139. reset(phraseObj);
  140. }
  141. })
  142. }
  143. );
  144. // // on traite les "rows"
  145. // $z = dom.window.$(".row ").each(function(index, element) {
  146. // // le topic
  147. // phraseObj.phrase.topic = topic;
  148. // var ligneCSV = "";
  149. // var csv1 = "";
  150. // var csv2 = "";
  151. // //traitement des données textuelles : Hanzi, Pinyin et traduction en anglais
  152. // //c'est la seule partie qui change entre les différents fichiers.
  153. // // on retrouve le texte en chinois
  154. // // DEBUG console.log("index: " + index + " texte en hanzi: " + $(element).find("p .chinese").text());
  155. // var hanzi = $(element).find("p .chinese").text();
  156. // var traditional = opencc.simplifiedToTraditional(hanzi);
  157. // phraseObj.phrase.hanzi.simplified = hanzi;
  158. // phraseObj.phrase.hanzi.traditional = traditional;
  159. // csv1 = hanzi + tab + traditional + tab;
  160. // // on retrouve le texte en anglais et pinyin
  161. // // DEBUG console.log("texte en pinyin et traduction en anglais");
  162. // // l'anglais
  163. // var anglais = $(element).find("p .sans_serif").text();
  164. // // DEBUG console.log(anglais);
  165. // var translationObj = {
  166. // "translation": {}
  167. // };
  168. // translationObj.translation.langue = "en";
  169. // translationObj.translation.texte = anglais;
  170. // phraseObj.phrase.translations.push(translationObj);
  171. // // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents
  172. // var pinyin = $(element).find("p .pinyin").text();
  173. // pinyin = pinyin.toLowerCase();
  174. // // phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
  175. // // on va tester ça ...
  176. // try {
  177. // phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
  178. // }
  179. // catch(err) {
  180. // console.log("Erreur: " + pinyin);
  181. // phraseObj.phrase.pinyin = pinyin;
  182. // }
  183. // csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab;
  184. // // DEBUG $(element).find(".indented img").each(function(index, letexte) {
  185. // // console.log("---->" + $(this).attr("title"));
  186. // // });
  187. // // // traitement des données audio en anglais et en chinois
  188. // // // on retrouve les enregistrements
  189. // var $t = $(element).find(".speech_samples:first");
  190. // // // prononctation en chinois
  191. // // DEBUG console.log("--> Prononciation en chinois");
  192. // $t.find("tr:first td a:nth-child(2)").each(function(index, audio) {
  193. // // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  194. // var recordingObject = {
  195. // "recording": {}
  196. // };
  197. // recordingObject.recording.langue = "zh";
  198. // recordingObject.recording.locuteur = $(this).text();
  199. // recordingObject.recording.audio = $(this).attr("href");
  200. // phraseObj.phrase.recordings.push(recordingObject);
  201. // // on crée la ligne csv à écrire dans le fichier
  202. // csv2 = recordingObject.recording.locuteur + tab + recordingObject.recording.audio;
  203. // ligneCSV = csv1 + csv2 + tab + topic + tab + "MaineEdu" + endLine;
  204. // csv.write(ligneCSV);
  205. // });
  206. // // prononciation en anglais
  207. // // DEBUG console.log("--> Prononciation en anglais");
  208. // $t.find("tr:nth-child(2) td a:nth-child(2)").each(function(index, audio) {
  209. // // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  210. // var recordingObject = {
  211. // "recording": {}
  212. // };
  213. // recordingObject.recording.langue = "en";
  214. // recordingObject.recording.locuteur = $(this).text();
  215. // recordingObject.recording.audio = $(this).attr("href");
  216. // phraseObj.phrase.recordings.push(recordingObject);
  217. // });
  218. // // DEBUG console.log(JSON.stringify(phraseObj));
  219. // maineeduObj.maineedu.push(phraseObj);
  220. // var ele = feed.ele(phraseObj);
  221. // reset(phraseObj);
  222. // });
  223. // on ferme le fichier CSV
  224. csv.end();
  225. // on écrit le fichier Json
  226. fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
  227. // DEBUG console.log(JSON.stringify(maineedu));
  228. // on écrit le fichier xml
  229. fs.writeFileSync(fichierXml, feed.end({
  230. pretty: true
  231. }));