CampusVirtualUGD::organizarMaterias

Organiza las materias del campus virtual de la UGD por año

// ==UserScript==
// @name:en  CampusVirtualUGD::organizarMaterias
// @name     CampusVirtualUGD::organizarMaterias
// @version  6
// @grant    none
// @match https://campusvirtual.ugd.edu.ar/moodle/
// @description:en Organiza las materias del campus virtual UGD por año
// @description: Organiza las materias del campus virtual UGD por año
// @namespace https://greasyfork.org/users/325953
// @description Organiza las materias del campus virtual de la UGD por año
// ==/UserScript==
agregarReglasCss();
/**
 * Arreglo de divs con la clase coursebox
 *
 * Estos divs son los links a las materias. Ojo, su estructura no
 * es tan sencilla como podria ser. Para empezar, en lugar de ser
 * divs podrian ser tags <a> y punto...
 */
var materias = document.querySelectorAll(".coursebox");
distribuirMaterias(materiasOrganizadas(materias));
function agregarReglasCss() {
    var css = "\n  .category-header {\n    font-size: 17px;\n    color: rgb(253, 253, 253);\n    line-height: 25px;\n    font-family: \"Oswald\",sans-serif;\n    background-color: rgb(255, 81, 0);\n    height: auto;\n  }\n\n  .coursebox {}\n  ";
    var style = document.createElement('style');
    style.innerText = css;
    document.querySelector('body').append(style);
}
function distribuirMaterias(materias) {
    quitarMateriasDelDocumento(materias);
    var categorias = crearCategorias();
    ubicarEnCategorias(categorias, materias);
    var arregloCategorias = categoriasComoArreglo(categorias);
    arregloCategorias = arregloCategorias.reverse();
    agregarCategoriasAlDocumento(arregloCategorias);
}
function categoriasComoArreglo(categorias) {
    return [
        categorias["primero"],
        categorias["segundo"],
        categorias["tercero"],
        categorias["cuarto"],
        categorias["quinto"],
        categorias["otro"]
    ];
}
function quitarMateriasDelDocumento(materias) {
    for (var clave in materias) {
        var materiasDeAño = materias[clave];
        for (var _i = 0, materiasDeAño_1 = materiasDeAño; _i < materiasDeAño_1.length; _i++) {
            var materia = materiasDeAño_1[_i];
            materia.remove();
        }
    }
}
function crearCategorias() {
    return {
        "primero": elementoCategoria("PRIMERO"),
        "segundo": elementoCategoria("SEGUNDO"),
        "tercero": elementoCategoria("TERCERO"),
        "cuarto": elementoCategoria("CUARTO"),
        "quinto": elementoCategoria("QUINTO"),
        "otro": elementoCategoria("OTRO")
    };
}
function elementoCategoria(nombre) {
    var divPadre = document.createElement('div');
    var n = document.createElement("h3");
    n.innerText = nombre;
    n.classList.add("category-header");
    divPadre.append(n);
    return divPadre;
}
function agregarCategoriasAlDocumento(categorias) {
    var divCursos = document.querySelector(".courses");
    for (var _i = 0, categorias_1 = categorias; _i < categorias_1.length; _i++) {
        var categoria = categorias_1[_i];
        divCursos.append(categoria);
    }
}
function ubicarEnCategorias(categorias, materias) {
    for (var clave in materias) {
        var materiasDeAño = materias[clave];
        var categoria = categorias[clave];
        for (var _i = 0, materiasDeAño_2 = materiasDeAño; _i < materiasDeAño_2.length; _i++) {
            var materia = materiasDeAño_2[_i];
            categoria.appendChild(materia);
        }
    }
}
function materiasOrganizadas(materias) {
    /**
     * Mapa de materias por año. Aca se guardaran las materias luego
     * de ser organizadas.
     */
    var materias_por_año = {
        "primero": [],
        "segundo": [],
        "tercero": [],
        "cuarto": [],
        "quinto": [],
        "otro": []
    };
    materias.forEach(function (materia) {
        var año = añoDeMateria(nombreFormateado(materia));
        materias_por_año[año].push(materia);
    });
    return materias_por_año;
}
function añoDeMateria(nombre) {
    if (esDePrimero(nombre)) {
        return "primero";
    }
    else if (esDeSegundo(nombre)) {
        return "segundo";
    }
    else if (esDeTercero(nombre)) {
        return "tercero";
    }
    else if (esDeCuarto(nombre)) {
        return "cuarto";
    }
    else if (esDeQuinto(nombre)) {
        return "quinto";
    }
    else {
        return "otro";
    }
}
function esDePrimero(nombre) {
    var materias = [
        "ingles i",
        "algoritmos y estructuras i",
        "lengua y comunicacion",
        "introduccion a la informatica",
        "matematica discreta",
        "taller de informatica",
        "ingles ii",
        "programacion estructurada",
        "principios de administracion y organizacion",
        "quimica general",
        "sistemas de representacion",
        "algebra y geometria analitica",
    ];
    return materias
        .some(function (n) { return n == nombre; });
}
function esDeSegundo(nombre) {
    var materias = [
        "analisis matematico i",
        "algoritmos y estructuras ii",
        "sistemas digitales",
        "fisica i",
        "elementos de costos y contabilidad",
        "sistemas de informacion",
        "analisis matematico ii",
        "bases de datos",
        "fisica ii",
        "estadistica",
        "arquitectura de computadoras",
    ];
    return materias
        .some(function (n) { return n == nombre; });
}
function esDeTercero(nombre) {
    var materias = [
        "ingles tecnologico",
        "programacion avanzada i",
        "sistemas operativos i",
        "analisis matematico iii",
        "analisis de sistemas",
        "analisis y diseño de algoritmos",
        "programacion avanzada ii",
        "fisica iii",
        "sistemas operativos ii",
        "diseño de sistemas",
        "comunicacion de datos",
        "paradigmas y lenguajes de programacion",
    ];
    return materias
        .some(function (n) { return n == nombre; });
}
function esDeCuarto(nombre) {
    var materias = [
        "automatas y lenguajes formales",
        "redes de computadoras i",
        "metodologias avanzadas",
        "tecnologias de bases de datos",
        "investigacion operativa",
        "principios de economia",
        "compiladores",
        "redes de computadoras ii",
        "taller de redes",
        "modelos y simulacion",
        "calculo numerico",
        "ingenieria del software",
    ];
    return materias
        .some(function (n) { return n == nombre; });
}
function esDeQuinto(nombre) {
    var materias = [
        "admistracion de recursos humanos",
        "direccion y gerenciamiento",
        "estudios y proyectos",
        "gestion de la calidad y auditoria",
        "inteligencia artificial i",
        "inteligencia artificial ii",
        "introduccion al diseño y desarrollo de videojuegos",
        "investigacion cientifica",
        "legislacion",
        "proyectos informaticos",
        "seguridad laboral y proteccion ambiental",
        "taller de aplicaciones web",
        "taller de formacion y prospectiva profesional",
        "taller de trabajo final",
        "teoria de control"
    ];
    return materias
        .some(function (n) { return n == nombre; });
}
function nombreFormateado(materia) {
    return cadenaSinAcentos(nombreDeMateria(materia).toLowerCase());
}
function cadenaSinAcentos(nombre) {
    return nombre
        .replace("á", "a")
        .replace("é", "e")
        .replace("í", "i")
        .replace("ó", "o")
        .replace("ú", "u");
}
/**
 * Extrae el nombre del elemento de una materia.
 *
 * El "boton" de una materia tiene la siguiente estructura:
 *
 *    <div class="coursebox ...">
 *      <h3 class="name">nombre de la materia</h3>
 *    </div>
 *
 * @param materia div
 * @returns string
 */
function nombreDeMateria(materia) {
    return materia.querySelector("h3").innerText;
}