Ir al contenido

Usuaria:Lana del Reno/links.js

De Wikipedia, la enciclopedia libre

Nota: Después de guardar, debes refrescar la caché de tu navegador para ver los cambios. Internet Explorer: mantén presionada Ctrl mientras pulsas Actualizar. Firefox: mientras presionas Mayús pulsas el botón Actualizar, (o presiona Ctrl-Shift-R). Los usuarios de Google Chrome y Safari pueden simplemente pulsar el botón Recargar. Para más detalles e instrucciones acerca de otros exploradores, véase Ayuda:Cómo limpiar la caché.

//<nowiki>
const dateLinkRemover = (() => {
    const skin = mw.config.get('skin');

    // Estos deben ser cargados para asegurar que todo funciona correctamente, la función de devolución de llamada que carga la secuencia de comandos sólo se llamará una vez DOM se ha cargado
    const loadDependencies = (callback) => {
        mw.loader.using('mediawiki.api', 'mediawiki.util', 'mediawiki.user');
        if (document.readyState !== 'loading') {
            callback();
        } else {
            document.addEventListener('DOMContentLoaded', callback());
        }
    }

    // Función que obtiene el contenido de una página
    function getContent(pageName) {
        let params = {
            action: 'query',
            prop: 'revisions',
            titles: pageName,
            rvprop: 'content',
            rvslots: 'main',
            formatversion: '2',
            format: 'json'
        };

        let apiPromise = new mw.Api().get(params).then(
            ((data) => {
                return data.query.pages[0].revisions[0].slots?.main?.content
            })
        );
        return apiPromise;
    }

    function makeRegexGlobal(expression) {
        return new RegExp(expression, "gi");
    }

    // Regexes variables
let regex = /\[\[\s*((?:(?:0?[1-9]|[12]\d|3[01])º?\sde\s)?(?:(?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|sep?tiembre|octubre|noviembre|diciembre)(?:\sde\s[1-9]\d{0,3})?)|(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo)|(?:(?:años?|década de)\s)?(?:[1-9]\d{0,3}|los\s[1-9]0|(?:[1-2]\d{0,2}0s|[1-9]0s)|siglo(?:\s|&nbsp;)*\w+|[IVXLCDM0-9]+º?\smilenio)(?:(?:\s|&nbsp;)*(?:a|d)\.(?:\s|&nbsp;)*C\.)?)\s*\]\]/i;
let pipeRegex = /\[\[\s*((?:(?:0?[1-9]|[12]\d|3[01])º?\sde\s)?(?:(?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|sep?tiembre|octubre|noviembre|diciembre)(?:\sde\s[1-9]\d{0,3})?)|(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo)|(?:(?:años?|década de)\s)?(?:[1-9]\d{0,3}|los\s[1-9]0|(?:[1-2]\d{0,2}0s|[1-9]0s)|siglo(?:\s|&nbsp;)*\w+|[IVXLCDM0-9]+º?\smilenio)(?:(?:\s|&nbsp;)*(?:a|d)\.(?:\s|&nbsp;)*C\.)?)(?:\s*\|([^\]]*))\s*\]\]/i;
    let templateRegex = /(\{\{(?:siglo|(?:Julgreg)?fecha)[^\}]+)(?:\|1|\|Link\s*=\s*(?:\"true\"|(?:s[ií]|pt)))\s*(\}\})/i;

    function textReplacer(articleText, applyRegex, applyPipeRegex, applyTemplateRegex) {
        let newText = articleText;
        if (applyRegex) {
            regex = makeRegexGlobal(regex);
            newText = newText.replace(regex, "$1");
        }
        if (applyPipeRegex) {
            pipeRegex = makeRegexGlobal(pipeRegex);
            newText = newText.replace(pipeRegex, "$2");
        }
        if (applyTemplateRegex) {
            templateRegex = makeRegexGlobal(templateRegex);
            newText = newText.replace(templateRegex, "$1$2");
        }
        return newText;
    }

    // Función principal del script
    const initializeScript = () => {
        // Buscar el nombre de la página actual y asignarlo a una variable
        const page = mw.config.get('wgPageName');
        getContent(page).then((content) => {
            const useRegex = regex.test(content);
            const usePipeRegex = pipeRegex.test(content);
            const useTemplateRegex = templateRegex.test(content);
            if (useRegex || usePipeRegex || useTemplateRegex) {
                console.log("found at least one date with brackets");
                // Esto añadirá el botón para eliminar los corchetes de las fechas si encuentra tal ocurrencia en un artículo
                const portletLink = mw.util.addPortletLink('p-views', '#', 'WP:ENLACESFECHAS', 'enlaces-fechas', 'Links have been detected on dates, click here to remove them.');
                if (skin == 'minerva') {
                    const icon = document.getElementsByClassName('minerva-icon minerva-icon-portletlink-enlaces-fechas mw-ui-icon-portletlink-enlaces-fechas');
                    icon[0].style.backgroundImage = "url(https://upload.wikimedia.org/wikipedia/commons/2/2c/Tabler-icons_letter-f.svg)";
                }
                // Almacenemos las evaluaciones en constantes mientras el usuario se toma su tiempo para pulsar el botón

                if (portletLink) {
                    portletLink.addEventListener("click", () => {
                        // Llamar a la API mw para realizar la edición 
                        new mw.Api().edit(
                            page,
                            (revision) => {
                                return {
                                    text: textReplacer(revision.content, useRegex, usePipeRegex, useTemplateRegex),
                                    summary: '[[WP:ENLACESFECHAS]] + mejoras cosméticas',
                                    minor: false
                                }
                            }
                            // Reload the page
                        ).then(() => {
                            setTimeout(() => {
                                location.reload();
                            }, 500);
                            // Detección de errores de ejecución
                        }).catch((error) => {
                            alert(`Se ha producido un error: ${error}`);
                        })
                    })
                }
            }
        })
    }

    (async () => {
        // El script no debería cargarse si el usuario no está en el espacio de nombres correcto
        const namespace = await mw.config.get('wgNamespaceNumber');
        if (namespace == 0 || namespace == 104 || namespace == 2) {
            loadDependencies(initializeScript);
        }
    })();

})();

//</nowiki>