MediaWiki:MarcEditorDynamicLinks.js: mudanças entre as edições

De Wikincat
Ir para navegação Ir para pesquisar
imported>Jaideraf
(replace jquery)
imported>Jaideraf
(replace jquery)
Linha 205: Linha 205:
}
}
};
};

// https://stackoverflow.com/questions/25224887/plain-javascript-equivalent-of-jquery-param
// https://stackoverflow.com/questions/278221 by Simon Staton
const urlParams = Object.keys(autRecordSettings)
.map(function (key) {
const stringifyParam = function (data, topLevel, keyProp) {
return encodeURIComponent(key) + '=' + encodeURIComponent(autRecordSettings[key]);
let string = '';
}).join('&');
for (let key in data) {
if (keyProp && topLevel[keyProp] && topLevel[keyProp].indexOf(data[key]) !== 0) {
string += keyProp;
}
if (topLevel[key]) {
string += key;
} else {
string += '[' + key + ']';
}
if (data[key] instanceof Array) {
string += stringifyParam(data[key], topLevel, key);
} else if (data[key] instanceof Object) {
string += stringifyParam(data[key], topLevel);
} else {
string += '=' + data[key];
string += '&';
}
}
return string;
},
toParam = function (data) {
const string = stringifyParam(data, data);
return encodeURI(string.substring(0, string.length - 1).split(' ').join('+'));
};


authorityLink.innerText = 'Criar autoridade';
authorityLink.innerText = 'Criar autoridade';
authorityLink.setAttribute("href", "/wiki/Special:FormEdit/AutRecord?" +
authorityLink.setAttribute("href", "/wiki/Special:FormEdit/AutRecord?" +
urlParams);
toParam(autRecordSettings));
}
}
authorityLink.style.display = '';
authorityLink.style.display = '';

Edição das 23h16min de 8 de agosto de 2022

// Author: @vitorsilverio
// Author: @jaideraf

///////////////////////////////////////////////////////////////////
// make collapsible CSS clickable (space or enter to click)
// from: https://alligator.io/css/collapsible/
"use strict";
let myCollapsibleLabels = document.querySelectorAll(".lbl-toggle");

Array.from(myCollapsibleLabels).forEach(label => {
    label.addEventListener("keydown", e => {
        // 32 === spacebar
        // 13 === enter
        if (e.which === 32 || e.which === 13) {
            e.preventDefault();
            label.click();
        }
    });
});
///////////////////////////////////////////////////////////////////
let tag = "";
let tagFromDropdown = "";

function createMarcFieldHelpLink() {
    const tagInputs = document.body.querySelectorAll('.tagInput');
    tagInputs.forEach(elem => {
        const marcFieldHelpLink = document.createElement('a');
        marcFieldHelpLink.setAttribute('target', '_blank');
        marcFieldHelpLink.innerText = `(?)`;

        const marcFieldHelpLinkClass = elem.closest('table').querySelector('.marcFieldHelpLink');
        marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);

        // find the tag value from the chosen dropdown
        marcFieldHelpLinkClass.addEventListener('mouseover', event => {
            tagFromDropdown = event.target.closest('.instanceMain').querySelector('.select2-selection__rendered').getAttribute('title');
            tagFromDropdown = tagFromDropdown.substring(0, 3);
            marcFieldHelpLink.setAttribute('title',
                `Documentação do campo ${tagFromDropdown}`);
            // build the URL
            if (window.location.href.match(/A\d{6}/) ||
                window.location.href.match(/AutRecord/)) {
                marcFieldHelpLink.setAttribute('href', 'http://marc.febab.org/a' + tagFromDropdown);
            } else {
                marcFieldHelpLink.setAttribute('href', `https://www.loc.gov/marc/bibliographic/bd${tagFromDropdown}.html`);
            }
        });
    });
}

