B000004 e MediaWiki:MarcEditorDynamicLinks.js: mudanças entre as páginas

De Wikincat
(Diferenças entre páginas)
Ir para navegação Ir para pesquisar
imported>Jaideraf
Sem resumo de edição
 
Sem resumo de edição
 
Linha 1: Linha 1:
// Author: @vitorsilverio
{{BibRecord
// Author: @jaideraf
|dateEnteredOnFile=030415
/*jshint esversion: 6 */
|recordStatus=n
function main() {
|typeOfRecord=a
let tag = '';
|bibliographicLevel=m
let tagFromDropdown = '';
|encodingLevel= 
|descriptiveCatalogingForm=a
function createMarcFieldHelpLink() {
|multipartResourceRecordLevel= 
const tagInputs = document.body.querySelectorAll('.tagInput');
|controlField006=
tagInputs.forEach((elem) => {
|controlField007=
const marcFieldHelpLink = document.createElement('a');
|typeOfDate=s
marcFieldHelpLink.setAttribute('target', '_blank');
|date1=2000
marcFieldHelpLink.innerText = '(?)';
|date2=
|placeOfPublication=spb
const marcFieldHelpLinkClass = elem.closest('table')
|illustrations=a
.querySelector('.marcFieldHelpLink');
|targetAudience=g
marcFieldHelpLinkClass.innerHTML = "";
|formOfItem= 
marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);
|natureOfContents= 
|governmentPublication= 
// find the tag value from the chosen dropdown
|conferencePublication= 
marcFieldHelpLinkClass.addEventListener('mouseover', (event) => {
|festschrift= 
tagFromDropdown = event.target.closest('.instanceMain')
|index= 
.querySelector('.oo-ui-inputWidget-input')
|literaryForm=1
.getAttribute('title') || '00x';
|biography=d
tagFromDropdown = tagFromDropdown.substring(0, 3);
|language=por
marcFieldHelpLink.setAttribute(
|modifiedRecord= 
'title',
|catalogingSource=d
`Documentação do campo ${tagFromDropdown}`
}}
);
{{Field
// build the URL
|tag=020
if (window.location.href.match(/A\d{6}/)
|authorityType=Nenhuma
|| window.location.href.match(/AutRecord/)) {
|ind1=#
marcFieldHelpLink.setAttribute(
|ind2=#
'href',
|data=$a 8533613377 $q v. 1
`http://marc.febab.org/a${tagFromDropdown}`
|authorityData100=
);
|authorityData110=
} else {
|authorityData111=
marcFieldHelpLink.setAttribute(
|authorityData130=
'href',
|authorityData150=
`https://www.loc.gov/marc/bibliographic/bd${tagFromDropdown}.html`
|authorityData151=
);
}}
}
{{Field
});
|tag=020
});
|authorityType=Nenhuma
}
|ind1=#
|ind2=#
function createAuthorityLinks() {
|data=$a 9788533613379 $q reimpr.
const inputs = document.body.querySelectorAll('.instanceMain div table .oo-ui-inputWidget-input');
|authorityData100=
inputs.forEach((elem) => {
|authorityData110=
const authorityLink = document.createElement('a');
|authorityData111=
authorityLink.setAttribute('title', 'Abre uma nova aba para criar ou editar um registro de autoridade');
|authorityData130=
authorityLink.setAttribute('target', '_blank');
|authorityData150=
authorityLink.innerText = 'Criar registro de autoridade';
|authorityData151=
authorityLink.style.display = 'none';
}}
{{Field
const createAuthorityLink = elem.closest('table')
|tag=020
.querySelector('.createAuthorityLink');
|authorityType=Nenhuma
createAuthorityLink.innerHTML = "";
|ind1=#
createAuthorityLink.appendChild(authorityLink);
|ind2=#
|data=$a 9788533613386 $q reimpr.
const pattern1 = /\$0\sA\d{6}/;
|authorityData100=
const pattern2 = /\$0\s\(BN\)\d{9}/;
|authorityData110=
|authorityData111=
elem.addEventListener('focusout', () => {
|authorityData130=
// if already recorded
|authorityData150=
if (pattern1.test(elem.value)) {
|authorityData151=
// build the URL for Wikincat aut record edit
}}
authorityLink.innerText = 'Editar autoridade';
{{Field
authorityLink.setAttribute(
|tag=020
'href',
|authorityType=Nenhuma
`/wiki/Special:FormEdit/AutRecord/Autoridade:${
|ind1=#
elem.value.match(/A\d{6}/)}`
|ind2=#
);
|data=$a 8533613385 $q v. 2
} else if (pattern2.test(elem.value)) {
|authorityData100=
// build the URL for BN aut record view
|authorityData110=
authorityLink.innerText = 'Ver registro de autoridade na BN';
|authorityData111=
authorityLink.setAttribute(
|authorityData130=
'href',
|authorityData150=
`http://acervo.bn.gov.br/sophia_web/autoridade/detalhe/${
|authorityData151=
elem.value.match(/\d{9}/)}`
}}
);
{{Field
} else {
|tag=020
// find the tag value from the chosen dropdown
|authorityType=Nenhuma
tagFromDropdown = elem.closest('.instanceMain')
|ind1=#
.querySelector('.oo-ui-inputWidget-input')
|ind2=#
.getAttribute('title') || '00x';
|data=$a 8533613393 $q v. 3
tagFromDropdown = tagFromDropdown.substring(0, 3);
|authorityData100=
// find the tag value from checked radio button
|authorityData110=
|authorityData111=
const tagFromRadio = elem.closest('.instanceMain')
|authorityData130=
.querySelector('input[origname=\'Field[authorityType]\']:checked')
|authorityData150=
.value;
|authorityData151=
}}
const authorityTypes = {
{{Field
'Pessoa': '100',
|tag=035
'Entidade coletiva': '110',
|authorityType=Nenhuma
'Evento': '111',
|ind1=#
'Título uniforme': '130',
|ind2=#
'Tópico': '150',
|data=$a (BIBLIODATA)SC000644855
'Local': '151'
|authorityData100=
};
|authorityData110=
|authorityData111=
if (tagFromRadio in authorityTypes) {
|authorityData130=
tag = authorityTypes[tagFromRadio];
|authorityData150=
}
|authorityData151=
}}
// declare the indicators default values
{{Field
let ind1 = elem.closest('.instanceMain')
|tag=040
.querySelector('select[origname=\'Field[ind1]\'] option:checked')
|authorityType=Nenhuma
.value;
|ind1=#
let ind2 = elem.closest('.instanceMain')
|ind2=#
.querySelector('select[origname=\'Field[ind2]\'] option:checked')
|data=$a BR-FlUSC $c BR-FlUSC $d BR-FlWIK
.value;
|authorityData100=
|authorityData110=
// declare the 008 field default values
|authorityData111=
let directOrIndirectGeogSubdiv = ''; // 06
|authorityData130=
let kindOfRecord = ''; // 09
|authorityData150=
let descriptiveCatalogingRules = 'c'; // 10
|authorityData151=
let subjectHeadingSystem = 'n'; // 11
}}
let typeOfSeries = 'n'; // 12
{{Field
let numberedOrUnnumberedSeries = 'n'; // 13
|tag=041
let headingUseMainOrAddedEntry = 'a'; // 14
|authorityType=Nenhuma
let headingUseSubjectAddedEntry = 'a'; // 15
|ind1=1
let headingUseSeriesAddedEntry = 'b'; // 16
|ind2=#
let typeOfSubjectSubdivision = 'n'; // 17
|data=$a por $h eng
let undifferentiatedPersonalName = 'n'; // 32
|authorityData100=
let levelOfEstablishment = 'a'; // 33
|authorityData110=
|authorityData111=
// set the 008 field and indicadors specific values
|authorityData130=
if (tag === '100') {
|authorityData150=
undifferentiatedPersonalName = 'a';
|authorityData151=
ind2 = '';
}}
}
{{Field
if (tag === '110') {
|tag=080
// in case of autocomplete of 260
|authorityType=Nenhuma
if (tagFromDropdown === '260') {
|ind1=#
directOrIndirectGeogSubdiv = 'n';
|ind2=#
kindOfRecord = 'b';
|data=$a 820-31
headingUseMainOrAddedEntry = 'b';
|authorityData100=
headingUseSubjectAddedEntry = 'b';
|authorityData110=
levelOfEstablishment = 'n';
|authorityData111=
ind1 = '1';
|authorityData130=
}
|authorityData150=
ind2 = '';
|authorityData151=
}
}}
if (tag === '111') {
{{Field
ind1 = '2';
|tag=090
ind2 = '';
|authorityType=Nenhuma
}
|ind1=#
if (tag === '130') {
|ind2=#
typeOfSeries = 'a';
|data=$a 820-31 $b T649s $c 2.ed.
numberedOrUnnumberedSeries = 'b';
|authorityData100=
headingUseSeriesAddedEntry = 'a';
|authorityData110=
if (tagFromDropdown === '130'
|authorityData111=
|| tagFromDropdown === '630'
|authorityData130=
|| tagFromDropdown === '730') {
|authorityData150=
ind2 = ind1; // an inverted value happens here, see and
|authorityData151=
ind1 = ''; // compare bib. and auth. 130 MARC definitions
}}
}
{{Field
ind1 = '';
|tag=100
}
|authorityType=Pessoa
if (tag === '150' || tag === '151') {
|ind1=1
descriptiveCatalogingRules = 'n';
|ind2=#
subjectHeadingSystem = 'z';
|data=
headingUseMainOrAddedEntry = 'b';
|authorityData100=$a Tolkien, J. R. R. $q (John Ronald Reuel), $d 1892-1973 $0 A000012
ind1 = ''; // 150 and 151 indicators must be empty in
|authorityData110=
ind2 = ''; // authority MARC records
|authorityData111=
if (tag === '151') {
|authorityData130=
typeOfSubjectSubdivision = 'd';
|authorityData150=
}
|authorityData151=
}
}}
// build the URL
{{Field
const autRecordParams = {
|tag=240
AutRecord: {
|authorityType=Nenhuma
directOrIndirectGeogSubdiv,
|ind1=1
kindOfRecord,
|ind2=4
descriptiveCatalogingRules,
|data=$a The lord of the rings. $l Português
subjectHeadingSystem,
|authorityData100=
typeOfSeries,
|authorityData110=
numberedOrUnnumberedSeries,
|authorityData111=
headingUseMainOrAddedEntry,
|authorityData130=
headingUseSubjectAddedEntry,
|authorityData150=
headingUseSeriesAddedEntry,
|authorityData151=
typeOfSubjectSubdivision,
}}
undifferentiatedPersonalName,
{{Field
levelOfEstablishment
|tag=245
},
|authorityType=Nenhuma
Field: {
|ind1=1
'1': {
|ind2=2
tag: '040',
|data=$a O senhor dos anéis / $c J. R. R. Tolkien ; tradução: Lenita Maria Rímoli Esteves, Almiro Pisetta ; revisão técnica e consultoria: Ronald Eduard Kyrmse ; coordenação: Luís Carlos Borges
data: '$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC'
|authorityData100=
},
|authorityData110=
'2': {
|authorityData111=
tag,
|authorityData130=
ind1,
|authorityData150=
ind2,
|authorityData151=
data: elem.value
}}
},
{{Field
'3': {
|tag=250
tag: '670',
|authorityType=Nenhuma
data: '$a '
|ind1=#
}
|ind2=#
}
|data=$a 2. ed.
};
|authorityData100=
|authorityData110=
const url = new URL(`${window.location.origin}/wiki/Special:FormEdit/AutRecord`);
|authorityData111=
// function to transform a 3rd level object to URL query strings
|authorityData130=
const makeUrlParams = (obj) => {
|authorityData150=
for (const [key, value] of Object.entries(obj)) {
|authorityData151=
if (typeof value === 'object') {
}}
for (const [key2, value2] of Object.entries(value)) {
{{Field
if (typeof value2 === 'object') {
|tag=260
for (const [key3, value3] of Object.entries(value2)) {
|authorityType=Nenhuma
url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
|ind1=#
}
|ind2=#
} else {
|data=$a São Paulo : $b M. Fontes, $c 2000.
url.searchParams.set(`${key}[${key2}]`, value2);
|authorityData100=
}
|authorityData110=
}
|authorityData111=
} else {
|authorityData130=
url.searchParams.set(key, value);
|authorityData150=
}
|authorityData151=
}
}}
};
{{Field
makeUrlParams(autRecordParams);
|tag=300
authorityLink.innerText = 'Criar registro de autoridade';
|authorityType=Nenhuma
authorityLink.setAttribute('href', url.pathname + url.search);
|ind1=#
}
|ind2=#
authorityLink.style.display = '';
|data=$a v. : $b il. ; $c 20 cm
});
|authorityData100=
});
|authorityData110=
}
|authorityData111=
|authorityData130=
function rmCarriageReturn() {
|authorityData150=
const textareas = document.body.querySelectorAll('textarea');
|authorityData151=
textareas.forEach((textarea) => {
}}
const element = textarea;
{{Field
element.value = element.value.replace('
', '');
|tag=505
});
|authorityType=Nenhuma
}
|ind1=8
|ind2=#
function rmHtmlTags() {
|data=$a v. 1. A sociedade do anel -- v. 2. As duas torres -- v. 3. O retorno do rei.
const textareas = document.body.querySelectorAll('textarea');
|authorityData100=
textareas.forEach((textarea) => {
|authorityData110=
const element = textarea;
|authorityData111=
element.value = element.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, '');
|authorityData130=
});
|authorityData150=
}
|authorityData151=
}}
function rmTxtFromHiddenFields() {
{{Field
const spans = document.body.querySelectorAll('span.hiddenByPF');
|tag=590
spans.forEach((elem) => {
|authorityType=Nenhuma
elem.querySelectorAll('.input.oo-ui-inputWidget-input').forEach((input) => {
|ind1=#
const element = input;
|ind2=#
element.value = '';
|data=$a A Biblioteca possui a 3. tiragem 2001, 4. tiragem 2002, 7. tiragem 2009, 12. e 13. reimpr. de 2014, 14. reimpr. de 2015.
});
|authorityData100=
elem.querySelectorAll('textarea').forEach((input) => {
|authorityData110=
const element = input;
|authorityData111=
element.value = '';
|authorityData130=
});
|authorityData150=
});
|authorityData151=
}
}}
{{Field
function normalizeInput() {
|tag=650
const instanceMains = document.body.querySelectorAll('.instanceMain div table');
|authorityType=Nenhuma
instanceMains.forEach((instanceMain) => {
|ind1=0
instanceMain.querySelectorAll('.oo-ui-inputWidget-input').forEach((input) => {
|ind2=4
const normalizedInput = input;
|data=$a Ficção inglesa
normalizedInput.value = normalizedInput.value
|authorityData100=
// "$a Bar \n$b Baz" > " $a Bar $b Baz"
|authorityData110=
.replace(/\s*(\$[a-z0-8])\s*/g, ' $1 ')
|authorityData111=
// "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar Foo" > "$a Bar Foo"
|authorityData130=
.replace(/\n|\s\s+|\t/g, ' ')
|authorityData150=
// replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
|authorityData151=
.replace('|', '%7C');
}}
});
{{Field
instanceMain.querySelectorAll('textarea').forEach((textarea) => {
|tag=650
const normalizedInput = textarea;
|authorityType=Nenhuma
textarea.value = normalizedInput.value
|ind1=0
// "$a Bar \n$b Baz" > " $a Bar $b Baz"
|ind2=4
.replace(/\s*(\$[a-z0-8])\s*/g, ' $1 ')
|data=$a Literatura inglesa
// "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar Foo" > "$a Bar Foo"
|authorityData100=
.replace(/\n|\s\s+|\t/g, ' ')
|authorityData110=
// replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
|authorityData111=
.replace('|', '%7C');
|authorityData130=
});
|authorityData150=
});
|authorityData151=
}
}}
{{Field
// calls main functions
|tag=740
createMarcFieldHelpLink();
|authorityType=Nenhuma
createAuthorityLinks();
|ind1=2
rmCarriageReturn();
|ind2=2
rmHtmlTags();
|data=$a A sociedade do anel
|authorityData100=
// Como instâncias do formulário são criadas pelo botão "Adicionar campo",
|authorityData110=
// é necessário observar o DOM a partir da classe ".multipleTemplateList".
|authorityData111=
// Toda vez que o DOM é alterado (mais especificamente, quando uma nova
|authorityData130=
// child de ".multipleTemplateList" é criada), as funções
|authorityData150=
// createMarcFieldHelpLink() e createAuthorityLinks() são novamente chamadas.
|authorityData151=
// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
}}
{{Field
// create an observer instance
|tag=740
const observer = new MutationObserver((mutations) => {
|authorityType=Nenhuma
mutations.forEach((mutation) => {
|ind1=3
const newNodes = mutation.addedNodes; // DOM NodeList
|ind2=2
if (newNodes.length !== 0) { // if there are new nodes added
|data=$a As duas torres
createMarcFieldHelpLink();
|authorityData100=
createAuthorityLinks();
|authorityData110=
}
|authorityData111=
});
|authorityData130=
});
|authorityData150=
|authorityData151=
// select the target node
}}
const target = document.querySelector('.multipleTemplateList');
{{Field
|tag=740
// configuration of the observer
|authorityType=Nenhuma
const config = {
|ind1=2
childList: true,
|ind2=2
attributes: false,
|data=$a O retorno do rei
subtree: false,
|authorityData100=
};
|authorityData110=
|authorityData111=
// pass in the target node, as well as the observer options
|authorityData130=
observer.observe(target, config);
|authorityData150=

|authorityData151=
// when clicking save...
}}
const saveBtn = document.body.querySelector('#wpSave');
{{EndOfRecord}}
saveBtn.addEventListener('click', () => {
observer.disconnect();
rmTxtFromHiddenFields();
rmCarriageReturn();
rmHtmlTags();
normalizeInput();
});
// when clicking adding field...
const addBtn = document.body.querySelector('.multipleTemplateAdder');
addBtn.addEventListener('click', () => {
createMarcFieldHelpLink();
});
}
if (document.readyState === 'complete' || (document.readyState !== 'loading')) {
main();
} else {
document.addEventListener('DOMContentLoaded', main);
}

