MediaWiki:MarcEditorDynamicLinks.js

Revisão de 16h28min de 22 de maio de 2021 por Jaider.ferreira (discussão | contribs)

Nota: Após publicar, você pode ter que limpar o "cache" do seu navegador para ver as alterações.

  • Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Internet Explorer/Edge: PressioneCtrl enquanto clica Recarregar, ou Pressione Ctrl-F5
  • Opera: Pressione Ctrl-F5.
// Author: @vitorsilverio
// Author: @jaideraf

///////////////////////////////////////////////////////////////////
// make collapsible CSS clickable (space or enter to click)
// from: https://alligator.io/css/collapsible/
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 createMarcFieldHelpLinks() {
"use strict";
    $(".tagInput").each(function() {
        let marcFieldHelpLink = $("<a>", {
            target: "_blank",
            text: "(?)"
        });
        marcFieldHelpLink.hide();
        $(this).closest("table").find(".marcFieldHelpLink").html(marcFieldHelpLink);
        $(this).closest("table").find("select").change(function() {

            // find the tag value from the chosen dropdown
            tagFromDropdown = $(this).closest(".instanceMain").find(".select2-selection__rendered").attr("title");
            tagFromDropdown = tagFromDropdown.substring(0, 3);

            // build the URL
            marcFieldHelpLink.attr("title", "Documentação do campo " + tagFromDropdown);
            
            if (window.location.href.match(/A\d{6}/) || 
                window.location.href.match(/AutRecord/)) {
                marcFieldHelpLink.attr("href", "http://marc.febab.org/a" + tagFromDropdown);
            } else {
            	marcFieldHelpLink.attr("href", "https://www.loc.gov/marc/bibliographic/bd" + tagFromDropdown + ".html");
            }
            
            marcFieldHelpLink.show();
        });
    });
}

function createAuthorityLinks() {
"use strict";
    $("textarea").each(function() {
        let authorityLink = $("<a>", {
            title: "Abre uma nova aba para criar ou editar um registro de autoridade",
            target: "_blank",
            text: "Criar autoridade"
        });
        let pattern1 = /\$0\sA\d{6}/;
        let pattern2 = /\$0\s\(BN\)\d{9}/;
        authorityLink.hide();
        $(this).closest("table").find(".createAuthorityLink").html(authorityLink);
        $(this).focusout(function() {
            // if already recorded
            if (pattern1.test($(this).val())) {
                // build the URL for Wikincat aut record edit
                authorityLink.text("Editar autoridade");
                authorityLink.attr("href", "/wiki/Special:FormEdit/AutRecord/Autoridade:" + 
                $(this).val().match(/A\d{6}/));
            } else if (pattern2.test($(this).val())) {
            	// build the URL for BN aut record view
                authorityLink.text("Ver autoridade na BN");
                authorityLink.attr("href", "http://acervo.bn.br/sophia_web/autoridade/detalhe/" + 
                $(this).val().match(/\d{9}/));
			} else {
                // find the tag value from the chosen dropdown
                tagFromDropdown = $(this).closest(".instanceMain")
                // PageForms 4.8
                // .find(".select2-chosen").text();
                // Page forms 4.9.1
                .find(".select2-selection__rendered").attr("title");
                tagFromDropdown = tagFromDropdown.substring(0, 3);

                // find the tag value from checked radio button
                let tagFromRadio = $(this).closest(".instanceMain")
                .find("input[origname='Field[authorityType]']:checked").val();
                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 = $(this).closest(".instanceMain")
                .find("select[origname='Field[ind1]'] option:selected").val();
                let ind2 = $(this).closest(".instanceMain")
                .find("select[origname='Field[ind2]'] option:selected").val();

                // 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
                authorityLink.attr("href", "/wiki/Special:FormEdit/AutRecord?" +
                decodeURIComponent($.param({
                    "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($(this).val())
                        },
                        "3": {
                            "tag": "670",
                            "data": "$a+"
                        }
                    }
                })));
            }
            authorityLink.show();
        });
    });
}

$(document).ready(function(){
"use strict";
    // remove carriage return
    $("span.inputSpan").find("textarea").each(function() {
        let input = $(this).val();
        input = input.replace("&#13;", "")
        // remove any html tags
        .replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, "");
        $(this).val(input);
    });

    // calls main functions
    createMarcFieldHelpLinks();
    createAuthorityLinks();

    // 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
                createMarcFieldHelpLinks();
                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 save, remove text form hidden textareas
    $("#wpSave").click(function(){
        observer.disconnect();
        $("span.hiddenByPF").find("textarea").val("");
        $("textarea").each(function() {
            let input = $(this).val();
            // normalize input
            let normalizedInput = input
            // "$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");
            $(this).val(normalizedInput);
        });
    });
});