grwiki-vocab.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. // librairie de gestion des répertoires et fichiers
  2. const fs = require("fs");
  3. const path = require("path");
  4. // librairie de gestion des arguments de la ligne de commande
  5. var argv = require("optimist").argv;
  6. // librairie de traitement du pinyin
  7. const pinyinizer = require("pinyinizer");
  8. const bopo = require("hanzi-to-zhuyin");
  9. // librairie de gestion du hanzi
  10. const opencc = require("node-opencc");
  11. // librairie de gestion des fichiers xml
  12. const builder = require("xmlbuilder");
  13. // librairie de recherche dans un json
  14. var _ = require("underscore");
  15. // librairie de gestion des fichiers csv
  16. var csv = require("comma-separated-values");
  17. // sons
  18. const shtooka1 = require("./cmn-caen-tan.json.json");
  19. const shtooka2 = require("./chi-balm.json.json");
  20. const shtooka3 = require("./cmn-balm-congcong.json.json");
  21. const shtooka4 = require("./cmn-balm-hsk1.json.json");
  22. // données de stockage
  23. var fichierXml = "grammarwiki-table.xml";
  24. var fichierJson = "grammarwiki-table.json";
  25. var fichierCSV = "grammarwiki-table.csv";
  26. // en entrée, on donne le nom du fichier à traiter sans le répertoire
  27. var repertoireInitial = "./";
  28. var argument = argv._[0];
  29. fichierDonnées = path.join(repertoireInitial, argument);
  30. // DEBUG
  31. // console.log(fichierDonnées);
  32. // sons
  33. var shtooka1données = shtooka1.shtooka;
  34. var shtooka2données = shtooka2.shtooka;
  35. var shtooka3données = shtooka3.shtooka;
  36. var shtooka4données = shtooka4.shtooka;
  37. // utilitaires
  38. var tab = "\t";
  39. var endLine = "\n";
  40. // Variables fichier des fichiers csv, json et xml
  41. fichierXml = path.join(repertoireInitial, argument + ".xml");
  42. fichierJson = path.join(repertoireInitial, argument + ".json");
  43. fichierCSV = path.join(repertoireInitial, argument + "-1.csv");
  44. // on crée le fichier xml
  45. var feed = builder.create("grammarwikitable", {
  46. version: "1.0",
  47. encoding: "UTF-8",
  48. standalone: true
  49. });
  50. // on crée le fichier csv
  51. var moncsv = fs.createWriteStream(fichierCSV);
  52. // on crée le fichier json
  53. var json = fs.createWriteStream(fichierJson);
  54. json.write('{"grammarwiki-vocab":[');
  55. var fichierATraiter = fs.readFileSync(fichierDonnées, "UTF-8");
  56. // DEBUG
  57. // console.log(fichierATraiter);
  58. var monjson = new csv(fichierATraiter, {
  59. header: [
  60. "hanzi",
  61. "traditional",
  62. "pinyin",
  63. "translation",
  64. "classifier",
  65. "taiwanpinyin",
  66. "samepinyin",
  67. "examples",
  68. "x",
  69. "y",
  70. "z",
  71. "tag"
  72. ],
  73. cast: [
  74. "String",
  75. "String",
  76. "String",
  77. "String",
  78. "String",
  79. "String",
  80. "String",
  81. "String",
  82. "String",
  83. "String",
  84. "String",
  85. "String"
  86. ]
  87. }).parse();
  88. // la ligne CSV qu'on va écrire dans le fichier CSV
  89. var ligneCSV = "";
  90. // L'élément xml qui constitue un enregistrement du fichier xml
  91. var ele = null;
  92. // a = liste json
  93. // b = le hanzi à trouver dans la liste ci-dessus(enregistrement.hanzi)
  94. function trouvé(a, b) {
  95. var t = _.find(a, function(record) {
  96. return record.hanzi == b;
  97. });
  98. return t;
  99. }
  100. monjson.forEach(function(enregistrement) {
  101. // DEBUG
  102. // console.log(enregistrement.hanzi);
  103. ligneCSV = "";
  104. ele = null;
  105. var enregistrementFinal = {};
  106. try {
  107. // hanzi
  108. enregistrementFinal.hanzi = enregistrement.hanzi.trim();
  109. var NomFichierSon = enregistrementFinal.hanzi.replace(/ /g, "");
  110. // traditional
  111. enregistrementFinal.traditional = opencc.simplifiedToTraditional(
  112. enregistrementFinal.hanzi
  113. );
  114. // pinyin
  115. enregistrementFinal.pinyin = enregistrement.pinyin;
  116. // translation
  117. enregistrementFinal.translation = enregistrement.translation;
  118. // classifier
  119. if (enregistrement.classifier == "") {
  120. enregistrementFinal.classifier = "";
  121. } else {
  122. enregistrementFinal.classifier = enregistrement.classifier;
  123. }
  124. // samepinyin
  125. // if (enregistrement.samepinyin == "") {
  126. // enregistrementFinal.samepinyin = "";
  127. // } else {
  128. // enregistrementFinal.samepinyin = enregistrement.samepinyin;
  129. // console.log(enregistrementFinal.samepinyin);
  130. // }
  131. // examples
  132. enregistrementFinal.examples = enregistrement.examples;
  133. //sequence
  134. if (enregistrement.tag == "A1") {
  135. enregistrementFinal.sequence = "A1";
  136. } else if (enregistrement.tag == "A2") {
  137. enregistrementFinal.sequence = "A2";
  138. }
  139. // lesson
  140. //enregistrementFinal.lesson = "";
  141. // sound
  142. tr = trouvé(shtooka1données, enregistrementFinal.hanzi);
  143. if (tr != undefined) {
  144. //console.log("trouvé dans shtooka1 " );
  145. enregistrementFinal.sound = "[sound:" + tr.sound + "]";
  146. enregistrementFinal.locuteur = tr.locuteur;
  147. enregistrementFinal.collectionAudio = "Shtooka-cmn-caen-tan";
  148. } else {
  149. tr = trouvé(shtooka2données, enregistrementFinal.hanzi);
  150. if (tr != undefined) {
  151. //console.log("trouvé dans shtooka2 " );
  152. enregistrementFinal.sound = "[sound:" + tr.sound + "]";
  153. enregistrementFinal.locuteur = tr.locuteur;
  154. enregistrementFinal.collectionAudio = "Shtooka-chi-balm";
  155. } else {
  156. tr = trouvé(shtooka3données, enregistrementFinal.hanzi);
  157. if (tr != undefined) {
  158. //console.log("trouvé dans shtooka3 " );
  159. enregistrementFinal.sound = "[sound:" + tr.sound + "]";
  160. enregistrementFinal.locuteur = tr.locuteur;
  161. enregistrementFinal.collectionAudio = "Shtooka-cmn-balm-congcong";
  162. } else {
  163. tr = trouvé(shtooka4données, enregistrementFinal.hanzi);
  164. if (tr != undefined) {
  165. //console.log("trouvé dans shtooka4 " );
  166. enregistrementFinal.sound = "[sound:" + tr.sound + "]";
  167. enregistrementFinal.locuteur = tr.locuteur;
  168. enregistrementFinal.collectionAudio = "Shtooka-cmn-balm-hsk1";
  169. } else {
  170. // console.log("pas trouvé! On va générer les sons avec Google tts");
  171. var nomFichierAudio = enregistrementFinal.hanzi + ".mp3";
  172. // DEBUG
  173. console.log(nomFichierAudio);
  174. enregistrementFinal.sound = "[sound:" + nomFichierAudio + "]";
  175. enregistrementFinal.locuteur = "Google TTS";
  176. enregistrementFinal.collectionAudio = "Google TTS";
  177. }
  178. }
  179. }
  180. }
  181. // origin
  182. enregistrementFinal.origin = "Grammar Wiki";
  183. // bopomofo: on le fait à la fin et on enregistre la ligne
  184. // dès que la traduction est faite
  185. // bopo(enregistrement.hanzi).then(x => {
  186. // enregistrement.taiwanpinyin = x;
  187. //enregistrementFinal.taiwanpinyin = "";
  188. // on écrit les lignes et enregistrements dans les fichiers
  189. ligneCSV =
  190. enregistrementFinal.hanzi +
  191. tab +
  192. enregistrementFinal.traditional +
  193. tab +
  194. enregistrementFinal.pinyin +
  195. tab +
  196. enregistrementFinal.translation +
  197. tab +
  198. enregistrementFinal.classifier +
  199. tab +
  200. enregistrementFinal.examples +
  201. tab +
  202. // enregistrementFinal.taiwanpinyin +
  203. // tab +
  204. // enregistrementFinal.samepinyin +
  205. // tab +
  206. enregistrementFinal.sequence +
  207. tab +
  208. // enregistrementFinal.lesson +
  209. // tab +
  210. enregistrementFinal.sound +
  211. tab +
  212. enregistrementFinal.locuteur +
  213. tab +
  214. enregistrementFinal.collectionAudio +
  215. tab +
  216. enregistrementFinal.origin +
  217. endLine;
  218. // DEBUG console.log(ligneCSV);
  219. // Ecriture de la ligne CSV
  220. moncsv.write(ligneCSV);
  221. // Ecriture de la ligne json
  222. json.write(JSON.stringify(enregistrementFinal) + ",");
  223. // ecriture de la ligne xml
  224. var ele = feed.ele({ enregistrementFinal });
  225. //.catch(err => console.log(err));
  226. // });
  227. } catch (err) {
  228. console.log(err);
  229. }
  230. });
  231. // DEBUG
  232. // console.log(monjson);
  233. // Fermeture des fichiers json, xml et csv
  234. // on ferme le fichier CSV
  235. moncsv.end();
  236. // on écrit le fichier xml
  237. fs.writeFileSync(
  238. fichierXml,
  239. feed.end({
  240. pretty: true
  241. })
  242. );
  243. // on écrit le fichier Json
  244. // fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
  245. json.write("{},]}");
  246. json.end();