1 # Ova datoteka sadrži pravila za generiranje MARC21 ISO 2709 izlazne
2 # datoteke. Ulazni format je CDS/ISIS izvorni format, sa zapisima u
3 # UNIMARC formatu, sa vi¹estrukim odstupanjima od standarda.
6 ## sve skupa se konvertira samo ako postoji polje 200^a
7 if ( rec('200','a') ) {
12 substr( rec('leader'), 5, 1 )
16 substr( rec('leader'), 6, 1 )
20 substr( rec('leader'), 7, 1)
23 my $ldr17 = substr( rec('leader'), 17, 1 );
30 marc_leader('17', $ldr17konv->{$ldr17}) ;
32 my $ldr18 = substr( rec('leader'), 17, 1 );
38 marc_leader('18', $ldr18konv->{$ldr18}) ;
40 marc('003','HR-ZaINA');
42 marc_fixed('008','00',
43 substr( rec('100'), 2, 6 )
46 my @a= (localtime) [5,4,3,2,1,0]; $a[0]+=1900; $a[1]++;
47 my $date = sprintf("%4d%02d%02d%02d%02d%04.1f",@a);
50 marc('005',rec('005'));
55 marc_fixed('008','00',
56 substr( rec('100','a'), 2, 6)
59 my $code06 = substr( rec('100','a'), 8, 1);
74 marc_fixed('008','06', $code06konv->{$code06});
96 my $code07 = substr( rec('100','a'), 9, 4);
97 if ( $code07 =~ m/\d\d\d\d/ ) {
98 marc_fixed('008','07',
101 } elsif ( $code07 =~ m/\s\s\s\s/ ) {
102 if ( rec('210','c') =~ m/\d\d\d\d/ ) {
103 marc_fixed('008','07',
104 substr( rec('210','c'), 0, 4)
108 marc_fixed('008','07',
113 my $code11 = substr( rec('100','a'), 13, 4);
114 if ( $code11 =~ m/\d\d\d\d/ ) {
115 marc_fixed('008','11',
119 marc_fixed('008','11',
124 marc_fixed('008','15',
128 if ( rec('110','a') ) {
129 my $code18s = substr( rec('110','a'),1,1 );
152 marc_fixed('008','18',$code18skonv->{$code18s});
155 my $rec_105_a = rec('105','a');
157 ' 000yy' => ' 000yy',
158 ' 001yy' => ' 001yy',
159 ' 100yy' => ' 100yy',
160 'a 000y' => 'a 000y ',
161 'a 000yy' => 'a 000yy',
162 'a 001yy' => 'a 001yy',
163 'abk 000yy' => 'abk 000yy',
164 'ad 000yy' => 'ad 000yy',
165 'ad 001yy' => 'ad 001yy',
166 'adf 001yy' => 'adf 001yy',
167 'a e 000yy' => 'a e 000yy',
169 'd 000yy' => 'd 000yy',
170 'd 001yy' => 'd 001yy',
171 'd 101yy' => 'd 101yy',
172 'dc 000yd' => 'dc 000yd',
173 'd j 001yy' => 'd j 001yy',
174 ' e 000yy' => ' e 000yy',
175 ' e 000yy' => ' e 000yy',
176 'f 000yy' => 'f 000yy',
177 'k n 000yy' => 'k n 000yy',
178 ' n 000yy' => ' n 000yy',
180 if ( my $replace = $mapping_105->{$rec_105_a} ) {
181 warn "# FIXED 105^a [$rec_105_a] -> [$replace]\n";
182 $rec_105_a = $replace;
187 my $code18 = substr( $rec_105_a, 0, 4);
224 warn "missing [$code18]" unless ($code18konv->{$code18}) ;
225 marc_fixed('008','18', $code18konv->{$code18});
228 if ( rec('110','a') ) {
229 my $code19s = substr( rec('110','a'),2,1 );
237 marc_fixed('008','19',$code19skonv->{$code19s});
240 if ( rec('110','a') ) {
241 my $code21 = substr( rec('110','a'),0,1 );
250 marc_fixed('008','21',$code21konv->{$code21});
253 my $code22 = substr( rec('100','a'), 17, 1);
266 marc_fixed('008','22', $code22konv->{$code22});
268 my $code23 = substr( rec('106','a'),0,1 );
269 marc_fixed('008','23', $code23);
271 if ( rec('110','a') ) {
272 my $code24s = substr( rec('110','a'),3,1 );
295 marc_fixed('008','24',$code24skonv->{$code24s});
299 my $code24 = substr( $rec_105_a, 4, 4);
327 marc_fixed('008','24', $code24konv->{$code24});
330 if ( rec('135','a') ) {
331 my $code26 = substr( rec('135','a'), 0,1 );
341 marc_fixed('008','26', $code26konv->{$code26});
344 my $code28 = substr( rec('100','a'), 20, 1);
359 marc_fixed('008','28', $code28konv->{$code28});
361 if ( rec('110','a') ) {
362 my $code29s = substr( rec('110','a'),7,1 );
363 marc_fixed('008','29',$code29s);
367 my $code29 = substr( $rec_105_a, 8, 1);
374 marc_fixed('008','29', $code29konv->{$code29});
378 my $code30 = substr( $rec_105_a, 9, 1);
385 marc_fixed('008','30', $code30konv->{$code30});
389 my $code31 = substr( $rec_105_a, 10, 1);
396 marc_fixed('008','31', $code31konv->{$code31});
399 if ( substr( rec('leader'),7,1 ) =~ m/s/ ) {
400 my $code33s = substr( rec('100','a'),34,1 );
413 marc_fixed('008','33', $code33skonv->{$code33s});
417 my $code33 = substr( $rec_105_a, 11, 1);
432 # warn "missing [$code33]" unless defined $code33konv->{$code33} ;
433 marc_fixed('008','33', $code33konv->{$code33});
437 my $code34 = substr( $rec_105_a, 12, 1);
447 marc_fixed('008','34', $code34konv->{$code34});
450 marc_fixed('008','35',
454 my $code38 = substr( rec('100','a'), 25, 1);
455 if ( $code38 =~ m/[abc]/ ) {
456 marc_fixed('008','38','o');
458 marc_fixed('008','38',' ');
506 ## moguæ problem u pretra¾ivanju ako ima zagrade, kako bi trebalo po standardu
531 if ( rec('101','i1') ) {
532 my $i1_041 = rec('101','i1');
533 warn "IND1: [$i1_041]";
539 marc_indicators('041', $i1_041konv->{$i1_041}, ' ');
542 marc_original_order('041','101');
545 marc_original_order('044','102');
550 marc_indicators('080',' ',' ');
560 ### 084 - other classification (R)
566 marc_indicators('100','1',' ');
571 ### formalna odrednica - iz 503 u 110, i1=0, i2=1
576 ## provjeriti za svaku bazu
577 ## konverzija u 110 ili 111 ovisno o postojanju/nepostojanju nekih polja - provjeriti ispise naslova iz svake zbirke - moguæe su gre¹ke.
578 ## popraviti interpunkciju
580 # ovo vrijedi za FFSFB
581 if ( rec('710','d') || rec('710','e') || rec('710','f') ) {
583 marc_indicators('111', 2, ' ');
587 rec('710','b') ? '.' :
593 rec('710','d') ? '(' :
598 ( ! rec('710','d') ) ? '(' :
599 ( ! rec('710','e') ) ? '(' :
604 ( rec('710','e') && ( rec('710','d') || rec('710','f') ) ) ? '; ' :
605 ( ! rec('710','d') && ! rec('710','f') ) ? '(' :
612 marc_indicators('110', 2, ' ');
619 if ( rec('710','c') ) {
621 surround('(', ')', rec('710','c'))
627 ## i1 = 0 za anonimne publikacije, i1 = 1 ako postoji 700 ili 710
628 ## i2 = pretpostavlja se na temelju èlana na poèetku naslova i jezika
630 marc_indicators('245', rec('200','i1'), 0);
632 if ( rec('200','a') =~ m/^Einen / ) {
633 marc_indicators('245', rec('200','i1'), 6);
635 if ( rec('200','a') =~ m/^Eine / ) {
636 marc_indicators('245', rec('200','i1'), 5);
638 if ( rec('200','a') =~ m/^(Die|Das|Der|Ein|Les|Los|The) / ) {
639 marc_indicators('245', rec('200','i1'), 4);
641 if ( rec('200','a') =~ m/^(Um|Un|An|La|Le|Lo|Il) / ) {
642 marc_indicators('245', rec('200','i1'), 3);
644 if ( ( rec('101') =~ m/ENG/ ) && ( rec('200','a') =~ m/^A / ) ) {
645 marc_indicators('245', rec('200','i1'), 2);
647 if ( rec('200','a') =~ m/^L / ) {
648 marc_indicators('245', rec('200','i1'), 2);
650 if ( rec('200','a') =~ m/^L'/ ) {
651 marc_indicators('245', rec('200','i1'), 2);
657 ## da li treba makivati razmake u inicijalima?
661 if ( rec('461','1') ) {
664 sub { rec('200','a') },
667 sub { rec('461','1') }
672 sub { rec('200','c') },
675 sub { rec('461','1') }
681 if ( rec('200','a') != rec('461','x') ) {
690 ( ! ( rec('200','d') || rec('200','e') || rec('200','k') || rec('200','h') ) ) && ( rec('200','f') ) ? ' /' :
691 ( rec('200','d') ) ? ' =' :
692 ( rec('200','e') ) ? ' :' :
693 ( rec('200','k') ) ? ' ;' :
694 ( rec('200','k') ) ? ' ;' :
696 join_with(' ; ', rec('200','a') ),
699 ( rec('200','d') && rec('200','f') ) ? ' /' :
700 ( rec('200','d') && rec('200','c') ) ? '.' :
705 ( rec('200','e') && rec('200','f') ) ? ' /' :
706 ( rec('200','e') && rec('200','c') ) ? '.' :
711 ( rec('200','k') && rec('200','f') ) ? ' /' :
712 ( rec('200','k') && rec('200','c') ) ? '.' :
717 ( rec('200','h') && rec('200','f') ) ? ' / ' :
722 ( rec('200','f') && rec('200','c') ) ? '. ' :
725 regex('s/(\S\.)\s(\S\.\s)/$1$2/g',
728 regex('s/(\S\.)\s(\S\.\s)/$1$2/g',
733 ## append to last subfield
746 ## i1=1 ukoliko pravilo nala¾e napomenu, ali napomenu necemo pisati ponovo u 500
747 ## i1=3 ako pravlo na nala¾e napomenu
749 ## i2 - pogledati za svaku bazu sto su ti naslovi, pa onda oderditi indikatoda oderditi indikatoree
750 marc_indicators('246', 3, ' ');
756 ## zapisima koji nemaju potpolje, dodaje se ^a u modify - provjeriti za svaku bazu
759 rec('205','f') ? ' / ' :
769 ## ponovljiva potpolja u originalnom redosljedu - priprema u modify
770 marc_original_order('260', '210');
774 ## urediti interpunkcije za sve kombinacije
777 rec('215','c') ? ' : ' :
778 rec('215','d') ? ' ; ' :
779 rec('215','e') ? ' + ' :
786 ( rec('215','c') && rec('215','d') ) ? ' ; ' :
787 ( rec('215','c') && rec('215','e') ) ? ' + ' :
794 rec('215','e') ? ' + ' :
803 marc_indicators('326', rec('207','i2'), ' ');
814 if ( rec('225','i1') =~ m/0/ || rec('225','i1') =~ m/2/ ) {
815 marc_indicators('490','1',' ');
816 } elsif ( rec('225','i1') =~ m/1/ ) {
817 marc_indicators('490','2',' ');
820 marc_original_order('490','225');
840 ### 502 - bilje¹ka o disertacijama
841 ## odgovarajuæeg polja nema u originalnim podacima. mo¾da se mo¾e pretpostaviti?
846 regex('s/\s*[\\r\\n]+\s*\**\s*/ ; /g',
852 ## NSK konvertira 327 (NP) u 501 (R)
853 ## u LOC konv. tablici stoji 327 (NP) u 505 (NR)
854 ## standard i validacije dopustaju 501 (R) i 505 (R)
855 ## za svaku bazu posebno provjeriti sta je u poljima 327 i 330
856 if ( config() =~ m/ffps|fftu/ ) {
857 marc_indicators('505', '0', ' ');
859 regex('s/\s*[\\r\\n]+\s*\**\s*/ ; /g',
865 if ( config() =~ m/ffan/ ) {
866 marc_indicators('505', '0', ' ');
875 ## NSK konvertira 330 (P) u 520 (P) = LOC konv. tablica
876 if ( config() =~ m/ffps/ ) {
878 regex('s/[\\r\\n]+/. /g',
884 ### 526 - STUDY PROGRAM INFORMATION NOTE
885 ## u nekim bazame je to u 996 - provjeriti za svaku bazu sta je u 996?
886 marc_indicators('526', 8, ' ');
891 ### 538 - zahtjevi sustava
893 regex('s/\s*[\\r\\n]+\s*\**\s*/ ; /g',
898 ### 653 - Index Term-Uncontrolled
899 ## da li ponovljivo polje ili potpolje, pogledati u Koha tags
900 marc_indicators('653', ' ', ' ');
905 ### 655 - Index Term-Genre/Form
906 marc_indicators('655', ' ', 4);
915 ## ako je u originalu ponovljivo polje treba bioti i konvertirano u ponovljivo !!
916 ## ako ima samo podpolje a onda je pseudonim - nakon konverzije treba provjeriti
917 if ( rec('701','a') =~ m/, / ) {
918 marc_indicators('700', 1, ' ');
920 marc_indicators('700', 0, ' ');
969 ## eventualno nadopuniti 710 i 711 - provjetiti da li u podacima postoji u ISIS-u
972 ### 740 - Added Entry - Uncontrolled Related/Analytical Title
974 ## nadopuniti prvi indikator prema èlanovima
975 marc_indicators('740', '0', ' ');
977 # if ( ! rec('464') ) {
994 ### 760 w ---------------------------------------------
995 ## generiranje zapisa o nakladnièkoj cjelini i povezivanje podreðenog zapisa s nadreðenim
998 # rec('225','a') # da li je nakladnièka cjelina?
1008 #my $series = get( $series_key );
1014 #$series = join_with('',
1020 #set( $series_key => $series );
1023 #} # nakladnièka cjelina
1025 #my $series_key = join_with('',
1033 # marc_indicators('760', 0, ' ');
1039 # get( $series_key )
1045 # my $dup_key = join_with('',
1056 # marc_indicators('776', 0, ' ');
1062 # -------------------------------------------------------------------
1069 sub { rec('200','a') },
1072 sub { rec('461','1') }
1077 prefix('(HR-ZaINA)', rec('461','1'))
1083 ### 774 - Constituent Item Entry - to bi trebali koristiti ali ne koristimo jer NSK to koristi za ne¹to drugo
1084 ### 787 - Nonspecific Relationship Entry
1086 #marc_indicators('787','0',' ');
1088 #marc_compose('787',
1089 # 'g', rec('230','v'),
1090 # 't', rec('230','a'),
1091 # 'b', rec('240','a'),
1092 # 'd', rec('250','a'),
1093 # 'd', rec('250','d'),
1094 # 'h', rec('260','a'),
1095 # 'k', rec('270','a'),
1096 # 'n', join_with('. - ',
1099 # 'x', join_with(', ',
1103 #marc_compose('787',
1104 # 'g', rec('231','v'),
1105 # 't', rec('231','a'),
1106 # 'b', rec('241','a'),
1107 # 'd', rec('251','a'),
1108 # 'd', rec('251','d'),
1109 # 'h', rec('261','a'),
1110 # 'k', rec('271','a'),
1111 # 'n', join_with('. - ',
1114 # 'x', join_with(', ',
1118 #marc_compose('787',
1119 # 'g', rec('232','v'),
1120 # 't', rec('232','a'),
1121 # 'b', rec('242','a'),
1122 # 'd', rec('252','a'),
1123 # 'd', rec('252','d'),
1124 # 'h', rec('262','a'),
1125 # 'k', rec('272','a'),
1126 # 'n', join_with('. - ',
1129 # 'x', join_with(', ',
1133 #marc_compose('787',
1134 # 'g', rec('233','v'),
1135 # 't', rec('233','a'),
1136 # 'b', rec('243','a'),
1137 # 'd', rec('253','a'),
1138 # 'h', rec('263','a'),
1139 # 'k', rec('273','a'),
1140 # 'n', join_with('. - ',
1143 # 'x', join_with(', ',
1150 if ( rec('410','i2') =~ m/0/ ) {
1151 marc_indicators('760',' ','1');
1152 } elsif ( rec('410','i2') =~ m/1/ ) {
1153 marc_indicators('760',' ','0');
1158 sub { rec('200','a') },
1161 sub { rec('410','1') }
1167 sub { '(HR-ZaINA)' . rec('001') },
1170 sub { rec('410','1') }
1178 ### 852 - ne koristimo, koristimo 942 i 952
1180 ### 876 - item information - basic bibliographic unit (R)
1181 ## da li ovdje zapisati stare inventarne brojeve?
1186 ### 886 - former marc
1187 # inicijale treba prebaciti u neko lokalno polje, a ovo polje nam ne treba
1189 # marc_indicators('886', 2, ' ');
1211 regex('s/\s*[\\r\\n]+\s*\**\s*/ ; /g',
1219 if ( rec('leader') =~ m/m/ ) {
1220 marc('942','b', 'LIB');
1221 marc('942','c','K');
1224 marc('942','b', 'PER');
1225 marc('942','c','S');
1234 if ( rec('700','a') ) {
1235 if ( rec('200','a') =~ m/^(The|Die|Das|Der|Ein|Les) / ) {
1238 regex('s/(^.{3}).*/$1/',
1239 uc ( rec('700','a') )
1241 regex('s/^.{4}(.{1}).*/$1/',
1242 lc ( rec('200','a') )
1246 } elsif ( rec('200','a') =~ m/^(Um|Un|An|La|Le|Il) / ) {
1249 regex('s/(^.{3}).*/$1/',
1250 uc ( rec('700','a') )
1252 regex('s/^.{3}(.{1}).*/$1/',
1253 lc ( rec('200','a') )
1257 } elsif ( rec('200','a') =~ m/^Eine / ) {
1260 regex('s/(^.{3}).*/$1/',
1261 uc ( rec('700','a') )
1263 regex('s/^.{5}(.{1}).*/$1/',
1264 lc ( rec('200','a') )
1268 } elsif ( rec('200','a') =~ m/^Einen / ) {
1271 regex('s/(^.{3}).*/$1/',
1272 uc ( rec('700','a') )
1274 regex('s/^.{6}(.{1}).*/$1/',
1275 lc ( rec('200','a') )
1279 } elsif ( rec('200','a') =~ m/^(A|L) / ) {
1282 regex('s/(^.{3}).*/$1/',
1283 uc ( rec('700','a') )
1285 regex('s/^.{2}(.{1}).*/$1/',
1286 lc ( rec('200','a') )
1293 regex('s/(^.{3}).*/$1/',
1294 uc ( rec('700','a') )
1296 regex('s/(^.{1}).*/$1/',
1297 lc ( rec('200','a') )
1302 } elsif ( rec('710','a') ) {
1303 if ( rec('200','a') =~ m/^(The|Die|Das|Der|Ein|Les) / ) {
1306 regex('s/(^.{3}).*/$1/',
1307 uc ( rec('710','a') )
1309 regex('s/^.{4}(.{1}).*/$1/',
1310 lc ( rec('200','a') )
1314 } elsif ( rec('200','a') =~ m/^(Um|Un|An|La|Le|Il) / ) {
1317 regex('s/(^.{3}).*/$1/',
1318 uc ( rec('710','a') )
1320 regex('s/^.{3}(.{1}).*/$1/',
1321 lc ( rec('200','a') )
1325 } elsif ( rec('200','a') =~ m/^Eine / ) {
1328 regex('s/(^.{3}).*/$1/',
1329 uc ( rec('710','a') )
1331 regex('s/^.{5}(.{1}).*/$1/',
1332 lc ( rec('200','a') )
1336 } elsif ( rec('200','a') =~ m/^Einen / ) {
1339 regex('s/(^.{3}).*/$1/',
1340 uc ( rec('710','a') )
1342 regex('s/^.{6}(.{1}).*/$1/',
1343 lc ( rec('200','a') )
1347 } elsif ( rec('200','a') =~ m/^(A|L) / ) {
1350 regex('s/(^.{3}).*/$1/',
1351 uc ( rec('710','a') )
1353 regex('s/^.{2}(.{1}).*/$1/',
1354 lc ( rec('200','a') )
1361 regex('s/(^.{3}).*/$1/',
1362 uc ( rec('710','a') )
1364 regex('s/(^.{1}).*/$1/',
1365 lc ( rec('200','a') )
1370 } elsif ( rec('200','a') =~ m/^(The|Die|Das|Der|Ein|Les) / ) {
1372 regex('s/^.{4}(.{3}).*/$1/',
1373 uc ( rec('200','a') )
1379 regex('s/(^\w{3}).*/$1/',
1380 uc ( rec('200','a') )
1386 ### Koha podaci o primjercima
1401 #if ( rec('leader') =~ m/m/ ) {
1402 # marc('952','y','K');
1404 # marc('952','y','S');
1407 # lokalna polja (stari inv. broj, 992 i 023)