-
Notifications
You must be signed in to change notification settings - Fork 1
/
lib.js
183 lines (159 loc) · 5.49 KB
/
lib.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
const ics = require("ics");
const fs = require("fs");
const config = require("./config");
const classToEmoji = require("./emoji.json");
const { get } = require("http");
/**
* Fonction qui récupère un Array de string pour le transformer en Array de JSON
* Si le cours est le dernier de la journée, le flag #END# se trouve collé au Nom du prof
* @param string
* @param annee
* @returns [] JSON type {"salle" : '',"cours" : '', "debut" : '', "fin" : '', "prof" : ''}
*/
let stringToArray = (string, annee) => {
let retour = [];
string.forEach((line) => {
let heure = Object.values(line.match(/\d\d:\d\d/g));
let debut = {
heures: heure[0].replace(/:\d\d/, ""),
minutes: heure[0].replace(/\d\d:/, ""),
};
let fin = {
heures: heure[1].replace(/:\d\d/, ""),
minutes: heure[1].replace(/\d\d:/, ""),
};
ogline = line.split("\n");
let salle = ogline[0];
let desc = ogline[1];
let cours = ogline[2];
let te = ogline[3];
let prof = ogline[4];
retour.push({
annee: annee,
date: "",
salle: salle,
cours: cours,
debut: debut,
fin: fin,
prof: prof,
desc: desc,
te: te,
line: line,
});
});
return retour;
};
/**
* Fonction qui récupère des événements formatés et ajoute la date de chacun événement
* @param events array de string formaté par stringToArray
* @param nbEventPerDay array de nombres qui donne le nombre de cours par jour
* @param nbDay array de nombres qui donne les dates de la semaine
* @returns {events} array de string formaté avec stringToArray avec la date en plus
*/
let daterEvents = (events, nbEventPerDay, nbDay) => {
nbDay = nbDay.map((e) => e.replace(/[A-Z][a-z][a-z]\s/, ""));
// On rajoute les dates
// On met les events dans les jours
let q = 0;
let a; // Événement par jour
for (let i = 0; q < events.length; i++) {
a = 0;
while (a < nbEventPerDay[i]) {
events[q].date = {
jour: nbDay[i].replace(/\/\d\d/, ""),
mois: nbDay[i].replace(/\d\d\//, ""),
};
q++;
a++;
}
}
return events;
};
/**
* Fonction qui transforme le array de String en un array utilisable par ICS
* @param events array de string formaté avec stringToArray
* @returns {*[]} array utilisable par ICS
*/
let arrayToIcs = (events) => {
let today = new Date().toLocaleString();
let calendar = [];
for (let i = 0; i < events.length; i++) {
if (events[i].date == "") continue;
let annee = parseInt(events[i].annee);
let jour = parseInt(events[i].date.jour);
let mois = parseInt(events[i].date.mois);
if (annee == NaN || jour == NaN || mois == NaN) continue;
let title =
events[i].desc != ""
? events[i].desc +
(events[i].cours != "" ? " - " + events[i].cours : "")
: events[i].cours != ""
? events[i].cours
: "Intervention planifiée";
//remove "Module de Base M1-" from the title
title = title.replace(/Module de Base M1-/, "");
title = title.replace(/Module Humanité et langue M1-/, "");
title = title.replace(/Module M1-/, "");
calendar.push({
start: [
annee,
mois,
jour,
parseInt(events[i].debut.heures),
parseInt(events[i].debut.minutes),
],
end: [
annee,
mois,
jour,
parseInt(events[i].fin.heures),
parseInt(events[i].fin.minutes),
],
title: getEmojiFromClassTitle(title) + " " + title,
location: events[i].salle,
// organizer: { name: events[i].prof }, // Ne s'affiche pas avec Outlook
busyStatus: "BUSY",
url: "https://junia-learning.com/my/",
status: "CONFIRMED",
description:
`${events[i].line}` +
`\n\nPlus d'informations sur https://aurion.junia.com et sur https://junia-learning.com/my/ .` +
`\nDernière actualisation : ${today}`,
});
}
return calendar;
};
/**
* Fonction qui fait le pont avec les autres fonctions. Elle demande en entrée les événements non formatés, l'année, le nombre de cours par jour,
* les dates de la semaine en cours. Elle ne retourne rien ou un code d'erreur et crée un object ics dans le dossier courant.
* @param events
* @returns {string|Error}
*/
let creerICS = (events) => {
let calendar = arrayToIcs(events);
const { error, value } = ics.createEvents(calendar);
if (error) {
console.log(error);
return error;
} else {
fs.writeFileSync(config.path, value);
return value;
}
};
function getEmojiFromClassTitle(title) {
// Loop through all the keys in classToEmoji
for (const className in classToEmoji) {
// Use regular expressions to search for the class name in the title (case-insensitive)
const regex = new RegExp(className, "i");
if (regex.test(title)) {
return classToEmoji[className];
}
}
// Return a default emoji if no class name is found in the title
return "📝";
}
module.exports = {
stringToArray,
daterEvents,
creerICS,
};