enhanced_marc 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +12 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Changes +2 -1
- data/Gemfile +9 -0
- data/README.md +59 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/enhanced_marc.gemspec +3 -39
- data/lib/enhanced_marc.rb +0 -1
- data/lib/enhanced_marc/book_record.rb +26 -21
- data/lib/enhanced_marc/book_type.rb +76 -62
- data/lib/enhanced_marc/computer_record.rb +27 -22
- data/lib/enhanced_marc/computer_type.rb +14 -11
- data/lib/enhanced_marc/leader.rb +99 -101
- data/lib/enhanced_marc/map_record.rb +31 -23
- data/lib/enhanced_marc/map_type.rb +27 -23
- data/lib/enhanced_marc/record.rb +5 -2
- data/lib/enhanced_marc/record_type.rb +87 -96
- data/lib/enhanced_marc/score_type.rb +3 -2
- data/lib/enhanced_marc/serial_type.rb +19 -19
- data/lib/enhanced_marc/sound_type.rb +3 -2
- data/lib/enhanced_marc/visual_type.rb +9 -9
- data/pkg/enhanced_marc-0.1.5.gem +0 -0
- data/pkg/enhanced_marc-0.1.gem +0 -0
- data/pkg/enhanced_marc-0.1.tgz +0 -0
- data/pkg/enhanced_marc-0.1.zip +0 -0
- data/pkg/enhanced_marc-0.1/Changes +1 -0
- data/pkg/enhanced_marc-0.1/LICENSE +21 -0
- data/{README → pkg/enhanced_marc-0.1/README} +2 -2
- data/pkg/enhanced_marc-0.1/Rakefile +23 -0
- data/pkg/enhanced_marc-0.1/test/ts_enhanced_marc.rb +5 -0
- metadata +61 -67
- data/lib/enhanced_marc/xmlreader.rb +0 -58
@@ -1,14 +1,17 @@
|
|
1
|
+
# Methods for Computer records
|
1
2
|
module ComputerType
|
2
3
|
include RecordType
|
3
|
-
public :form, :audience_level, :is_govdoc?
|
4
|
-
def file_type(human_readable=false)
|
5
|
-
return false unless
|
6
|
-
file_map = {'a'=>'Numeric data', 'b'=>'Computer program',
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
public :form, :audience_level, :is_govdoc?, :govdoc?, :conference?
|
5
|
+
def file_type(human_readable = false)
|
6
|
+
return false unless contains_type?('COM')
|
7
|
+
file_map = { 'a' => 'Numeric data', 'b' => 'Computer program',
|
8
|
+
'c' => 'Representational', 'd' => 'Document',
|
9
|
+
'e' => 'Bibliographic data', 'f' => 'Font', 'g' => 'Game',
|
10
|
+
'h' => 'Sounds', 'i' => 'Interactive multimedia',
|
11
|
+
'j' => 'Online', 'm' => 'Combination', 'u' => 'Unknown',
|
12
|
+
'z' => 'Other' }
|
10
13
|
human_readable = file_map if human_readable
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
14
|
+
field_parser({ match: 'COM', start: 26, end: 1 },
|
15
|
+
{ match: 'm', start: 9, end: 1 }, human_readable)
|
16
|
+
end
|
17
|
+
end
|
data/lib/enhanced_marc/leader.rb
CHANGED
@@ -1,132 +1,130 @@
|
|
1
1
|
module MARC
|
2
|
-
|
2
|
+
|
3
3
|
# A class for accessing the MARC Leader
|
4
4
|
class Leader < String
|
5
|
-
attr_reader :leader, :
|
5
|
+
attr_reader :leader, :fixed_fields
|
6
6
|
def initialize(leader)
|
7
|
-
super
|
7
|
+
super
|
8
8
|
# leader defaults:
|
9
9
|
# http://www.loc.gov/marc/bibliographic/ecbdldrd.html
|
10
10
|
self[10..11] = '22'
|
11
|
-
self[20..23] = '4500'
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse_leader
|
15
|
-
self.get_type
|
16
|
-
self.get_blvl
|
17
|
-
self.get_elvl
|
11
|
+
self[20..23] = '4500'
|
18
12
|
end
|
19
|
-
|
20
|
-
def
|
21
|
-
|
13
|
+
|
14
|
+
def type_code
|
15
|
+
self[6, 1]
|
22
16
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
|
18
|
+
alias get_type_code type_code
|
19
|
+
|
20
|
+
def blvl_code
|
21
|
+
self[7, 1]
|
26
22
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
|
24
|
+
alias get_blvl_code blvl_code
|
25
|
+
|
26
|
+
def record_type
|
27
|
+
type_translator(get_type_code, get_blvl_code)
|
30
28
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
|
30
|
+
alias get_type record_type
|
31
|
+
|
32
|
+
def archival?
|
33
|
+
return true if self[8, 1] == 'a'
|
34
|
+
false
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
alias is_archival? archival?
|
38
|
+
|
39
|
+
def blvl
|
38
40
|
blvls = {
|
39
|
-
'a'=>'Monographic component part',
|
40
|
-
'b'=>'Serial component part',
|
41
|
-
'c'=>'Collection',
|
42
|
-
'd'=>'Subunit',
|
43
|
-
'i'=>'Integrating resource',
|
44
|
-
'm'=>'Monograph/Item',
|
45
|
-
's'=>'Serial'
|
41
|
+
'a' => 'Monographic component part',
|
42
|
+
'b' => 'Serial component part',
|
43
|
+
'c' => 'Collection',
|
44
|
+
'd' => 'Subunit',
|
45
|
+
'i' => 'Integrating resource',
|
46
|
+
'm' => 'Monograph/Item',
|
47
|
+
's' => 'Serial'
|
46
48
|
}
|
47
|
-
|
49
|
+
blvls[get_blvl_code]
|
48
50
|
end
|
49
51
|
|
50
|
-
|
52
|
+
alias bibliographic_level blvl
|
53
|
+
alias get_blvl blvl
|
54
|
+
|
55
|
+
def record_type=(type)
|
51
56
|
if type.length == 1
|
52
|
-
translated_type =
|
53
|
-
raise ArgumentError,
|
57
|
+
translated_type = types(type)
|
58
|
+
raise ArgumentError, 'Invalid Type' if translated_type.nil?
|
54
59
|
elsif type.length > 1
|
55
|
-
|
56
|
-
|
57
|
-
raise ArgumentError, "Invalid Type" if type.nil?
|
60
|
+
type = types(type)
|
61
|
+
raise ArgumentError, 'Invalid Type' if type.nil?
|
58
62
|
else
|
59
|
-
raise ArgumentError,
|
60
|
-
end
|
61
|
-
self[6] = type
|
63
|
+
raise ArgumentError, 'Invalid Type'
|
64
|
+
end
|
65
|
+
self[6] = type
|
62
66
|
end
|
63
|
-
|
67
|
+
|
68
|
+
alias set_type record_type=
|
69
|
+
|
64
70
|
def type_translator(type_code, blvl_code)
|
65
|
-
valid_types = [
|
66
|
-
unless valid_types.index(type_code)
|
67
|
-
|
68
|
-
return
|
69
|
-
end
|
71
|
+
valid_types = %w[a t g k r o p e f c d i j m]
|
72
|
+
raise ArgumentError, 'Invalid Type!' unless valid_types.index(type_code)
|
73
|
+
|
70
74
|
rec_types = {
|
71
|
-
'BKS' => { :
|
72
|
-
|
73
|
-
'VIS' => { :
|
74
|
-
'MIX' => { :
|
75
|
-
'MAP' => { :
|
76
|
-
'SCO' => { :
|
77
|
-
'REC' => { :
|
78
|
-
'COM' => { :
|
79
|
-
}
|
80
|
-
|
81
|
-
rec_types.each_key { | type |
|
82
|
-
return type if type_code.match(rec_types[type][:type]) and blvl_code.match(rec_types[type][:blvl])
|
83
|
-
}
|
84
|
-
raise ArgumentError, "Invalid BLvl!"
|
85
|
-
return nil
|
86
|
-
end
|
87
|
-
|
88
|
-
def get_elvl_code
|
89
|
-
return self[17,1]
|
90
|
-
end
|
91
|
-
|
92
|
-
def get_elvl
|
93
|
-
elvls = {
|
94
|
-
' '=>'Full',
|
95
|
-
'1'=>'Full, not examined',
|
96
|
-
'2'=>'Less-than-full',
|
97
|
-
'3'=>'Abbreviated',
|
98
|
-
'4'=>'Core',
|
99
|
-
'5'=>'Partial',
|
100
|
-
'7'=>'Minimal',
|
101
|
-
'8'=>'Prepublication',
|
102
|
-
'I'=>'Full-level input by OCLC participants',
|
103
|
-
'K'=>'Less-than-full input by OCLC participants',
|
104
|
-
'L'=>'Full-level input added from a batch process',
|
105
|
-
'M'=>'Less-than-full added from a batch process',
|
106
|
-
'E'=>'System-identified MARC error in batchloaded record',
|
107
|
-
'J'=>'Deleted record'
|
75
|
+
'BKS' => { type: /[at]{1}/, blvl: /[acdm]{1}/ },
|
76
|
+
'SER' => { type: /[a]{1}/, blvl: /[bs]{1}/ },
|
77
|
+
'VIS' => { type: /[gkro]{1}/, blvl: /[abcdims]{1}/ },
|
78
|
+
'MIX' => { type: /[p]{1}/, blvl: /[cd]{1}/ },
|
79
|
+
'MAP' => { type: /[ef]{1}/, blvl: /[abcdims]{1}/ },
|
80
|
+
'SCO' => { type: /[cd]{1}/, blvl: /[abcdims]{1}/ },
|
81
|
+
'REC' => { type: /[ij]{1}/, blvl: /[abcdims]{1}/ },
|
82
|
+
'COM' => { type: /[m]{1}/, blvl: /[abcdims]{1}/ }
|
108
83
|
}
|
109
|
-
|
84
|
+
|
85
|
+
rec_types.each_key do |type|
|
86
|
+
if type_code.match(rec_types[type][:type]) && blvl_code.match(rec_types[type][:blvl])
|
87
|
+
return type
|
88
|
+
end
|
89
|
+
end
|
90
|
+
raise ArgumentError, 'Invalid BLvl!'
|
110
91
|
end
|
111
|
-
|
112
|
-
def
|
113
|
-
self
|
114
|
-
return @encoding_level
|
92
|
+
|
93
|
+
def elvl_code
|
94
|
+
self[17, 1]
|
115
95
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
96
|
+
alias get_elvl_code elvl_code
|
97
|
+
|
98
|
+
def elvl
|
99
|
+
elvls = { ' ' => 'Full', '1' => 'Full, not examined',
|
100
|
+
'2' => 'Less-than-full', '3' => 'Abbreviated',
|
101
|
+
'4' => 'Core', '5' => 'Partial', '7' => 'Minimal',
|
102
|
+
'8' => 'Prepublication', 'J' => 'Deleted record',
|
103
|
+
'I' => 'Full-level input by OCLC participants',
|
104
|
+
'K' => 'Less-than-full input by OCLC participants',
|
105
|
+
'L' => 'Full-level input added from a batch process',
|
106
|
+
'M' => 'Less-than-full added from a batch process',
|
107
|
+
'E' => 'System-identified MARC error in batchloaded record' }
|
108
|
+
elvls[get_elvl_code]
|
119
109
|
end
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
110
|
+
alias encoding_level elvl
|
111
|
+
alias ELvl elvl
|
112
|
+
alias get_elvl elvl
|
113
|
+
|
114
|
+
def desc_code
|
115
|
+
self[18, 1]
|
124
116
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
117
|
+
|
118
|
+
alias get_desc_code desc_code
|
119
|
+
|
120
|
+
def desc
|
121
|
+
codes = {
|
122
|
+
' ' => 'Non-ISBD', 'a' => 'AACR2', 'i' => 'ISBD', 'u' => 'Unknown'
|
123
|
+
}
|
124
|
+
codes[get_desc_code]
|
129
125
|
end
|
130
|
-
|
126
|
+
alias descriptive_cataloging_form desc
|
127
|
+
alias Desc desc
|
128
|
+
alias get_desc desc
|
131
129
|
end
|
132
130
|
end
|
@@ -1,38 +1,46 @@
|
|
1
1
|
module MARC
|
2
2
|
|
3
3
|
# A class that represents an individual MARC record. Every record
|
4
|
-
# is made up of a collection of MARC::Field objects.
|
5
|
-
|
4
|
+
# is made up of a collection of MARC::Field objects.
|
6
5
|
class MapRecord < Record
|
7
6
|
|
8
7
|
def initialize
|
9
8
|
super
|
10
|
-
@leader[6] = 'e' if @leader[6,1] == ' '
|
11
|
-
@leader[7] = 'm' if @leader[7,1] == ' '
|
12
|
-
@record_type = 'MAP'
|
9
|
+
@leader[6] = 'e' if @leader[6, 1] == ' '
|
10
|
+
@leader[7] = 'm' if @leader[7, 1] == ' '
|
11
|
+
@record_type = 'MAP'
|
13
12
|
@bibliographic_level = @leader.get_blvl
|
14
|
-
|
15
|
-
|
13
|
+
extend MapType
|
14
|
+
inspect_fixed_fields
|
16
15
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
return false unless @leader[6,1]
|
20
|
-
|
16
|
+
|
17
|
+
def valid_type?
|
18
|
+
return false unless @leader[6, 1] =~ /[ef]{1}/
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
alias is_valid_type? valid_type?
|
22
|
+
def valid_blvl?
|
23
|
+
if @leader[7, 1] =~ /[acdim]{1}/ && @leader[6, 1] == 'f'
|
24
|
+
true
|
25
|
+
elsif @leader[7, 1] =~ /[abcdims]{1}/ && @leader[6, 1] == 'e'
|
26
|
+
true
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
26
30
|
end
|
31
|
+
alias is_valid_blvl? valid_blvl?
|
27
32
|
def self.new_from_record(record)
|
28
33
|
rec = MapRecord.new
|
29
|
-
record.instance_variables.each
|
34
|
+
record.instance_variables.each do |var|
|
30
35
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
end
|
37
|
+
error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
|
38
|
+
if !error && !rec.valid_blvl?
|
39
|
+
error = 'Incorrect bibliographic declaration in leader'
|
40
|
+
end
|
41
|
+
return Exception.new(error) if error
|
42
|
+
rec
|
43
|
+
end
|
44
|
+
|
37
45
|
end
|
38
|
-
end
|
46
|
+
end
|
@@ -1,22 +1,26 @@
|
|
1
|
+
# Methods for Map records
|
1
2
|
module MapType
|
2
3
|
include RecordType
|
3
|
-
public :is_govdoc?, :form, :has_index?
|
4
|
-
def cartographic_type(human_readable=false)
|
5
|
-
crtp_map = {'a'=>'Map', 'b'=>'Map series', 'c'=>'Map serial',
|
6
|
-
|
4
|
+
public :is_govdoc?, :form, :has_index?, :govdoc?, :conference?
|
5
|
+
def cartographic_type(human_readable = false)
|
6
|
+
crtp_map = { 'a' => 'Map', 'b' => 'Map series', 'c' => 'Map serial',
|
7
|
+
'd' => 'Globe', 'e' => 'Atlas', 'f' => 'Supplement',
|
8
|
+
'g' => 'Bound as part of another work', 'u' => 'Unknown',
|
9
|
+
'z' => 'Other' }
|
7
10
|
human_readable = crtp_map if human_readable
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
field_parser({ match: 'MAP', start: 25, end:1 },
|
12
|
+
{ match: /[ef]{1}/, start: 8, end: 1 }, human_readable)
|
13
|
+
end
|
14
|
+
|
15
|
+
def relief(human_readable = false)
|
12
16
|
relief_map = {'a'=>'Contours', 'b'=>'Shading', 'c'=>'Grading and bathymetric tints',
|
13
17
|
'd'=>'Hachures', 'e'=>'Bathymetry, soundings', 'f'=>'Form lines', 'g'=>'Spot heights',
|
14
|
-
'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
|
18
|
+
'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
|
15
19
|
'm'=>'Rock drawings', 'z'=>'Other'
|
16
20
|
}
|
17
21
|
contents = []
|
18
22
|
if self.record_type == 'MAP'
|
19
|
-
self['008'].value[18,4].split(//).each { | char |
|
23
|
+
self['008'].value[18,4].split(//).each { | char |
|
20
24
|
next if char == " "
|
21
25
|
if human_readable
|
22
26
|
contents << relief_map[char]
|
@@ -26,8 +30,8 @@ module MapType
|
|
26
30
|
}
|
27
31
|
end
|
28
32
|
@fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
|
29
|
-
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
30
|
-
fxd_fld.value[1,4].split(//).each { | char |
|
33
|
+
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
34
|
+
fxd_fld.value[1,4].split(//).each { | char |
|
31
35
|
next if char == " "
|
32
36
|
if human_readable
|
33
37
|
contents << relief_map[char]
|
@@ -35,11 +39,11 @@ module MapType
|
|
35
39
|
contents << char
|
36
40
|
end
|
37
41
|
}
|
38
|
-
}
|
42
|
+
}
|
39
43
|
return false if contents.empty?
|
40
|
-
|
44
|
+
contents
|
41
45
|
end
|
42
|
-
|
46
|
+
|
43
47
|
def projection(human_readable=false)
|
44
48
|
proj_map = {'Azimuthal'=>{'aa'=>'Aitoff','ab'=>'Gnomic','ac'=>"Lambert's equal area",
|
45
49
|
'ad'=>'Orthographic','ae'=>'Azithumal equidistant', 'af'=>'Stereographic',
|
@@ -56,7 +60,7 @@ module MapType
|
|
56
60
|
},
|
57
61
|
'Other'=>{'da'=>'Armadillo','db'=>'Butterfly','dc'=>'Eckert','dd'=>"Goode's homolosine",
|
58
62
|
'de'=>"Miller's bipolar oblique conformal conic",'df'=>'Van Der Grinten',
|
59
|
-
'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
|
63
|
+
'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
|
60
64
|
}
|
61
65
|
}
|
62
66
|
if @record_type == "MAP"
|
@@ -70,7 +74,7 @@ module MapType
|
|
70
74
|
return self['008'].value[22,2]
|
71
75
|
end
|
72
76
|
end
|
73
|
-
end
|
77
|
+
end
|
74
78
|
@fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
|
75
79
|
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
76
80
|
unless fxd_fld.value[5,2] == ' '
|
@@ -78,15 +82,15 @@ module MapType
|
|
78
82
|
proj_map.each_key { | general |
|
79
83
|
next unless proj_map[general].keys.index(fxd_fld.value[5,2])
|
80
84
|
return [general,proj_map[general][fxd_fld.value[5,2]]]
|
81
|
-
}
|
85
|
+
}
|
82
86
|
else
|
83
87
|
return fxd_fld.value[5,2]
|
84
88
|
end
|
85
89
|
end
|
86
|
-
}
|
87
|
-
|
90
|
+
}
|
91
|
+
false
|
88
92
|
end
|
89
|
-
|
93
|
+
|
90
94
|
def special_format(human_readable=false)
|
91
95
|
spfm_map = {'a'=>'Blueprint photocopy','b'=>'Other photocopy','c'=>'Negative photocopy',
|
92
96
|
'd'=>'Film negative','f'=>'Facsimile','g'=>'Relief model','h'=>'Rare (pre-1800)',
|
@@ -94,6 +98,6 @@ module MapType
|
|
94
98
|
'm'=>'Braille, tactile','n'=>'Game','o'=>'Wall map','p'=>'Playing cards',
|
95
99
|
'q'=>'Loose-leaf','z'=>'Other'}
|
96
100
|
human_readable = spfm_map if human_readable
|
97
|
-
return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
|
101
|
+
return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
|
98
102
|
end
|
99
|
-
end
|
103
|
+
end
|
data/lib/enhanced_marc/record.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module MARC
|
2
2
|
class Record
|
3
3
|
|
4
|
-
attr_reader :record_type
|
4
|
+
attr_reader :record_type
|
5
5
|
|
6
6
|
# Creates a new MARC::Record using MARC::Leader
|
7
7
|
# to work with the leader, rather than a string
|
@@ -33,7 +33,7 @@ module MARC
|
|
33
33
|
when 'SCO' then MARC::ScoreRecord.new_from_record(record)
|
34
34
|
when 'REC' then MARC::SoundRecord.new_from_record(record)
|
35
35
|
when 'COM' then MARC::ComputerRecord.new_from_record(record)
|
36
|
-
end
|
36
|
+
end
|
37
37
|
typed_record.fields.reindex
|
38
38
|
typed_record
|
39
39
|
end
|
@@ -50,6 +50,9 @@ module MARC
|
|
50
50
|
def composition_form(human_readable=false)
|
51
51
|
end
|
52
52
|
|
53
|
+
def bibliographic_level
|
54
|
+
@leader.get_blvl
|
55
|
+
end
|
53
56
|
|
54
57
|
def publication_country
|
55
58
|
return self['008'].value[15,3].strip unless self['008'].value[15,3] == ' '
|