-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontent.js
203 lines (191 loc) · 7.04 KB
/
content.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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
shortNames = {
"Álgebra Linear para a Engenharia": "AL",
"Cálculo para a Engenharia": "Cálculo",
"Laboratórios de Informática I": "LI1",
"Programação Funcional": "PF",
"Tópicos de Matemática Discreta": "TMD",
"Análise Matemática para Engenharia": "Análise",
"Elementos de Probabilidades e Teoria de Números": "EPTN",
"Laboratórios de Informática II": "LI2",
Lógica: "Lógica",
"Programação Imperativa": "PI",
"Sistemas de Computação": "SC",
"Algoritmos e Complexidade": "AlgC",
"Arquitetura de Computadores": "ArqC",
"Estatística Aplicada": "EA",
"Física Moderna": "FM",
"Fundamentos de Comunicação de Dados": "FCD",
"Laboratórios de Informática III": "LI3",
"Bases de Dados": "BD",
"Investigação Operacional": "IO",
"Métodos Numéricos e Otimização Não Linear": "MNOnL",
"Programação Orientada aos Objetos": "POO",
"Redes de Computadores": "RC",
"Sistemas Operativos": "SO",
"Cálculo de Programas": "CP",
"Comunicações por Computador": "CC",
"Desenvolvimento de Sistemas de Software": "DSS",
"Inteligência Artificial": "IA",
"Laboratórios de Informática IV": "LI4",
"Sistemas Distribuídos": "SD",
"Aprendizagem e Decisão Inteligentes": "ADI",
"Computação Gráfica": "CG",
"Interface Pessoa-Máquina": "IPM",
"Processamento de Linguagens": "PL",
"Segurança de Sistemas Informáticos": "SSI",
"Análise de Projetos": "AProj",
"Engenharia Web": "EngWeb",
"Mecânica Quântica": "MQ",
"Análise e Teste de Software": "ATS",
"Aplicações e Serviços de Computação em Nuvem": "ASCN",
"Computação Paralela": "CPar",
"Dados e Aprendizagem Automática": "DAA",
"Engenharia de Serviços em Rede": "ESR",
"Métodos Formais em Engenharia de Software": "MFES",
"Requisitos e Arquiteturas de Software": "RAS",
"Agentes e Sistemas Multiagente": "ASM",
"Análise Inteligente em Sistemas de 'Big Data'": "AISBD",
"Arquiteturas Aplicacionais": "AA",
"Engenharia de Segurança": "ES",
"Engenharia Gramatical": "EG",
"Experimentação em Engenharia de Software": "EES",
"Gestão e Segurança de Redes": "GSR",
"Redes Definidas por Software": "RDS",
"Sistemas Distribuídos em Grande Escala": "SDGE",
"Verificação Formal": "VF",
"Visão por Computador e Processamento de Imagem": "VCPI",
"Administração de Bases de Dados": "ABD",
"Aprendizagem Profunda": "AProf",
"Bases de Dados NoSQL": "NoSQL",
"Estruturas Criptográficas": "EC",
"Interligação de Redes IP": "IRIP",
"Manutenção e Evolução de Software": "MES",
"Programação Ciber-Física": "PCF",
"Redes Fixas e Móveis": "RFM",
"Scripting no Processamento de Linguagem Natural": "SPLN",
"Tolerância a Faltas": "TF",
"Visualização e Iluminação": "VI",
"Cálculo de Sistemas de Informação": "CSI",
"Mineração de Dados": "MD",
"Novos Paradigmas de Rede": "NPR",
"Paradigmas de Sistemas Distribuídos": "PSD",
"Qualidade de Serviço na Internet": "QSI",
"Representação e Processamento de Conhecimento na Web": "RPCW",
"Sensorização e Ambiente": "SA",
"Sistemas Interativos Confiáveis": "SIC",
"Tecnologias de Segurança": "TS",
"Tópicos de Desenvolvimento de Software": "TDS",
"Visualização em Tempo Real": "VTR",
Bilinguismo: "Bilinguismo",
"Cidadania Digital": "CD",
"Democracia Plena, Responsabilidade e Estado de Direito": "DPRED",
"Direito Laboral": "DL",
"Educação e Cidadania Global Criativa": "ECGC",
"Educação, Cidadania e Direitos Humanos": "ECDH",
"Inglês Académico": "IngA",
"Introdução à Língua e Cultura Russa": "ILCR",
"Literacia Fotográfica da Física à Mensagem": "LFFM",
"Matemática das Coisas": "MC",
"Princípios de Gestão de Inventários": "PGI",
"Substâncias que Mudaram o Mundo": "SMM",
"Sustentabilidade Ambiental, Social e Económica": "SASE",
"Temas de Direito da Igualdade e Não Discriminação": "TDIND",
"Tópicos de Astronomia e Cosmologia": "TAC",
"Projeto de Informática": "ProjInf",
Dissertação: "D",
};
function levenshteinDistance(str1, str2) {
const len1 = str1.length;
const len2 = str2.length;
const dp = Array(len1 + 1)
.fill(null)
.map(() => Array(len2 + 1).fill(null));
for (let i = 0; i <= len1; i++) dp[i][0] = i;
for (let j = 0; j <= len2; j++) dp[0][j] = j;
for (let i = 1; i <= len1; i++) {
for (let j = 1; j <= len2; j++) {
const cost = str1[i - 1] === str2[j - 1] ? 0 : 1;
dp[i][j] = Math.min(
dp[i - 1][j] + 1, // Deletion
dp[i][j - 1] + 1, // Insertion
dp[i - 1][j - 1] + cost // Substitution
);
}
}
return dp[len1][len2];
}
function parsePage() {
let array = document.getElementsByTagName("tr");
let filteredArray = Array.from(array).filter((tr) => {
let children = Array.from(tr.children);
return children.some((child) => child.tagName.toLowerCase() === "td");
});
let arr = filteredArray.map((x) => {
let arr = Array.from(x.getElementsByTagName("td"));
return {
course: arr[1].textContent
.replace("(Teórica)", "")
.trim()
.replace("(Teórica", ""),
shift: arr[2].textContent.trim(),
};
});
// Define the Object.groupBy function
Object.groupBy = function (array, key) {
return array.reduce(function (rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x.shift);
return rv;
}, {});
};
let groupedByCourse = arr.reduce(function (rv, x) {
(rv[x["course"]] = rv[x["course"]] || []).push(x.shift);
return rv;
}, {});
return groupedByCourse;
}
function getClosestShortName(scrapedName) {
let closestName = null;
let smallestDistance = Infinity;
// Iterate over the long names and find the one with the smallest distance
for (const longName in shortNames) {
const distance = levenshteinDistance(scrapedName, longName);
if (distance < smallestDistance) {
smallestDistance = distance;
closestName = longName;
}
}
// Return the corresponding short name
return shortNames[closestName];
}
const navbar = document.querySelector(".navbar");
const button = document.createElement("button");
button.classList.add("btn-sm");
button.style.backgroundColor = "#543780";
button.style.border = "none";
button.onclick = () => {
groupedByCourse = parsePage();
shiftString = "";
Object.keys(groupedByCourse).map((name) => {
const shortName = getClosestShortName(name);
shiftString += `${shortName}=${groupedByCourse[name]}&`;
});
shiftString = shiftString.slice(0, -1);
navigator.clipboard.writeText(shiftString);
if (
shiftString !== "" &&
window.confirm(
"The share code was generated and copied successfully. Click the 'Share' icon in Calendarium and paste the code to proceed."
)
) {
window.open("https://calendario.cesium.pt", "_blank");
} else {
alert("Something went wrong. Please make sure you are logged in.");
}
};
const logo = document.createElement("img");
logo.src = "https://calendario.cesium.di.uminho.pt/favicon-calendarium.ico";
logo.alt = "Calendarium";
logo.title = "Export to Calendarium";
logo.style.height = "2rem";
button.appendChild(logo);
navbar.appendChild(button);