drills.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  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 lecture de lignes de texte
  7. var readline = require("readline");
  8. // librairie de traitement du pinyin
  9. const pinyinizer = require("pinyinizer");
  10. // librairie de gestion du hanzi
  11. const opencc = require("node-opencc");
  12. // librairie de gestion des fichiers csv
  13. var csv = require("comma-separated-values");
  14. // librairie de lecture ligne par ligne d'un fichier
  15. const lineReader = require("line-reader");
  16. // Nom du fichier entrée csv
  17. // en entrée, on donne le nom du fichier à traiter sans le répertoire
  18. var repertoireInitial = "./";
  19. var argument = argv._[0];
  20. fichierDonnées = path.join(repertoireInitial, argument);
  21. // DEBUG
  22. // console.log(fichierDonnées);
  23. // Nom du fichier xml
  24. console.log("nom du fichier: ", fichierDonnées)
  25. fichierXml = fichierDonnées.replace(".csv", ".xml");
  26. // DEBUG
  27. // console.log("nom du fichier: ", fichierXml)
  28. var tab = "\t";
  29. var rc = "\n";
  30. // There are 4 types of drills with a different number of fields
  31. // depending of the absence or presence of a cue, and the type of the cue.
  32. var longueur = 0;
  33. // enregistrement des drills à 10 champs
  34. var ligne1 = {
  35. numero: "",
  36. pinyin: "",
  37. hanzi: "",
  38. translation: "",
  39. pinyin1: "",
  40. hanzi1: "",
  41. translation1: "",
  42. themodule: "",
  43. unit: "",
  44. book: "",
  45. };
  46. function resetLigne1() {
  47. numero = "";
  48. pinyin = "";
  49. hanzi = "";
  50. translation = "";
  51. pinyin1 = "";
  52. hanzi1 = "";
  53. translation1 = "";
  54. themodule = "";
  55. unit = "";
  56. book = "";
  57. }
  58. // enregistrement des drills à 11 champs
  59. var ligne2 = {
  60. numero: "",
  61. pinyin: "",
  62. hanzi: "",
  63. translation: "",
  64. cue: "",
  65. pinyin1: "",
  66. hanzi1: "",
  67. translation1: "",
  68. themodule: "",
  69. unit: "",
  70. book: "",
  71. };
  72. function resetLigne2() {
  73. numero = "";
  74. pinyin = "";
  75. hanzi = "";
  76. translation = "";
  77. cue = "";
  78. pinyin1 = "";
  79. hanzi1 = "";
  80. translation1 = "";
  81. themodule = "";
  82. unit = "";
  83. book = "";
  84. }
  85. // enregistrement des drills à 13 champs
  86. var ligne3 = {
  87. numero: "",
  88. pinyin: "",
  89. hanzi: "",
  90. translation: "",
  91. cue_pinyin: "",
  92. cue_hanzi: "",
  93. cue_translation: "",
  94. pinyin1: "",
  95. hanzi1: "",
  96. translation1: "",
  97. themodule: "",
  98. unit: "",
  99. book: "",
  100. };
  101. function resetLigne3() {
  102. numero = "";
  103. pinyin = "";
  104. hanzi = "";
  105. translation = "";
  106. cue_pinyin: "";
  107. cue_hanzi: "";
  108. cue_translation: "";
  109. pinyin1 = "";
  110. hanzi1 = "";
  111. translation1 = "";
  112. themodule = "";
  113. unit = "";
  114. book = "";
  115. }
  116. // la ligne CSV qu'on lit
  117. var ligneCSV = "";
  118. prelude = `
  119. <table frame="none" colsep="0" rowsep="0">
  120. <title>Give affirmative response to all questions.</title>
  121. <tgroup cols="2">
  122. <colspec colname="c1" colnum="1" colwidth="1.0*"/>
  123. <colspec colname="c2" colnum="2" colwidth="15.0*"/>
  124. <tbody>
  125. `;
  126. fin = `
  127. </tbody>
  128. </tgroup>
  129. </table>
  130. `;
  131. // on ouvre le fichier, on teste la première ligne, on affiche les résultats, et on ferme le fichier:
  132. // il y 10, 11 ou 12 champs suivant l'exercice
  133. // on ouvre et lit le fichier csv à traiter
  134. var fichierATraiter = fs.readFileSync(fichierDonnées, "UTF-8");
  135. // DEBUG
  136. console.log("nom du fichier à traiter: ", fichierDonnées, '\n');
  137. var res = fichierATraiter.split("\n");
  138. var res1 = res[0].split("\t");
  139. longueur = res1.length;
  140. console.log("type d'exercice: ", longueur, " champs");
  141. // on crée et ouvre le fichier de sortie xml
  142. var monxml = fs.createWriteStream(fichierXml);
  143. console.log("fichier créé")
  144. if (longueur == 10) {
  145. console.log('modèle à 10 champs')
  146. var moncsv = new csv(fichierATraiter, {
  147. header: [
  148. "numero",
  149. "pinyin",
  150. "hanzi",
  151. "translation",
  152. "pinyin1",
  153. "hanzi1",
  154. "translation1",
  155. "themodule",
  156. "unit",
  157. "book",
  158. ],
  159. cast: [
  160. "String",
  161. "String",
  162. "String",
  163. "String",
  164. "String",
  165. "String",
  166. "String",
  167. "String",
  168. "String",
  169. "String",
  170. ],cellDelimiter : "\t"
  171. }).parse();
  172. console.log("fichier parsé")
  173. // écriture du prélude
  174. monxml.write(prelude);
  175. monxml.write(rc);
  176. console.log("prelude écrit")
  177. //
  178. // transformation et écriture des lignes dans le fichier xml
  179. moncsv.forEach(function (enregistrement) {
  180. // écriture de la question
  181. monxml.write("<row>");
  182. monxml.write(rc);
  183. monxml.write(tab);
  184. monxml.write("<entry>");
  185. monxml.write(enregistrement.numero);
  186. monxml.write("</entry>");
  187. monxml.write(rc);
  188. monxml.write(tab);
  189. monxml.write(
  190. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Latn-pinyin">'
  191. );
  192. monxml.write(enregistrement.pinyin);
  193. monxml.write("</foreignphrase></entry>");
  194. monxml.write(rc);
  195. monxml.write("</row>");
  196. monxml.write(rc);
  197. monxml.write("<row>");
  198. monxml.write(rc);
  199. monxml.write(tab);
  200. monxml.write("<entry/>");
  201. monxml.write(rc);
  202. monxml.write(tab);
  203. monxml.write(
  204. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Hani">'
  205. );
  206. monxml.write(enregistrement.hanzi);
  207. monxml.write("</foreignphrase></entry>");
  208. monxml.write(rc);
  209. monxml.write("</row>");
  210. monxml.write(rc);
  211. monxml.write("<row>");
  212. monxml.write(rc);
  213. monxml.write(tab);
  214. monxml.write("<entry/>");
  215. monxml.write(rc);
  216. monxml.write(tab);
  217. monxml.write(
  218. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>'
  219. );
  220. monxml.write(enregistrement.translation);
  221. monxml.write("</entry>");
  222. monxml.write(rc);
  223. monxml.write("</row>");
  224. // écriture de l'espace entre question et réponse
  225. monxml.write(rc);
  226. monxml.write("<row><entry/><entry/></row>");
  227. monxml.write(rc);
  228. // écriture de la réponse
  229. monxml.write("<row>");
  230. monxml.write(rc);
  231. monxml.write(tab);
  232. monxml.write("<entry>");
  233. monxml.write("</entry>");
  234. monxml.write(rc);
  235. monxml.write(tab);
  236. monxml.write('<entry><foreignphrase xml:lang="cmn-Latn-pinyin">');
  237. monxml.write(enregistrement.pinyin1);
  238. monxml.write("</foreignphrase></entry>");
  239. monxml.write(rc);
  240. monxml.write("</row>");
  241. monxml.write(rc);
  242. monxml.write("<row>");
  243. monxml.write(rc);
  244. monxml.write(tab);
  245. monxml.write("<entry/>");
  246. monxml.write(rc);
  247. monxml.write(tab);
  248. monxml.write('<entry><foreignphrase xml:lang="cmn-Hani">');
  249. monxml.write(enregistrement.hanzi1);
  250. monxml.write("</foreignphrase></entry>");
  251. monxml.write(rc);
  252. monxml.write("</row>");
  253. monxml.write(rc);
  254. monxml.write("<row>");
  255. monxml.write(rc);
  256. monxml.write(tab);
  257. monxml.write("<entry/>");
  258. monxml.write(rc);
  259. monxml.write(tab);
  260. monxml.write("<entry>");
  261. monxml.write(enregistrement.translation1);
  262. monxml.write("</entry>");
  263. monxml.write(rc);
  264. monxml.write("</row>");
  265. monxml.write(rc);
  266. monxml.write("<row><entry/><entry/></row>");
  267. // remise à zéro de l'enregistrement
  268. resetLigne1();
  269. });
  270. } else if (longueur == 11) {
  271. console.log('modèle à 11 champs')
  272. var moncsv = new csv(fichierATraiter, {
  273. header: [
  274. "numero",
  275. "pinyin",
  276. "hanzi",
  277. "translation",
  278. "cue",
  279. "pinyin1",
  280. "hanzi1",
  281. "translation1",
  282. "themodule",
  283. "unit",
  284. "book",
  285. ],
  286. cast: [
  287. "String",
  288. "String",
  289. "String",
  290. "String",
  291. "String",
  292. "String",
  293. "String",
  294. "String",
  295. "String",
  296. "String",
  297. "String",
  298. ],
  299. }).parse();
  300. // écriture du prélude
  301. monxml.write(prelude);
  302. monxml.write(rc);
  303. //
  304. // transformation et écriture des lignes dans le fichier xml
  305. moncsv.forEach(function (enregistrement) {
  306. // écriture de la question
  307. monxml.write("<row>");
  308. monxml.write(rc);
  309. monxml.write(tab);
  310. monxml.write("<entry>");
  311. monxml.write(enregistrement.numero);
  312. monxml.write("</entry>");
  313. monxml.write(rc);
  314. monxml.write(tab);
  315. monxml.write(
  316. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Latn-pinyin">'
  317. );
  318. monxml.write(enregistrement.pinyin);
  319. monxml.write("</foreignphrase></entry>");
  320. monxml.write(rc);
  321. monxml.write("</row>");
  322. monxml.write(rc);
  323. monxml.write("<row>");
  324. monxml.write(rc);
  325. monxml.write(tab);
  326. monxml.write("<entry/>");
  327. monxml.write(rc);
  328. monxml.write(tab);
  329. monxml.write(
  330. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Hani">'
  331. );
  332. monxml.write(enregistrement.hanzi);
  333. monxml.write("</foreignphrase></entry>");
  334. monxml.write(rc);
  335. monxml.write("</row>");
  336. monxml.write(rc);
  337. monxml.write("<row>");
  338. monxml.write(rc);
  339. monxml.write(tab);
  340. monxml.write("<entry/>");
  341. monxml.write(rc);
  342. monxml.write(tab);
  343. monxml.write(
  344. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>'
  345. );
  346. monxml.write(enregistrement.translation);
  347. monxml.write("</entry>");
  348. monxml.write(rc);
  349. monxml.write("</row>");
  350. // écriture de l'espace entre question et la cue
  351. monxml.write(rc);
  352. monxml.write("<row><entry/><entry/></row>");
  353. monxml.write(rc);
  354. // écriture de la cue
  355. monxml.write("<row>");
  356. monxml.write(rc);
  357. monxml.write(tab);
  358. monxml.write('<entry>Cue</entry><entry align="center"><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>');
  359. monxml.write(enregistrement.cue);
  360. monxml.write("</entry>");
  361. monxml.write(rc);
  362. monxml.write("</row>");
  363. // écriture de l'espace entre la cue et la réponse
  364. monxml.write(rc);
  365. monxml.write("<row><entry/><entry/></row>");
  366. monxml.write(rc);
  367. // écriture de la réponse
  368. monxml.write("<row>");
  369. monxml.write(rc);
  370. monxml.write(tab);
  371. monxml.write("<entry>");
  372. monxml.write("</entry>");
  373. monxml.write(rc);
  374. monxml.write(tab);
  375. monxml.write('<entry><foreignphrase xml:lang="cmn-Latn-pinyin">');
  376. monxml.write(enregistrement.pinyin1);
  377. monxml.write("</foreignphrase></entry>");
  378. monxml.write(rc);
  379. monxml.write("</row>");
  380. monxml.write(rc);
  381. monxml.write("<row>");
  382. monxml.write(rc);
  383. monxml.write(tab);
  384. monxml.write("<entry/>");
  385. monxml.write(rc);
  386. monxml.write(tab);
  387. monxml.write('<entry><foreignphrase xml:lang="cmn-Hani">');
  388. monxml.write(enregistrement.hanzi1);
  389. monxml.write("</foreignphrase></entry>");
  390. monxml.write(rc);
  391. monxml.write("</row>");
  392. monxml.write(rc);
  393. monxml.write("<row>");
  394. monxml.write(rc);
  395. monxml.write(tab);
  396. monxml.write("<entry/>");
  397. monxml.write(rc);
  398. monxml.write(tab);
  399. monxml.write("<entry>");
  400. monxml.write(enregistrement.translation1);
  401. monxml.write("</entry>");
  402. monxml.write(rc);
  403. monxml.write("</row>");
  404. monxml.write(rc);
  405. monxml.write("<row><entry/><entry/></row>");
  406. // remise à zéro de l'enregistrement
  407. resetLigne2();
  408. });
  409. } else if (longueur == 12) {
  410. console.log('modèle à 12 champs')
  411. } else if (longueur == 13) {
  412. console.log('modèle à 13 champs')
  413. var moncsv = new csv(fichierATraiter, {
  414. header: [
  415. "numero",
  416. "pinyin",
  417. "hanzi",
  418. "translation",
  419. "cue_pinyin",
  420. "cue_hanzi",
  421. "cue_translation",
  422. "pinyin1",
  423. "hanzi1",
  424. "translation1",
  425. "themodule",
  426. "unit",
  427. "book",
  428. ],
  429. cast: [
  430. "String",
  431. "String",
  432. "String",
  433. "String",
  434. "String",
  435. "String",
  436. "String",
  437. "String",
  438. "String",
  439. "String",
  440. "String",
  441. "String",
  442. "String",
  443. ],
  444. }).parse();
  445. // écriture du prélude
  446. monxml.write(prelude);
  447. monxml.write(rc);
  448. //
  449. // transformation et écriture des lignes dans le fichier xml
  450. moncsv.forEach(function (enregistrement) {
  451. // écriture de la question
  452. monxml.write("<row>");
  453. monxml.write(rc);
  454. monxml.write(tab);
  455. monxml.write("<entry>");
  456. monxml.write(enregistrement.numero);
  457. monxml.write("</entry>");
  458. monxml.write(rc);
  459. monxml.write(tab);
  460. monxml.write(
  461. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Latn-pinyin">'
  462. );
  463. monxml.write(enregistrement.pinyin);
  464. monxml.write("</foreignphrase></entry>");
  465. monxml.write(rc);
  466. monxml.write("</row>");
  467. monxml.write(rc);
  468. monxml.write("<row>");
  469. monxml.write(rc);
  470. monxml.write(tab);
  471. monxml.write("<entry/>");
  472. monxml.write(rc);
  473. monxml.write(tab);
  474. monxml.write(
  475. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?><foreignphrase xml:lang="cmn-Hani">'
  476. );
  477. monxml.write(enregistrement.hanzi);
  478. monxml.write("</foreignphrase></entry>");
  479. monxml.write(rc);
  480. monxml.write("</row>");
  481. monxml.write(rc);
  482. monxml.write("<row>");
  483. monxml.write(rc);
  484. monxml.write(tab);
  485. monxml.write("<entry/>");
  486. monxml.write(rc);
  487. monxml.write(tab);
  488. monxml.write(
  489. '<entry><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>'
  490. );
  491. monxml.write(enregistrement.translation);
  492. monxml.write("</entry>");
  493. monxml.write(rc);
  494. monxml.write("</row>");
  495. // écriture de l'espace entre question et la cue
  496. monxml.write(rc);
  497. monxml.write("<row><entry/><entry/></row>");
  498. monxml.write(rc);
  499. // écriture de la cue
  500. monxml.write("<row>");
  501. monxml.write(rc);
  502. monxml.write(tab);
  503. monxml.write('<entry>Cue</entry><entry align="center"><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>');
  504. monxml.write('<foreignphrase xml:lang="cmn-Latn-pinyin">' + enregistrement.cue_pinyin + '</foreignphrase>');
  505. monxml.write("</entry>");
  506. monxml.write(rc);
  507. monxml.write("</row>");
  508. monxml.write("<row>");
  509. monxml.write(rc);
  510. monxml.write(tab);
  511. monxml.write('<entry></entry><entry align="center"><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>');
  512. monxml.write('<foreignphrase xml:lang="cmn-Hani">' + enregistrement.cue_hanzi + '</foreignphrase>');
  513. monxml.write("</entry>");
  514. monxml.write(rc);
  515. monxml.write("</row>");
  516. monxml.write("<row>");
  517. monxml.write(rc);
  518. monxml.write(tab);
  519. monxml.write('<entry></entry><entry align="center"><?dbhtml bgcolor="#f4f5f6" ?><?dbfo bgcolor="#f4f5f6"?>');
  520. monxml.write(enregistrement.cue_translation);
  521. monxml.write("</entry>");
  522. monxml.write(rc);
  523. monxml.write("</row>");
  524. // écriture de l'espace entre la cue et la réponse
  525. monxml.write(rc);
  526. monxml.write("<row><entry/><entry/></row>");
  527. monxml.write(rc);
  528. // écriture de la réponse
  529. monxml.write("<row>");
  530. monxml.write(rc);
  531. monxml.write(tab);
  532. monxml.write("<entry>");
  533. monxml.write("</entry>");
  534. monxml.write(rc);
  535. monxml.write(tab);
  536. monxml.write('<entry><foreignphrase xml:lang="cmn-Latn-pinyin">');
  537. monxml.write(enregistrement.pinyin1);
  538. monxml.write("</foreignphrase></entry>");
  539. monxml.write(rc);
  540. monxml.write("</row>");
  541. monxml.write(rc);
  542. monxml.write("<row>");
  543. monxml.write(rc);
  544. monxml.write(tab);
  545. monxml.write("<entry/>");
  546. monxml.write(rc);
  547. monxml.write(tab);
  548. monxml.write('<entry><foreignphrase xml:lang="cmn-Hani">');
  549. monxml.write(enregistrement.hanzi1);
  550. monxml.write("</foreignphrase></entry>");
  551. monxml.write(rc);
  552. monxml.write("</row>");
  553. monxml.write(rc);
  554. monxml.write("<row>");
  555. monxml.write(rc);
  556. monxml.write(tab);
  557. monxml.write("<entry/>");
  558. monxml.write(rc);
  559. monxml.write(tab);
  560. monxml.write("<entry>");
  561. monxml.write(enregistrement.translation1);
  562. monxml.write("</entry>");
  563. monxml.write(rc);
  564. monxml.write("</row>");
  565. monxml.write(rc);
  566. monxml.write("<row><entry/><entry/></row>");
  567. // remise à zéro de l'enregistrement
  568. resetLigne2();
  569. });
  570. } else {
  571. console.log("Erreur du nombre de champs dans le fichier: ", fichierDonnées);
  572. }
  573. // écriture de la fin dans le fichier xml
  574. monxml.write(fin);
  575. //
  576. // fermeture du fichier de sortie xml
  577. monxml.end();
  578. //
  579. //