// for no obvious reason to me, the first call to the "main" function is not
// occurring, so wait 3 seconds and call it anyway.
setTimeout(main, 3000);

Edição das 14h25min de 14 de março de 2024

// Author: @vitorsilverio
// Author: @jaideraf
/*jshint esversion: 6 */
function main() {
    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.innerHTML = "";  
        marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);
  
        // find the tag value from the chosen dropdown
        marcFieldHelpLinkClass.addEventListener('mouseover', (event) => {
          tagFromDropdown = event.target.closest('.instanceMain')
            .querySelector('.oo-ui-inputWidget-input')
            .getAttribute('title') || '00x';
          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 inputs = document.body.querySelectorAll('.instanceMain div table .oo-ui-inputWidget-input');
      inputs.forEach((elem) => {
        const 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 registro de autoridade';
        authorityLink.style.display = 'none';
  
        const createAuthorityLink = elem.closest('table')
          .querySelector('.createAuthorityLink');
        createAuthorityLink.innerHTML = "";  
        createAuthorityLink.appendChild(authorityLink);
  
        const pattern1 = /\$0\sA\d{6}/;
        const 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 registro de autoridade na BN';
            authorityLink.setAttribute(
              'href',
              `http://acervo.bn.gov.br/sophia_web/autoridade/detalhe/${
                elem.value.match(/\d{9}/)}`
            );
          } else {
            // find the tag value from the chosen dropdown
            tagFromDropdown = elem.closest('.instanceMain')
              .querySelector('.oo-ui-inputWidget-input')
              .getAttribute('title') || '00x';
            tagFromDropdown = tagFromDropdown.substring(0, 3);
            // find the tag value from checked radio button
  
            const tagFromRadio = elem.closest('.instanceMain')
              .querySelector('input[origname=\'Field[authorityType]\']:checked')
              .value;
  
            const 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
            let kindOfRecord = ''; // 09
            let descriptiveCatalogingRules = 'c'; // 10
            let subjectHeadingSystem = 'n'; // 11
            let typeOfSeries = 'n'; // 12
            let numberedOrUnnumberedSeries = 'n'; // 13
            let headingUseMainOrAddedEntry = 'a'; // 14
            let headingUseSubjectAddedEntry = 'a'; // 15
            let headingUseSeriesAddedEntry = 'b'; // 16
            let typeOfSubjectSubdivision = 'n'; // 17
            let undifferentiatedPersonalName = 'n'; // 32
            let 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
            const autRecordParams = {
              AutRecord: {
                directOrIndirectGeogSubdiv,
                kindOfRecord,
                descriptiveCatalogingRules,
                subjectHeadingSystem,
                typeOfSeries,
                numberedOrUnnumberedSeries,
                headingUseMainOrAddedEntry,
                headingUseSubjectAddedEntry,
                headingUseSeriesAddedEntry,
                typeOfSubjectSubdivision,
                undifferentiatedPersonalName,
                levelOfEstablishment
              },
              Field: {
                '1': {
                  tag: '040',
                  data: '$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC'
                },
                '2': {
                  tag,
                  ind1,
                  ind2,
                  data: elem.value
                },
                '3': {
                  tag: '670',
                  data: '$a '
                }
              }
            };
  
            const url = new URL(`${window.location.origin}/wiki/Special:FormEdit/AutRecord`);
            // function to transform a 3rd level object to URL query strings
            const makeUrlParams = (obj) => {
              for (const [key, value] of Object.entries(obj)) {
                if (typeof value === 'object') {
                  for (const [key2, value2] of Object.entries(value)) {
                    if (typeof value2 === 'object') {
                      for (const [key3, value3] of Object.entries(value2)) {
                        url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
                      }
                    } else {
                      url.searchParams.set(`${key}[${key2}]`, value2);
                    }
                  }
                } else {
                  url.searchParams.set(key, value);
                }
              }
            };
            makeUrlParams(autRecordParams);
            authorityLink.innerText = 'Criar registro de autoridade';
            authorityLink.setAttribute('href', url.pathname + url.search);
          }
          authorityLink.style.display = '';
        });
      });
    }
  
    function rmCarriageReturn() {
      const textareas = document.body.querySelectorAll('textarea');
      textareas.forEach((textarea) => {
        const element = textarea;
        element.value = element.value.replace('&#13;', '');
      });
    }
  
    function rmHtmlTags() {
      const textareas = document.body.querySelectorAll('textarea');
      textareas.forEach((textarea) => {
        const element = textarea;
        element.value = element.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, '');
      });
    }
  
    function rmTxtFromHiddenFields() {
      const spans = document.body.querySelectorAll('span.hiddenByPF');
      spans.forEach((elem) => {
        elem.querySelectorAll('.input.oo-ui-inputWidget-input').forEach((input) => {
          const element = input;
          element.value = '';
        });
        elem.querySelectorAll('textarea').forEach((input) => {
          const element = input;
          element.value = '';
        });
      });
    }
  
    function normalizeInput() {
      const instanceMains = document.body.querySelectorAll('.instanceMain div table');
      instanceMains.forEach((instanceMain) => {
          instanceMain.querySelectorAll('.oo-ui-inputWidget-input').forEach((input) => {
              const normalizedInput = input;
              normalizedInput.value = normalizedInput.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');
          });
          instanceMain.querySelectorAll('textarea').forEach((textarea) => {
              const normalizedInput = textarea;
              textarea.value = normalizedInput.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');
          });
      });
    }
  
    // 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), as funções
    // createMarcFieldHelpLink() e createAuthorityLinks() são novamente chamadas.
    // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
  
    // create an observer instance
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        const newNodes = mutation.addedNodes; // DOM NodeList
        if (newNodes.length !== 0) { // if there are new nodes added
          createMarcFieldHelpLink();
          createAuthorityLinks();
        }
      });
    });
  
    // select the target node
    const target = document.querySelector('.multipleTemplateList');
  
    // configuration of the observer
    const 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();
        rmTxtFromHiddenFields();
        rmCarriageReturn();
        rmHtmlTags();
        normalizeInput();
    });
  
    // when clicking adding field...
    const addBtn = document.body.querySelector('.multipleTemplateAdder');
    addBtn.addEventListener('click', () => {
        createMarcFieldHelpLink();
    });
}
  
if (document.readyState === 'complete' || (document.readyState !== 'loading')) {
main();
} else {
document.addEventListener('DOMContentLoaded', main);
}

// for no obvious reason to me, the first call to the "main" function is not 
// occurring, so wait 3 seconds and call it anyway.
setTimeout(main, 3000);