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

Ir para navegação Ir para pesquisar
sem sumário de edição
Sem resumo de edição
Sem resumo de edição
(38 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
/* jshint esversion: 10 */
// Author: @vitorsilverio
// Author: @jaideraf
function main() {
// calling main functions
let tag = '';
makeMarcFieldHelpLink();
let tagFromDropdown = '';
authorityLinks();
 
setIndicators();
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) ? tagFromDropdown.substring(0, 3) : '100';
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) => {
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.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 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
 
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('
', '');
});
}
 
function rmHtmlTags() {
const textareas = document.body.querySelectorAll('textarea');
textareas.forEach((textarea) => {
const element = textarea;
element.value = element.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, '');
});
}
 
function rmTxtFromHiddenTexareas() {
const textareas = document.body.querySelectorAll('span.hiddenByPF');
textareas.forEach((elem) => {
elem.querySelectorAll('textarea').forEach((textarea) => {
const element = textarea;
element.value = '';
});
});
}
 
function normalizeInput() {
const textareas = document.body.querySelectorAll('textarea');
textareas.forEach((textarea) => {
const normalizedInput = textarea;
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');
});
}
 
// calls main functions
createMarcFieldHelpLink();
createAuthorityLinks();
rmCarriageReturn();
rmHtmlTags();
// Toda vez que o DOM é alterado (mais especificamente, quando uma nova
// child de ".multipleTemplateList" é criada), as funções
// createMarcFieldHelpLinkmakeMarcFieldHelpLink() e createAuthorityLinksauthorityLinks() são novamente chamadas.
// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
 
mutations.forEach((mutation) => {
const newNodes = mutation.addedNodes; // DOM NodeList
if (newNodes.length !== 0) { // if there are new nodes added
createMarcFieldHelpLink();// if there are new nodes added
createAuthorityLinksmakeMarcFieldHelpLink();
authorityLinks();
setIndicators();
}
});
saveBtn.addEventListener('click', () => {
observer.disconnect();
rmTxtFromHiddenTexareasrmTxtFromHiddenFields();
rmCarriageReturn();
rmHtmlTags();
}
 
document.addEventListener('DOMContentLoaded', function (event) {
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);

Menu de navegação