enhanced_marc 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/Changes +1 -0
  2. data/LICENSE +21 -0
  3. data/README +51 -0
  4. data/Rakefile +41 -0
  5. data/VERSION +1 -0
  6. data/enhanced_marc-0.1.gem +0 -0
  7. data/enhanced_marc.gemspec +85 -0
  8. data/lib/enhanced_marc.rb +23 -0
  9. data/lib/enhanced_marc/book_record.rb +37 -0
  10. data/lib/enhanced_marc/book_type.rb +87 -0
  11. data/lib/enhanced_marc/computer_record.rb +37 -0
  12. data/lib/enhanced_marc/computer_type.rb +14 -0
  13. data/lib/enhanced_marc/leader.rb +132 -0
  14. data/lib/enhanced_marc/leftovers.rb +122 -0
  15. data/lib/enhanced_marc/map_record.rb +38 -0
  16. data/lib/enhanced_marc/map_type.rb +99 -0
  17. data/lib/enhanced_marc/mixed_record.rb +37 -0
  18. data/lib/enhanced_marc/mixed_type.rb +4 -0
  19. data/lib/enhanced_marc/reader.rb +105 -0
  20. data/lib/enhanced_marc/record.rb +96 -0
  21. data/lib/enhanced_marc/record_type.rb +310 -0
  22. data/lib/enhanced_marc/score_record.rb +38 -0
  23. data/lib/enhanced_marc/score_type.rb +4 -0
  24. data/lib/enhanced_marc/serial_record.rb +37 -0
  25. data/lib/enhanced_marc/serial_type.rb +87 -0
  26. data/lib/enhanced_marc/sound_record.rb +37 -0
  27. data/lib/enhanced_marc/sound_type.rb +4 -0
  28. data/lib/enhanced_marc/visual_record.rb +37 -0
  29. data/lib/enhanced_marc/visual_type.rb +38 -0
  30. data/lib/enhanced_marc/xmlreader.rb +58 -0
  31. data/pkg/enhanced_marc-0.1.gem +0 -0
  32. data/pkg/enhanced_marc-0.1.tgz +0 -0
  33. data/pkg/enhanced_marc-0.1.zip +0 -0
  34. data/pkg/enhanced_marc-0.1/Changes +1 -0
  35. data/pkg/enhanced_marc-0.1/LICENSE +21 -0
  36. data/pkg/enhanced_marc-0.1/README +51 -0
  37. data/pkg/enhanced_marc-0.1/Rakefile +41 -0
  38. data/pkg/enhanced_marc-0.1/test/ts_enhanced_marc.rb +5 -0
  39. data/test/ts_enhanced_marc.rb +5 -0
  40. metadata +113 -0
