68f543276335904e0ad0cedf69c7a1ea91a5f708
[webpac2] / conf / normalize / ff-libri.pl
1 #########################################################################
2 ##                                                                      ##
3 ## Ova datoteka sadr¾i pravila za generiranje MARC21 ISO 2709 izlazne   ##
4 ## datoteke. Ulazni format je CDS/ISIS sa zapisima u UNIMARC-u.         ##
5 ##                                                                      ##      
6 ##########################################################################
7
8 # konvertira se ako postoji polje 200^a
9
10 if ( rec('200','a') ) {
11
12 ### LEADER
13 # raspraviti 17,18
14 # u nekim knji¾nicama koristi se 999a i 999b, a u nekima samo 999
15
16 if ( rec('999') && first(rec('999')) =~ m/(pregledan|P)/i) {
17         marc_leader('05','c');
18 } else {
19         marc_leader('05','n');
20 }
21
22 # moguæa je i oznaka "m" u 06 - odrediti kriterije
23         marc_leader('06','a');
24         marc_leader('07','m');
25         marc_leader('18','i');
26
27 # pojasniti upotrebu 19 lidera!
28
29 if ( rec('230') ) {
30         marc_leader('19','r');
31 }
32
33 ### 001 - Voyager
34
35 ### 003
36 # Pojasniti upotrebu polja
37
38 ### 007
39 # pojasniti upotrebu polja
40
41 marc_fixed('007',00,'ta');
42
43 ### 008
44 # ¹to zapisati u polje kad datum nije poznat?
45
46 if ( rec('994','c') ) {
47         marc_fixed('008','00',
48                 regex('s/^\d\d//',
49                         rec('994','c')
50                 ),
51         );
52 } else {
53         marc_fixed('008', 00,
54                 '000101'
55         );
56 }
57
58 #warn( dump(
59 #       regex('s/^\d\d//',
60 #               rec('994','c')
61 #       ),
62 #)
63 #);
64
65 marc_fixed('008','35',
66         first( lc(rec('101')) )
67 );
68
69
70 ### 020
71 # postoji modify -> drugi ISBN poèinje prefixom "ISBN" koji se mièe (sfb)
72
73 marc('020','a',
74         regex('s/ ISBN //g',
75                 rec('10')
76         )
77 );
78
79
80 ### 035$6
81 # Privemeno koristimo 035$6 umjesto 035$9, zato ¹to marclint prijavljuje 9 kao gre¹ku.
82 # marc 035a - System Number - Voyagerov ID (001) 
83 # polje 035$9 mo¾e sadr¾avati slova i razmake
84
85 marc('035','6',
86 join_with('',
87 #               config('input normalize path'),
88 #               config('name'),
89                 config(),
90                 ' L',
91 #               config('input name'),
92 #               id(),
93 #               rec('994','a'),
94                 rec('000')
95         )
96 );
97
98 ### 040
99 # za sve je isti
100 # treba utvrditi toènu oznaku za ustanovu
101
102 marc('040','a',
103         'HR FFZG'
104 );
105
106 marc('040','b',
107         'hrv'
108 );
109
110 marc('040','e',
111         'HR PPIAK'
112 );
113
114
115 ### 041
116
117 # indikatori
118 #
119 # pretpostavke o indikatorima:
120
121 # 1. Ako postoji polje 300 i ono sadr¾i /Prijevod/ ili /Izv. stv. nasl./, i1 = 1
122 # (Da li je napomena uvijek pisana?)
123 #
124 # 2. Podatak o prevodiocu u 200g. Problem: razlièiti oblici rijeèi, razlièiti jezici.
125 #
126 # 3. Ako u UDK oznaci postoji "=", bez zagrada, onda je to prijevod
127 # (ako postoje zagrade pr. 94(=411.16) onda su to pomoæne oznake)
128 # pr. 821.111-2=163.42 je prijevod engleske drame na HR. 
129 # to ima samo za knji¾evna djela, eseje.... 
130 # ????
131
132
133 #if ( rec('675') =~ m/\d=\d/ ) {
134 if ( grep( m/prijevod/i, rec('300')) || grep( m/prevedeno/i, rec('300')) || grep( m/izv.*stv.*nasl/i, rec('300')) || grep( m/izvornik/i, rec('300')) || grep( m/preve/i, rec('200','f')) || grep( m/preve/i, rec('200','g')) || grep( m/prijevod/i, rec('200','f')) || grep( m/prijevod/i, rec('200','g')) ) {
135         marc_indicators('041', 1, ' ');
136 } else {
137         marc_indicators('041', 0, ' ');
138 }
139
140
141 ### 041
142 # ponovljivo polje konvertira se u ponovljivo potpolje
143
144 #_debug(2);
145
146 marc_repeatable_subfield('041','a',
147         rec('101')
148 );
149
150 #_debug(0);
151
152 ### 044
153
154
155 ### 080
156 # 675 podpolja b, c, d ... - ¹to s njima ???
157
158 marc('080','a',
159         rec('675','a')
160 );
161
162 marc('080','a',
163         rec('675','b')
164 );
165
166 marc('080','a',
167         rec('675','c')
168 );
169
170 marc('080','a',
171         rec('675','d')
172 );
173
174
175 ### 084 - other classification (R)
176 # NSK ga koristi za struènu oznaku NSK iz polja 681
177 # NSK konvertira polje 686 u 084, u skladu s LOC konv. tablicom
178 # polje 686 koristi FFPS. jo¹ netko?
179
180 marc('084','a',
181         rec('686')
182 );
183
184 ### 100
185
186 # I1 = 0 ako je pseudonim (ima 700a, nema 700b)
187
188 if ( rec('700','a') && ! rec('700','b') ) {
189         marc_indicators('100', 0, ' ');
190 } else {
191         marc_indicators('100', 1, ' ');
192 }
193
194 marc('100','a',
195         join_with(', ',
196                 rec('700', 'a'),
197                 rec('700', 'b')
198         )
199 );
200
201
202 ### 111 i 110
203 # provjeriti ispise naslova iz svake baze - moguæe su gre¹ke.
204 # ovo vrijedi za FFSFB
205
206 if ( rec('710','d') || rec('710','e') || rec('710','f') ) {
207
208 marc_indicators('111', 2, ' ');
209
210 marc_compose('111',
211         'a', suffix(
212                 rec('710','b') ? '.' :
213                         '',
214                         rec('710','a'),
215         ),
216         'e', rec('710','b'),
217         'n', prefix(
218                 rec('710','d') ? '(' :
219                         '',
220                         rec('710','d')
221         ),
222         'd', prefix(
223                 ( ! rec('710','d') ) ? '(' :
224                 ( ! rec('710','e') ) ? '(' :
225                         '; ',
226                         rec('710','f'),
227         ),
228         'c', prefix(
229                 ( rec('710','e') && ( rec('710','d') || rec('710','f') ) ) ? '; ' :
230                 ( ! rec('710','d') && ! rec('710','f') )  ? '(' :
231                         '',
232                         rec('710','e'),
233         ),
234         '+',')',
235 );
236
237
238 } else {
239         
240 marc_indicators('110', 2, ' ');
241
242 marc('110','a',
243         rec('710','a')
244 );
245
246 marc('110','b',
247         rec('710','b')
248 );
249
250         if ( rec('710','c') ) {
251         marc('110','c',
252                 surround('(', ')', rec('710','c'))
253         );
254         }
255
256 }
257
258
259 ### 245
260
261 # indikatori
262 #
263 # i1 = 0 za anonimne publikacije, i1 = 1 ako postoji 700 ili 710
264 # i2 = pretpostavlja se na temelju èlana na poèetku naslova i jezika
265 # treba nadopuniti i dati podatke na verifikaciju knji¾nièarima
266
267 my $i1;
268
269 if ( rec('700') || rec('710') ) {
270         $i1 = 1;
271
272 } else {
273         $i1 = 0;
274 }
275         
276 marc_indicators('245', $i1, 0);
277
278 if (    ( rec('200','a') =~ m/^Die /) || 
279         ( rec('200','a') =~ m/^Das /) || 
280         ( rec('200','a') =~ m/^Der /) || 
281         ( rec('200','a') =~ m/^The /) ) {
282                 marc_indicators('245', $i1, 4);
283
284
285 if (    ( rec('200','a') =~ m/^A /) && ( rec(101) =~ m/ENG/ ) ) {
286                 marc_indicators('245', $i1, 2);
287
288
289 if (    ( rec('200','a') =~ m/^An /) && ( rec(101) =~ m/ENG/ ) ) {
290                 marc_indicators('245', $i1, 2);
291
292
293 # podpolja i interpunkcije pripremljeni u modify
294
295 #_debug(3);
296
297 marc_compose('245',
298         'a', suffix(
299                 ( ! ( rec('200','d') || rec('200','e') || rec('200','k') ) ) && ( rec('200','f') ) ? ' / ' :  
300                 ( rec('200','d') ) ? ' = ' :
301                 ( rec('200','e') ) ? ' : ' :
302                 ( rec('200','k') ) ? ' ; ' :
303                         '', 
304                         rec('200','a'),
305         ),
306         'b', suffix(
307                 ( rec('200','d') && rec('200','f') ) ? ' / ' : 
308                 ( rec('200','d') && rec('200','c') ) ? '. '  : 
309                         '',
310                         rec('200','d'),
311         ),
312         'b', suffix(
313                 ( rec('200','e') && rec('200','f') ) ? ' / ' : 
314                 ( rec('200','e') && rec('200','c') ) ? '. '  : 
315                         '',
316                         rec('200','e'),
317         ),
318         'b', suffix(
319                 ( rec('200','k') && rec('200','f') ) ? ' / ' : 
320                 ( rec('200','k') && rec('200','c') ) ? '. '  : 
321                         '',
322                         rec('200','k'),
323         ),
324         'c', suffix(
325                 ( rec('200','f') && rec('200','c') ) ? '. ' :
326                         '',
327                         rec('200','f'),
328         ),
329         '+', rec('200','c'),
330 );
331
332 #marc_compose('245',
333 #       'a', suffix(
334 #               ( ! rec('200','p') && ( rec('200','f') || rec('200','c') ) ) ? ' / ' :  
335 #               ( ! rec('200','p') && rec('200','c') ) ? ' : '  : 
336 #                       '', 
337 #                       rec('200','a'),
338 #       ),
339 #       'b', suffix(
340 #               ( rec('200','p') && rec('200','f') ) ? ' / ' : 
341 #               ( rec('200','p') && rec('200','c') ) ? '. '  : 
342 #                       '',
343 #                       rec('200','p'),
344 #       ),
345 #       'c', suffix(
346 #               ( rec('200','f') && rec('200','c') ) ? '. ' :
347 #                       '',
348 #                       rec('200','f'),
349 #       ),
350 #       '+', rec('200','c'),
351 #);
352
353 #_debug(0);
354
355 #marc_compose('245',
356 #       'a', suffix(
357 #               rec('200','b') ? '. '   :
358 #               rec('200','k') ? ' ; '  :
359 #               rec('200','d') ? ' = '  :
360 #               rec('200','e') ? ' : '  :
361 #               rec('200','f') ? ' / '  :
362 #                                '.',
363 #                       rec('200','a')
364 #       ),
365 ##      'h', rec('200','b'),
366 #       'b', suffix(
367 #               ( rec('200','k') && rec('200','f') ) ? ' / ' :
368 #                                    ' ',
369 #                       join_with(' ; ',
370 #                               rec('200','k'),
371 #                       ),
372 #       ),
373 #       'b', suffix(
374 #               ( rec('200','d') && rec('200','f') ) ? ' / ' :
375 #                                                      ' ',
376 #                               rec('200','d'), 
377 #       ),
378 #       'b', suffix(
379 #               ( rec('200','e') && rec('200','f') ) ? ' / ' :
380 #                                                      ' ',
381 #                       join_with(' : ',
382 #                               rec('200','e'),
383 #                       ),
384 #       ),
385 #       'c', rec('200','f'),
386 ## append to last subfield
387 #       '+', prefix('. ', 
388 #               rec('200','c') 
389 #       ),
390 #);
391
392
393
394
395
396 ### 250
397 # zapisima koji nemaju potpolje, dodaje se ^a u modify - provjeriti
398
399 marc_compose('250',
400         'a',suffix(
401                 rec('205','f') ? ' / ' : 
402                         ' ',
403                         rec('205','a')
404         ),
405         'b', rec('205','f'),
406 );
407
408
409
410 ### 260
411 # ponovljiva potpolja u originalnom redosljedu
412
413 marc_original_order('260', '210');
414
415
416 ### 300
417 # urediti interpunkcije za sve kombinacije
418
419 marc('300','a',
420         suffix(
421                 rec('215','c') ? ' : ' :
422                 rec('215','d') ? ' ; ' :
423                 rec('215','e') ? ' + ' :
424                                         ' ',
425                         rec('215','a')
426         )
427 );
428
429 marc('300','b',
430         suffix(
431                 ( rec('215','c') && rec('215','d') ) ? ' ; ' :
432                 ( rec('215','c') && rec('215','e') ) ? ' + ' :
433                                                        ' ',
434                         rec('215','c')
435         )
436 );
437
438 marc('300','c',
439         suffix(
440                 rec('215','e') ? ' + ' :
441                                  ' ',
442                         rec('215','d')
443         )
444 );
445
446 marc('300','e',
447         rec('215','e')
448 );
449
450 ### 362
451 # brojèani podaci za nakladnièku cjelinu
452 # ???
453
454 ### 440
455 # 2.ind. prema jeziku i èlanu
456
457 marc_indicators('440', ' ', '0');
458
459 if (    ( rec('225','a') =~ m/^Die /) || 
460         ( rec('225','a') =~ m/^Das /) || 
461         ( rec('225','a') =~ m/^The /) ) {
462                 marc_indicators('440', ' ', 4);
463
464
465 if (    ( rec('225','a') =~ m/^A /) && ( rec(101) =~ m/ENG/ ) ) {
466                 marc_indicators('440', ' ', 2);
467
468
469 if (    ( rec('225','a') =~ m/^An /) && ( rec(101) =~ m/ENG/ ) ) {
470                 marc_indicators('440', ' ', 2);
471
472
473 #_debug(3);
474
475 marc_original_order('440','225');
476
477
478 #marc_compose('440',
479 #       'a', suffix(
480 #               rec('225','i') ? '. ' :
481 #                       '',
482 #                       rec('225','a'),
483 #       ),
484 #       'p', suffix(
485 #               ( ! rec('225','x') && rec('225','i') && rec('225','v') ) ? ' ; ' :
486 #               ( rec('225','i') && rec('225','x') ) ? ', '  :
487 #                       '',
488 #                       rec('225','i'),
489 #       ),
490 #       'x', suffix(
491 #               ( rec('225','x') && rec('225','v') ) ? ' ; ' :
492 #                       '',
493 #                       rec('225','x'),
494 #       ),
495 #       'v', rec('225','v'),
496 #);
497
498 ## ovo radi samo kad 225 nije ponovljivo
499
500 #if (
501 #       count( lookup(
502 #               sub { 1 },
503 #               'ffps','libri',
504 #               sub { rec('225','a') }
505 #       ) ) > 1
506 #) {
507
508 #marc_compose('440',
509 #       'a', suffix(
510 #               ( rec('225','x') ) ? ', '  :
511 #               ( rec('225','v') || rec('225','w') ) ? ' ; ' :
512 #               ( rec('225','h') || rec('225','i') ) ? '. '  :
513 #                       '',
514 #                       join_with(' / ',
515 #                               join_with(' : ',
516 #                                       join_with(' = ',
517 #                                               rec('225','a'),
518 #                                               rec('225','d'),
519 #                                       ),
520 #                                       rec('225','e'),
521 #                               ),
522 #                               rec('225','f'),
523 #                       ),
524 #       ),
525 #       'x', suffix(
526 #               ( rec('225','x') && rec('225','v') ) ? ' ; ' :
527 #               ( rec('225','x') && ( rec('225','h') || rec('225','i') ) ) ? '. ' :
528 #                       '',
529 #                       rec('225','x'),
530 #       ),
531 #       'v', suffix(
532 #               ( rec('225','v') && rec('225','h') || rec('225','i') ) ? '. ' :
533 #                       '',
534 #                       join_with('; ',
535 #                               rec('225','v'),
536 #                       )
537 #       ),
538 #       'n', suffix(
539 #               ( rec('225','h') && rec('225','p') || rec('225','y') ) ? ', ' :
540 #                       '',
541 #                       rec('225','h'),
542 #       ),
543 #       'p', suffix(
544 #               ( rec('225','i') && rec('225','x') ) ? ', ' :
545 #               ( rec('225','i') && rec('225','v') ) ? ' ; ' :
546 #                       '',
547 #                       rec('225','i'),
548 #       ),
549 #       'x', suffix(
550 #               ( rec('225','y') && rec('225','v') ) ? ' ; ' :
551 #                       '',
552 #                       rec('225','y'),
553 #       ),
554 #       'v', rec('225','w'),
555 # );
556
557 # marc_compose('440',
558 #       'a', suffix(
559 #               rec('225','k') ? ' ; ' :
560 #                       '',
561 #                       join_with(' / ',
562 #                               rec('225','b'),
563 #                               rec('225','j')
564 #                       ),
565 #       ),
566 #       'v',
567 #               rec('225','k'),
568 # );
569
570
571 # marc_compose('440',
572 #       'a', suffix(
573 #               rec('225','s') ? ' ; ' :
574 #                       '',
575 #                       join_with(' / ',
576 #                               rec('225','c'),
577 #                               rec('225','r')
578 #                       ),
579 #       ),
580 #       'v',
581 #               rec('225','s'),
582 # );
583
584 #}
585
586 #if ( rec('225','i') ) {
587 #       marc('440','p',
588 #               prefix('. ',
589 #                       rec('225','i')
590 #               ),
591 #       );
592 #}
593 #
594 #if ( rec('225','v') ) {
595 #       marc('440','v',
596 #               prefix(' ; ',
597 #                       rec('225','v'),
598 #               ),
599 #       );
600 #}
601
602 #_debug(0);
603
604
605 ### 50x
606
607 marc('500','a',
608         rec('300')
609 );
610
611 marc('500','a',
612         rec('305')
613 );
614
615 marc('500','a',
616         rec('307')
617 );
618
619 marc('500','a',
620         rec('314')
621 );
622
623 ### 502 - bilje¹ka o disertacijama
624 # odgovarajuæeg polja nema u originalnim podacima. mo¾da se mo¾e pretpostaviti?
625
626 ### 504
627
628 marc('504','a',
629         rec('320')
630 );
631
632 ## napomene uz konverziju polja 327 (sadrzaj):
633 # NSK konvertira 327 (NP) u 501 (R)
634 # u LOC konv. tablici stoji 327 (NP) u 505 (NR)
635 # standard i validacije dopu¹taju 501 (R) i 505 (R)
636
637 ## 505
638 # FFPS 327 - sadrzaj
639
640 if ( config() =~ m/ffps/ || config() =~ m/fftu/ ) {
641         marc_indicators('505', '0', ' ');
642         marc('505','a',
643                 regex('s/\s*[\\r\\n]+\s*\**\s*/ ; /g',
644                         rec('327')
645                 )       
646 );
647 }
648
649 if ( config() =~ m/ffan/ ) {
650         marc_indicators('505', '0', ' ');
651         marc('505','a',
652                 regex('s/[<>]//g',
653                         rec('330')
654                 )       
655 );
656 }
657
658
659 # NSK konvertira 330 (P) u 520 (P) = LOC konv. tablica
660
661
662 ### 520
663 # mo¾da i polje 520y - jezik napomene ako je uvijek isti jezik?
664
665 # FFPS 330 (NP) - sa¾etak
666 if ( config() =~ m/ffps/ ) { 
667         marc('520','a',
668                 regex('s/[\\r\\n]+/. /g',
669                         rec('330')
670                 )       
671         );
672 }
673
674 ### 526 - STUDY PROGRAM INFORMATION NOTE
675 # provjeriti za svaku bazu sta je tocno u 996?
676
677 marc_indicators('526', 8, ' ');
678
679 marc('526','a',
680         rec('996')
681 );
682
683 ### 538 - zahtjevi sustava
684
685 marc('538','a',
686         rec('337','a')
687 );
688
689
690 ### 246
691
692 marc_indicators('246', 1, 3);
693 marc('246','a',
694         rec('532')
695 );
696
697 ### 655
698
699 marc_indicators('655', ' ', 4);
700 marc('655','a',
701         rec('608')
702 );
703
704 ### 653
705
706 marc_indicators('653', 0, ' ');
707 marc('653','a',
708         rec('610')
709 );
710
711 #_debug(2);
712
713
714 ### 700
715
716 marc_indicators('700', 1, ' ');
717
718 if ( rec('701') ) { 
719 marc('700','4', 
720         'aut'
721 ); 
722 }
723
724 marc('700','a',
725         join_with(', ',
726                 rec('701', 'a'),
727                 rec('701', 'b')
728         )
729 );
730
731 marc('700','a',
732         join_with(', ',
733                 rec('701', 'c'),
734                 rec('701', 'd')
735         )
736 );
737
738 marc('700','a',
739         join_with(', ',
740                 rec('701', 'e'),
741                 rec('701', 'f')
742         )
743 );
744
745 marc('700','a',
746         join_with(', ',
747                 rec('701', 'g'),
748                 rec('701', 'h')
749         )
750 );
751
752
753 marc('700','a',
754         join_with(', ',
755                 rec('702', 'a'),
756                 rec('702', 'b')
757         )
758 );
759
760
761 # ako je u originalu ponovljivo polje treba biti i konvertirano u ponovljivo !!
762
763
764 marc('700','a',
765         join_with(', ',
766                 rec('702','c'),
767                 rec('702','d')
768         )
769 );
770
771 marc('700','a',
772         join_with(', ',
773                 rec('702','e'),
774                 rec('702','f')
775         )
776 );
777
778 marc('700','a',
779         join_with(', ',
780                 rec('702','g'),
781                 rec('702','h')
782         )
783 );
784
785 #_debug(0);
786
787
788 ### 740
789
790 marc_indicators('740', 0, ' ');
791
792 # if ( ! rec('464') ) {
793 # marc('740','a',
794 #       rec('200','c')
795 # );
796
797 marc('740','a',
798         rec('200','k')
799 );
800
801 # } else {
802
803 #marc('740','a',
804 #       rec('464','a')
805 #);
806
807 # };
808
809 # generiranje zapisa o nakladnièkoj cjelini i povezivanje podreðenog zapisa s nadreðenim
810
811 if (
812         rec('225','a')  # da li je nakladnièka cjelina?
813 ) {
814
815 my $series_key =
816 join_with('',
817         rec('225','a'),
818         rec('210','a'),
819         rec('210','b'),
820 );
821
822 my $series = get( $series_key );
823
824 if ($series) {
825         warn "nije novi";
826 } else {
827
828 $series = join_with('',
829         config(),
830         'LS',
831         rec('000')
832 );
833
834 set( $series_key => $series );
835
836 } # $series
837 } # nakladnièka cjelina
838
839 my $series_key = join_with('',
840         rec('225','a'),
841         rec('210','a'),
842         rec('210','b'),
843 );
844
845 if ($series_key) {
846
847         marc_indicators('760', 0, ' ');
848         
849         marc('760','w',
850                 get( $series_key )
851         );
852 }
853 ### testing
854 #
855 # my $dup_key = join_with('',
856 #       rec('200','a'),
857 #);
858 #
859 #if ($dup_key) {
860 #       marc('995','a',
861 #               get( $dup_key )
862 #       );
863 #}
864 #
865 #
866 # marc_indicators('776', 0, ' ');
867
868 # marc('776','a',
869 #       rec('452','1')
870 # );
871 #
872
873
874 ### 852 - lokacija
875
876 marc_indicators('852', 4, ' ');
877
878 marc('852','j',
879         join_with(' ',
880                 rec('990')
881         )
882 );
883
884 ### 876 - item information - basic bibliographic unit
885
886 marc('876','a',
887         rec('991'),
888 );
889
890 ### 886 - former marc
891
892 marc_indicators('886', 2, ' ');
893
894 marc('886','2',
895         'ffmarc'
896 );
897
898 marc('886','a',
899         '994'
900 );
901
902 marc('886','b',
903         join_with(''.
904                 '##^a',
905                 join_with('',
906                         prefix('^a',
907                                 rec('994','a'),
908                         ),
909                         prefix('^b',
910                                 rec('994','b')
911                         )
912                 )
913         )
914 );
915
916
917 } # polje 200a