Predefinição:BibRules e Módulo:MARCimporter: mudanças entre as páginas
(Diferenças entre páginas)
Ir para navegação
Ir para pesquisar
imported>Jaideraf |
imported>Jaideraf Sem resumo de edição |
||
Linha 1: | Linha 1: | ||
local p = {} |
|||
{{#if: {{Exist|245}} | |
|||
-- a função "record" é dividida em 4 partes: um handler para registros ISO 2709, |
|||
{{#switch: {{Field data string|000|5|1|property=Leader}} | <!-- Record status --> |
|||
-- um handler para registros em "MARC tags", uma configuração para registros |
|||
|n = * Segundo o Líder, este é um registro '''novo''' (não um alterado ou revisado, expandido, excluído, etc.). |
|||
-- bibliográficos e uma configuração para registros de autoridade. |
|||
|c = * Segundo o Líder, este é um registro '''alterado ou revisado''' (não um novo, expandido, excluído, etc.). |
|||
function p.record( frame ) |
|||
|a|d|p = * Segundo o Líder, este é um registro '''expandido''' ou '''excluído''' (não novo). |
|||
-- recebe o registro, o terceiro argumento da Predefinição:MARCimporter |
|||
}} {{#switch: {{Field data string|000|6|1|property=Leader}} | <!-- Type of record --> |
|||
local record = frame.args[3] or '' |
|||
|a = * Segundo o Líder, este registro descreve um '''material textual'''. |
|||
-- recebe o modo de normalização Unicode ("Sim" para ativar o modo NFD) |
|||
}} {{#switch: {{Field data string|000|7|1|property=Leader}} | <!-- Bibliographic level --> |
|||
local isNFD = frame.args[2] or '' |
|||
|m = * Segundo o Líder, este registro descreve um '''item monográfico''' (não parte de um item, não um item seriado, não uma coleção, etc.). |
|||
-- inicializa as variáveis básicas do registro |
|||
}} {{#switch: {{Field data string|000|17|1|property=Leader}} | <!-- Encoding level --> |
|||
local leader = '' |
|||
|1 = * Segundo o Líder, este registro tem um nível '''completo''' de catalogação (mas o material não foi examinado). |
|||
local baseAddressOfData = 0 |
|||
|#default = * Segundo o Líder, este registro tem um nível '''completo''' de catalogação (a descrição foi realizada com o material em mãos). |
|||
local directory = 0 |
|||
}} {{#switch: {{Field data string|000|18|1|property=Leader}} | <!-- Descriptive cataloging form --> |
|||
local dataValuesGroup = '' |
|||
|a = * Segundo o Líder, este registro possui uma catalogação '''compatível com as regras do AACR 2'''. |
|||
-- inicializa as variáveis auxiliares |
|||
|#default = * Segundo o Líder, este registro possui uma catalogação '''não compatível com as regras da ISBD'''. |
|||
local directoryEntry = 0 |
|||
}} <!-- explica a sintaxe "(Biblioteca)NúmeroDeControle" --> |
|||
local entryTag = 0 |
|||
* Internamente, este registro é identificado pelo código "{{Field data string|001|0||property=Control field data}}"; para sistemas externos, o código é "({{Field data string|003|0||property=Control field data}}){{Field data string|001|0||property=Control field data}}". <!-- campo 005 e 008 --> |
|||
local entryDataLength = 0 |
|||
* O registro foi criado em: {{#show:{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}|?Creation date#-F[l, d \d\e F \d\e Y]|headers=hide|mainlabel=-}}. Sua última transação foi em: {{#show:{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}|?Modification date#-F[l, d \d\e F \d\e Y]|headers=hide|mainlabel=-}}. {{#if: {{#regex:{{Field data string|008|15|3|property=Control field data}}|/^[A-Z]/r|}} | * <strong class="error">O uso de maiúsculas não é permitido no campo 008, local de publicação.</strong> | * O item possui a seguinte origem: {{#switch:{{Field data string|008|15|3|property=Control field data}} |
|||
local entryInitPosition = 0 |
|||
|acb = Acre |
|||
local dataField = {} -- Cada tabela que contém os dados dos campos. Formato: |
|||
|alb = Alagoas |
|||
-- { tag='', length='', initPosition='', data='', ind1='', ind2='' } |
|||
|amb = Amazonas |
|||
local dataFields = {} -- Tabela que contém cada tabela dataField. Formato: |
|||
|apb = Amapá |
|||
-- { 1={}, 2={}, 3={}, 4={}, n={} } |
|||
|bab = Bahia |
|||
local controlField003 = '' |
|||
|ceb = Ceará |
|||
local controlField006 = '' |
|||
|dfb = Distrito Federal |
|||
local controlField007 = '' |
|||
|esb = Espírito Santo |
|||
local controlField008 = '' |
|||
|gob = Goiás |
|||
local tag040 = '' |
|||
|mab = Maranhão |
|||
local firstTemplate = '' |
|||
|mgb = Minas Gerais |
|||
local fieldTemplates = '' |
|||
|msb = Mato Grosso do Sul |
|||
local lastTemplate = '{{EndOfRecord}}</pre>' |
|||
|mtb = Mato Grosso |
|||
local queryString = '' |
|||
|pab = Pará |
|||
local fieldQueryString = '' |
|||
|pbb = Paraíba |
|||
local formLink = '' |
|||
|peb = Pernambuco |
|||
local function normalizeData( data ) |
|||
|pib = Piauí |
|||
data = data |
|||
:gsub( '|(.)', ' $%1 ' ) -- substitui "|a" por " $a " |
|||
|rjb = Rio de Janeiro |
|||
:gsub( '(%d)p%.', '%1 p.' ) -- // "1p." por "1 p." |
|||
|rnb = Rio Grande do Norte |
|||
:gsub( '(%d)cm', '%1 cm' ) -- // "1cm" por "1 cm" |
|||
|rob = Rondônia |
|||
:gsub( '(%d)ed%.', '%1 ed.' ) -- // "1ed." por "1 ed." |
|||
|rrb = Roraima |
|||
:gsub( '%.%s?%-$', '.' ) -- // ". -" por "." |
|||
|rsb = Rio Grande do Sul |
|||
:gsub( '(%$.*)(%$w.*)', '%2 %1' ) -- move o subcampo $w para a frente |
|||
|scb = Santa Catarina |
|||
:gsub( '(%$z.*)(%$u.*)', '%2 %1' ) -- move o subcampo $u para a frente |
|||
|seb = Sergipe |
|||
return data |
|||
|spb = São Paulo |
|||
end |
|||
|tob = Tocantins |
|||
if record:match( '^%d%d%d%d' ) |
|||
|bl = Brasil |
|||
then |
|||
|xxu = Estados Unidos |
|||
-- == MARC ISO 2709 handler == -- |
|||
|flu = Flórida, EUA |
|||
-- O MediaWiki substitui caracteres de controle (RS, US, GS) pelo |
|||
|nyu = Nova York, EUA |
|||
-- caractere de "desconhecido" (losango com interrogação) e, aqui, |
|||
|po = Portugal |
|||
-- substituo esse caractere por um pipe (é necessário substituir |
|||
|xxk = Reino Unido |
|||
-- por um caractere da faixa ASCII). |
|||
|fr = França |
|||
record = record:gsub( '�', '|' ) |
|||
|sp = Espanha |
|||
-- verifica se a forma de normalização Unicode é a |
|||
|gw = Alemanha |
|||
-- Normalization Form Canonical Decomposition (NFD) |
|||
|xx = <strong class="error">não foi identificado um local de publicação no campo 008</strong> |
|||
if isNFD == 'Sim' |
|||
|vp = há vários locais de publicação |
|||
then |
|||
|esp|eua|fra = <strong class="error">código inválido para o local de publicação</strong> |
|||
record = mw.ustring.toNFD( record ) |
|||
| = <strong class="error">é necessário informar um código de local de publicação, campo 008.</strong> |
|||
end |
|||
|#default = {{Field data string|008|15|3|property=Control field data}} |
|||
-- configuração das variáveis básicas do registro (via ISO 2709): |
|||
}}. |
|||
-- obtém o líder |
|||
}} {{#if: {{#regex:{{Field data string|008|35|3|property=Control field data}}|/^[A-Z]/r|}} | |
|||
leader = record:sub( 1, 24 ) or '' |
|||
* <strong class="error">O uso de maiúsculas não é permitido no campo 008, idioma.</strong> | |
|||
--> 00898nam a2200277 a 4500 |
|||
* Majoritariamente, o item se expressa no seguinte idioma: {{#switch:{{Field data string|008|35|3|property=Control field data}} |
|||
-- obtém o endereço base dos dados |
|||
|por = português |
|||
baseAddressOfData = tonumber( leader:sub( 13, 17 ) ) or 0 |
|||
|eng = inglês |
|||
--> 00277 |
|||
|spa = espanhol |
|||
-- obtém o diretório (-1 para não pegar RS) |
|||
|ger = alemão |
|||
directory = record:sub( 25, baseAddressOfData - 1 ) or 0 |
|||
|fre = francês |
|||
--> 0010010000000050017000100080041000270200027000680400017000950... |
|||
|ita = italiano |
|||
-- obtém os dados dos campos em um único grupo |
|||
|chi = chinês |
|||
dataValuesGroup = record:sub( baseAddressOfData + 1 ) or '' |
|||
|esp|ing|fra|pt|en|es = <strong class="error">código inválido para o idioma, campo 008</strong> |
|||
--> 278 até o final do registro |
|||
| = <strong class="error">é necessário informar um código de idioma no campo 008.</strong> |
|||
-- enquanto o tamanho do diretório for maior que 0... |
|||
|#default = {{Field data string|008|35|3|property=Control field data}} |
|||
while #directory > 0 |
|||
}} |
|||
do |
|||
}} <!-- se existe o campo 041, mostra "(traduzido do...)" na mesma linha do idioma presente no 008 --> {{#if: {{Exist|041}} | {{#ifeq: {{Field data string|041|0|1|}} | 1 |  (traduzido do {{#switch:{{Select|041|h}} |
|||
directoryEntry = directory:sub( 1, 12 ) -- 245008100177 |
|||
|por = português |
|||
entryTag = directoryEntry:sub( 1, 3 ) -- 245 |
|||
|eng = inglês |
|||
entryDataLength = directoryEntry:sub( 4, 7 ) -- 0081 |
|||
|spa = espanhol |
|||
entryInitPosition = directoryEntry:sub( 8, 12 ) -- 00177 |
|||
|ger = alemão |
|||
-- cria uma tabela com os dados... |
|||
|fre = francês |
|||
dataField = { |
|||
tag = entryTag, |
|||
length = entryDataLength, |
|||
|esp|ing|fra|pt|en|es = <strong class="error">código inválido para o idioma do subcampo $h do campo 041</strong> |
|||
initPosition = entryInitPosition |
|||
|#default = {{Select|041|h}} |
|||
} |
} |
||
-- e insere cada tabela dataField na tabela dataFields |
|||
}} {{#if: {{Exist|020}} | <!-- testa se existe(m) ISBN(s) inválido(s) --> {{#iferror: {{Print ISBN}} | * <strong class="error">ISBN inválido, por favor, reveja os números informados.</strong>|}} <!-- testa se existe(m) hifen(s) ou x minúsculo no ISBN --> {{#switch: {{#regex:{{#show:{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#020|?Field data#|headers=hide|mainlabel=-}}|/-{{!}}x/}} |
|||
table.insert( dataFields, dataField ) |
|||
|- = * <strong class="error">O ISBN não pode conter hifens. Apenas números e "X" maiúsculo.</strong> |
|||
-- esvazia o diretório de 12 em 12 |
|||
|x = * <strong class="error">O ISBN não pode conter um x minúsculo. Apenas números e "X" maiúsculo.</strong> |
|||
directory = directory:sub( 13 ) |
|||
|#default =}} <!-- testa se há indicadores no campo 020 --> {{#ifeq: {{Field data string|020|0|1|}} | # || * <strong class="error">O primeiro indicador do campo 020 foi preenchido, porém, ele não deve ser preenchido.</strong>}} {{#ifeq: {{Field data string|020|1|1|}} | # || * <strong class="error">O segundo indicador do campo 020 foi preenchido, porém, ele não deve ser preenchido.</strong>}} }} <!-- testa o uso de maiúsculas no campo 041 --> {{#if: {{Exist|041}} | {{#ifeq: {{Field data string|041|0|1|}} | # | * <strong class="error">Talvez o primeiro indicador do campo 041 foi esquecido.</strong>}} {{#if: {{#regex:{{Select|041|a}}|/^[A-Z]/r|}} | * <strong class="error">O uso de maiúsculas não é permitido nos códigos de idioma (campo 041).</strong>}} }} <!-- a seguir, testa se há subcampo $b e se há espaço no subcampo $c do campo 090 --> {{#if: {{Exist|090}} | {{#if: {{Select|090|b}} || * <strong class="error">Está faltando o subcampo $b do campo 090 (notação de Cutter).</strong>}} <!-- a seguir, testa se não foi esquecida a letra do tíulo na notação de Cutter, caso haja um ponto de acesso 1XX --> {{#ifexpr: {{#ask:[[{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#100||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#110||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#111||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#130]]|?Field data|format=count|mainlabel=-}} >= 1 | {{#if: {{#regex:{{Select|090|b}}|/[0-9]$/r|}}| * <strong class="error">Falta a letra do título na notação de Cutter.</strong>}} }} {{#if: {{#regex:{{Select|090|c}}|/\sed/r|}} | * <strong class="error">Nossa política de catalogação proíbe espaços na indicação de edição no número de chamada (090 $c).</strong>}} }} <!-- a seguir, testa (conta) se existe mais de um ponto de acesso principal --> {{#ifexpr: {{#ask:[[{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#100||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#110||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#111||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#130]]|?Field data|format=count|mainlabel=-}} > 1 | * <strong class="error">Foi registrado '''mais de um ponto de acesso principal'''. Isso não é permitido.</strong>}} <!-- fim do teste de contagem de pontos de acesso principais --> {{#if: {{Exist|100}} | * O ponto de acesso principal foi dado a uma '''pessoa'''{{#switch:{{Field data string|100|0|1|}} |
|||
end |
|||
|0 =  e a entrada começa pelo seu '''primeiro nome'''. |
|||
-- para cada item da tabela dataFields... |
|||
|1 =  e a entrada começa pelo seu '''sobrenome'''. |
|||
for index, dataField in ipairs( dataFields ) |
|||
|3 =  e a entrada começa pelo seu '''nome de família'''. |
|||
do |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
-- configura as variáveis para uso na função string.sub( i, j ) |
|||
|2|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
-- (+1 porque em Lua se começa do 1, não do 0) |
|||
}}{{#ifeq: {{Field data string|100|1|1|}} | # || |
|||
local i = dataFields[index].initPosition + 1 |
|||
* <strong class="error">O segundo indicador do campo 100 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
-- (-1 para não pegar RS) |
|||
}} <!-- testa se existe "," no subcampo $a (Nome, Sobrenome) --> {{#if: {{#regex:{{Select|100|a}}|/.*?,./r|}} || * <strong class="error">Em pontos de acesso, o nome pessoal deve ser invertido (Nome, Sobrenome). Verifique o campo 100.</strong> |
|||
local j = dataFields[index].initPosition + dataFields[index].length - 1 |
|||
}} {{#if: {{#regex:{{Select|100|a}}|/[a-zÀ-ü],[A-ZÀ-ü]/r|}} |* <strong class="error">Falta espaço após a vírgula. Verifique o campo 100.</strong>}} {{#if: {{Select|100|q}} | {{#if: {{#regex:{{Select|100|q}}|/^\(/r|}} || * <strong class="error">O subcampo $q do campo 100 necessita de parênteses.</strong>}} }} {{#if: {{Select|100|d}} | {{#if: {{#regex:{{Field data string|100|2|}}|/\$d \d\d\d\d$/r|}} |* <strong class="error">O subcampo $d do campo 100 necessita de hífen.</strong>}} }} |
|||
-- localiza o dado em dataValuesGroup, normaliza o dado |
|||
}}{{#if: {{Exist|110}} | |
|||
-- e armazena na tabela |
|||
* O ponto de acesso principal foi dado a uma '''entidade coletiva'''{{#switch:{{Field data string|110|0|1|}} |
|||
dataFields[index].data = normalizeData( dataValuesGroup:sub( i, j ) ) |
|||
|0 =  e a entrada começa por um '''nome invertido'''. |
|||
-- armazena os campos de controle (00X) para posterior decomposição |
|||
|1 =  e a entrada começa por um '''nome de jurisdição'''. |
|||
if dataFields[index].tag == '006' |
|||
|2 =  e a entrada começa por um '''nome em ordem direta'''. |
|||
then |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
controlField006 = dataFields[index].data:gsub( '[|#$]', ' ' ) |
|||
|3|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
end |
|||
if dataFields[index].tag == '007' |
|||
{{#ifeq: {{Field data string|110|1|1|}} | # || |
|||
then |
|||
* <strong class="error">O segundo indicador do campo 110 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
controlField007 = dataFields[index].data:gsub( '[|#$\r]', ' ' ) |
|||
}} |
|||
end |
|||
}}{{#if: {{Exist|111}} | |
|||
if dataFields[index].tag == '008' |
|||
* O ponto de acesso principal foi dado a um '''evento'''{{#switch:{{Field data string|111|0|1|}} |
|||
then |
|||
|0 =, a entrada começa por um '''nome invertido'''. |
|||
controlField008 = dataFields[index].data:gsub( '[|#$-]', ' ' ) |
|||
|1 =, a entrada começa por um '''nome de jurisdição'''. |
|||
end |
|||
|2 =, a entrada começa por um '''nome em ordem direta'''. |
|||
end |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
else |
|||
|3|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
-- == MARC tags handler == -- |
|||
}} |
|||
record = record |
|||
{{#ifeq: {{Field data string|111|1|1|}} | # || |
|||
:gsub( ' ', ' ' ) -- LC bib handling (\t+\s) |
|||
* <strong class="error">O segundo indicador do campo 111 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
:gsub( ' ', ' ' ) -- LC aut handling (\t) |
|||
}} |
|||
:gsub( ' ', ' ' ) -- Pergamum handling (control fields) (non-breaking space) |
|||
}}{{#if: {{Exist|130}} | |
|||
:gsub( ' ', ' ' ) -- Pergamum handling (data fields) (non-breaking space) |
|||
* O ponto de acesso principal foi dado a um '''título uniforme'''. |
|||
record = record .. '\n' |
|||
{{#ifeq: {{Field data string|130|1|1|}} | # || |
|||
if record:match( '^FMT' ) or record:match( '^LDR' ) -- Aleph handling |
|||
* <strong class="error">O segundo indicador do campo 130 foi preenchido, ele não deve ser preenchido.</strong>}} <!-- a seguir, testa se existe um ponto de acesso principal. Se existir, testa se o primeiro indicador do campo 245 condiz com essa realidade --> |
|||
then |
|||
}}{{#ifexpr: {{#ask:[[{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#100||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#110||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#111||{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}#130]]|?Field data|format=count|mainlabel=-}} = 0 | {{#ifeq: {{Field data string|245|0|1|}} | 1 | |
|||
record = record:gsub( '\t', ' ' ) -- 1 |
|||
* <strong class="error">Não houve um ponto de acesso principal nos campos 1XX, desse modo, o primeiro indicador do campo 245 deve ter o valor "0".</strong>}} | {{#ifeq: {{Field data string|245|0|1|}} | 0 | |
|||
:gsub( '^(FMT%s[A-Z].-\n)', '' ) -- 2 |
|||
* <strong class="error">Houve um ponto de acesso principal nos campos 1XX, desse modo, o primeiro indicador do campo 245 deve ter o valor "1".</strong>}} <!-- a seguir, testa a relação entre a presença do campo 240 em relação a presença do campo 041 e a presença do subcampo $l --> |
|||
:gsub( 'LDR%s([0%s][0%s][0%s][0%s][0%s].-\n)', '000 %1' ) -- 3 |
|||
}} {{#if: {{Exist|240}} | {{#if: {{Exist|041}} || * <strong class="error">Normalmente, quando há um campo 240, deve haver um campo 041.</strong>}}{{#if: {{Select|240|l}} | {{#if: {{#regex:{{Select|240|l}}|/^[a-zA-Z]{3}$/|}} || * <strong class="error">É necessário informar o idioma por extenso ($l do campo 240) antecedido por um ponto no subcampo $a.</strong>}} {{#if: {{#regex:{{Field data string|240||}}|/\.\s?\$l/r|}} || * <strong class="error">O subcampo $l do campo 240 necessita ser antecedido por um ponto no subcampo anterior.</strong>}} | * <strong class="error">Normalmente, quando há um campo 240 $a, deve haver também um 240 $l. 240 $l não foi detectado.</strong>}} {{#switch: {{Field data string|240|0|1}} |
|||
:gsub( '\n(%d%d%d)%s(%$.%s)', '\n%1 %2' ) -- 4 |
|||
|0 = * O título uniforme não será exibido. |
|||
:gsub( '\n(%d%d%d)(%d)', '\n%1 %2' ) -- 5 |
|||
|1 = * O título uniforme será exibido. |
|||
:gsub( '\n(%d%d%d%s%d%s)', '\n%1 ' ) -- 6 (manter essa ordem) |
|||
|# = * <strong class="error">Está faltando o primeiro indicador do campo 240.</strong> |
|||
end |
|||
|2|3|4|5|6|7|8|9 = * <strong class="error">O primeiro indicador do campo 240 foi preenchido incorretamente.</strong> |
|||
-- configuração das variáveis básicas do registro (via MARC tags): |
|||
}}{{#ifeq: {{Field data string|240|1|1}} | # | |
|||
-- obtém o líder |
|||
* <strong class="error">Está faltando o segundo indicador do campo 240.</strong> | |
|||
leader = record:match( '^000%s([%d%s][%d%s][%d%s][%d%s][%d%s].-)\n' ) or '' |
|||
* O título uniforme será alfabetado como "'''{{ucfirst:{{#regex:{{#sub:{{Select|240|a}}|{{Field data string|240|1|1}}}}|/[\/:=.]$/|}}}}'''". |
|||
leader = leader:gsub( '[|#$]', ' ' ) |
|||
}}}} <!-- a seguir, informa se o título receberá o ponto de acesso principal ou secundário --> {{#switch: {{Field data string|245|0|1|}} |
|||
-- obtém os campos de controle |
|||
|0 = * O título recebeu o '''ponto de acesso principal'''. |
|||
controlField003 = record:match( '\n003%s(.-)\n' ) or '' |
|||
|1 = * O título recebeu um '''ponto de acesso secundário'''. |
|||
controlField006 = record:match( '\n006%s([a-z].-)\n' ) or '' |
|||
|# = * <strong class="error">Está faltando o primeiro indicador do campo 245.</strong> |
|||
controlField006 = controlField006:gsub( '[|#$]', ' ' ) |
|||
|2|3|4|5|6|7|8|9 = * <strong class="error">O primeiro indicador do campo 245 foi preenchido incorretamente.</strong> |
|||
controlField007 = record:match( '\n007%s([a-z].-)\n' ) or '' |
|||
}} <!-- a seguir, testa se foi preenchido o segundo indicador do 245, se foi, mostra como será a alfabetação, removendo a pontuação final do subcampo $a ("/",":","="" ou ".") --> {{#ifeq: {{Field data string|245|1|1|}} | # | |
|||
controlField007 = controlField007:gsub( '[|#$\r]', ' ' ) |
|||
* <strong class="error">Está faltando o segundo indicador do campo 245.</strong> | |
|||
controlField008 = record:match( '008%s([%d%s][%d%s][%d%s][%d%s][%d%s][%d%s].-)\n' ) or '' |
|||
* O título será alfabetado como "'''{{ucfirst:{{#regex:{{#sub:{{Select|245|a}}|{{Field data string|245|1|1|}}}}|/\s?[\/:=.]$/|}}}}'''". <!-- a seguir, testa se existe espaço antes da pontuação "/", ":" e "=" no final do subcampo $a e $b --> |
|||
controlField008 = controlField008:gsub( '[|#$-]', ' ' ) |
|||
}}{{#if: {{#regex:{{Select|245|a}}|/[a-zA-Z][\/:=]$/r|}} | * <strong class="error">Inclua um espaço antes da pontuação (ao final do subcampo $a do campo 245).</strong> |
|||
-- para cada linha do registro, identifica o campo e seu conteúdo |
|||
}}{{#if: {{Select|245|b}} | {{#if: {{#regex:{{Select|245|b}}|/[a-zA-Z][\/:=]$/r|}} | * <strong class="error">Inclua um espaço antes da pontuação (ao final do subcampo $b do campo 245).</strong> |
|||
-- (o conteúdo inclui os indicadores) |
|||
}} <!-- a seguir, testa se o subcampo $b começa com letras maiúsculas --> {{#if: {{#regex:{{Select|245|b}}|/^[A-Z]/r|}} | * <strong class="error">Normalmente, o início de um subtítulo (245 $b) começa com letras minúsculas.</strong>|}} <!-- testa se existe mais de um subcampo $b no 245 --> {{#if: {{#regex:{{Field data string|245|||}}|/\$b.*\$b/r|}} |* <strong class="error">Há mais de um subcampo $b no campo 245. O subcampo $b não é repetível.</strong>}} }} <!-- a seguir, testa se o subcampo $c está presente --> {{#if: {{Select|245|c}} | <!-- a seguir, testa se existe espaço antes do ponto e vírgula na indicação de responsabilidade, subcampo $c do 245 --> {{#if: {{#regex:{{Select|245|c}}|/[a-zA-Z.];/r|}} | * <strong class="error">Inclua um espaço antes do ponto e vírgula (subcampo $c do campo 245).</strong>}} <!-- a seguir, testa se existe "/" antes do subcampo $c do campo 245 --> {{#if: {{#regex:{{Field data string|245||}}|/[a-zA-Z]\s?\$c/r|}} | * <strong class="error">É necessária a pontuação que precede a indicação de responsabilidade (" / ") no campo 245.</strong>}} <!-- a seguir, testa se há ": $c" --> {{#if: {{#regex:{{Field data string|245||}}|/:\s?\$c/r|}} | * <strong class="error">Ou o subtítulo foi colocado no subcampo $c, ou a pontuação que precede a indicação de responsabilidade (" / ") não foi informada corretamente (campo 245).</strong>}} <!-- a seguir, testa se o subcampo $c termina em "-" --> {{#if: {{#regex:{{Field data string|245||}}|/-␞/r|}} | * <strong class="error">Nunca inclua hifens de separação de áreas do AACR2 em registros MARC 21. Reveja a pontuação (campo 245).</strong>}} <!-- testa se existe mais de um subcampo $c no 245 --> {{#if: {{#regex:{{Field data string|245|||}}|/\$c.*\$c/r|}} |* <strong class="error">Há mais de um subcampo $c no campo 245. O subcampo $c não é repetível.</strong>}} <!-- a seguir, testa se existe mais de 3 vírgulas no campo 245 $c --> {{#if: {{#regex:{{Select|245|c}}|/([A-Za-zÀ-ü ]*,){3}/r|}} | * <strong class="error">Parece haver mais de 3 pessoas na indicação de responsabilidade (245 $c), use " ... [et al.]".</strong>}} <!-- a seguir, testa se existe a sintaxe "*...[et. " --> {{#if: {{#regex:{{Select|245|c}}|/[a-zA-ZÀ-ü]\.\.\.\[et.?\s/r|}} | * <strong class="error">No campo 245, o espaçamento correto é " ... [et al.]".</strong>}} | * <strong class="error">Está faltando o subcampo $c do campo 245.</strong>}} <!-- a seguir, testa se existe espaço antes de "ed." (subcampo $a do 250) --> {{#if: {{Exist|250}} | {{#if: {{#regex:{{Select|250|a}}|/\d\.?ed\./}} | * <strong class="error">Inclua um espaço antes da indicação "ed." (subcampo $a do campo 250).</strong>}} }} <!-- a seguir, testa se existe 260, se existir, verifica a pontuação final dos subcampos $a, $b e $c do campo 260 --> {{#if: {{Exist|260}} | {{#if: {{Select|260|a}} | {{#if: {{#regex:{{Select|260|a}}|/[a-zA-ZÀ-ü\],]\s?$/}} | * <strong class="error">Normalmente, o final do subcampo $a do campo 260 requer a seguinte pontuação " : ".</strong>}} | * <strong class="error">Está faltando o subcampo $a do campo 260.</strong>}} {{#if: {{Select|260|b}} | {{#if: {{#regex:{{Select|260|b}}|/[a-zA-Z.]$/r|}} | * <strong class="error">Normalmente, o final do subcampo $b do campo 260 requer uma das seguintes pontuações ", " ou " : ". Reveja a pontuação.</strong>}} | * <strong class="error">Está faltando o subcampo $b do campo 260.</strong>}} {{#if: {{Select|260|c}} | <!-- a seguir, testa se o subcampo $c é precedido ou não por "," --> {{#if: {{#regex:{{Field data string|260||}}|/[a-zA-ZÀ-ü\]][;:]\s?\$c/r}} | * <strong class="error">O ano de publicação deve sempre ser precedido de uma vírgula. Reveja a pontuação (campo 260).</strong>}} {{#if: {{#regex:{{Select|260|c}}|/[a-zA-ZÀ-ü0-9\]]$/r|}} | * <strong class="error">Nossa política de catalogação define que o subcampo $c do campo 260 deve terminar com um ponto.</strong>}} | * <strong class="error">Está faltando o subcampo $c do campo 260.</strong>}} }} <!-- a seguir, testa se existe espaço entre o número a a indicaçação de extensão do texto --> {{#if: {{Exist|300}} | {{#if: {{Select|300|a}} | {{#if: {{#regex:{{Select|300|a}}|/\d[a-z]\./}} | * <strong class="error">Inclua um espaço entre o número e a indicação "p.", "f." ou "v." (subcampo $a do campo 300).</strong>}} <!-- a seguir, testa se existe espaço entre "p." e ";" --> {{#if: {{#regex:{{Select|300|a}}|/\.[:;]/r}} | * <strong class="error">Inclua um espaço entre a indicação "p.", "f." ou "v." e a pontuação final (subcampo $a do campo 300).</strong>}} <!-- a seguir, testa se existe "il." no subcampo $a (deve estar no subcampo $b) --> {{#if: {{#regex:{{Select|300|a}}|/il\./}} | * <strong class="error">Ilustrações e outros detalhes físicos devem ir no subcampo $b do campo 300, antecedidos de " : ".</strong>}} }} <!-- a seguir, testa se existe ".;" no subcampo $b do campo 300 --> {{#if: {{Select|300|b}} | {{#if: {{#regex:{{Select|300|b}}|/\.;/r}} | * <strong class="error">Inclua um espaço entre o ponto e o ponto e vírgula (campo 300, subcampo $b).</strong>}} {{#if: {{#regex:{{Select|300|b}}|/il,/r}} | * <strong class="error">Falta um ponto na abreviatura para ilustrações (il.).</strong>}} }} <!-- a seguir, testa se existe o subcampo $c do campo 300 e se a sintaxe das dimensões está correta --> {{#if: {{Select|300|c}} | {{#if: {{#regex:{{Select|300|c}}|/\d[a-z]/r}} | * <strong class="error">Atenção, a sintaxe correta para a dimensão é: NN cm ou, menos frequentemente, NN x NN cm (subcampo $c do campo 300).</strong>}} | * <strong class="error">Não foi detectado um subcampo $c no campo 300.</strong>}} <!-- a seguir, testa se a pontuação antes da dimensão é ".", "," ou ":" --> {{#if: {{#regex:{{Field data string|300||}}|/[.,:]\s?\$c/r}} | * <strong class="error">A pontuação que precede a dimensão (300 $c) deve ser " ; ".</strong>}} <!-- a seguir, testa se o subcampo $c termina em "-" --> {{#if: {{#regex:{{Field data string|300||}}|/-␞/r|}} | * <strong class="error">Nunca inclua hifens de separação de áreas do AACR2 em registros MARC 21. Reveja a pontuação (campo 300).</strong>}} }} <!-- a seguir, testa se existem indicadores, parênteses no subcampo $a do campo 490 e se existe ";" antes da numeração da série --> {{#if: {{Exist|490}} | {{#ifeq: {{Field data string|490|1|1|}} | # || |
|||
for tagMatch, dataMatch in record:gmatch( |
|||
* <strong class="error">O segundo indicador do campo 490 foi preenchido, porém, ele não deve ser preenchido.</strong>}} {{#if: {{#regex:{{Select|490|a}}|/^\(/r|}} | * <strong class="error">Segundo as orientações do MARC 21, não inclua os parênteses no campo 490 ou 830.</strong>}} {{#if: {{Select|490|v}} | {{#if: {{#regex:{{Field data string|490||}}|/;\s?\$v/r}} || * <strong class="error">É necessária a pontuação que precede a numeração da série (490, $v).</strong>}} }} <!-- a seguir, testa a consistência entre o indicador do 490 e a presença do campo 830 --> |
|||
'([0-8]%d%d) ([0-9_%s][0-9_%s] [$|].-)\n' ) |
|||
{{#ifeq: {{Field data string|490|0|1|}} | # | * <strong class="error">Está faltando o primeiro indicador do campo 490.</strong> | |
|||
do |
|||
{{#ifeq: {{Field data string|490|0|1|}} | 1 | |
|||
-- transforma o dado para o formato igual ao manipulado pelo |
|||
{{#if: {{Exist|830}} || * <strong class="error">Foi especificado um ponto de acesso secundário para a série (490, primeiro indicador com valor 1), porém, um campo 830 não foi informado.</strong>}} |
|||
-- MARC ISO 2709 handler |
|||
}}{{#ifeq: {{Field data string|490|0|1|}} | 0 | |
|||
dataMatch = dataMatch:gsub( '%s?|(.)%s', '|%1' ) |
|||
{{#if: {{Exist|830}} | * <strong class="error">O primeiro indicador do campo 490 indica que não foi gerado um ponto de acesso para a série, porém, um campo 830 foi informado.</strong>}} |
|||
-- normaliza o dado |
|||
}} |
|||
dataMatch = normalizeData(dataMatch) |
|||
}} |
|||
}} <!-- a seguir, testa se a nota 500 acaba com "." --> {{#if: {{Exist|500}} | {{#if: {{#regex:{{Select|500|a}}|/[a-zA-ZÀ-ü0-9:;-]$/r|}} | * <strong class="error">Nossa política de catalogação define que as notas devem terminar com um ponto.</strong>}} }} <!-- a seguir, testa se a nota 504 acaba com "." e se existe uso de maiúsculas no meio da nota --> {{#if: {{Exist|504}} | {{#if: {{#regex:{{Select|504|a}}|/[a-zA-ZÀ-ü0-9]$/r|}} | * <strong class="error">Nossa política de catalogação define que as notas devem terminar com um ponto.</strong>}} {{#if: {{#regex:{{Select|504|a}}|/.*\s[A-Z]/r|}} | * <strong class="error">Verifique o uso de maiúsculas na nota do campo 504.</strong>}} }} <!-- a seguir, testa os indicadores dos campos 6XX --> {{#if: {{Exist|600}} | {{#ifeq: {{Field data string|600|0|1|}} | # | * <strong class="error">Está faltando o primeiro indicador do campo 600.</strong>}} {{#ifeq: {{Field data string|600|1|1|}} | 4 || * <strong class="error">Nossa política de catalogação define que o segundo indicador do campo 600 deve ser sempre "4".</strong>}} <!-- testa se existe "," no subcampo $a (Nome, Sobrenome) --> {{#if: {{#regex:{{Select|600|a}}|/.*,./r|}} || * <strong class="error">Em pontos de acesso, o nome pessoal deve ser invertido (Nome, Sobrenome). Verifique o campo 600.</strong>}} {{#if: {{#regex:{{Select|600|a}}|/[a-zÀ-ü],[A-ZÀ-ü]/r|}} |* <strong class="error">Falta espaço após a vírgula. Verifique o campo 600.</strong>}} {{#if: {{Select|600|q}} | {{#if: {{#regex:{{Select|600|q}}|/^\(/r|}} || * <strong class="error">O subcampo $q do campo 600 necessita de parênteses.</strong>}} }} }} {{#if: {{Exist|610}} | {{#ifeq: {{Field data string|610|0|1|}} | # | * <strong class="error">Está faltando o primeiro indicador do campo 610.</strong>}} {{#ifeq: {{Field data string|610|1|1|}} | 4 || * <strong class="error">Nossa política de catalogação define que o segundo indicador do campo 610 deve ser sempre "4".</strong>}} }} {{#if: {{Exist|611}} | {{#ifeq: {{Field data string|611|1|1|}} | 4 || * <strong class="error">Nossa política de catalogação define que o segundo indicador do campo 611 deve ser sempre "4".</strong>}} }} {{#if: {{Exist|650}} | {{#ifeq: {{Field data string|650|0|1|}} | 0 || * <strong class="error">Nossa política de catalogação define que o primeiro indicador do campo 650 deve ser sempre "0".</strong>}} {{#ifeq: {{Field data string|650|1|1|}} | 4 || * <strong class="error">Nossa política de catalogação define que o segundo indicador do campo 650 deve ser sempre "4".</strong>}} <!-- a seguir, testa se os assuntos começam com letra minúscula --> {{#if: {{#regex:{{Field data string|650||}}|/\$[axzy][a-zà-ü]/r|}} | * <strong class="error">Os assuntos principais e suas subdivisões devem começar com letra maiúscula.</strong>}} <!-- a seguir, testa se um subcampo termina em "-" --> {{#if: {{#regex:{{Field data string|650||}}|/-\s?\$/r|}} | * <strong class="error">Nunca inclua hifens entre termos de assuntos.</strong>}} }} {{#if: {{Exist|651}} | {{#ifeq: {{Field data string|651|0|1|}} | # || * <strong class="error">Nossa política de catalogação define que o primeiro indicador do campo 651 deve ser sempre " ".</strong>}} {{#ifeq: {{Field data string|651|1|1|}} | 4 || * <strong class="error">Nossa política de catalogação define que o segundo indicador do campo 651 deve ser sempre "4".</strong>}} }} <!-- a seguir, testa os pontos de acesso secundários, tal como os principais --> {{#if: {{Exist|700}} | |
|||
-- cria uma tabela com os dados... |
|||
* Um ponto de acesso secundário foi dado a uma '''pessoa'''{{#switch:{{Field data string|700|0|1|}} |
|||
dataField = { |
|||
|0 =  e a entrada começa pelo seu '''primeiro nome'''. |
|||
tag = tagMatch, |
|||
|1 =  e a entrada começa pelo seu '''sobrenome'''. |
|||
data = dataMatch |
|||
|3 =  e a entrada começa pelo seu '''nome de família'''. |
|||
} |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
-- e insere cada tabela dataField na tabela dataFields |
|||
|2|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
table.insert( dataFields, dataField ) |
|||
|#default =. |
|||
end |
|||
}}{{#ifeq: {{Field data string|700|1|1|}} | # || |
|||
end |
|||
* <strong class="error">O segundo indicador do campo 700 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
-- == Handler unificado == -- |
|||
}} <!-- testa se existe mais de um subcampo $a no mesmo campo 700 --> {{#ifeq: {{Exist|700}} | yes | {{#if: {{#regex:{{Field data string|700|||}}|/\$a.*\$a.*?$/r|}} |* <strong class="error">Há mais de um subcampo $a no campo 700. O subcampo $a não é repetível.</strong>}} }} <!-- testa se existe "," no subcampo $a (Nome, Sobrenome) --> {{#if: {{#regex:{{Select|700|a}}|/.*,./r|}} || * <strong class="error">Em pontos de acesso, o nome pessoal deve ser invertido (Nome, Sobrenome). Verifique o campo 700.</strong> |
|||
if leader:sub( 7, 7 ) == 'z' and controlField003 == 'Br' |
|||
}} {{#if: {{#regex:{{Select|700|a}}|/[a-zÀ-ü],[A-ZÀ-ü]/r|}} |* <strong class="error">Falta espaço após a vírgula. Verifique o campo 700.</strong>}} {{#if: {{Select|700|q}} | {{#if: {{#regex:{{Select|700|q}}|/^\(/r|}} || * <strong class="error">O subcampo $q do campo 700 necessita de parênteses.</strong>}} }} |
|||
then |
|||
}}{{#if: {{Exist|710}} | |
|||
-- cria uma tabela com os dados... |
|||
* Um ponto de acesso secundário foi dado a uma '''entidade coletiva'''{{#switch:{{Field data string|710|0|1|}} |
|||
dataField = { |
|||
|0 =  e a entrada começa por um '''nome invertido'''. |
|||
tag = '670', |
|||
|1 =  e a entrada começa por um '''nome de jurisdição'''. |
|||
data = '## $a CA-BN ' .. os.date( '%Y' ) |
|||
} |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
-- e insere a tabela dataField na tabela dataFields |
|||
|3|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
table.insert( dataFields, dataField ) |
|||
|#default =. |
|||
end |
|||
}} |
|||
-- função de ordenação dos campos |
|||
{{#ifeq: {{Field data string|710|1|1|}} | # || |
|||
local function sortByTag ( a, b ) |
|||
* <strong class="error">O segundo indicador do campo 710 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
if ( a.tag < b.tag ) |
|||
}} |
|||
then |
|||
}}{{#if: {{Exist|711}} | |
|||
return true |
|||
* Um ponto de acesso secundário foi dado a um '''evento'''{{#switch:{{Field data string|711|0|1|}} |
|||
elseif ( a.tag > b.tag ) |
|||
|0 =, a entrada começa por um '''nome invertido'''. |
|||
then |
|||
|1 =, a entrada começa por um '''nome de jurisdição'''. |
|||
return false |
|||
|2 =, a entrada começa por um '''nome em ordem direta'''. |
|||
else |
|||
|# =, porém, <strong class="error">o primeiro indicador não foi preenchido.</strong> |
|||
return a.originalOrder < b.originalOrder |
|||
|3|4|5|6|7|8|9 =, porém, <strong class="error">o primeiro indicador foi preenchido incorretamente.</strong> |
|||
end |
|||
|#default =. |
|||
end |
|||
}}{{#ifeq: {{Field data string|711|1|1|}} | # || |
|||
-- para cada item da tabela dataFields... |
|||
* <strong class="error">O segundo indicador do campo 711 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
for index, dataField in ipairs( dataFields ) |
|||
}} <!-- a seguir, testa os indicadores do campo 830 --> |
|||
do |
|||
}}{{#if: {{Exist|830}} | {{#ifeq: {{Field data string|830|0|1|}} | # || |
|||
-- verifica se a tag é a 040 |
|||
* <strong class="error">O primeiro indicador do campo 830 foi preenchido, porém, ele não deve ser preenchido.</strong> |
|||
if dataFields[index].tag == '040' |
|||
}}{{#ifeq: {{Field data string|830|1|1|}} | # | |
|||
-- se for, adiciona o subcampo para a agência modificadora do registro |
|||
* <strong class="error">O segundo indicador do campo 830 precisa ser preenchido.</strong>}} {{#if: {{Select|830|v}} | {{#if: {{#regex:{{Field data string|830||}}|/;\s?\$v/r}} || * <strong class="error">É necessária a pontuação que precede a numeração da série (830, $v).</strong>}} }} |
|||
-- e marca como verdadeiro a presença deste campo |
|||
}}{{#if: {{Exist|856}} | {{#ifeq: {{Field data string|856|0|1|}} | 4 || * <strong class="error">O primeiro indicador do campo 856 precisa ter o valor "4".</strong>}} {{#if: {{Select|856|a}} | * <strong class="error">Normalmente, o subcampo utilizado no 856 é o $u, não o $a.</strong>}} |
|||
then |
|||
}} <!-- a seguir, testa por inteiro o registro de modo a acusar: "," ou o "." precedido de espaço; designadores de subcampos errados --> {{#if: {{#regex:{{#ask:[[-Has subobject::{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}]][[Datafield::+]]|?Field data|format=plainlist|link=none|headers=hide|mainlabel=-|outro=|sep=|valuesep=|propsep=}}|/\s[.,][^.]/r|}} | * <strong class="error">Pontos finais ou vírgulas nunca devem ser precedidos por um espaço.</strong>}} {{#if: {{#regex:{{#ask:[[-Has subobject::{{{1|{{#urldecode:{{#urlget:fullpagename|{{FULLPAGENAME}}}}}}}}}]][[Datafield::+]]|?Field data|format=plainlist|link=none|headers=hide|mainlabel=-|outro=|sep=|valuesep=|propsep=}}|/\$[A-Z]/r|}} | * <strong class="error">Não são permitidos designadores de subcampos com letras maiúsculas.</strong>}} |
|||
dataFields[index].data = dataFields[index].data .. ' $d BR-FlWIK' |
|||
}}{{DISPLAYTITLE:Validar catalogação}} |
|||
tag040 = dataFields[index].data |
|||
end |
|||
-- verifica se a tag é uma das seguintes |
|||
if dataFields[index].tag == '092' or dataFields[index].tag == '595' |
|||
then |
|||
-- se for, exclua da tabela dataFields |
|||
table.remove( dataFields, index ) |
|||
end |
|||
end |
|||
-- se não há campo 040, então será criado agora |
|||
if tag040 == '' |
|||
then |
|||
-- cria uma tabela com os dados... |
|||
dataField = { |
|||
tag = '040', |
|||
data = '## $a BR-FlWIK $b por $c BR-FlWIK' |
|||
} |
|||
-- e insere a tabela dataField na tabela dataFields |
|||
table.insert( dataFields, dataField ) |
|||
end |
|||
if leader:sub( 7, 7 ) == 'z' and tag040:match( 'a DLC' ) |
|||
then |
|||
-- cria uma tabela com os dados... |
|||
dataField = { |
|||
tag = '670', |
|||
data = '## $a CA-LC ' .. os.date( '%Y' ) |
|||
} |
|||
-- e insere a tabela dataField na tabela dataFields |
|||
table.insert( dataFields, dataField ) |
|||
end |
|||
for index, dataField in ipairs( dataFields ) |
|||
do |
|||
-- guarda a ordem original do campo para posterior inclusão de outros |
|||
-- campos (mantendo a ordem original) |
|||
dataFields[index].originalOrder = index |
|||
end |
|||
-- ordena os campos do registro |
|||
table.sort( dataFields, sortByTag ) |
|||
for index, dataField in ipairs( dataFields ) |
|||
do |
|||
-- se os campos forem maior que 009, então gerarão indicadores |
|||
if tonumber( dataFields[index].tag ) > 9 |
|||
then |
|||
dataFields[index].ind1 = |
|||
dataFields[index].data:sub( 1, 1 ):gsub( '[ _]', '#' ) |
|||
dataFields[index].ind2 = |
|||
dataFields[index].data:sub( 2, 2 ):gsub( '[ _]', '#' ) |
|||
end |
|||
-- se, também, os campos estiverem entre 010 e 830 (com exceção para 856), |
|||
-- criará a query string do link para o formulário e a sintaxe da |
|||
-- Predefinição Field |
|||
if |
|||
tonumber( dataFields[index].tag ) == 10 or |
|||
tonumber( dataFields[index].tag ) > 12 and |
|||
tonumber( dataFields[index].tag ) < 831 or |
|||
tonumber( dataFields[index].tag ) == 856 |
|||
then |
|||
-- query string maker (part 2), Predefinição Field |
|||
fieldQueryString = fieldQueryString .. |
|||
'&Field[' .. index .. '][tag]=' .. dataField.tag .. |
|||
'&Field[' .. index .. '][ind1]=' .. dataField.ind1 .. |
|||
'&Field[' .. index .. '][ind2]=' .. dataField.ind2 .. |
|||
'&Field[' .. index .. '][data]=' .. mw.uri.encode( dataField.data:sub( 4 ) ) |
|||
-- template string maker (part 2), Predefinição Field |
|||
fieldTemplates = fieldTemplates .. '{{Field' .. |
|||
'\n|tag=' .. dataField.tag .. |
|||
'\n|ind1=' .. dataField.ind1 .. |
|||
'\n|ind2=' .. dataField.ind2 .. |
|||
'\n|data=' .. dataField.data:sub( 4 ) .. |
|||
'\n}}\n' |
|||
end |
|||
end |
|||
if frame.args[1] == 'bib' or frame.args[1] == '' |
|||
then |
|||
-- inicializa as variáveis derivadas (registro bibliográfico) |
|||
-- líder |
|||
local recordStatus = leader:sub( 6, 6 ) |
|||
local typeOfRecord = leader:sub( 7, 7 ) |
|||
local bibliographicLevel = leader:sub( 8, 8 ) |
|||
local encodingLevel = leader:sub( 18, 18 ) |
|||
if encodingLevel == ' ' |
|||
then |
|||
encodingLevel = '' |
|||
end |
|||
local descriptiveCatalogingForm = leader:sub( 19, 19 ) |
|||
if descriptiveCatalogingForm == ' ' |
|||
then |
|||
descriptiveCatalogingForm = '' |
|||
end |
|||
local multipartResourceRecordLevel = leader:sub( 20, 20 ) |
|||
if multipartResourceRecordLevel == ' ' |
|||
then |
|||
multipartResourceRecordLevel = '' |
|||
end |
|||
-- control field 008 |
|||
local dateEnteredOnFile = controlField008:sub( 1, 6 ) |
|||
local typeOfDate = controlField008:sub( 7, 7 ) |
|||
local date1 = controlField008:sub( 8, 11 ) |
|||
local date2 = controlField008:sub( 12, 15 ) |
|||
local placeOfPublication = controlField008:sub( 16, 18 ) |
|||
local illustrations = controlField008:sub( 19, 19 ) |
|||
if illustrations == ' ' |
|||
then |
|||
illustrations = '' |
|||
end |
|||
local targetAudience = controlField008:sub( 23, 23 ) |
|||
if targetAudience == ' ' |
|||
then |
|||
targetAudience = '' |
|||
end |
|||
local formOfItem = controlField008:sub( 24, 24 ) |
|||
if formOfItem == ' ' |
|||
then |
|||
formOfItem = '' |
|||
end |
|||
local natureOfContents = controlField008:sub( 25, 25 ) |
|||
if natureOfContents == ' ' |
|||
then |
|||
natureOfContents = '' |
|||
end |
|||
local governmentPublication = controlField008:sub( 29, 29 ) |
|||
if governmentPublication == ' ' or governmentPublication == '0' |
|||
then |
|||
governmentPublication = '' |
|||
end |
|||
local conferencePublication = controlField008:sub( 30, 30 ) |
|||
if conferencePublication == '0' |
|||
then |
|||
conferencePublication = '' |
|||
end |
|||
local festschrift = controlField008:sub( 31, 31 ) |
|||
if festschrift == '0' |
|||
then |
|||
festschrift = '' |
|||
end |
|||
local index = controlField008:sub( 32, 32 ) |
|||
if index == '0' or index == ' ' |
|||
then |
|||
index = '' |
|||
end |
|||
local literaryForm = controlField008:sub( 34, 34 ) |
|||
if literaryForm == '0' or literaryForm == ' ' |
|||
then |
|||
literaryForm = '' |
|||
end |
|||
local biography = controlField008:sub( 35, 35 ) |
|||
if biography == ' ' |
|||
then |
|||
biography = '' |
|||
end |
|||
local language = controlField008:sub( 36, 38 ) |
|||
local modifiedRecord = controlField008:sub( 39, 39 ) |
|||
if modifiedRecord == ' ' or modifiedRecord:match( '\r' ) |
|||
then |
|||
modifiedRecord = '' |
|||
end |
|||
local catalogingSource = controlField008:sub( 40, 40 ) |
|||
if catalogingSource == ' ' |
|||
then |
|||
catalogingSource = '' |
|||
end |
|||
-- query string maker (part 1), Predefinição BibRecord |
|||
queryString = |
|||
'BibRecord[dateEnteredOnFile]=' .. dateEnteredOnFile .. |
|||
'&BibRecord[recordStatus]=' .. recordStatus .. |
|||
'&BibRecord[typeOfRecord]=' .. typeOfRecord .. |
|||
'&BibRecord[bibliographicLevel]=' .. bibliographicLevel .. |
|||
'&BibRecord[encodingLevel]=' .. encodingLevel .. |
|||
'&BibRecord[descriptiveCatalogingForm]=' .. descriptiveCatalogingForm .. |
|||
'&BibRecord[multipartResourceRecordLevel]=' .. multipartResourceRecordLevel .. |
|||
'&BibRecord[controlField006]=' .. controlField006 .. |
|||
'&BibRecord[controlField007]=' .. controlField007 .. |
|||
'&BibRecord[typeOfDate]=' .. typeOfDate .. |
|||
'&BibRecord[date1]=' .. date1 .. |
|||
'&BibRecord[date2]=' .. date2 .. |
|||
'&BibRecord[placeOfPublication]=' .. placeOfPublication .. |
|||
'&BibRecord[illustrations]=' .. illustrations .. |
|||
'&BibRecord[targetAudience]=' .. targetAudience .. |
|||
'&BibRecord[formOfItem]=' .. formOfItem .. |
|||
'&BibRecord[natureOfContents]=' .. natureOfContents .. |
|||
'&BibRecord[governmentPublication]=' .. governmentPublication .. |
|||
'&BibRecord[conferencePublication]=' .. conferencePublication .. |
|||
'&BibRecord[festschrift]=' .. festschrift .. |
|||
'&BibRecord[index]=' .. index .. |
|||
'&BibRecord[literaryForm]=' .. literaryForm .. |
|||
'&BibRecord[biography]=' .. biography .. |
|||
'&BibRecord[language]=' .. language .. |
|||
'&BibRecord[modifiedRecord]=' .. modifiedRecord .. |
|||
'&BibRecord[catalogingSource]=' .. catalogingSource .. |
|||
fieldQueryString |
|||
-- template string maker (part 1), Predefinição BibRecord |
|||
firstTemplate = '<pre>{{BibRecord\n' .. |
|||
'|dateEnteredOnFile=' .. dateEnteredOnFile .. '\n' .. |
|||
'|recordStatus=' .. recordStatus .. '\n' .. |
|||
'|typeOfRecord=' .. typeOfRecord .. '\n' .. |
|||
'|bibliographicLevel=' .. bibliographicLevel .. '\n' .. |
|||
'|encodingLevel=' .. encodingLevel .. '\n' .. |
|||
'|descriptiveCatalogingForm=' .. descriptiveCatalogingForm .. '\n' .. |
|||
'|multipartResourceRecordLevel=' .. multipartResourceRecordLevel .. '\n' .. |
|||
'|controlField006=' .. controlField006 .. '\n' .. |
|||
'|controlField007=' .. controlField007 .. '\n' .. |
|||
'|typeOfDate=' .. typeOfDate .. '\n' .. |
|||
'|date1=' .. date1 .. '\n' .. |
|||
'|date2=' .. date2 .. '\n' .. |
|||
'|placeOfPublication=' .. placeOfPublication .. '\n' .. |
|||
'|illustrations=' .. illustrations .. '\n' .. |
|||
'|targetAudience=' .. targetAudience .. '\n' .. |
|||
'|formOfItem=' .. formOfItem .. '\n' .. |
|||
'|natureOfContents=' .. natureOfContents .. '\n' .. |
|||
'|governmentPublication=' .. governmentPublication .. '\n' .. |
|||
'|conferencePublication=' .. conferencePublication .. '\n' .. |
|||
'|festschrift=' .. festschrift .. '\n' .. |
|||
'|index=' .. index .. '\n' .. |
|||
'|literaryForm=' .. literaryForm .. '\n' .. |
|||
'|biography=' .. biography .. '\n' .. |
|||
'|language=' .. language .. '\n' .. |
|||
'|modifiedRecord=' .. modifiedRecord .. '\n' .. |
|||
'|catalogingSource=' .. catalogingSource .. |
|||
'\n}}\n' |
|||
-- cria o botão para a importação do registro |
|||
formLink = frame:callParserFunction{ name = '#formlink', |
|||
args = { 'form=BibRecord', 'link text=Importar registro', |
|||
'link type=post button', 'query string=' .. queryString } } |
|||
else |
|||
-- inicializa as variáveis derivadas (registro de autoridade) |
|||
-- líder |
|||
local recordStatus = leader:sub( 6, 6 ) |
|||
local encodingLevel = leader:sub( 18, 18 ) |
|||
if encodingLevel == ' ' |
|||
then |
|||
encodingLevel = '' |
|||
end |
|||
local punctuationPolicy = leader:sub( 19, 19 ) |
|||
if punctuationPolicy == ' ' or punctuationPolicy == '4' |
|||
then |
|||
punctuationPolicy = '' |
|||
end |
|||
-- control field 008 |
|||
local dateEnteredOnFile = controlField008:sub( 1, 6 ) |
|||
local directOrIndirectGeogSubdiv = controlField008:sub( 7, 7 ) |
|||
if directOrIndirectGeogSubdiv == ' ' |
|||
then |
|||
directOrIndirectGeogSubdiv = '' |
|||
end |
|||
local romanizationScheme = controlField008:sub( 8, 8 ) |
|||
local languageOfCatalog = controlField008:sub( 9, 9 ) |
|||
if languageOfCatalog == ' ' |
|||
then |
|||
languageOfCatalog = '' |
|||
end |
|||
local kindOfRecord = controlField008:sub( 10, 10 ) |
|||
local descriptiveCatalogingRules = controlField008:sub( 11, 11 ) |
|||
local subjectHeadingSystem = controlField008:sub( 12, 12 ) |
|||
local typeOfSeries = controlField008:sub( 13, 13 ) |
|||
local numberedOrUnnumberedSeries = controlField008:sub( 14, 14 ) |
|||
if numberedOrUnnumberedSeries == ' ' |
|||
then |
|||
numberedOrUnnumberedSeries = '' |
|||
end |
|||
local headingUseMainOrAddedEntry = controlField008:sub( 15, 15 ) |
|||
local headingUseSubjectAddedEntry = controlField008:sub( 16, 16 ) |
|||
if headingUseSubjectAddedEntry == ' ' |
|||
then |
|||
headingUseSubjectAddedEntry = '' |
|||
end |
|||
local headingUseSeriesAddedEntry = controlField008:sub( 17, 17 ) |
|||
local typeOfSubjectSubdivision = controlField008:sub( 18, 18 ) |
|||
if typeOfSubjectSubdivision == ' ' |
|||
then |
|||
typeOfSubjectSubdivision = '' |
|||
end |
|||
local typeOfGovernmentAgency = controlField008:sub( 29, 29 ) |
|||
if typeOfGovernmentAgency == ' ' |
|||
then |
|||
typeOfGovernmentAgency = '' |
|||
end |
|||
local referenceEvaluation = controlField008:sub( 30, 30 ) |
|||
if referenceEvaluation == ' ' |
|||
then |
|||
referenceEvaluation = '' |
|||
end |
|||
local recordUpdateInProcess = controlField008:sub( 32, 32 ) |
|||
local undifferentiatedPersonalName = controlField008:sub( 33, 33 ) |
|||
if undifferentiatedPersonalName == ' ' |
|||
then |
|||
undifferentiatedPersonalName = '' |
|||
end |
|||
local levelOfEstablishment = controlField008:sub( 34, 34 ) |
|||
if levelOfEstablishment == ' ' |
|||
then |
|||
levelOfEstablishment = '' |
|||
end |
|||
local modifiedRecord = controlField008:sub( 39, 39 ) |
|||
if modifiedRecord == ' ' or modifiedRecord:match( '\r' ) |
|||
then |
|||
modifiedRecord = '' |
|||
end |
|||
local catalogingSource = controlField008:sub( 40, 40 ) |
|||
if catalogingSource == ' ' |
|||
then |
|||
catalogingSource = '' |
|||
end |
|||
-- query string maker (part 1), Predefinição AutRecord |
|||
queryString = |
|||
'AutRecord[dateEnteredOnFile]=' .. dateEnteredOnFile .. |
|||
'&AutRecord[recordStatus]=' .. recordStatus .. |
|||
'&AutRecord[encodingLevel]=' .. encodingLevel .. |
|||
'&AutRecord[punctuationPolicy]=' .. punctuationPolicy .. |
|||
'&AutRecord[directOrIndirectGeogSubdiv]=' .. directOrIndirectGeogSubdiv .. |
|||
'&AutRecord[romanizationScheme]=' .. romanizationScheme .. |
|||
'&AutRecord[languageOfCatalog]=' .. languageOfCatalog .. |
|||
'&AutRecord[kindOfRecord]=' .. kindOfRecord .. |
|||
'&AutRecord[descriptiveCatalogingRules]=' .. descriptiveCatalogingRules .. |
|||
'&AutRecord[subjectHeadingSystem]=' .. subjectHeadingSystem .. |
|||
'&AutRecord[typeOfSeries]=' .. typeOfSeries .. |
|||
'&AutRecord[numberedOrUnnumberedSeries]=' .. numberedOrUnnumberedSeries .. |
|||
'&AutRecord[headingUseMainOrAddedEntry]=' .. headingUseMainOrAddedEntry .. |
|||
'&AutRecord[headingUseSubjectAddedEntry]=' .. headingUseSubjectAddedEntry .. |
|||
'&AutRecord[headingUseSeriesAddedEntry]=' .. headingUseSeriesAddedEntry .. |
|||
'&AutRecord[typeOfSubjectSubdivision]=' .. typeOfSubjectSubdivision .. |
|||
'&AutRecord[typeOfGovernmentAgency]=' .. typeOfGovernmentAgency .. |
|||
'&AutRecord[referenceEvaluation]=' .. referenceEvaluation .. |
|||
'&AutRecord[recordUpdateInProcess]=' .. recordUpdateInProcess .. |
|||
'&AutRecord[undifferentiatedPersonalName]=' .. undifferentiatedPersonalName .. |
|||
'&AutRecord[levelOfEstablishment]=' .. levelOfEstablishment .. |
|||
'&AutRecord[modifiedRecord]=' .. modifiedRecord .. |
|||
'&AutRecord[catalogingSource]=' .. catalogingSource .. |
|||
fieldQueryString |
|||
-- template string maker (part 1), Predefinição AutRecord |
|||
firstTemplate = '<pre>{{AutRecord\n' .. |
|||
'|dateEnteredOnFile=' .. dateEnteredOnFile .. '\n' .. |
|||
'|recordStatus=' .. recordStatus .. '\n' .. |
|||
'|encodingLevel=' .. encodingLevel .. '\n' .. |
|||
'|punctuationPolicy=' .. punctuationPolicy .. '\n' .. |
|||
'|directOrIndirectGeogSubdiv=' .. directOrIndirectGeogSubdiv .. '\n' .. |
|||
'|romanizationScheme=' .. romanizationScheme .. '\n' .. |
|||
'|languageOfCatalog=' .. languageOfCatalog .. '\n' .. |
|||
'|kindOfRecord=' .. kindOfRecord .. '\n' .. |
|||
'|descriptiveCatalogingRules=' .. descriptiveCatalogingRules .. '\n' .. |
|||
'|subjectHeadingSystem=' .. subjectHeadingSystem .. '\n' .. |
|||
'|typeOfSeries=' .. typeOfSeries .. '\n' .. |
|||
'|numberedOrUnnumberedSeries=' .. numberedOrUnnumberedSeries .. '\n' .. |
|||
'|headingUseMainOrAddedEntry=' .. headingUseMainOrAddedEntry .. '\n' .. |
|||
'|headingUseSubjectAddedEntry=' .. headingUseSubjectAddedEntry .. '\n' .. |
|||
'|headingUseSeriesAddedEntry=' .. headingUseSeriesAddedEntry .. '\n' .. |
|||
'|typeOfSubjectSubdivision=' .. typeOfSubjectSubdivision .. '\n' .. |
|||
'|typeOfGovernmentAgency=' .. typeOfGovernmentAgency .. '\n' .. |
|||
'|referenceEvaluation=' .. referenceEvaluation .. '\n' .. |
|||
'|recordUpdateInProcess=' .. recordUpdateInProcess .. '\n' .. |
|||
'|undifferentiatedPersonalName=' .. undifferentiatedPersonalName .. '\n' .. |
|||
'|levelOfEstablishment=' .. levelOfEstablishment .. '\n' .. |
|||
'|modifiedRecord=' .. modifiedRecord .. '\n' .. |
|||
'|catalogingSource=' .. catalogingSource .. |
|||
'\n}}\n' |
|||
-- cria o botão para a importação do registro |
|||
formLink = frame:callParserFunction{ name = '#formlink', |
|||
args = { 'form=AutRecord', 'link text=Importar registro', |
|||
'link type=post button', 'query string=' .. queryString } } |
|||
end |
|||
-- retorna todos os valores para a predefinição {{MARCimporter}} |
|||
return formLink, firstTemplate, fieldTemplates, lastTemplate |
|||
end |
|||
return p |
Edição das 11h52min de 10 de junho de 2021
A documentação para este módulo pode ser criada em Módulo:MARCimporter/doc
local p = {}
-- a função "record" é dividida em 4 partes: um handler para registros ISO 2709,
-- um handler para registros em "MARC tags", uma configuração para registros
-- bibliográficos e uma configuração para registros de autoridade.
function p.record( frame )
-- recebe o registro, o terceiro argumento da Predefinição:MARCimporter
local record = frame.args[3] or ''
-- recebe o modo de normalização Unicode ("Sim" para ativar o modo NFD)
local isNFD = frame.args[2] or ''
-- inicializa as variáveis básicas do registro
local leader = ''
local baseAddressOfData = 0
local directory = 0
local dataValuesGroup = ''
-- inicializa as variáveis auxiliares
local directoryEntry = 0
local entryTag = 0
local entryDataLength = 0
local entryInitPosition = 0
local dataField = {} -- Cada tabela que contém os dados dos campos. Formato:
-- { tag='', length='', initPosition='', data='', ind1='', ind2='' }
local dataFields = {} -- Tabela que contém cada tabela dataField. Formato:
-- { 1={}, 2={}, 3={}, 4={}, n={} }
local controlField003 = ''
local controlField006 = ''
local controlField007 = ''
local controlField008 = ''
local tag040 = ''
local firstTemplate = ''
local fieldTemplates = ''
local lastTemplate = '{{EndOfRecord}}</pre>'
local queryString = ''
local fieldQueryString = ''
local formLink = ''
local function normalizeData( data )
data = data
:gsub( '|(.)', ' $%1 ' ) -- substitui "|a" por " $a "
:gsub( '(%d)p%.', '%1 p.' ) -- // "1p." por "1 p."
:gsub( '(%d)cm', '%1 cm' ) -- // "1cm" por "1 cm"
:gsub( '(%d)ed%.', '%1 ed.' ) -- // "1ed." por "1 ed."
:gsub( '%.%s?%-$', '.' ) -- // ". -" por "."
:gsub( '(%$.*)(%$w.*)', '%2 %1' ) -- move o subcampo $w para a frente
:gsub( '(%$z.*)(%$u.*)', '%2 %1' ) -- move o subcampo $u para a frente
return data
end
if record:match( '^%d%d%d%d' )
then
-- == MARC ISO 2709 handler == --
-- O MediaWiki substitui caracteres de controle (RS, US, GS) pelo
-- caractere de "desconhecido" (losango com interrogação) e, aqui,
-- substituo esse caractere por um pipe (é necessário substituir
-- por um caractere da faixa ASCII).
record = record:gsub( '�', '|' )
-- verifica se a forma de normalização Unicode é a
-- Normalization Form Canonical Decomposition (NFD)
if isNFD == 'Sim'
then
record = mw.ustring.toNFD( record )
end
-- configuração das variáveis básicas do registro (via ISO 2709):
-- obtém o líder
leader = record:sub( 1, 24 ) or ''
--> 00898nam a2200277 a 4500
-- obtém o endereço base dos dados
baseAddressOfData = tonumber( leader:sub( 13, 17 ) ) or 0
--> 00277
-- obtém o diretório (-1 para não pegar RS)
directory = record:sub( 25, baseAddressOfData - 1 ) or 0
--> 0010010000000050017000100080041000270200027000680400017000950...
-- obtém os dados dos campos em um único grupo
dataValuesGroup = record:sub( baseAddressOfData + 1 ) or ''
--> 278 até o final do registro
-- enquanto o tamanho do diretório for maior que 0...
while #directory > 0
do
directoryEntry = directory:sub( 1, 12 ) -- 245008100177
entryTag = directoryEntry:sub( 1, 3 ) -- 245
entryDataLength = directoryEntry:sub( 4, 7 ) -- 0081
entryInitPosition = directoryEntry:sub( 8, 12 ) -- 00177
-- cria uma tabela com os dados...
dataField = {
tag = entryTag,
length = entryDataLength,
initPosition = entryInitPosition
}
-- e insere cada tabela dataField na tabela dataFields
table.insert( dataFields, dataField )
-- esvazia o diretório de 12 em 12
directory = directory:sub( 13 )
end
-- para cada item da tabela dataFields...
for index, dataField in ipairs( dataFields )
do
-- configura as variáveis para uso na função string.sub( i, j )
-- (+1 porque em Lua se começa do 1, não do 0)
local i = dataFields[index].initPosition + 1
-- (-1 para não pegar RS)
local j = dataFields[index].initPosition + dataFields[index].length - 1
-- localiza o dado em dataValuesGroup, normaliza o dado
-- e armazena na tabela
dataFields[index].data = normalizeData( dataValuesGroup:sub( i, j ) )
-- armazena os campos de controle (00X) para posterior decomposição
if dataFields[index].tag == '006'
then
controlField006 = dataFields[index].data:gsub( '[|#$]', ' ' )
end
if dataFields[index].tag == '007'
then
controlField007 = dataFields[index].data:gsub( '[|#$\r]', ' ' )
end
if dataFields[index].tag == '008'
then
controlField008 = dataFields[index].data:gsub( '[|#$-]', ' ' )
end
end
else
-- == MARC tags handler == --
record = record
:gsub( ' ', ' ' ) -- LC bib handling (\t+\s)
:gsub( ' ', ' ' ) -- LC aut handling (\t)
:gsub( ' ', ' ' ) -- Pergamum handling (control fields) (non-breaking space)
:gsub( ' ', ' ' ) -- Pergamum handling (data fields) (non-breaking space)
record = record .. '\n'
if record:match( '^FMT' ) or record:match( '^LDR' ) -- Aleph handling
then
record = record:gsub( '\t', ' ' ) -- 1
:gsub( '^(FMT%s[A-Z].-\n)', '' ) -- 2
:gsub( 'LDR%s([0%s][0%s][0%s][0%s][0%s].-\n)', '000 %1' ) -- 3
:gsub( '\n(%d%d%d)%s(%$.%s)', '\n%1 %2' ) -- 4
:gsub( '\n(%d%d%d)(%d)', '\n%1 %2' ) -- 5
:gsub( '\n(%d%d%d%s%d%s)', '\n%1 ' ) -- 6 (manter essa ordem)
end
-- configuração das variáveis básicas do registro (via MARC tags):
-- obtém o líder
leader = record:match( '^000%s([%d%s][%d%s][%d%s][%d%s][%d%s].-)\n' ) or ''
leader = leader:gsub( '[|#$]', ' ' )
-- obtém os campos de controle
controlField003 = record:match( '\n003%s(.-)\n' ) or ''
controlField006 = record:match( '\n006%s([a-z].-)\n' ) or ''
controlField006 = controlField006:gsub( '[|#$]', ' ' )
controlField007 = record:match( '\n007%s([a-z].-)\n' ) or ''
controlField007 = controlField007:gsub( '[|#$\r]', ' ' )
controlField008 = record:match( '008%s([%d%s][%d%s][%d%s][%d%s][%d%s][%d%s].-)\n' ) or ''
controlField008 = controlField008:gsub( '[|#$-]', ' ' )
-- para cada linha do registro, identifica o campo e seu conteúdo
-- (o conteúdo inclui os indicadores)
for tagMatch, dataMatch in record:gmatch(
'([0-8]%d%d) ([0-9_%s][0-9_%s] [$|].-)\n' )
do
-- transforma o dado para o formato igual ao manipulado pelo
-- MARC ISO 2709 handler
dataMatch = dataMatch:gsub( '%s?|(.)%s', '|%1' )
-- normaliza o dado
dataMatch = normalizeData(dataMatch)
-- cria uma tabela com os dados...
dataField = {
tag = tagMatch,
data = dataMatch
}
-- e insere cada tabela dataField na tabela dataFields
table.insert( dataFields, dataField )
end
end
-- == Handler unificado == --
if leader:sub( 7, 7 ) == 'z' and controlField003 == 'Br'
then
-- cria uma tabela com os dados...
dataField = {
tag = '670',
data = '## $a CA-BN ' .. os.date( '%Y' )
}
-- e insere a tabela dataField na tabela dataFields
table.insert( dataFields, dataField )
end
-- função de ordenação dos campos
local function sortByTag ( a, b )
if ( a.tag < b.tag )
then
return true
elseif ( a.tag > b.tag )
then
return false
else
return a.originalOrder < b.originalOrder
end
end
-- para cada item da tabela dataFields...
for index, dataField in ipairs( dataFields )
do
-- verifica se a tag é a 040
if dataFields[index].tag == '040'
-- se for, adiciona o subcampo para a agência modificadora do registro
-- e marca como verdadeiro a presença deste campo
then
dataFields[index].data = dataFields[index].data .. ' $d BR-FlWIK'
tag040 = dataFields[index].data
end
-- verifica se a tag é uma das seguintes
if dataFields[index].tag == '092' or dataFields[index].tag == '595'
then
-- se for, exclua da tabela dataFields
table.remove( dataFields, index )
end
end
-- se não há campo 040, então será criado agora
if tag040 == ''
then
-- cria uma tabela com os dados...
dataField = {
tag = '040',
data = '## $a BR-FlWIK $b por $c BR-FlWIK'
}
-- e insere a tabela dataField na tabela dataFields
table.insert( dataFields, dataField )
end
if leader:sub( 7, 7 ) == 'z' and tag040:match( 'a DLC' )
then
-- cria uma tabela com os dados...
dataField = {
tag = '670',
data = '## $a CA-LC ' .. os.date( '%Y' )
}
-- e insere a tabela dataField na tabela dataFields
table.insert( dataFields, dataField )
end
for index, dataField in ipairs( dataFields )
do
-- guarda a ordem original do campo para posterior inclusão de outros
-- campos (mantendo a ordem original)
dataFields[index].originalOrder = index
end
-- ordena os campos do registro
table.sort( dataFields, sortByTag )
for index, dataField in ipairs( dataFields )
do
-- se os campos forem maior que 009, então gerarão indicadores
if tonumber( dataFields[index].tag ) > 9
then
dataFields[index].ind1 =
dataFields[index].data:sub( 1, 1 ):gsub( '[ _]', '#' )
dataFields[index].ind2 =
dataFields[index].data:sub( 2, 2 ):gsub( '[ _]', '#' )
end
-- se, também, os campos estiverem entre 010 e 830 (com exceção para 856),
-- criará a query string do link para o formulário e a sintaxe da
-- Predefinição Field
if
tonumber( dataFields[index].tag ) == 10 or
tonumber( dataFields[index].tag ) > 12 and
tonumber( dataFields[index].tag ) < 831 or
tonumber( dataFields[index].tag ) == 856
then
-- query string maker (part 2), Predefinição Field
fieldQueryString = fieldQueryString ..
'&Field[' .. index .. '][tag]=' .. dataField.tag ..
'&Field[' .. index .. '][ind1]=' .. dataField.ind1 ..
'&Field[' .. index .. '][ind2]=' .. dataField.ind2 ..
'&Field[' .. index .. '][data]=' .. mw.uri.encode( dataField.data:sub( 4 ) )
-- template string maker (part 2), Predefinição Field
fieldTemplates = fieldTemplates .. '{{Field' ..
'\n|tag=' .. dataField.tag ..
'\n|ind1=' .. dataField.ind1 ..
'\n|ind2=' .. dataField.ind2 ..
'\n|data=' .. dataField.data:sub( 4 ) ..
'\n}}\n'
end
end
if frame.args[1] == 'bib' or frame.args[1] == ''
then
-- inicializa as variáveis derivadas (registro bibliográfico)
-- líder
local recordStatus = leader:sub( 6, 6 )
local typeOfRecord = leader:sub( 7, 7 )
local bibliographicLevel = leader:sub( 8, 8 )
local encodingLevel = leader:sub( 18, 18 )
if encodingLevel == ' '
then
encodingLevel = ''
end
local descriptiveCatalogingForm = leader:sub( 19, 19 )
if descriptiveCatalogingForm == ' '
then
descriptiveCatalogingForm = ''
end
local multipartResourceRecordLevel = leader:sub( 20, 20 )
if multipartResourceRecordLevel == ' '
then
multipartResourceRecordLevel = ''
end
-- control field 008
local dateEnteredOnFile = controlField008:sub( 1, 6 )
local typeOfDate = controlField008:sub( 7, 7 )
local date1 = controlField008:sub( 8, 11 )
local date2 = controlField008:sub( 12, 15 )
local placeOfPublication = controlField008:sub( 16, 18 )
local illustrations = controlField008:sub( 19, 19 )
if illustrations == ' '
then
illustrations = ''
end
local targetAudience = controlField008:sub( 23, 23 )
if targetAudience == ' '
then
targetAudience = ''
end
local formOfItem = controlField008:sub( 24, 24 )
if formOfItem == ' '
then
formOfItem = ''
end
local natureOfContents = controlField008:sub( 25, 25 )
if natureOfContents == ' '
then
natureOfContents = ''
end
local governmentPublication = controlField008:sub( 29, 29 )
if governmentPublication == ' ' or governmentPublication == '0'
then
governmentPublication = ''
end
local conferencePublication = controlField008:sub( 30, 30 )
if conferencePublication == '0'
then
conferencePublication = ''
end
local festschrift = controlField008:sub( 31, 31 )
if festschrift == '0'
then
festschrift = ''
end
local index = controlField008:sub( 32, 32 )
if index == '0' or index == ' '
then
index = ''
end
local literaryForm = controlField008:sub( 34, 34 )
if literaryForm == '0' or literaryForm == ' '
then
literaryForm = ''
end
local biography = controlField008:sub( 35, 35 )
if biography == ' '
then
biography = ''
end
local language = controlField008:sub( 36, 38 )
local modifiedRecord = controlField008:sub( 39, 39 )
if modifiedRecord == ' ' or modifiedRecord:match( '\r' )
then
modifiedRecord = ''
end
local catalogingSource = controlField008:sub( 40, 40 )
if catalogingSource == ' '
then
catalogingSource = ''
end
-- query string maker (part 1), Predefinição BibRecord
queryString =
'BibRecord[dateEnteredOnFile]=' .. dateEnteredOnFile ..
'&BibRecord[recordStatus]=' .. recordStatus ..
'&BibRecord[typeOfRecord]=' .. typeOfRecord ..
'&BibRecord[bibliographicLevel]=' .. bibliographicLevel ..
'&BibRecord[encodingLevel]=' .. encodingLevel ..
'&BibRecord[descriptiveCatalogingForm]=' .. descriptiveCatalogingForm ..
'&BibRecord[multipartResourceRecordLevel]=' .. multipartResourceRecordLevel ..
'&BibRecord[controlField006]=' .. controlField006 ..
'&BibRecord[controlField007]=' .. controlField007 ..
'&BibRecord[typeOfDate]=' .. typeOfDate ..
'&BibRecord[date1]=' .. date1 ..
'&BibRecord[date2]=' .. date2 ..
'&BibRecord[placeOfPublication]=' .. placeOfPublication ..
'&BibRecord[illustrations]=' .. illustrations ..
'&BibRecord[targetAudience]=' .. targetAudience ..
'&BibRecord[formOfItem]=' .. formOfItem ..
'&BibRecord[natureOfContents]=' .. natureOfContents ..
'&BibRecord[governmentPublication]=' .. governmentPublication ..
'&BibRecord[conferencePublication]=' .. conferencePublication ..
'&BibRecord[festschrift]=' .. festschrift ..
'&BibRecord[index]=' .. index ..
'&BibRecord[literaryForm]=' .. literaryForm ..
'&BibRecord[biography]=' .. biography ..
'&BibRecord[language]=' .. language ..
'&BibRecord[modifiedRecord]=' .. modifiedRecord ..
'&BibRecord[catalogingSource]=' .. catalogingSource ..
fieldQueryString
-- template string maker (part 1), Predefinição BibRecord
firstTemplate = '<pre>{{BibRecord\n' ..
'|dateEnteredOnFile=' .. dateEnteredOnFile .. '\n' ..
'|recordStatus=' .. recordStatus .. '\n' ..
'|typeOfRecord=' .. typeOfRecord .. '\n' ..
'|bibliographicLevel=' .. bibliographicLevel .. '\n' ..
'|encodingLevel=' .. encodingLevel .. '\n' ..
'|descriptiveCatalogingForm=' .. descriptiveCatalogingForm .. '\n' ..
'|multipartResourceRecordLevel=' .. multipartResourceRecordLevel .. '\n' ..
'|controlField006=' .. controlField006 .. '\n' ..
'|controlField007=' .. controlField007 .. '\n' ..
'|typeOfDate=' .. typeOfDate .. '\n' ..
'|date1=' .. date1 .. '\n' ..
'|date2=' .. date2 .. '\n' ..
'|placeOfPublication=' .. placeOfPublication .. '\n' ..
'|illustrations=' .. illustrations .. '\n' ..
'|targetAudience=' .. targetAudience .. '\n' ..
'|formOfItem=' .. formOfItem .. '\n' ..
'|natureOfContents=' .. natureOfContents .. '\n' ..
'|governmentPublication=' .. governmentPublication .. '\n' ..
'|conferencePublication=' .. conferencePublication .. '\n' ..
'|festschrift=' .. festschrift .. '\n' ..
'|index=' .. index .. '\n' ..
'|literaryForm=' .. literaryForm .. '\n' ..
'|biography=' .. biography .. '\n' ..
'|language=' .. language .. '\n' ..
'|modifiedRecord=' .. modifiedRecord .. '\n' ..
'|catalogingSource=' .. catalogingSource ..
'\n}}\n'
-- cria o botão para a importação do registro
formLink = frame:callParserFunction{ name = '#formlink',
args = { 'form=BibRecord', 'link text=Importar registro',
'link type=post button', 'query string=' .. queryString } }
else
-- inicializa as variáveis derivadas (registro de autoridade)
-- líder
local recordStatus = leader:sub( 6, 6 )
local encodingLevel = leader:sub( 18, 18 )
if encodingLevel == ' '
then
encodingLevel = ''
end
local punctuationPolicy = leader:sub( 19, 19 )
if punctuationPolicy == ' ' or punctuationPolicy == '4'
then
punctuationPolicy = ''
end
-- control field 008
local dateEnteredOnFile = controlField008:sub( 1, 6 )
local directOrIndirectGeogSubdiv = controlField008:sub( 7, 7 )
if directOrIndirectGeogSubdiv == ' '
then
directOrIndirectGeogSubdiv = ''
end
local romanizationScheme = controlField008:sub( 8, 8 )
local languageOfCatalog = controlField008:sub( 9, 9 )
if languageOfCatalog == ' '
then
languageOfCatalog = ''
end
local kindOfRecord = controlField008:sub( 10, 10 )
local descriptiveCatalogingRules = controlField008:sub( 11, 11 )
local subjectHeadingSystem = controlField008:sub( 12, 12 )
local typeOfSeries = controlField008:sub( 13, 13 )
local numberedOrUnnumberedSeries = controlField008:sub( 14, 14 )
if numberedOrUnnumberedSeries == ' '
then
numberedOrUnnumberedSeries = ''
end
local headingUseMainOrAddedEntry = controlField008:sub( 15, 15 )
local headingUseSubjectAddedEntry = controlField008:sub( 16, 16 )
if headingUseSubjectAddedEntry == ' '
then
headingUseSubjectAddedEntry = ''
end
local headingUseSeriesAddedEntry = controlField008:sub( 17, 17 )
local typeOfSubjectSubdivision = controlField008:sub( 18, 18 )
if typeOfSubjectSubdivision == ' '
then
typeOfSubjectSubdivision = ''
end
local typeOfGovernmentAgency = controlField008:sub( 29, 29 )
if typeOfGovernmentAgency == ' '
then
typeOfGovernmentAgency = ''
end
local referenceEvaluation = controlField008:sub( 30, 30 )
if referenceEvaluation == ' '
then
referenceEvaluation = ''
end
local recordUpdateInProcess = controlField008:sub( 32, 32 )
local undifferentiatedPersonalName = controlField008:sub( 33, 33 )
if undifferentiatedPersonalName == ' '
then
undifferentiatedPersonalName = ''
end
local levelOfEstablishment = controlField008:sub( 34, 34 )
if levelOfEstablishment == ' '
then
levelOfEstablishment = ''
end
local modifiedRecord = controlField008:sub( 39, 39 )
if modifiedRecord == ' ' or modifiedRecord:match( '\r' )
then
modifiedRecord = ''
end
local catalogingSource = controlField008:sub( 40, 40 )
if catalogingSource == ' '
then
catalogingSource = ''
end
-- query string maker (part 1), Predefinição AutRecord
queryString =
'AutRecord[dateEnteredOnFile]=' .. dateEnteredOnFile ..
'&AutRecord[recordStatus]=' .. recordStatus ..
'&AutRecord[encodingLevel]=' .. encodingLevel ..
'&AutRecord[punctuationPolicy]=' .. punctuationPolicy ..
'&AutRecord[directOrIndirectGeogSubdiv]=' .. directOrIndirectGeogSubdiv ..
'&AutRecord[romanizationScheme]=' .. romanizationScheme ..
'&AutRecord[languageOfCatalog]=' .. languageOfCatalog ..
'&AutRecord[kindOfRecord]=' .. kindOfRecord ..
'&AutRecord[descriptiveCatalogingRules]=' .. descriptiveCatalogingRules ..
'&AutRecord[subjectHeadingSystem]=' .. subjectHeadingSystem ..
'&AutRecord[typeOfSeries]=' .. typeOfSeries ..
'&AutRecord[numberedOrUnnumberedSeries]=' .. numberedOrUnnumberedSeries ..
'&AutRecord[headingUseMainOrAddedEntry]=' .. headingUseMainOrAddedEntry ..
'&AutRecord[headingUseSubjectAddedEntry]=' .. headingUseSubjectAddedEntry ..
'&AutRecord[headingUseSeriesAddedEntry]=' .. headingUseSeriesAddedEntry ..
'&AutRecord[typeOfSubjectSubdivision]=' .. typeOfSubjectSubdivision ..
'&AutRecord[typeOfGovernmentAgency]=' .. typeOfGovernmentAgency ..
'&AutRecord[referenceEvaluation]=' .. referenceEvaluation ..
'&AutRecord[recordUpdateInProcess]=' .. recordUpdateInProcess ..
'&AutRecord[undifferentiatedPersonalName]=' .. undifferentiatedPersonalName ..
'&AutRecord[levelOfEstablishment]=' .. levelOfEstablishment ..
'&AutRecord[modifiedRecord]=' .. modifiedRecord ..
'&AutRecord[catalogingSource]=' .. catalogingSource ..
fieldQueryString
-- template string maker (part 1), Predefinição AutRecord
firstTemplate = '<pre>{{AutRecord\n' ..
'|dateEnteredOnFile=' .. dateEnteredOnFile .. '\n' ..
'|recordStatus=' .. recordStatus .. '\n' ..
'|encodingLevel=' .. encodingLevel .. '\n' ..
'|punctuationPolicy=' .. punctuationPolicy .. '\n' ..
'|directOrIndirectGeogSubdiv=' .. directOrIndirectGeogSubdiv .. '\n' ..
'|romanizationScheme=' .. romanizationScheme .. '\n' ..
'|languageOfCatalog=' .. languageOfCatalog .. '\n' ..
'|kindOfRecord=' .. kindOfRecord .. '\n' ..
'|descriptiveCatalogingRules=' .. descriptiveCatalogingRules .. '\n' ..
'|subjectHeadingSystem=' .. subjectHeadingSystem .. '\n' ..
'|typeOfSeries=' .. typeOfSeries .. '\n' ..
'|numberedOrUnnumberedSeries=' .. numberedOrUnnumberedSeries .. '\n' ..
'|headingUseMainOrAddedEntry=' .. headingUseMainOrAddedEntry .. '\n' ..
'|headingUseSubjectAddedEntry=' .. headingUseSubjectAddedEntry .. '\n' ..
'|headingUseSeriesAddedEntry=' .. headingUseSeriesAddedEntry .. '\n' ..
'|typeOfSubjectSubdivision=' .. typeOfSubjectSubdivision .. '\n' ..
'|typeOfGovernmentAgency=' .. typeOfGovernmentAgency .. '\n' ..
'|referenceEvaluation=' .. referenceEvaluation .. '\n' ..
'|recordUpdateInProcess=' .. recordUpdateInProcess .. '\n' ..
'|undifferentiatedPersonalName=' .. undifferentiatedPersonalName .. '\n' ..
'|levelOfEstablishment=' .. levelOfEstablishment .. '\n' ..
'|modifiedRecord=' .. modifiedRecord .. '\n' ..
'|catalogingSource=' .. catalogingSource ..
'\n}}\n'
-- cria o botão para a importação do registro
formLink = frame:callParserFunction{ name = '#formlink',
args = { 'form=AutRecord', 'link text=Importar registro',
'link type=post button', 'query string=' .. queryString } }
end
-- retorna todos os valores para a predefinição {{MARCimporter}}
return formLink, firstTemplate, fieldTemplates, lastTemplate
end
return p