function createAuthorityLinks() {
    const textareas = document.body.querySelectorAll('textarea.has-authority-control');
    textareas.forEach(elem => {
        let authorityLink = document.createElement('a');
        authorityLink.setAttribute('title', 'Abre uma nova aba para criar ou editar um registro de autoridade');
        authorityLink.setAttribute('target', '_blank');
        authorityLink.innerText = 'Criar autoridade';
        authorityLink.style.display = 'none';

        let createAuthorityLink = elem.closest('table').querySelector('.createAuthorityLink');

        createAuthorityLink.appendChild(authorityLink);

        let pattern1 = /\$0\sA\d{6}/;
        let pattern2 = /\$0\s\(BN\)\d{9}/;

        elem.addEventListener('focusout', () => {
            // if already recorded
            if (pattern1.test(elem.value)) {
                // build the URL for Wikincat aut record edit
                authorityLink.innerText = 'Editar autoridade';
                authorityLink.setAttribute('href',
                    '/wiki/Special:FormEdit/AutRecord/Autoridade:' +
                    elem.value.match(/A\d{6}/));
            } else if (pattern2.test(elem.value)) {
                // build the URL for BN aut record view
                authorityLink.innerText = 'Ver autoridade na BN';
                authorityLink.setAttribute('href',
                    'http://acervo.bn.br/sophia_web/autoridade/detalhe/' +
                    elem.value.match(/\d{9}/));
            } else {
                // find the tag value from the chosen dropdown
                tagFromDropdown = elem.closest(".instanceMain")
                    // PageForms 4.8
                    // .find(".select2-chosen").text();
                    // Page forms 4.9.1
                    .querySelector('.select2-selection__rendered')
                    .getAttribute('title');
                tagFromDropdown = tagFromDropdown.substring(0, 3);
                // find the tag value from checked radio button

                let tagFromRadio = elem.closest('.instanceMain')
                    .querySelector("input[origname='Field[authorityType]']:checked")
                    .value;

                let authorityTypes = {
                    "Pessoa": "100",
                    "Entidade coletiva": "110",
                    "Evento": "111",
                    "Título uniforme": "130",
                    "Tópico": "150",
                    "Local": "151"
                };

                if (tagFromRadio in authorityTypes) {
                    tag = authorityTypes[tagFromRadio];
                }

                // declare the indicators default values
                let ind1 = elem.closest(".instanceMain")
                    .querySelector("select[origname='Field[ind1]'] option:checked")
                    .value;
                let ind2 = elem.closest(".instanceMain")
                    .querySelector("select[origname='Field[ind2]'] option:checked")
                    .value;

                // declare the 008 field default values
                let directOrIndirectGeogSubdiv = "", // 06
                    kindOfRecord = "", // 09
                    descriptiveCatalogingRules = "c", // 10
                    subjectHeadingSystem = "n", // 11
                    typeOfSeries = "n", // 12
                    numberedOrUnnumberedSeries = "n", // 13
                    headingUseMainOrAddedEntry = "a", // 14
                    headingUseSubjectAddedEntry = "a", // 15
                    headingUseSeriesAddedEntry = "b", // 16
                    typeOfSubjectSubdivision = "n", // 17
                    undifferentiatedPersonalName = "n", // 32
                    levelOfEstablishment = "a"; // 33

                // set the 008 field and indicadors specific values
                if (tag === "100") {
                    undifferentiatedPersonalName = "a";
                    ind2 = "";
                }
                if (tag === "110") {
                    // in case of autocomplete of 260
                    if (tagFromDropdown === "260") {
                        directOrIndirectGeogSubdiv = "n";
                        kindOfRecord = "b";
                        headingUseMainOrAddedEntry = "b";
                        headingUseSubjectAddedEntry = "b";
                        levelOfEstablishment = "n";
                        ind1 = "1";
                    }
                    ind2 = "";
                }
                if (tag === "111") {
                    ind1 = "2";
                    ind2 = "";
                }
                if (tag === "130") {
                    typeOfSeries = "a";
                    numberedOrUnnumberedSeries = "b";
                    headingUseSeriesAddedEntry = "a";
                    if (tagFromDropdown === "130" ||
                        tagFromDropdown === "630" ||
                        tagFromDropdown === "730") {
                        ind2 = ind1; // an inverted value happens here, see and
                        ind1 = "";   // compare bib. and auth. 130 MARC definitions
                    }
                    ind1 = "";
                }
                if (tag === "150" || tag === "151") {
                    descriptiveCatalogingRules = "n";
                    subjectHeadingSystem = "z";
                    headingUseMainOrAddedEntry = "b";
                    ind1 = ""; // 150 and 151 indicators must be empty in
                    ind2 = ""; // authority MARC records
                    if (tag === "151") {
                        typeOfSubjectSubdivision = "d";
                    }
                }
                // build the URL
                let autRecordSettings = {
                    "AutRecord": {
                        "directOrIndirectGeogSubdiv": directOrIndirectGeogSubdiv,
                        "kindOfRecord": kindOfRecord,
                        "descriptiveCatalogingRules": descriptiveCatalogingRules,
                        "subjectHeadingSystem": subjectHeadingSystem,
                        "typeOfSeries": typeOfSeries,
                        "numberedOrUnnumberedSeries": numberedOrUnnumberedSeries,
                        "headingUseMainOrAddedEntry": headingUseMainOrAddedEntry,
                        "headingUseSubjectAddedEntry": headingUseSubjectAddedEntry,
                        "headingUseSeriesAddedEntry": headingUseSeriesAddedEntry,
                        "typeOfSubjectSubdivision": typeOfSubjectSubdivision,
                        "undifferentiatedPersonalName": undifferentiatedPersonalName,
                        "levelOfEstablishment": levelOfEstablishment
                    },
                    "Field": {
                        "1": {
                            "tag": "040",
                            "data": encodeURIComponent("$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC")
                        },
                        "2": {
                            "tag": tag,
                            "ind1": encodeURIComponent(ind1),
                            "ind2": encodeURIComponent(ind2),
                            "data": encodeURIComponent(elem.value)
                        },
                        "3": {
                            "tag": "670",
                            "data": "$a+"
                        }
                    }
                };

                // https://stackoverflow.com/questions/278221 by Simon Staton
                const stringifyParam = function (data, topLevel, keyProp) {
                    let string = '';
                    for (let key in data) {
                        if (keyProp && topLevel[keyProp] && topLevel[keyProp].indexOf(data[key]) !== 0) {
                            string += keyProp;
                        }
                        if (topLevel[key]) {
                            string += key;
                        } else {
                            string += '[' + key + ']';
                        }
                        if (data[key] instanceof Array) {
                            string += stringifyParam(data[key], topLevel, key);
                        } else if (data[key] instanceof Object) {
                            string += stringifyParam(data[key], topLevel);
                        } else {
                            string += '=' + data[key];
                            string += '&';
                        }
                    }
                    return string;
                },
                    toParam = function (data) {
                        const string = stringifyParam(data, data);
                        return encodeURI(string.substring(0, string.length - 1).split(' ').join('+'));
                    };

                authorityLink.innerText = 'Criar autoridade';
                authorityLink.setAttribute("href", "/wiki/Special:FormEdit/AutRecord?" +
                    toParam(autRecordSettings));
            }
            authorityLink.style.display = '';
        });
    });
}

