berkeley_library-marc 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/build.yml +18 -0
- data/.gitignore +388 -0
- data/.idea/inspectionProfiles/Project_Default.xml +20 -0
- data/.idea/marc.iml +101 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rubocop.yml +334 -0
- data/.ruby-version +1 -0
- data/.simplecov +8 -0
- data/.yardopts +1 -0
- data/CHANGES.md +12 -0
- data/Dockerfile +57 -0
- data/Gemfile +3 -0
- data/Jenkinsfile +18 -0
- data/LICENSE.md +21 -0
- data/README.md +4 -0
- data/Rakefile +20 -0
- data/berkeley_library-marc.gemspec +42 -0
- data/docker-compose.yml +15 -0
- data/lib/.rubocop.yml +6 -0
- data/lib/berkeley_library/marc.rb +3 -0
- data/lib/berkeley_library/marc/field_info.rb +1 -0
- data/lib/berkeley_library/marc/field_info/ctrl_fields/data/ctrl_fields_standard.txt +2143 -0
- data/lib/berkeley_library/marc/field_info/leader/data/leader_standard.txt +87 -0
- data/lib/berkeley_library/marc/field_info/var_fields.rb +46 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data.rb +4 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/mapping-orig.tsv +265 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx.txt +53 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx_parsed.rb +51 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard.txt +5458 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard_parsed.rb +6577 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved.txt +44 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved_parsed.rb +30 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind.txt +105 -0
- data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind_parsed.rb +114 -0
- data/lib/berkeley_library/marc/field_info/var_fields/ind_def.rb +39 -0
- data/lib/berkeley_library/marc/field_info/var_fields/ind_val_def.rb +27 -0
- data/lib/berkeley_library/marc/field_info/var_fields/instrument_or_voices_code.rb +26 -0
- data/lib/berkeley_library/marc/field_info/var_fields/obsolescible.rb +55 -0
- data/lib/berkeley_library/marc/field_info/var_fields/section.rb +50 -0
- data/lib/berkeley_library/marc/field_info/var_fields/subfield_def.rb +50 -0
- data/lib/berkeley_library/marc/field_info/var_fields/subfield_val.rb +24 -0
- data/lib/berkeley_library/marc/field_info/var_fields/var_field_def.rb +62 -0
- data/lib/berkeley_library/marc/field_info/var_fields/var_field_list.rb +43 -0
- data/lib/berkeley_library/marc/field_info/var_fields/var_field_parser.rb +136 -0
- data/lib/berkeley_library/marc/field_info/var_fields/var_field_transform.rb +160 -0
- data/lib/berkeley_library/marc/module_info.rb +14 -0
- data/lib/marc_extensions.rb +1 -0
- data/lib/marc_extensions/data_field.rb +29 -0
- data/lib/marc_extensions/field_map.rb +63 -0
- data/lib/marc_extensions/record.rb +100 -0
- data/lib/marc_extensions/subfield.rb +21 -0
- data/lib/marc_extensions/xml_reader.rb +19 -0
- data/rakelib/bundle.rake +8 -0
- data/rakelib/coverage.rake +11 -0
- data/rakelib/gem.rake +54 -0
- data/rakelib/rubocop.rake +18 -0
- data/rakelib/spec.rake +2 -0
- data/spec/.rubocop.yml +37 -0
- data/spec/berkeley_library/marc/field_info/var_fields/var_field_def_spec.rb +26 -0
- data/spec/berkeley_library/marc/field_info/var_fields/var_field_parser_spec.rb +596 -0
- data/spec/berkeley_library/marc/field_info/var_fields/var_field_transform_spec.rb +173 -0
- data/spec/berkeley_library/marc/field_info/var_fields_spec.rb +112 -0
- data/spec/data/field_info/vf_046.txt +32 -0
- data/spec/data/field_info/vf_048.txt +112 -0
- data/spec/data/record-187888.xml +78 -0
- data/spec/marc_extensions/data_field_spec.rb +13 -0
- data/spec/marc_extensions/record_spec.rb +211 -0
- data/spec/spec_helper.rb +27 -0
- metadata +354 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'berkeley_library/marc/field_info/var_fields/var_field_def'
|
2
|
+
require 'berkeley_library/marc/field_info/var_fields/obsolescible'
|
3
|
+
|
4
|
+
module BerkeleyLibrary
|
5
|
+
module Marc
|
6
|
+
module FieldInfo
|
7
|
+
module VarFields
|
8
|
+
class Section
|
9
|
+
include Enumerable
|
10
|
+
include Obsolescible
|
11
|
+
|
12
|
+
attr_reader :desc
|
13
|
+
attr_reader :var_fields
|
14
|
+
|
15
|
+
def initialize(desc:, var_fields:)
|
16
|
+
@desc = desc
|
17
|
+
@var_fields = var_fields
|
18
|
+
end
|
19
|
+
|
20
|
+
def each(&block)
|
21
|
+
return to_enum(:each) unless block_given?
|
22
|
+
|
23
|
+
var_fields.each(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def size
|
27
|
+
var_fields.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def empty?
|
31
|
+
var_fields.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def reject_obsoletes
|
35
|
+
Section.new(
|
36
|
+
desc: desc,
|
37
|
+
var_fields: _reject_obsolete(var_fields)
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
blocks = ["--#{desc}--"]
|
43
|
+
blocks.concat(var_fields.map(&:to_s))
|
44
|
+
blocks.join("\n")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'berkeley_library/marc/field_info/var_fields/subfield_val'
|
2
|
+
require 'berkeley_library/marc/field_info/var_fields/obsolescible'
|
3
|
+
|
4
|
+
module BerkeleyLibrary
|
5
|
+
module Marc
|
6
|
+
module FieldInfo
|
7
|
+
module VarFields
|
8
|
+
# TODO: destructure range codes in some useful way (e.g. 886a-z, 0-9)
|
9
|
+
class SubfieldDef
|
10
|
+
include Obsolescible
|
11
|
+
|
12
|
+
attr_reader :code, :desc, :values
|
13
|
+
|
14
|
+
def initialize(code:, desc:, values: [])
|
15
|
+
@code = code
|
16
|
+
@desc = desc
|
17
|
+
@values = values
|
18
|
+
end
|
19
|
+
|
20
|
+
def reject_obsoletes
|
21
|
+
SubfieldDef.new(code: code, desc: desc, values: _reject_obsolete(values))
|
22
|
+
end
|
23
|
+
|
24
|
+
def each_value(&block)
|
25
|
+
return to_enum(:each_value) unless block_given?
|
26
|
+
|
27
|
+
values.each(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
INDENT = ' '.freeze
|
31
|
+
private_constant :INDENT
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
lines = ["$#{code_str} - #{desc}"]
|
35
|
+
values.each { |v| lines << INDENT + v.to_s }
|
36
|
+
lines.join("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def code_str
|
42
|
+
return code.to_s unless code.is_a?(Range)
|
43
|
+
|
44
|
+
"#{code.first}-#{code.last}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module BerkeleyLibrary
|
2
|
+
module Marc
|
3
|
+
module FieldInfo
|
4
|
+
module VarFields
|
5
|
+
class SubfieldVal
|
6
|
+
# TODO: include Comparable
|
7
|
+
include Obsolescible
|
8
|
+
|
9
|
+
attr_reader :val
|
10
|
+
attr_reader :desc
|
11
|
+
|
12
|
+
def initialize(val:, desc:)
|
13
|
+
@val = val
|
14
|
+
@desc = desc
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"#{val} - #{desc}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'berkeley_library/marc/field_info/var_fields/ind_def'
|
2
|
+
require 'berkeley_library/marc/field_info/var_fields/subfield_def'
|
3
|
+
require 'berkeley_library/marc/field_info/var_fields/instrument_or_voices_code'
|
4
|
+
require 'berkeley_library/marc/field_info/var_fields/obsolescible'
|
5
|
+
|
6
|
+
module BerkeleyLibrary
|
7
|
+
module Marc
|
8
|
+
module FieldInfo
|
9
|
+
module VarFields
|
10
|
+
class VarFieldDef
|
11
|
+
include Obsolescible
|
12
|
+
|
13
|
+
attr_reader :tag, :desc, :indicators, :subfield_codes, :inst_or_voices_codes
|
14
|
+
|
15
|
+
def initialize(tag:, desc:, indicators: [], subfield_codes: [], inst_or_voices_codes: [])
|
16
|
+
@tag = tag
|
17
|
+
@desc = desc
|
18
|
+
@indicators = indicators # TODO: split out ind1/ind2 (but what about obsolete?)
|
19
|
+
@subfield_codes = subfield_codes
|
20
|
+
@inst_or_voices_codes = inst_or_voices_codes
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
blocks = ["#{tag} - #{desc}"]
|
25
|
+
|
26
|
+
concat_indented(blocks, indicators, 'Indicators')
|
27
|
+
concat_indented(blocks, subfield_codes, 'Subfield Codes')
|
28
|
+
concat_indented(blocks, inst_or_voices_codes, 'Instrument or Voices Codes')
|
29
|
+
|
30
|
+
blocks.join("\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
def reject_obsoletes
|
34
|
+
VarFieldDef.new(
|
35
|
+
tag: tag,
|
36
|
+
desc: desc,
|
37
|
+
indicators: _reject_obsolete(indicators),
|
38
|
+
subfield_codes: _reject_obsolete(subfield_codes),
|
39
|
+
inst_or_voices_codes: _reject_obsolete(inst_or_voices_codes)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
INDENT = ' '.freeze
|
46
|
+
private_constant :INDENT
|
47
|
+
|
48
|
+
def concat_indented(blocks, values, header)
|
49
|
+
return if values.empty?
|
50
|
+
|
51
|
+
blocks << INDENT + header
|
52
|
+
values.each do |v|
|
53
|
+
lines = v.to_s.lines(chomp: true)
|
54
|
+
lines.each { |line| blocks << INDENT + INDENT + line }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'berkeley_library/marc/field_info/var_fields/section'
|
2
|
+
require 'berkeley_library/marc/field_info/var_fields/obsolescible'
|
3
|
+
|
4
|
+
module BerkeleyLibrary
|
5
|
+
module Marc
|
6
|
+
module FieldInfo
|
7
|
+
module VarFields
|
8
|
+
class VarFieldList
|
9
|
+
include Enumerable
|
10
|
+
include Obsolescible
|
11
|
+
|
12
|
+
attr_reader :desc, :sections
|
13
|
+
|
14
|
+
def initialize(desc:, sections:)
|
15
|
+
@desc = desc
|
16
|
+
@sections = sections
|
17
|
+
end
|
18
|
+
|
19
|
+
def each(&block)
|
20
|
+
return to_enum(:each) unless block_given?
|
21
|
+
|
22
|
+
sections.each { |section| section.each(&block) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def size
|
26
|
+
sections.sum(&:size)
|
27
|
+
end
|
28
|
+
|
29
|
+
def reject_obsoletes
|
30
|
+
VarFieldList.new(
|
31
|
+
desc: desc,
|
32
|
+
sections: _reject_obsolete(sections)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
sections.map(&:to_s).join("\n")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'parslet'
|
2
|
+
|
3
|
+
module BerkeleyLibrary
|
4
|
+
module Marc
|
5
|
+
module FieldInfo
|
6
|
+
module VarFields
|
7
|
+
|
8
|
+
# rubocop:disable Style/BlockDelimiters
|
9
|
+
class VarFieldParser < Parslet::Parser
|
10
|
+
|
11
|
+
# ------------------------------------------------------------
|
12
|
+
# structural
|
13
|
+
|
14
|
+
rule(:blank) { match('[[:blank:]]') }
|
15
|
+
|
16
|
+
rule(:nonhyphen) { match('[\t[:print:]&&[^-]]') }
|
17
|
+
|
18
|
+
rule(:nonterminal_hyphen) { match('-(?!-?$)') }
|
19
|
+
|
20
|
+
rule(:printable) { nonhyphen | nonterminal_hyphen }
|
21
|
+
|
22
|
+
rule(:ln_br) { str("\r\n") | match('[\n\v\f\r\u0085\u2028\u2029]') }
|
23
|
+
|
24
|
+
rule(:eof) { any.absent? }
|
25
|
+
|
26
|
+
rule(:eol) { blank.repeat(0) >> ln_br }
|
27
|
+
|
28
|
+
rule(:text) { printable.repeat(0) }
|
29
|
+
|
30
|
+
rule(:comment) { blank.repeat(0) >> str('//') >> blank.repeat(0) >> text.as(:comment) }
|
31
|
+
|
32
|
+
# non-captured
|
33
|
+
rule(:nc) { (eol | comment).repeat(0) }
|
34
|
+
|
35
|
+
rule(:indent) { (eol | comment).repeat(1) >> blank.repeat(1) }
|
36
|
+
|
37
|
+
# ------------------------------------------------------------
|
38
|
+
# indicators
|
39
|
+
|
40
|
+
rule(:ind_header) { str('Indicators') }
|
41
|
+
|
42
|
+
rule(:ind1_header) { str('First - ') >> text.as(:desc) }
|
43
|
+
|
44
|
+
rule(:ind2_header) { str('Second - ') >> text.as(:desc) }
|
45
|
+
|
46
|
+
rule(:ind_val) {
|
47
|
+
# Yes, caps should be invalid; yes, TIND does it anyway
|
48
|
+
match('[0-9a-zA-Z#]')
|
49
|
+
}
|
50
|
+
|
51
|
+
# Relatively rare -- e.g. 130
|
52
|
+
rule(:ind_val_range) { match('[0-9]') >> str('-') >> match('[0-9]') }
|
53
|
+
|
54
|
+
rule(:ind_def) { (ind_val_range | ind_val).as(:val) >> str(' - ') >> text.as(:desc) }
|
55
|
+
|
56
|
+
rule(:ind1) { ind1_header >> (indent >> ind_def).repeat(0).as(:ind1) }
|
57
|
+
|
58
|
+
rule(:ind2) { ind2_header >> (indent >> ind_def).repeat(0).as(:ind2) }
|
59
|
+
|
60
|
+
rule(:indicators) do
|
61
|
+
# TODO: enforce that we only get multiples when all but one are obsolete
|
62
|
+
ind_header >> (indent >> (ind1 | ind2)).repeat(0)
|
63
|
+
end
|
64
|
+
|
65
|
+
# ------------------------------------------------------------
|
66
|
+
# subfield definitions
|
67
|
+
|
68
|
+
rule(:sf_header) { str('Subfield Codes') }
|
69
|
+
|
70
|
+
rule(:sf_code) { match('[0-9a-z]') }
|
71
|
+
|
72
|
+
# rare (e.g. 034a)
|
73
|
+
rule(:subfield_value) { match('[^$ \t]').repeat(1).as(:val) >> str(' - ') >> text.as(:desc) }
|
74
|
+
|
75
|
+
rule(:subfield_def) {
|
76
|
+
str('$') >>
|
77
|
+
(
|
78
|
+
(sf_code.as(:code1) >> str('-') >> sf_code.as(:code2)) | # range - rarely used (e.g. 886a-z, 0-9)
|
79
|
+
sf_code.as(:code) # single code - typical case
|
80
|
+
) >>
|
81
|
+
(str(' - ') | str(' ')) >> text.as(:desc) >> # 880 doesn't have -, probably a typo
|
82
|
+
(indent >> subfield_value).repeat(0).as(:values)
|
83
|
+
}
|
84
|
+
|
85
|
+
rule(:subfield_codes) { sf_header.maybe >> (indent >> subfield_def).repeat(1) }
|
86
|
+
|
87
|
+
# instrument or voices codes (only for 048)
|
88
|
+
|
89
|
+
rule(:ivc_header) { str('Instrument or Voices Codes') }
|
90
|
+
|
91
|
+
rule(:ivc_value) { match('[a-z]').repeat(2, 2).as(:val) >> str(' - ') >> text.as(:desc) }
|
92
|
+
|
93
|
+
rule(:ivc_def) { ivc_header >> (indent >> ivc_value).repeat(1) }
|
94
|
+
|
95
|
+
# ------------------------------------------------------------
|
96
|
+
# variable fields
|
97
|
+
|
98
|
+
rule(:vf_header) { match('[0-9]').repeat(3, 3).as(:tag) >> str(' - ') >> text.as(:desc) }
|
99
|
+
|
100
|
+
rule(:vf) {
|
101
|
+
vf_header >> (
|
102
|
+
indent >> indicators.as(:indicators) >>
|
103
|
+
indent >> subfield_codes.as(:subfield_codes) >>
|
104
|
+
(indent >> ivc_def).as(:inst_or_voices_codes).maybe
|
105
|
+
).maybe
|
106
|
+
}
|
107
|
+
|
108
|
+
# ------------------------------------------------------------
|
109
|
+
# sections
|
110
|
+
|
111
|
+
rule(:section_header) { str('--') >> text.as(:desc) >> str('--') }
|
112
|
+
|
113
|
+
rule(:section) { section_header.maybe >> (nc >> vf).repeat(1).as(:var_fields) >> nc }
|
114
|
+
|
115
|
+
# ------------------------------------------------------------
|
116
|
+
# entire list
|
117
|
+
|
118
|
+
rule(:list) { (comment >> eol).repeat(0).as(:doc_comments) >> nc >> section.repeat(1).as(:sections) }
|
119
|
+
|
120
|
+
root(:list)
|
121
|
+
|
122
|
+
# ------------------------------------------------------------
|
123
|
+
# Parser
|
124
|
+
|
125
|
+
def parse(io, options = nil)
|
126
|
+
opts = { reporter: Parslet::ErrorReporter::Deepest.new }
|
127
|
+
opts.merge!(options) if options
|
128
|
+
|
129
|
+
super(io, opts)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
# rubocop:enable Style/BlockDelimiters
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'parslet'
|
2
|
+
require 'berkeley_library/marc/field_info/var_fields/var_field_list'
|
3
|
+
|
4
|
+
module BerkeleyLibrary
|
5
|
+
module Marc
|
6
|
+
module FieldInfo
|
7
|
+
module VarFields
|
8
|
+
# TODO: flag [OBSOLETE], (R), (NR)
|
9
|
+
# rubocop:disable Style/BlockDelimiters
|
10
|
+
class VarFieldTransform < Parslet::Transform
|
11
|
+
|
12
|
+
class AnyValue
|
13
|
+
attr_reader :val, :desc
|
14
|
+
|
15
|
+
def initialize(val:, desc:)
|
16
|
+
@val = val
|
17
|
+
@desc = desc
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_ind_val_def
|
21
|
+
IndValDef.new(val: val, desc: desc)
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_subfield_val
|
25
|
+
SubfieldVal.new(val: val, desc: desc)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_ivc
|
29
|
+
InstrumentOrVoicesCode.new(val: val, desc: desc)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# ------------------------------------------------------------
|
34
|
+
# structural elements
|
35
|
+
|
36
|
+
# comment
|
37
|
+
rule(comment: simple(:comment)) {
|
38
|
+
comment
|
39
|
+
}
|
40
|
+
|
41
|
+
# value
|
42
|
+
rule(val: simple(:val), desc: simple(:desc)) {
|
43
|
+
AnyValue.new(val: val, desc: desc)
|
44
|
+
}
|
45
|
+
|
46
|
+
# ------------------------------------------------------------
|
47
|
+
# indicators
|
48
|
+
|
49
|
+
# ind1
|
50
|
+
rule(desc: simple(:desc), ind1: sequence(:val_defs)) {
|
51
|
+
IndDef.new(pos: 1, desc: desc, val_defs: val_defs.map(&:to_ind_val_def))
|
52
|
+
}
|
53
|
+
|
54
|
+
# ind2
|
55
|
+
rule(desc: simple(:desc), ind2: sequence(:val_defs)) {
|
56
|
+
IndDef.new(pos: 2, desc: desc, val_defs: val_defs.map(&:to_ind_val_def))
|
57
|
+
}
|
58
|
+
|
59
|
+
# ------------------------------------------------------------
|
60
|
+
# subfield definitions
|
61
|
+
|
62
|
+
# sf_code_def (single code)
|
63
|
+
rule(code: simple(:code), desc: simple(:desc), values: sequence(:values)) {
|
64
|
+
SubfieldDef.new(code: code, desc: desc, values: values.map(&:to_subfield_val))
|
65
|
+
}
|
66
|
+
|
67
|
+
# sf_code_def (range code, e.g. 886a-z, 0-9)
|
68
|
+
rule(code1: simple(:code1), code2: simple(:code2), desc: simple(:desc), values: sequence(:values)) {
|
69
|
+
SubfieldDef.new(code: (code1.to_s..code2.to_s), desc: desc, values: values.map(&:to_subfield_val))
|
70
|
+
}
|
71
|
+
|
72
|
+
# ------------------------------------------------------------
|
73
|
+
# variable fields
|
74
|
+
|
75
|
+
rule(
|
76
|
+
tag: simple(:tag),
|
77
|
+
desc: simple(:desc),
|
78
|
+
indicators: sequence(:indicators),
|
79
|
+
subfield_codes: sequence(:subfield_codes),
|
80
|
+
inst_or_voices_codes: sequence(:inst_or_voices_codes)
|
81
|
+
) {
|
82
|
+
VarFieldDef.new(
|
83
|
+
tag: tag,
|
84
|
+
desc: desc,
|
85
|
+
indicators: indicators,
|
86
|
+
subfield_codes: subfield_codes,
|
87
|
+
# instrument or voices codes (only for 048)
|
88
|
+
inst_or_voices_codes: inst_or_voices_codes.map(&:to_ivc)
|
89
|
+
)
|
90
|
+
}
|
91
|
+
|
92
|
+
rule(
|
93
|
+
tag: simple(:tag),
|
94
|
+
desc: simple(:desc),
|
95
|
+
indicators: sequence(:indicators),
|
96
|
+
subfield_codes: sequence(:subfield_codes)
|
97
|
+
) {
|
98
|
+
VarFieldDef.new(
|
99
|
+
tag: tag,
|
100
|
+
desc: desc,
|
101
|
+
indicators: indicators,
|
102
|
+
subfield_codes: subfield_codes
|
103
|
+
)
|
104
|
+
}
|
105
|
+
|
106
|
+
# TODO: reinstate these?
|
107
|
+
# rule(
|
108
|
+
# tag: simple(:tag),
|
109
|
+
# desc: simple(:desc),
|
110
|
+
# indicators: sequence(:indicators)
|
111
|
+
# ) {
|
112
|
+
# VarFieldDef.new(
|
113
|
+
# tag: tag,
|
114
|
+
# desc: desc,
|
115
|
+
# indicators: indicators
|
116
|
+
# )
|
117
|
+
# }
|
118
|
+
|
119
|
+
# rule(
|
120
|
+
# tag: simple(:tag),
|
121
|
+
# desc: simple(:desc),
|
122
|
+
# subfield_codes: sequence(:subfield_codes)
|
123
|
+
# ) {
|
124
|
+
# VarFieldDef.new(
|
125
|
+
# tag: tag,
|
126
|
+
# desc: desc,
|
127
|
+
# subfield_codes: subfield_codes
|
128
|
+
# )
|
129
|
+
# }
|
130
|
+
|
131
|
+
rule(
|
132
|
+
tag: simple(:tag),
|
133
|
+
desc: simple(:desc)
|
134
|
+
) {
|
135
|
+
VarFieldDef.new(
|
136
|
+
tag: tag,
|
137
|
+
desc: desc
|
138
|
+
)
|
139
|
+
}
|
140
|
+
|
141
|
+
# ------------------------------------------------------------
|
142
|
+
# Sections
|
143
|
+
|
144
|
+
rule(desc: simple(:desc), var_fields: sequence(:var_fields)) {
|
145
|
+
Section.new(desc: desc, var_fields: var_fields)
|
146
|
+
}
|
147
|
+
|
148
|
+
# ------------------------------------------------------------
|
149
|
+
# List
|
150
|
+
|
151
|
+
rule(doc_comments: sequence(:doc_comments), sections: sequence(:sections)) {
|
152
|
+
desc = doc_comments.reject { |c| c.start_with?('TODO:') }.join("\n") # TODO: is "\n" best?
|
153
|
+
VarFieldList.new(desc: desc, sections: sections)
|
154
|
+
}
|
155
|
+
end
|
156
|
+
# rubocop:enable Style/BlockDelimiters
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|