improving fingerprinter -- taking language into account, adding fixed field extractor
[Evergreen.git] / Open-ILS / src / javascript / backend / catalog / record_type.js
1
2 var rec_type = {
3         BKS : { Type : /[at]{1}/,       BLvl : /[acdm]{1}/ },
4         SER : { Type : /[a]{1}/,        BLvl : /[bs]{1}/ },
5         VIS : { Type : /[gkro]{1}/,     BLvl : /[abcdms]{1}/ },
6         MIX : { Type : /[p]{1}/,        BLvl : /[cd]{1}/ },
7         MAP : { Type : /[ef]{1}/,       BLvl : /[abcdms]{1}/ },
8         SCO : { Type : /[cd]{1}/,       BLvl : /[abcdms]{1}/ },
9         REC : { Type : /[ij]{1}/,       BLvl : /[abcdms]{1}/ },
10         COM : { Type : /[m]{1}/,        BLvl : /[abcdms]{1}/ }
11 };
12
13 var ff_pos = {
14         Ctry : {
15                 _8 : {
16                         BKS : {start : 15, len : 3, def : ' ' },
17                         SER : {start : 15, len : 3, def : ' ' },
18                         VIS : {start : 15, len : 3, def : ' ' },
19                         MIX : {start : 15, len : 3, def : ' ' },
20                         MAP : {start : 15, len : 3, def : ' ' },
21                         SCO : {start : 15, len : 3, def : ' ' },
22                         REC : {start : 15, len : 3, def : ' ' },
23                         COM : {start : 15, len : 3, def : ' ' },
24                 }
25         },
26         Lang : {
27                 _8 : {
28                         BKS : {start : 35, len : 3, def : ' ' },
29                         SER : {start : 35, len : 3, def : ' ' },
30                         VIS : {start : 35, len : 3, def : ' ' },
31                         MIX : {start : 35, len : 3, def : ' ' },
32                         MAP : {start : 35, len : 3, def : ' ' },
33                         SCO : {start : 35, len : 3, def : ' ' },
34                         REC : {start : 35, len : 3, def : ' ' },
35                         COM : {start : 35, len : 3, def : ' ' },
36                 }
37         },
38         MRec : {
39                 _8 : {
40                         BKS : {start : 38, len : 1, def : ' ' },
41                         SER : {start : 38, len : 1, def : ' ' },
42                         VIS : {start : 38, len : 1, def : ' ' },
43                         MIX : {start : 38, len : 1, def : ' ' },
44                         MAP : {start : 38, len : 1, def : ' ' },
45                         SCO : {start : 38, len : 1, def : ' ' },
46                         REC : {start : 38, len : 1, def : ' ' },
47                         COM : {start : 38, len : 1, def : ' ' },
48                 }
49         },
50         DtSt : {
51                 _8 : {
52                         BKS : {start : 6, len : 1, def : ' ' },
53                         SER : {start : 6, len : 1, def : 'c' },
54                         VIS : {start : 6, len : 1, def : ' ' },
55                         MIX : {start : 6, len : 1, def : ' ' },
56                         MAP : {start : 6, len : 1, def : ' ' },
57                         SCO : {start : 6, len : 1, def : ' ' },
58                         REC : {start : 6, len : 1, def : ' ' },
59                         COM : {start : 6, len : 1, def : ' ' },
60                 }
61         },
62         Type : {
63                 ldr : {
64                         BKS : {start : 6, len : 1, def : 'a' },
65                         SER : {start : 6, len : 1, def : 'a' },
66                         VIS : {start : 6, len : 1, def : 'g' },
67                         MIX : {start : 6, len : 1, def : 'p' },
68                         MAP : {start : 6, len : 1, def : 'e' },
69                         SCO : {start : 6, len : 1, def : 'c' },
70                         REC : {start : 6, len : 1, def : 'i' },
71                         COM : {start : 6, len : 1, def : 'm' },
72                 }
73         },
74         Ctrl : {
75                 ldr : {
76                         BKS : {start : 8, len : 1, def : ' ' },
77                         SER : {start : 8, len : 1, def : ' ' },
78                         VIS : {start : 8, len : 1, def : ' ' },
79                         MIX : {start : 8, len : 1, def : ' ' },
80                         MAP : {start : 8, len : 1, def : ' ' },
81                         SCO : {start : 8, len : 1, def : ' ' },
82                         REC : {start : 8, len : 1, def : ' ' },
83                         COM : {start : 8, len : 1, def : ' ' },
84                 }
85         },
86         BLvl : {
87                 ldr : {
88                         BKS : {start : 7, len : 1, def : 'm' },
89                         SER : {start : 7, len : 1, def : 's' },
90                         VIS : {start : 7, len : 1, def : 'm' },
91                         MIX : {start : 7, len : 1, def : 'c' },
92                         MAP : {start : 7, len : 1, def : 'm' },
93                         SCO : {start : 7, len : 1, def : 'm' },
94                         REC : {start : 7, len : 1, def : 'm' },
95                         COM : {start : 7, len : 1, def : 'm' },
96                 }
97         },
98         Desc : {
99                 ldr : {
100                         BKS : {start : 18, len : 1, def : ' ' },
101                         SER : {start : 18, len : 1, def : ' ' },
102                         VIS : {start : 18, len : 1, def : ' ' },
103                         MIX : {start : 18, len : 1, def : ' ' },
104                         MAP : {start : 18, len : 1, def : ' ' },
105                         SCO : {start : 18, len : 1, def : ' ' },
106                         REC : {start : 18, len : 1, def : ' ' },
107                         COM : {start : 18, len : 1, def : ' ' },
108                 }
109         },
110         ELvl : {
111                 ldr : {
112                         BKS : {start : 17, len : 1, def : ' ' },
113                         SER : {start : 17, len : 1, def : ' ' },
114                         VIS : {start : 17, len : 1, def : ' ' },
115                         MIX : {start : 17, len : 1, def : ' ' },
116                         MAP : {start : 17, len : 1, def : ' ' },
117                         SCO : {start : 17, len : 1, def : ' ' },
118                         REC : {start : 17, len : 1, def : ' ' },
119                         COM : {start : 17, len : 1, def : ' ' },
120                 }
121         },
122         Indx : {
123                 _8 : {
124                         BKS : {start : 31, len : 1, def : '0' },
125                         MAP : {start : 31, len : 1, def : '0' },
126                 },
127                 _6 : {
128                         BKS : {start : 14, len : 1, def : '0' },
129                         MAP : {start : 14, len : 1, def : '0' },
130                 }
131         },
132         Date1 : {
133                 _8 : {
134                         BKS : {start : 7, len : 4, def : ' ' },
135                         SER : {start : 7, len : 4, def : ' ' },
136                         VIS : {start : 7, len : 4, def : ' ' },
137                         MIX : {start : 7, len : 4, def : ' ' },
138                         MAP : {start : 7, len : 4, def : ' ' },
139                         SCO : {start : 7, len : 4, def : ' ' },
140                         REC : {start : 7, len : 4, def : ' ' },
141                         COM : {start : 7, len : 4, def : ' ' },
142                 },
143         },
144         Date2 : {
145                 _8 : {
146                         BKS : {start : 11, len : 4, def : ' ' },
147                         SER : {start : 11, len : 4, def : '9' },
148                         VIS : {start : 11, len : 4, def : ' ' },
149                         MIX : {start : 11, len : 4, def : ' ' },
150                         MAP : {start : 11, len : 4, def : ' ' },
151                         SCO : {start : 11, len : 4, def : ' ' },
152                         REC : {start : 11, len : 4, def : ' ' },
153                         COM : {start : 11, len : 4, def : ' ' },
154                 },
155         },
156         LitF : {
157                 _8 : {
158                         BKS : {start : 33, len : 1, def : '0' },
159                 },
160                 _6 : {
161                         BKS : {start : 16, len : 1, def : '0' },
162                 }
163         },
164         Biog : {
165                 _8 : {
166                         BKS : {start : 34, len : 1, def : ' ' },
167                 },
168                 _6 : {
169                         BKS : {start : 17, len : 1, def : ' ' },
170                 }
171         },
172         Ills : {
173                 _8 : {
174                         BKS : {start : 18, len : 4, def : ' ' },
175                 },
176                 _6 : {
177                         BKS : {start : 1, len : 4, def : ' ' },
178                 }
179         },
180         Fest : {
181                 _8 : {
182                         BKS : {start : 30, len : 1, def : '0' },
183                 },
184                 _6 : {
185                         BKS : {start : 13, len : 1, def : '0' },
186                 }
187         },
188         Conf : {
189                 _8 : {
190                         BKS : {start : 24, len : 4, def : ' ' },
191                         SER : {start : 25, len : 3, def : ' ' },
192                 },
193                 _6 : {
194                         BKS : {start : 7, len : 4, def : ' ' },
195                         SER : {start : 8, len : 3, def : ' ' },
196                 }
197         },
198         GPub : {
199                 _8 : {
200                         BKS : {start : 28, len : 1, def : ' ' },
201                         SER : {start : 28, len : 1, def : ' ' },
202                         VIS : {start : 28, len : 1, def : ' ' },
203                         MAP : {start : 28, len : 1, def : ' ' },
204                         COM : {start : 28, len : 1, def : ' ' },
205                 },
206                 _6 : {
207                         BKS : {start : 11, len : 1, def : ' ' },
208                         SER : {start : 11, len : 1, def : ' ' },
209                         VIS : {start : 11, len : 1, def : ' ' },
210                         MAP : {start : 11, len : 1, def : ' ' },
211                         COM : {start : 11, len : 1, def : ' ' },
212                 }
213         },
214         Audn : {
215                 _8 : {
216                         BKS : {start : 22, len : 1, def : ' ' },
217                         SER : {start : 22, len : 1, def : ' ' },
218                         VIS : {start : 22, len : 1, def : ' ' },
219                         SCO : {start : 22, len : 1, def : ' ' },
220                         REC : {start : 22, len : 1, def : ' ' },
221                         COM : {start : 22, len : 1, def : ' ' },
222                 },
223                 _6 : {
224                         BKS : {start : 5, len : 1, def : ' ' },
225                         SER : {start : 5, len : 1, def : ' ' },
226                         VIS : {start : 5, len : 1, def : ' ' },
227                         SCO : {start : 5, len : 1, def : ' ' },
228                         REC : {start : 5, len : 1, def : ' ' },
229                         COM : {start : 5, len : 1, def : ' ' },
230                 }
231         },
232         Form : {
233                 _8 : {
234                         BKS : {start : 23, len : 1, def : ' ' },
235                         SER : {start : 23, len : 1, def : ' ' },
236                         VIS : {start : 29, len : 1, def : ' ' },
237                         MIX : {start : 23, len : 1, def : ' ' },
238                         MAP : {start : 29, len : 1, def : ' ' },
239                         SCO : {start : 23, len : 1, def : ' ' },
240                         REC : {start : 23, len : 1, def : ' ' },
241                 },
242                 _6 : {
243                         BKS : {start : 6, len : 1, def : ' ' },
244                         SER : {start : 6, len : 1, def : ' ' },
245                         VIS : {start : 12, len : 1, def : ' ' },
246                         MIX : {start : 6, len : 1, def : ' ' },
247                         MAP : {start : 12, len : 1, def : ' ' },
248                         SCO : {start : 6, len : 1, def : ' ' },
249                         REC : {start : 6, len : 1, def : ' ' },
250                 }
251         },
252         'S/L' : {
253                 _8 : {
254                         SER : {start : 34, len : 1, def : '0' },
255                 },
256                 _6 : {
257                         SER : {start : 17, len : 1, def : '0' },
258                 }
259         },
260         'Alph' : {
261                 _8 : {
262                         SER : {start : 33, len : 1, def : ' ' },
263                 },
264                 _6 : {
265                         SER : {start : 16, len : 1, def : ' ' },
266                 }
267         },
268 };
269
270 function recordType (rec) {
271
272         var marcns = new Namespace("http://www.loc.gov/MARC21/slim");
273         var _l = rec.marcns::leader.toString();
274
275         var _t = _l.substr(ff_pos.Type.ldr.BKS.start, ff_pos.Type.ldr.BKS.len);
276         var _b = _l.substr(ff_pos.BLvl.ldr.BKS.start, ff_pos.BLvl.ldr.BKS.len);
277
278         for (var t in rec_type) {
279                 if (_t.match(rec_type[t].Type) && _b.match(rec_type[t].BLvl)) {
280                         return t;
281                 }
282         }
283 }
284
285 function extractFixedField (rec, field) {
286
287         var marcns = new Namespace("http://www.loc.gov/MARC21/slim");
288         var _l = rec.marcns::leader.toString();
289         var _8 = rec.marcns::controlfield.(@tag.match(/008/)).text().toString();
290         var _6 = rec.marcns::controlfield.(@tag.match(/006/)).text().toString();
291         var _7 = rec.marcns::controlfield.(@tag.match(/007/)).text().toString();
292
293         var rtype = recordType(rec);
294
295         var val;
296
297         if (ff_pos[field].ldr) {
298                 val = _l.substr(
299                         ff_pos[field].ldr[rtype].start,
300                         ff_pos[field].ldr[rtype].len
301                 );
302         } else if (ff_pos[field]._8) {
303                 val = _8.substr(
304                         ff_pos[field]._8[rtype].start,
305                         ff_pos[field]._8[rtype].len
306                 );
307         }
308
309         if (!val && ff_pos[field]._6) {
310                 val = _6.substr(
311                         ff_pos[field]._6[rtype].start,
312                         ff_pos[field]._6[rtype].len
313                 );
314         }
315                 
316         return val;
317 }
318