function rmCarriageReturn() {
    const textareas = document.body.querySelectorAll('textarea');
    textareas.forEach(elem => {
        elem.value = elem.value.replace("
", "");
    });
}

function rmHtmlTags() {
    const textareas = document.body.querySelectorAll('textarea');
    textareas.forEach(elem => {
        elem.value = elem.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, "");
    });
}

function rmTxtFromHiddenTexareas() {
    const textareas = document.body.querySelectorAll('span.hiddenByPF');
    textareas.forEach(elem => {
        elem.querySelectorAll('textarea').forEach(elem => {
            elem.value = '';
        });
    });
}

function normalizeInput() {
    const textareas = document.body.querySelectorAll('textarea');
    textareas.forEach(elem => {
        let normalizedInput = elem.value;
        normalizedInput = elem.value
            // "$a   Bar   \n$b    Baz" > " $a Bar $b Baz"
            .replace(/\s*(\$[a-z0-8])\s*/g, " $1 ")
            // "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar  Foo" > "$a Bar Foo"
            .replace(/\n|\s\s+|\t/g, " ")
            // replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
            .replace("|", "%7C");
        elem.value = normalizedInput;
    });
}

$(document).ready(function () {
    // calls main functions
    createMarcFieldHelpLink();
    createAuthorityLinks();
    rmCarriageReturn();
    rmHtmlTags();

    // Como instâncias do formulário são criadas pelo botão "Adicionar campo",
    // é necessário observar o DOM a partir da classe ".multipleTemplateList".
    // Toda vez que o DOM é alterado (mais especificamente, quando uma nova
    // child de ".multipleTemplateList" é criada), a função
    // marcEditorDynamicLinks() é novamente chamada.
    // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

    // create an observer instance
    let observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            let newNodes = mutation.addedNodes; // DOM NodeList
            if (newNodes.length !== 0) { // if there are new nodes added
                createMarcFieldHelpLink();
                createAuthorityLinks();
            }
        });
    });

    // select the target node
    let target = document.querySelector(".multipleTemplateList");

    // configuration of the observer
    let config = {
        childList: true,
        attributes: false,
        subtree: false
    };

    // pass in the target node, as well as the observer options
    observer.observe(target, config);

    // when clicking save...
    const saveBtn = document.body.querySelector('#wpSave');
    saveBtn.addEventListener('click', () => {
        observer.disconnect();
        rmTxtFromHiddenTexareas();
        rmCarriageReturn();
        rmHtmlTags();
        normalizeInput();
    });

});