--- trunk/conf/normalize/ff-libri.pl 2006/11/03 20:41:12 773 +++ trunk/conf/normalize/ff-libri.pl 2007/05/25 19:48:02 842 @@ -1,20 +1,25 @@ -# ne konvertira se ako nema polje 200^a +######################################################################### +## ## +## Ova datoteka sadrži pravila za generiranje MARC21 ISO 2709 izlazne ## +## datoteke. Ulazni format je CDS/ISIS sa zapisima u UNIMARC-u. ## +## ## +########################################################################## + +# konvertira se ako postoji polje 200^a if ( rec('200','a') ) { -# Leader +### LEADER # raspraviti 17,18 -# -# u nekim knjižnicama koristi se 999a i 999b -# -# vrijedi za ffan... +# u nekim knjižnicama koristi se 999a i 999b, a u nekima samo 999 -if ( rec('999') && first(rec('999')) =~ m/pregledan/i) { +if ( rec('999') && first(rec('999')) =~ m/(pregledan|P)/i) { marc_leader('05','c'); } else { marc_leader('05','n'); } +# moguća je i oznaka "m" u 06 - odrediti kriterije marc_leader('06','a'); marc_leader('07','m'); marc_leader('18','i'); @@ -23,11 +28,45 @@ marc_leader('19','r'); } -# 001 polje - Voyager -# -# privemeno koristimo 0356 umjesto 0359, zato što marclint 9 prijavljuje kao grešku -# u marc 035a - System Number - ?? -# NSK zapisuje Voyagerov ID (001) - kako ??? +### 001 - Voyager + +### 007 + +marc_fixed('007',00,'ta'); + +### 008 + +if ( rec('994','c') ) { + marc_fixed('008','00', + regex('s/^\d\d//', + rec('994','c') + ), + ); +} else { + marc_fixed('008', 00, + '000101' + ); +} + +#warn( dump( +# regex('s/^\d\d//', +# rec('994','c') +# ), +#) +#); + +## FIXME treba velika slova pretvoriti u mala + +marc_fixed('008','35', + first( lc(rec('101')) ) +); + + + +### 035$6 +# Privemeno koristimo 035$6 umjesto 035$9, zato što marclint prijavljuje 9 kao grešku. +# marc 035a - System Number - NSK zapisuje Voyagerov ID (001) - kako? +# kako mora izgledati polje 035$9? može li sadržavati slova i razmake? marc('035','6', @@ -44,15 +83,18 @@ ); -# u FFSF bazama postoji nekoliko zaredanih ISBN, odvojenih s '. - ' +### 020 +# postoji modify -> drugi ISBN počinje prefixom "ISBN" koji se miče (sfb) marc('020','a', - rec('10') + regex('s/ ISBN //g', + rec('10') + ) ); -# u polje 040a - prefiks HR ? -# NSK ima HR NSB (možda u novijim zapisima ima NSK?) +### 040 +# za sve je isti marc('040','a', 'HR FFZG' @@ -66,98 +108,237 @@ 'HR PPIAK' ); -if ( rec('300') && first(rec('300')) =~ m/Prijevod/) { + +### 041 indikatori +# pretpostavke o indikatorima: +# +# 1. Ako postoji polje 300 i ono sadrži /Prijevod/ ili /Izv. stv. nasl./, i1 = 1 +# (Da li je napomena uvijek pisana?) +# +# 2. Podatak o prevodiocu u 200g. Problem: različiti oblici riječi, različiti jezici. +# +# 3. Ako u UDK oznaci postoji "=", bez zagrada, onda je to prijevod +# (ako postoje zagrade pr. 94(=411.16) onda su to pomoćne oznake) +# pr. 821.111-2=163.42 je prijevod engleske drame na HR. +# to ima samo za književna djela, eseje.... +# ???? + + +#if ( rec('675') =~ m/\d=\d/ ) { +if ( grep( m/Prijevod/, rec('300')) || grep( m/Izv. stv. nasl./, rec('300') ) ) { marc_indicators('041', 1, ' '); } else { marc_indicators('041', 0, ' '); } -## naći primjer u NSK +### 041 +# ponovljivo polje konvertira se u ponovljivo potpolje + +#_debug(2); marc_repeatable_subfield('041','a', rec('101') ); +#_debug(0); + -# indikatori za članove. treba uvjetovati prema jezicima !! +### 080 +# 675 podpolja b, c, d ... - što s njima ??? + +marc('080','a', + rec('675','a') +); + + +### 084 - other classification (R) +# NSK ga koristi za stručnu oznaku NSK iz polja 681 +# NSK definira i prelazak polja 686 u 084, u skladu s LOC konv. tablicom +# polje 686 koristi FFPS + + +marc('084','a', + rec('686') +); + +### 100 +# I1 = 0 ako je pseudonim (ima 700a, nema 700b) + +if ( rec('700','a') && ! rec('700','b') ) { + marc_indicators('100', 0, ' '); +} else { + marc_indicators('100', 1, ' '); +} + +marc('100','a', + join_with(', ', + rec('700', 'a'), + rec('700', 'b') + ) +); + + +### 111 i 110 +# provjeriti ispise naslova iz svake baze - moguće su greške. +# ovo vrijedi za FFSFB + +if ( rec('710','f') ) { + +marc_indicators('111', 2, ' '); + +marc_compose('111', + 'a', rec('710','a'), + 'e', rec('710','b'), + 'n', rec('710','d'), + 'd', rec('710','f'), + 'c', rec('710','e'), +); + + +} else { + +marc_indicators('110', 2, ' '); +marc('110','a', + rec('710','a') +); + +marc('110','c', + rec('710','c') +); + +} + + +### 245 indikatori +# i1 = 0 za anonimne publikacije, i1 = 1 ako postoji 700 ili 710 +# i2 = pretpostavlja se na temelju člana na početku naslova i jezika +# treba nadopuniti i dati podatke na verifikaciju knjižničarima + +my $i1; + +if ( rec('700') || rec('710') ) { + $i1 = 1; + +} else { + $i1 = 0; +} + +marc_indicators('245', $i1, 0); if ( ( rec('200','a') =~ m/^Die /) || ( rec('200','a') =~ m/^Das /) || + ( rec('200','a') =~ m/^Der /) || ( rec('200','a') =~ m/^The /) ) { - marc_indicators('245', 0, 4); -} else { - marc_indicators('245', 0, 0); -} + marc_indicators('245', $i1, 4); +} + +if ( ( rec('200','a') =~ m/^A /) && ( rec(101) =~ m/ENG/ ) ) { + marc_indicators('245', $i1, 2); +} + +if ( ( rec('200','a') =~ m/^An /) && ( rec(101) =~ m/ENG/ ) ) { + marc_indicators('245', $i1, 2); +} + +### 245 +# redoslijed polja važan +# podpolja i interpunkcije pripremljeni u modify #_debug(3); marc_compose('245', 'a', suffix( - rec('200','b') ? '. ' : - rec('200','k') ? ' ; ' : - rec('200','d') ? ' = ' : - rec('200','e') ? ' : ' : - rec('200','f') ? ' / ' : - '.', - rec('200','a') - ), - 'h', rec('200','b'), - 'b', suffix( - ( rec('200','k') && rec('200','f') ) ? ' / ' : - ' ', - join_with(' ; ', - rec('200','k'), - ), - ), - 'b', suffix( - ( rec('200','d') && rec('200','f') ) ? ' / ' : - ' ', - rec('200','d'), + ( ! rec('200','p') && ( rec('200','f') || rec('200','c') ) ) ? ' / ' : + ( rec('200','p') && rec('200','c') ) ? ' : ' : + '', + rec('200','a'), ), 'b', suffix( - ( rec('200','e') && rec('200','f') ) ? ' / ' : - ' ', - join_with(' : ', - rec('200','e'), - ), + ( rec('200','p') && rec('200','f') ) ? ' / ' : + ( rec('200','p') && rec('200','c') ) ? '. ' : + '', + rec('200','p'), ), - -# ovo trenutno radi za slučaj kad f nije ponovljivo i kad uvijek postoje c i f u paru !!! - 'c', join_with('. ', - rec('200','f'), - rec('200','c'), + 'c', suffix( + ( rec('200','f') && rec('200','c') ) ? '. ' : + '', + rec('200','f'), ), -# FIXME append to last subfield -# '+', prefix('. ', rec('200','c') ), + '+', rec('200','c'), ); - #_debug(0); -marc('250','a', - suffix( - rec('205','f') ? ' / ' : - ' '. +#marc_compose('245', +# 'a', suffix( +# rec('200','b') ? '. ' : +# rec('200','k') ? ' ; ' : +# rec('200','d') ? ' = ' : +# rec('200','e') ? ' : ' : +# rec('200','f') ? ' / ' : +# '.', +# rec('200','a') +# ), +## 'h', rec('200','b'), +# 'b', suffix( +# ( rec('200','k') && rec('200','f') ) ? ' / ' : +# ' ', +# join_with(' ; ', +# rec('200','k'), +# ), +# ), +# 'b', suffix( +# ( rec('200','d') && rec('200','f') ) ? ' / ' : +# ' ', +# rec('200','d'), +# ), +# 'b', suffix( +# ( rec('200','e') && rec('200','f') ) ? ' / ' : +# ' ', +# join_with(' : ', +# rec('200','e'), +# ), +# ), +# 'c', rec('200','f'), +### append to last subfield +# '+', prefix('. ', +# rec('200','c') +# ), +#); + + + + + +### 250 + +marc_compose('250', + 'a',suffix( + rec('205','f') ? ' / ' : + ' ', rec('205','a') - ) + ), + 'b', rec('205','f'), ); -marc('250','b', - rec('205','f') -); +#marc('250','b', +# rec('205','f') +#); + +### 260 # ponovljiva potpolja u originalnom redosljedu marc_original_order('260', '210'); +### 300 # provjeriti interpunkcije !! -# u NSK nesto ne stima marc('300','a', suffix( - rec('215','c') ? ' : ' : - rec('215','d') ? ' ; ' : - rec('215','e') ? ' + ' : + rec('215','c') ? ' : ' : + rec('215','d') ? ' ; ' : + rec('215','e') ? ' + ' : ' ', rec('215','a') ) @@ -165,9 +346,9 @@ marc('300','b', suffix( - ( rec('215','c') && rec('215','d') ) ? ' ; ' : - ( rec('215','c') && rec('215','e') ) ? ' + ' : - ' ', + ( rec('215','c') && rec('215','d') ) ? ' ; ' : + ( rec('215','c') && rec('215','e') ) ? ' + ' : + ' ', rec('215','c') ) ); @@ -185,45 +366,68 @@ ); -# provjeriti +### 440 +# 2.ind. prema jeziku i članu -marc_indicators('490', 0, ' '); +marc_indicators('440', ' ', '0'); -marc('490','a', - rec('225','a') -); +if ( ( rec('225','a') =~ m/^Die /) || + ( rec('225','a') =~ m/^Das /) || + ( rec('225','a') =~ m/^The /) ) { + marc_indicators('440', ' ', 4); +} + +if ( ( rec('225','a') =~ m/^A /) && ( rec(101) =~ m/ENG/ ) ) { + marc_indicators('440', ' ', 2); +} + +if ( ( rec('225','a') =~ m/^An /) && ( rec(101) =~ m/ENG/ ) ) { + marc_indicators('440', ' ', 2); +} -marc('490','v', - join_with(', ', - rec('225','v'), - rec('225','w') +#_debug(3); + +marc('440', + 'a', suffix( rec('225','f'), + rec('225','a'), ), ); -marc('490','x', +# join_with(' / ', +# join_with(' ', +# rec('225','a'), +# rec('225','p'), +# ), +# rec('225','f') +# ), + +#_debug(0); + +marc('440','n', + rec('225','h') +); + +marc('440','p', + rec('225','i') +); + +marc('440','v', + rec('225','v'), +); + +marc('440','x', rec('225','x') ); + +### 490 +# #marc('490','a', -# join_with(' : ', -# rec('225','a'), -# join_with(" = ", -# rec('225','d'), -# join_with(" / ", -# rec('225','e'), -# rec('225','f') -# ) -# ) -# ) +# rec('225','a') #); -#marc('490','v', -# join2_with(225, 'v', ' , ', 225,'w'); -# join_with(', ', -# rec('225','v'), -# rec('225','w') -# ) -#); + +### 50x marc('500','a', rec('300') @@ -241,6 +445,11 @@ rec('314') ); +### 502 - bilješka o disertacijama +# odgovarajućeg polja nema u originalnim podacima. možda se može pretpostaviti? + +### 504 + marc('504','a', rec('320') ); @@ -250,7 +459,9 @@ # u LOC konv. tablici stoji 327 (NP) u 505 (NR) # standard i validacije dopuštaju 501 (R) i 505 (R) +## 505 ## FFPS 327 - sadrzaj + if ( config() =~ m/ffps/ || config() =~ m/fftu/ ) { marc_indicators('505', '0', ' '); marc('505','a', @@ -260,11 +471,24 @@ ); } +if ( config() =~ m/ffan/ ) { + marc_indicators('505', '0', ' '); + marc('505','a', + regex('s/[<>]//g', + rec('330') + ) +); +} + + ## napomene uz konverziju polja 330: # NSK konvertira 330 (P) u 520 (P) = LOC konv. tablica +### 520 +# možda i polje 520y - jezik napomene ako je uvijek isti jezik + # FFPS 330 (NP) - sažetak if ( config() =~ m/ffps/ ) { marc('520','a', @@ -274,60 +498,46 @@ ); } -# FFTU 330 - ??? -if ( config() =~ m/fftu/ ) { - marc('520','a', - rec('330') - ); -} +### 526 - STUDY PROGRAM INFORMATION NOTE + +marc_indicators('526', 8, ' '); + +marc('526','a', + rec('996') +); + +### 538 - zahtjevi sustava marc('538','a', rec('337','a') ); -# možda i polje 520y - jezik napomene ako je uvijek isti jezik +### 246 marc_indicators('246', 1, 3); marc('246','a', rec('532') ); +### 655 + marc_indicators('655', ' ', 4); marc('655','a', rec('608') ); +### 653 + marc_indicators('653', 0, ' '); marc('653','a', rec('610') ); -# 675 podpolja c, d ... - što s njima ??? - -marc('080','a', - rec('675','a') -); - -# 084 je other classification (R) -# NSK ga koristi za stručnu oznaku NSK iz polja 681 -# NSK definira i prelazak polja 686 u 084, u skladu s LOC konv. tablicom -# -# polje 686 koristi FFPS - -marc('084','a', - rec('686') -); +#_debug(2); -marc_indicators('100', 1, ' '); -marc('100','a', - join_with(', ', - rec('700', 'a'), - rec('700', 'b') - ) -); -#_debug(2); +### 700 marc_indicators('700', 1, ' '); @@ -396,8 +606,7 @@ ); ## treba provjeriti da li polje 330 sadrzi jos neke podatke koji mogu biti u <> ili su tu iskljucivo autori? da li samo autori ili neke druge osobe? - - +# # marc('700','a', # rec('330','a') # ); @@ -427,217 +636,136 @@ #_debug(0); -if ( rec('710','f') ) { -marc_indicators('111', 2, ' '); -marc('111','a', - rec('710','a') -); -marc('111','c', - rec('710','e') -); +### 740 -marc('111','d', - rec('710','f') -); +marc_indicators('740', 0, ' '); -marc('111','e', - rec('710','b') -); +# if ( ! rec('464') ) { +# marc('740','a', +# rec('200','c') +# ); -marc('111','n', - rec('710','d') +marc('740','a', + rec('200','k') ); +# } else { -} else { - -marc_indicators('110', 2, ' '); -marc('110','a', - rec('710','a') -); - -marc('110','c', - rec('710','c') -); +#marc('740','a', +# rec('464','a') +#); -}; +# }; +### generiranje zapisa o nakladničkoj cjelini i povezivanje podređenog zapisa s nadređenim -marc_indicators('740', 0, ' '); +if ( + rec('225','a') # da li je nakladnicka cjelina? +) { -if ( ! rec('464') ) { -marc('740','a', - rec('200','c') +my $series_key = +join_with('', + rec('225','a'), + rec('210','a'), + rec('210','b'), ); -marc('740','a', - rec('200','k') -); +my $series = get( $series_key ); +if ($series) { + warn "nije novi"; } else { -marc('740','a', - rec('464','a') -); -}; +$series = join_with('', + config(), + 'LS', + rec('000') +); -## višerazinci +set( $series_key => $series ); -if ( rec('230') ) { - - marc_duplicate(); +} +} - marc_remove('035'); - marc('035','6', - join_with('', - config(), - rec('000'), - '-', - id(), - ) - ); +my $series_key = join_with('', + rec('225','a'), + rec('210','a'), + rec('210','b'), +); +if ($series_key) { - marc_remove('245'); + marc_indicators('760', 0, ' '); - if ( rec('230','a') ) { - marc_compose('245', - 'a', suffix( - rec('230','b') ? '. ' : - rec('230','k') ? ' ; ' : - rec('230','d') ? ' = ' : - rec('230','e') ? ' : ' : - rec('230','f') ? ' / ' : - '.', - rec('230','a') - ), - 'b', - join_with(' ; ', - rec('230','k'), - ), - 'b', rec('230','d'), - 'b', - join_with(' : ', - rec('230','e'), - ), - 'c', - join_with(' ; ', - rec('230','f'), - ), - ); - - } else { - - marc_compose('245', - 'a', suffix( - rec('230','b') ? '. ' : - rec('230','k') ? ' ; ' : - rec('230','d') ? ' = ' : - rec('230','e') ? ' : ' : - rec('230','f') ? ' / ' : - '.', - rec('200','a') - ), - 'b', - join_with(' ; ', - rec('230','k'), - ), - 'b', rec('230','d'), - 'b', - join_with(' : ', - rec('230','e'), - ), - 'c', - join_with(' ; ', - rec('230','f'), - ), - 'n', rec('230','v'), - ); - - } - - marc_remove('260'); - -# marc_original_order('260', '250'); - - marc('260','c', - rec1('251') + marc('760','w', + get( $series_key ) ); +} +### testing +# +# my $dup_key = join_with('', +# rec('200','a'), +#); +# +#if ($dup_key) { +# marc('995','a', +# get( $dup_key ) +# ); +#} +# +# +# marc_indicators('776', 0, ' '); +# +# marc('776','a', +# rec('452','1') +# ); +# -# marc('260','a', -# rec('251','a') -# ); -# marc('260','b', -# rec('251','c') -# ); -# marc('260','c', -# rec('251','d'), -# rec1('251') -# ); +## 852 - lokacija - marc_remove('300'); - marc('300','a', - rec('260') - ); +marc_indicators('852', 4, ' '); - marc_remove('490'); - marc('490','a', - rec('270') - ); +marc('852','j', + join_with(' ', + rec('990') + ) +); - marc_remove('500'); - marc('500','a', - rec('280') - ); +## 876 - item information - basic bibliographic unit - marc_remove('020'); - marc('020','a', - rec('290') - ); +marc('876','a', + rec('991'), +); - marc_indicators('774', 0, ' '); - marc('774','g', - rec('230','v') - ); - - marc('774','t', - rec('200','a') - ); - - marc('774','w', - join_with('', - config(), - rec('000') - ) - ); +## 886 - former marc - -}; +marc_indicators('886', 2, ' '); -marc_indicators('776', 0, ' '); +marc('886','2', + 'ffmarc' +); -marc('776','a', - rec('452','1') +marc('886','a', + '994' ); -marc('900','a', - lookup( - sub { rec('000') }, - 'ffps','libri', - sub { rec('200','a') }, +marc('886','b', + join_with(''. + '##^a', + join_with('', + prefix('^a', + rec('994','a'), + ), + prefix('^b', + rec('994','b') + ) + ) ) ); -marc('901','a', - lookup( - sub { 'NSK' }, - 'nsk','baza', - sub { rec('200','a') }, - ) -); -} +} # polje 200a