@@ -0,0 +1,310 @@
1
+ module RecordType
2
+
3
+ private
4
+
5
+ def is_govdoc?(human_readable=false)
6
+ govdoc_map={'a'=>'Autonomous or semiautonomous components', 'c'=>'Multilocal', 'f'=>'Federal',
7
+ 'i'=>'International', 'l'=>'Local', 'm'=>'Multistate', 'o'=>'Undetermined', 's'=>'State', 'u'=>'Unknown', 'z'=>'Other'}
8
+ human_readable = govdoc_map if human_readable
9
+ return self.field_parser({:match=>/^BKS$|^COM$|^MAP$|^SER$|^VIS$/, :start=>28,:end=>1}, {:match=>/[atmefsgkor]{1}/, :start=>11,:end=>1}, human_readable)
10
+ end
11
+
12
+ def nature_of_contents(human_readable=false)
13
+ cont_map = {'a'=>'Abstracts','b'=>'Bibliography','c'=>'Catalog','d'=>'Dictionary',
14
+ 'e'=>'Encyclopedia', 'f'=>'Handbook', 'g'=>'Legal article', 'h'=>'Biography', 'i'=>'Index',
15
+ 'j'=>'Patent document', 'k'=>'Discography', 'l'=>'Legislation', 'm'=>'Thesis', 'n'=>'Literature survey',
16
+ 'o'=>'Review', 'p'=>'Programmed text', 'q'=>'Filmography', 'r'=>'Directory', 's'=>'Statistics',
17
+ 't'=>'Technical report', 'u'=>'Standard/specification', 'v'=>'Legal case', 'w'=>'Law report', 'x'=>'Other report',
18
+ 'y'=>'Yearbook', 'z'=>'Treaty', '2'=>'Offprint', '5'=>'Calendar', '6'=>'Comic/Graphic Novel'}
19
+
20
+ contents = []
21
+ idx = nil
22
+ if self.record_type == 'BKS'
23
+ idx = 24
24
+ len = 4
25
+ elsif self.record_type == 'SER'
26
+ idx = 25
27
+ len = 3
28
+ end
29
+ if idx
30
+ self['008'].value[idx,len].split(//).each { | char |
31
+ next if char == " "
32
+ if human_readable
33
+ contents << cont_map[char] if cont_map[char]
34
+ else
35
+ contents << char
36
+ end
37
+ }
38
+ end
39
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
40
+ idx = nil
41
+ if fxd_fld.value[0,1].match(/[at]{1}/)
42
+ idx = 7
43
+ len = 4
44
+ elsif fxd_fld.value[0,1].match('s')
45
+ idx = 8
46
+ len = 3
47
+ end
48
+ if idx
49
+ fxd_fld.value[idx,len].split(//).each { | char |
50
+ next if char == " "
51
+ if human_readable
52
+ contents << cont_map[char] if cont_map[char]
53
+ else
54
+ contents << char
55
+ end
56
+ }
57
+ end
58
+ }
59
+ return false if contents.empty?
60
+ return contents
61
+ end
62
+
63
+
64
+ def is_conference?
65
+ return true if self['008'].value[29,1] == '1' && @record_type.match(/^BKS$|^SER$/)
66
+ return true if self['008'].value[30,2].match(/c/) && @record_type.match(/^SCO$|^REC$/)
67
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
68
+ return true if fxd_fld.value[12,1] == '1' && fxd_fld.value[0,1].match(/[ats]{1}/)
69
+
70
+ return true if fxd_fld.value[13,2].match(/c/) && fxd_fld.value[0,1].match(/[cdij]{1}/)
71
+ }
72
+ return false
73
+ end
74
+
75
+ def set_conference(value=false, field=nil)
76
+ if field
77
+ return Exception.new("Field is not an 006") unless field.tag == '006'
78
+ return Exception.new("Field is not a BKS or SER") unless field.value[0,1].match(/[ats]{1}/)
79
+ if value
80
+ field.value[12] = '1'
81
+ else
82
+ field.value[12] = '0'
83
+ end
84
+ else
85
+ field = @fields['008']
86
+ field = MARC::Controlfield.new('008') unless field
87
+ if value
88
+ field[29] = '1'
89
+ else
90
+ field[29] = '0'
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ def accompanying_matter(human_readable=false)
97
+ accm_map = {'a'=>'Discography','b'=>'Bibliography','c'=>'Thematic index','d'=>'Libretto',
98
+ 'e'=>'Composer biography', 'f'=>'Performer biography', 'g'=>'Technical/historical information on instruments',
99
+ 'h'=>'Technical information on music', 'i'=>'Historical information', 'j'=>'Historical information other than music',
100
+ 'k'=>'Ethnological information', 'n'=>'Not applicable', 'r'=>'Instructional materials', 's'=>'Music',
101
+ 'z'=>'Other accompanying matter'}
102
+ matter = []
103
+
104
+ if ['SCO', 'REC'].index(@record_type)
105
+ self['008'].value[24,6].split(//).each { | char |
106
+ next if char == " "
107
+ if human_readable
108
+ matter << accm_map[char] if accm_map[char]
109
+ else
110
+ matter << char
111
+ end
112
+ }
113
+ end
114
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
115
+
116
+ if fxd_fld.value[0,1].match(/[cdij]{1}/)
117
+ fxd_fld.value[7,6].split(//).each { | char |
118
+ next if char == " "
119
+ if human_readable
120
+ matter << accm_map[char]
121
+ else
122
+ matter << char
123
+ end
124
+ }
125
+ end
126
+ }
127
+ return false if matter.empty?
128
+ return matter
129
+ end
130
+
131
+ def audience_level(human_readable=false)
132
+ audn_map = {'a'=>'Preschool', 'b'=>'Children age 6-8', 'c'=>'Children age 9-13',
133
+ 'd'=>'Adolescent', 'e'=>'Adult', 'f'=>'Specialized', 'g'=>'General', 'j'=>'Juvenile'
134
+ }
135
+ human_readable = audn_map if human_readable
136
+ return self.field_parser({:match=>/^BKS$|^VIS$|^MIX$|^MAP$|^SCO$|^REC$|^COM$/, :start=>22,:end=>1}, {:match=>/[atmefpcdijgkor]{1}/, :start=>5,:end=>1}, human_readable)
137
+ end
138
+
139
+ def form(human_readable=false)
140
+ form_map = {'a'=>'Microfilm', 'b'=>'Microfiche', 'c'=>'Microopaque',
141
+ 'd'=>'Large print', 'f'=>'Braille', 'r'=>'Reproduction', 's'=>'Electronic'
142
+ }
143
+ idx = nil
144
+ if self.record_type.match(/^MAP$|^VIS$/)
145
+ idx = 29
146
+ else
147
+ idx = 23
148
+ end
149
+ unless self['008'].value[idx,1] == ' '
150
+ if human_readable
151
+ return form_map[self['008'].value[idx,1]]
152
+ else
153
+ return self['008'].value[idx,1]
154
+ end
155
+ end
156
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
157
+ idx = nil
158
+ if fxd_fld.value[0,1].match(/[efgkor]{1}/)
159
+ idx = 6
160
+ else
161
+ idx = 12
162
+ end
163
+ next if fxd_fld.value[idx,1] == ' '
164
+ if human_readable
165
+ return form_map[fxd_fld.value[idx,1]]
166
+ else
167
+ return fxd_fld.value[idx,1]
168
+ end
169
+ }
170
+ return false
171
+ end
172
+
173
+ def has_index?
174
+ return true if self['008'].value[31,1] == '1'
175
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
176
+ return true if fxd_fld.value[14,1] == '1'
177
+ }
178
+ return false
179
+ end
180
+
181
+ def composition_form(human_readable=false)
182
+ comp_map = {'an'=>'Anthem','bd'=>'Ballad','bt'=>'Ballet','bg'=>'Bluegrass music',
183
+ 'bl'=>'Blues','cn'=>'Canon or round','ct'=>'Catata','cz'=>'Canzona','cr'=>'Carol',
184
+ 'ca'=>'Chaconne','cs'=>'Chance composition','cp'=>'Polyphonic chanson','cc'=>'Christian chant',
185
+ 'cb'=>'Chant','cl'=>'Chorale prelude','ch'=>'Chorale','cg'=>'Concerti grossi','co'=>'Concerto',
186
+ 'cy'=>'Country music','df'=>'Dance form','dv'=>'Divertimento/serenade/cassation/divertissement/notturni',
187
+ 'ft'=>'Fantasia','fm'=>'Folk music','fg'=>'Fugue','gm'=>'Gospel music','hy'=>"Hymn",'jz'=>'Jazz',
188
+ 'md'=>'Madrigal','mr'=>'March','ms'=>'Mass','mz'=>'Mazurka','mi'=>'Minuet','mo'=>'Motet',
189
+ 'mp'=>'Motion picture music','mu'=>'Multiple forms','mc'=>'Musical revue/comedy',
190
+ 'nc'=>'Nocturne','nn'=>'Not a musical recording','op'=>'Opera','or'=>'Oratorio',
191
+ 'ov'=>'Overture','pt'=>'Part-song','ps'=>'Passacaglia','pm'=>'Passion music',
192
+ 'pv'=>'Pavanes','po'=>'Polonaises','pp'=>'Popular music','pr'=>'Prelude','pg'=>'Program music',
193
+ 'rg'=>'Ragtime music','rq'=>'Requiem','rp'=>'Rhapsody','ri'=>'Ricercars','rc'=>'Rock music',
194
+ 'rd'=>'Rondo','sn'=>'Sonata','sg'=>'Song','sd'=>'Square dance music','st'=>'Study/exercise',
195
+ 'su'=>'Suite','sp'=>'Symphonic poem','sy'=>'Symphony','tc'=>'Toccata','ts'=>'Trio-sonata',
196
+ 'uu'=>'Unknown','vr'=>'Variation','wz'=>'Waltz','zz'=>'Other'
197
+ }
198
+ if @record_type.match(/^SCO$|^REC$/)
199
+ unless self['008'].value[18,2] == ' '
200
+ if human_readable
201
+ return comp_map[self['008'].value[18,2]]
202
+ else
203
+ return self['008'].value[18,2]
204
+ end
205
+ end
206
+ end
207
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
208
+ next unless fxd_fld.value[0,1].match(/[cdij]{1}/)
209
+ unless fxd_fld.value[1,2] == ' '
210
+ if human_readable
211
+ return comp_map[fxd_fld.value[1,2]]
212
+ else
213
+ return fxd_fld.value[1,2]
214
+ end
215
+ end
216
+ }
217
+ return false
218
+ end
219
+
220
+ def music_format(human_readable=false)
221
+ fmus_map = {'a'=>'Full score','b'=>'Full score, miniature/study size','c'=>'Accompaniment reduced for keyboard',
222
+ 'd'=>'Voice score','e'=>'Condensed score','g'=>'Close score','m'=>'Multiple formats','n'=>'N/A',
223
+ 'u'=>'Unknown','z'=>'Other'}
224
+ human_readable = fmus_map if human_readable
225
+ return self.field_parser({:match=>/^SCO$|^REC$/, :start=>20,:end=>1}, {:match=>/[cdij]{1}/, :start=>3,:end=>1}, human_readable)
226
+ # if self.record_type.match(/^SCO$|^REC$/)
227
+ # unless self['008'].value[20,1] == ' '
228
+ # if human_readable
229
+ # return fmus_map[self['008'].value[20,1]]
230
+ # else
231
+ # return self['008'].value[20,1]
232
+ # end
233
+ # end
234
+ # end
235
+ ## @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
236
+ # next unless fxd_fld.value[0,1].match(/[cdij]{1}/)
237
+ # next if fxd_fld.value[3,1] == ' '
238
+ # if human_readable
239
+ # return fmus_map[fxd_fld.value[3,1]]
240
+ # else
241
+ # return fxd_fld.value[3,1]
242
+ # end
243
+ # }
244
+ # return false
245
+ end
246
+
247
+ def has_index?
248
+ return true if self['008'].value[31,1] == '1'
249
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
250
+ return true if fxd_fld.value[14,1] == '1'
251
+ }
252
+ return false
253
+ end
254
+
255
+ def literary_text(human_readable=true)
256
+ ltxt_map = {'a'=>'Autobiography', 'b'=>'Biography','c'=>'Conference proceeding','d'=>'Drama',
257
+ 'e'=>'Essay','f'=>'Fiction','g'=>'Reporting','h'=>'History','i'=>'Instruction','j'=>'Language instruction',
258
+ 'k'=>'Comedy','l'=>'Lecture/speech','m'=>'Memoir','n'=>'N/A','o'=>'Folktale','p'=>'Poetry','r'=>'Rehearsal',
259
+ 's'=>'Sounds','t'=>'Interview','z'=>'Other'}
260
+ txts = []
261
+
262
+ if ['SCO', 'REC'].index(@record_type)
263
+ self['008'].value[30,2].split(//).each { | char |
264
+ next if char == " "
265
+ if human_readable
266
+ txts << ltxt_map[char]
267
+ else
268
+ txts << char
269
+ end
270
+ }
271
+ end
272
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
273
+
274
+ if fxd_fld.value[0,1].match(/[cdij]{1}/)
275
+ fxd_fld.value[13,2].split(//).each { | char |
276
+ next if char == " "
277
+ if human_readable
278
+ txts << ltxt_map[char]
279
+ else
280
+ txts << char
281
+ end
282
+ }
283
+ end
284
+ }
285
+ return false if txts.empty?
286
+ return txts
287
+ end
288
+ protected
289
+ def field_parser(eight, six, human_readable_map=nil)
290
+ if self.record_type.match(eight[:match])
291
+ unless self['008'].value[eight[:start],eight[:end]] == ' '*eight[:end]
292
+ if human_readable_map
293
+ return human_readable_map[self['008'].value[eight[:start],eight[:end]]]
294
+ else
295
+ return self['008'].value[eight[:start],eight[:end]]
296
+ end
297
+ end
298
+ end
299
+ @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
300
+ next unless fxd_fld.value[0,1].match(six[:match])
301
+ next if fxd_fld.value[six[:start],six[:end]] == ' '*six[:end]
302
+ if human_readable_map
303
+ return human_readable_map[fxd_fld.value[six[:start],six[:end]]]
304
+ else
305
+ return fxd_fld.value[six[:start],six[:end]]
306
+ end
307
+ }
308
+ return false
309
+ end
310
+ end
@@ -0,0 +1,38 @@
1
+ module MARC
2
+
3
+ # A class that represents an individual MARC record. Every record
4
+ # is made up of a collection of MARC::Field objects.
5
+
6
+ class ScoreRecord < Record
7
+
8
+ def initialize
9
+ super
10
+ @leader[6] = 'c' if @leader[6,1] == ' '
11
+ @leader[7] = 'm' if @leader[7,1] == ' '
12
+ @record_type = 'SCO'
13
+ @bibliographic_level = @leader.get_blvl
14
+ self.extend ScoreType
15
+ self.inspect_fixed_fields
16
+ end
17
+
18
+ def is_valid_type?
19
+ return false unless @leader[6,1].match(/[cd]{1}/)
20
+ return true
21
+ end
22
+ def is_valid_blvl?
23
+ return true if @leader[7,1].match(/[acdim]{1}/) and @leader[6,1].match('d')
24
+ return true if @leader[7,1].match(/[abcdims]{1}/) and @leader[6,1].match('c')
25
+ return false
26
+ end
27
+ def self.new_from_record(record)
28
+ rec = ScoreRecord.new
29
+ record.instance_variables.each { | var |
30
+ rec.instance_variable_set(var, record.instance_variable_get(var))
31
+ }
32
+ return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
33
+ return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
34
+ return rec
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,4 @@
1
+ module ScoreType
2
+ include RecordType
3
+ public :accompanying_matter, :audience_level, :form, :composition_form, :music_format, :is_conference?
4
+ end
@@ -0,0 +1,37 @@
1
+ module MARC
2
+
3
+ # A class that represents an individual MARC record. Every record
4
+ # is made up of a collection of MARC::Field objects.
5
+
6
+ class SerialRecord < Record
7
+
8
+ def initialize
9
+ super
10
+ @leader[6] = 'a' if @leader[6,1] == ' '
11
+ @leader[7] = 's' if @leader[7,1] == ' '
12
+ @record_type = 'SER'
13
+ @bibliographic_level = @leader.get_blvl
14
+ self.extend SerialType
15
+ self.inspect_fixed_fields
16
+ end
17
+
18
+ def is_valid_type?
19
+ return false unless @leader[6,1].match('a')
20
+ return true
21
+ end
22
+ def is_valid_blvl?
23
+ return false unless @leader[7,1].match(/[bis]{1}/)
24
+ return true
25
+ end
26
+ def self.new_from_record(record)
27
+ rec = SerialRecord.new
28
+ record.instance_variables.each { | var |
29
+ rec.instance_variable_set(var, record.instance_variable_get(var))
30
+ }
31
+ return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
32
+ return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
33
+ return rec
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,87 @@
1
+ module SerialType
2
+ include RecordType
3
+ public :is_govdoc?, :nature_of_contents, :is_conference?, :form
4
+ def alphabet(human_readable=false)
5
+ alph_map = {'a'=>'Roman', 'b'=>'Extended Roman', 'c'=>'Cyrillic',
6
+ 'd'=>'Japanese', 'e'=>'Chinese', 'f'=>'Arabic', 'g'=>'Greek',
7
+ 'h'=>'Hebrew', 'i'=>'Thai', 'j'=>'Devanagari', 'k'=>'Korean', 'l'=>'Tamil',
8
+ 'u'=>'Unknown', 'z'=>'Other'
9
+ }
10
+ human_readable = alph_map if human_readable
11
+ return self.field_parser({:match=>'SER', :start=>33,:end=>1}, {:match=>'s', :start=>16,:end=>1}, human_readable)
12
+ end
13
+
14
+ def frequency(human_readable=false)
15
+ freq_map = {'a'=>'Annual','b'=>'Bimonthly','c'=>'Semiweekly','d'=>'Daily',
16
+ 'e'=>'Biweekly','f'=>'Semiannual','g'=>'Biennial','h'=>'Triennial','i'=>'3 times/week',
17
+ 'j'=>'3 times/month', 'k'=>'Continuously updated','m'=>'Monthly','q'=>'Quarterly',
18
+ 's'=>'Semimonthly','t'=>'3 times/year','u'=>'Unknown','w'=>'Weekly','z'=>'Other'
19
+ }
20
+ human_readable = freq_map if human_readable
21
+ resp = self.field_parser({:match=>'SER', :start=>18,:end=>1}, {:match=>'s', :start=>1,:end=>1}, human_readable)
22
+ return resp if resp
23
+ if human_readable
24
+ return 'No determinable frequency'
25
+ else
26
+ return false
27
+ end
28
+ end
29
+
30
+ def regularity(human_readable=false)
31
+ regl_map = {'n'=>'Normalized irregular','r'=>'Regular','u'=>'Unknown','x'=>'Completely irregular'}
32
+ human_readable = regl_map if human_readable
33
+ return self.field_parser({:match=>'SER', :start=>19,:end=>1}, {:match=>'s', :start=>2,:end=>1}, human_readable)
34
+ end
35
+
36
+ def serial_type(human_readable=false)
37
+ srtp_map = {'d'=>'Database','l'=>'Loose-leaf','m'=>'Monographic series','n'=>'Newspaper','p'=>'Periodical','w'=>'Website'}
38
+ human_readable = srtp_map if human_readable
39
+ resp = self.field_parser({:match=>'SER', :start=>21,:end=>1}, {:match=>'s', :start=>4,:end=>1}, human_readable)
40
+ return resp if resp
41
+ if human_readable
42
+ return 'Other'
43
+ else
44
+ return false
45
+ end
46
+ end
47
+
48
+ def original_form(human_readable=false)
49
+ orig_map = {'a'=>'Microfilm','b'=>'Microfiche','c'=>'Microopaque','d'=>'Large print',
50
+ 'e'=>'Newspaper format','f'=>'Braille','s'=>'Electronic'}
51
+ human_readable = orig_map if human_readable
52
+ resp = self.field_parser({:match=>'SER', :start=>22,:end=>1}, {:match=>'s', :start=>5,:end=>1}, human_readable)
53
+ return resp if resp
54
+
55
+ if human_readable
56
+ return 'Other'
57
+ else
58
+ return false
59
+ end
60
+
61
+ end
62
+
63
+ def nature_of_work(human_readable=false)
64
+ entw_map = {'a'=>'Abstracts','b'=>'Bibliography','c'=>'Catalog','d'=>'Dictionary',
65
+ 'e'=>'Encyclopedia', 'f'=>'Handbook', 'g'=>'Legal article', 'h'=>'Biography', 'i'=>'Index',
66
+ 'j'=>'Patent document', 'k'=>'Discography', 'l'=>'Legislation', 'm'=>'Thesis', 'n'=>'Literature survey',
67
+ 'o'=>'Review', 'p'=>'Programmed text', 'q'=>'Filmography', 'r'=>'Directory', 's'=>'Statistics',
68
+ 't'=>'Technical report', 'u'=>'Standard/specification', 'v'=>'Legal case', 'w'=>'Law report', 'x'=>'Other report',
69
+ 'z'=>'Treaty'}
70
+
71
+ human_readable = entw_map if human_readable
72
+ resp = self.field_parser({:match=>'SER', :start=>24,:end=>1}, {:match=>'s', :start=>7,:end=>1}, human_readable)
73
+ return resp if resp
74
+ if human_readable
75
+ return 'Not specified'
76
+ else
77
+ return false
78
+ end
79
+
80
+ end
81
+
82
+ def entry(human_readable=false)
83
+ entry_map = {'0'=>'Successive','1'=>'Latest','2'=>'Integrated'}
84
+ human_readable = entry_map if human_readable
85
+ return self.field_parser({:match=>'SER', :start=>34,:end=>1}, {:match=>'s', :start=>17,:end=>1}, human_readable)
86
+ end
87
+ end