relaton-bib 1.10.7 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97f3e3e14c073c18fac8b204483116de57d77338ed7de3ce6f03c75da41fd0c1
4
- data.tar.gz: 713f4591e31ff1538b31f75bff7b6e1d4770a8f87fbd5e01445968cf8e6ffb8c
3
+ metadata.gz: d15360baaf96bbd8ba4bb079f5c1ed71b2d1a3c04a709b7b26122b10ea6e998d
4
+ data.tar.gz: ea64b85cfe56d2bac01881c246877f9ffb5329bf108dbffbe9e9ce789352a244
5
5
  SHA512:
6
- metadata.gz: c75ffe32176bb63fa2d9ff7717312ac15dce830622cf8db699628f4a93f45e8f4907431120236d726d1cc9a5d1fcb91e1b5ca39772ac70429fec44cfb7dd198a
7
- data.tar.gz: c4bad97d2b455e787e3e4e8eed11b8e7e466eb288655e2055b0d7fa38c236a7e02f59701cc7c693230879a5116c7872fa16bd70ada9827535894542841d9d716
6
+ metadata.gz: c94693cbcd3a935883d608a80af6d8660ebf08a079898a4658ed057fd5ce7f84e93631f33579f8fbc6696b80f1413fac49b2dd48af120d5c60c7e104ebbf1b01
7
+ data.tar.gz: e98dca1228dff147f05e7ea460a95ea909137fa49fdd38fdc9af3c9147e3030e0ef1c65906f79dac5f108b5d2d0107410c52bf8d584a75401f01fd112a8205cb
data/README.adoc CHANGED
@@ -213,7 +213,11 @@ item = RelatonBib::BibliographicItem.new(
213
213
  ),
214
214
  place: [
215
215
  "bib place",
216
- RelatonBib::Place.new(name: "Geneva", uri: "geneva.place", region: "Switzelznd")
216
+ RelatonBib::Place.new(
217
+ city: "Geneva",
218
+ region: [RelatonBib::Place::RegionType.new(name: "Region")],
219
+ country: [RelatonBib::Place::RegionType.new(name: "Switzeland", iso: "SH", recommended: true)],
220
+ )
217
221
  ],
218
222
  extent: [
219
223
  RelatonBib::BibItemLocality.new("section", "Reference from", "Reference to"),
data/grammars/biblio.rng CHANGED
@@ -527,7 +527,7 @@
527
527
  </define>
528
528
  <define name="LocalityType">
529
529
  <data type="string">
530
- <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
530
+ <param name="pattern">section|clause|part|paragraph|chapter|page|title|line|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
531
531
  </data>
532
532
  </define>
533
533
  <define name="referenceFrom">
@@ -677,6 +677,9 @@
677
677
  <zeroOrMore>
678
678
  <ref name="extent"/>
679
679
  </zeroOrMore>
680
+ <optional>
681
+ <ref name="bibliographic_size"/>
682
+ </optional>
680
683
  <zeroOrMore>
681
684
  <ref name="accesslocation"/>
682
685
  </zeroOrMore>
@@ -848,17 +851,46 @@
848
851
  </define>
849
852
  <define name="bplace">
850
853
  <element name="place">
851
- <optional>
852
- <attribute name="uri">
853
- <data type="anyURI"/>
854
- </attribute>
855
- </optional>
856
- <optional>
857
- <attribute name="region"/>
858
- </optional>
854
+ <choice>
855
+ <text/>
856
+ <group>
857
+ <ref name="bibliocity"/>
858
+ <zeroOrMore>
859
+ <ref name="biblioregion"/>
860
+ </zeroOrMore>
861
+ <zeroOrMore>
862
+ <ref name="bibliocountry"/>
863
+ </zeroOrMore>
864
+ </group>
865
+ </choice>
866
+ </element>
867
+ </define>
868
+ <define name="bibliocity">
869
+ <element name="city">
859
870
  <text/>
860
871
  </element>
861
872
  </define>
873
+ <define name="biblioregion">
874
+ <element name="region">
875
+ <ref name="RegionType"/>
876
+ </element>
877
+ </define>
878
+ <define name="bibliocountry">
879
+ <element name="country">
880
+ <ref name="RegionType"/>
881
+ </element>
882
+ </define>
883
+ <define name="RegionType">
884
+ <optional>
885
+ <attribute name="iso"/>
886
+ </optional>
887
+ <optional>
888
+ <attribute name="recommended">
889
+ <data type="boolean"/>
890
+ </attribute>
891
+ </optional>
892
+ <text/>
893
+ </define>
862
894
  <define name="bprice">
863
895
  <element name="price">
864
896
  <attribute name="currency"/>
@@ -922,9 +954,29 @@
922
954
  <text/>
923
955
  </element>
924
956
  </define>
957
+ <define name="sizevalue">
958
+ <element name="value">
959
+ <attribute name="type"/>
960
+ <text/>
961
+ </element>
962
+ </define>
963
+ <define name="bibliographic_size">
964
+ <element name="size">
965
+ <oneOrMore>
966
+ <ref name="sizevalue"/>
967
+ </oneOrMore>
968
+ </element>
969
+ </define>
925
970
  <define name="extent">
926
971
  <element name="extent">
927
- <ref name="BibItemLocality"/>
972
+ <choice>
973
+ <zeroOrMore>
974
+ <ref name="locality"/>
975
+ </zeroOrMore>
976
+ <zeroOrMore>
977
+ <ref name="localityStack"/>
978
+ </zeroOrMore>
979
+ </choice>
928
980
  </element>
929
981
  </define>
930
982
  <define name="series">
data/grammars/isodoc.rng CHANGED
@@ -152,9 +152,7 @@
152
152
  <data type="boolean"/>
153
153
  </attribute>
154
154
  </optional>
155
- <oneOrMore>
156
- <ref name="PureTextElement"/>
157
- </oneOrMore>
155
+ <ref name="XrefBody"/>
158
156
  </element>
159
157
  </define>
160
158
  <define name="erefType">
@@ -188,6 +186,42 @@
188
186
  <ref name="PureTextElement"/>
189
187
  </oneOrMore>
190
188
  </define>
189
+ <define name="localityStack">
190
+ <element name="localityStack">
191
+ <optional>
192
+ <attribute name="connective">
193
+ <choice>
194
+ <value>and</value>
195
+ <value>or</value>
196
+ <value>from</value>
197
+ <value>to</value>
198
+ <value/>
199
+ </choice>
200
+ </attribute>
201
+ </optional>
202
+ <zeroOrMore>
203
+ <ref name="locality"/>
204
+ </zeroOrMore>
205
+ </element>
206
+ </define>
207
+ <define name="sourceLocalityStack">
208
+ <element name="sourceLocalityStack">
209
+ <optional>
210
+ <attribute name="connective">
211
+ <choice>
212
+ <value>and</value>
213
+ <value>or</value>
214
+ <value>from</value>
215
+ <value>to</value>
216
+ <value/>
217
+ </choice>
218
+ </attribute>
219
+ </optional>
220
+ <zeroOrMore>
221
+ <ref name="sourceLocality"/>
222
+ </zeroOrMore>
223
+ </element>
224
+ </define>
191
225
  <define name="ul">
192
226
  <element name="ul">
193
227
  <attribute name="id">
@@ -1098,6 +1132,16 @@
1098
1132
  </define>
1099
1133
  </include>
1100
1134
  <!-- end overrides -->
1135
+ <define name="image" combine="choice">
1136
+ <element name="svg">
1137
+ <oneOrMore>
1138
+ <choice>
1139
+ <text/>
1140
+ <ref name="AnyElement"/>
1141
+ </choice>
1142
+ </oneOrMore>
1143
+ </element>
1144
+ </define>
1101
1145
  <define name="MultilingualRenderingType">
1102
1146
  <choice>
1103
1147
  <value>common</value>
@@ -2631,4 +2675,30 @@
2631
2675
  </zeroOrMore>
2632
2676
  </element>
2633
2677
  </define>
2678
+ <define name="XrefBody">
2679
+ <zeroOrMore>
2680
+ <ref name="XrefTarget"/>
2681
+ </zeroOrMore>
2682
+ <oneOrMore>
2683
+ <ref name="PureTextElement"/>
2684
+ </oneOrMore>
2685
+ </define>
2686
+ <define name="XrefTarget">
2687
+ <element name="location">
2688
+ <attribute name="target">
2689
+ <data type="string">
2690
+ <param name="pattern">\i\c*|\c+#\c+</param>
2691
+ </data>
2692
+ </attribute>
2693
+ <attribute name="connective">
2694
+ <choice>
2695
+ <value>and</value>
2696
+ <value>or</value>
2697
+ <value>from</value>
2698
+ <value>to</value>
2699
+ <value/>
2700
+ </choice>
2701
+ </attribute>
2702
+ </element>
2703
+ </define>
2634
2704
  </grammar>
@@ -51,6 +51,22 @@ module RelatonBib
51
51
  out += "#{pref}reference_to:: #{reference_to}\n" if reference_to
52
52
  out
53
53
  end
54
+
55
+ #
56
+ # Render locality as BibTeX.
57
+ #
58
+ # @param [BibTeX::Entry] item BibTeX entry.
59
+ #
60
+ def to_bibtex(item)
61
+ case type
62
+ when "chapter" then item.chapter = reference_from
63
+ when "page"
64
+ value = reference_from
65
+ value += "-#{reference_to}" if reference_to
66
+ item.pages = value
67
+ when "volume" then item.volume = reference_from
68
+ end
69
+ end
54
70
  end
55
71
 
56
72
  class Locality < BibItemLocality
@@ -58,6 +74,28 @@ module RelatonBib
58
74
  def to_xml(builder)
59
75
  builder.locality { |b| super(b) }
60
76
  end
77
+
78
+ #
79
+ # Render locality as hash.
80
+ #
81
+ # @return [Hash] locality as hash.
82
+ #
83
+ def to_hash
84
+ { "locality" => super }
85
+ end
86
+
87
+ #
88
+ # Render locality as AsciiBib.
89
+ #
90
+ # @param [String] prefix prefix of locality
91
+ # @param [Integer] count number of localities
92
+ #
93
+ # @return [String] AsciiBib.
94
+ #
95
+ def to_asciibib(prefix = "", count = 1)
96
+ pref = prefix.empty? ? "locality" : "#{prefix}.locality"
97
+ super(pref, count)
98
+ end
61
99
  end
62
100
 
63
101
  class LocalityStack
@@ -82,6 +120,30 @@ module RelatonBib
82
120
  def to_hash
83
121
  { "locality_stack" => single_element_array(locality) }
84
122
  end
123
+
124
+ #
125
+ # Render locality stack as AsciiBib.
126
+ #
127
+ # @param [String] prefix <description>
128
+ # @param [Integer] size size of locality stack
129
+ #
130
+ # @return [String] AsciiBib.
131
+ #
132
+ def to_asciibib(prefix = "", size = 1)
133
+ pref = prefix.empty? ? "locality_stack" : "#{prefix}.locality_stack"
134
+ out = ""
135
+ out << "#{pref}::\n" if size > 1
136
+ out << locality.map { |l| l.to_asciibib(pref, locality.size) }.join
137
+ end
138
+
139
+ #
140
+ # Render locality stack as BibTeX.
141
+ #
142
+ # @param [BibTeX::Entry] item BibTeX entry.
143
+ #
144
+ def to_bibtex(item)
145
+ locality.each { |l| l.to_bibtex(item) }
146
+ end
85
147
  end
86
148
 
87
149
  class SourceLocality < BibItemLocality
@@ -27,6 +27,7 @@ require "relaton_bib/place"
27
27
  require "relaton_bib/structured_identifier"
28
28
  require "relaton_bib/editorial_group"
29
29
  require "relaton_bib/ics"
30
+ require "relaton_bib/bibliographic_size"
30
31
 
31
32
  module RelatonBib
32
33
  # Bibliographic item
@@ -95,7 +96,7 @@ module RelatonBib
95
96
  # @return [Array<RelatonBib::Place>]
96
97
  attr_reader :place
97
98
 
98
- # @return [Array<RelatonBib::BibItemLocality>]
99
+ # @return [Array<RelatonBib::Locality, RelatonBib::LocalityStack>]
99
100
  attr_reader :extent
100
101
 
101
102
  # @return [Array<Strig>]
@@ -122,6 +123,9 @@ module RelatonBib
122
123
  # @return [RelatonBib::StructuredIdentifierCollection]
123
124
  attr_reader :structuredidentifier
124
125
 
126
+ # @return [RelatonBib::BibliographicSize, nil]
127
+ attr_reader :size
128
+
125
129
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
126
130
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
127
131
 
@@ -141,7 +145,7 @@ module RelatonBib
141
145
  # @param series [Array<RelatonBib::Series>]
142
146
  # @param medium [RelatonBib::Medium, NilClas]
143
147
  # @param place [Array<String, RelatonBib::Place>]
144
- # @param extent [Array<Relaton::BibItemLocality>]
148
+ # @param extent [Array<Relaton::Locality, RelatonBib::LocalityStack>]
145
149
  # @param accesslocation [Array<String>]
146
150
  # @param classification [Array<RelatonBib::Classification>]
147
151
  # @param validity [RelatonBib:Validity, NilClass]
@@ -152,6 +156,7 @@ module RelatonBib
152
156
  # @param editorialgroup [RelatonBib::EditorialGroup, nil]
153
157
  # @param ics [Array<RelatonBib::ICS>]
154
158
  # @param structuredidentifier [RelatonBib::StructuredIdentifierCollection]
159
+ # @param size [RelatonBib::BibliographicSize, nil]
155
160
  #
156
161
  # @param copyright [Array<Hash, RelatonBib::CopyrightAssociation>]
157
162
  # @option copyright [Array<Hash, RelatonBib::ContributionInfo>] :owner
@@ -243,6 +248,7 @@ module RelatonBib
243
248
  pl.is_a?(String) ? Place.new(name: pl) : pl
244
249
  end
245
250
  @extent = args[:extent] || []
251
+ @size = args[:size]
246
252
  @accesslocation = args.fetch :accesslocation, []
247
253
  @classification = args.fetch :classification, []
248
254
  @validity = args[:validity]
@@ -372,6 +378,7 @@ module RelatonBib
372
378
  hash["medium"] = medium.to_hash if medium
373
379
  hash["place"] = single_element_array(place) if place&.any?
374
380
  hash["extent"] = single_element_array(extent) if extent&.any?
381
+ hash["size"] = size.to_hash if size&.any?
375
382
  if accesslocation&.any?
376
383
  hash["accesslocation"] = single_element_array(accesslocation)
377
384
  end
@@ -525,6 +532,7 @@ module RelatonBib
525
532
  out += medium.to_asciibib prefix if medium
526
533
  place.each { |pl| out += pl.to_asciibib prefix, place.size }
527
534
  extent.each { |ex| out += ex.to_asciibib "#{pref}extent", extent.size }
535
+ out += size.to_asciibib pref if size
528
536
  accesslocation.each { |al| out += "#{pref}accesslocation:: #{al}\n" }
529
537
  classification.each do |cl|
530
538
  out += cl.to_asciibib prefix, classification.size
@@ -624,16 +632,7 @@ module RelatonBib
624
632
 
625
633
  # @param [BibTeX::Entry]
626
634
  def bibtex_extent(item)
627
- extent.each do |e|
628
- case e.type
629
- when "chapter" then item.chapter = e.reference_from
630
- when "page"
631
- value = e.reference_from
632
- value += "-#{e.reference_to}" if e.reference_to
633
- item.pages = value
634
- when "volume" then item.volume = e.reference_from
635
- end
636
- end
635
+ extent.each { |e| e.to_bibtex(item) }
637
636
  end
638
637
 
639
638
  # @param [BibTeX::Entry]
@@ -736,6 +735,7 @@ module RelatonBib
736
735
  medium&.to_xml builder
737
736
  place.each { |pl| pl.to_xml builder }
738
737
  extent.each { |e| builder.extent { e.to_xml builder } }
738
+ size&.to_xml builder
739
739
  accesslocation.each { |al| builder.accesslocation al }
740
740
  license.each { |l| builder.license l }
741
741
  classification.each { |cls| cls.to_xml builder }
@@ -0,0 +1,103 @@
1
+ module RelatonBib
2
+ class BibliographicSize
3
+ extend Forwardable
4
+
5
+ def_delegators :@size, :any?
6
+
7
+ # @return [Array<RelatonBib::BibliographicSize::Value>]
8
+ attr_reader :size
9
+
10
+ #
11
+ # Initialize a BibliographicSize object.
12
+ #
13
+ # @param [<Type>] size <description>
14
+ #
15
+ def initialize(size)
16
+ @size = size
17
+ end
18
+
19
+ #
20
+ # Render BibliographicSize object to XML.
21
+ #
22
+ # @param [Nokogiri::XML::Builder] builder the XML builder
23
+ #
24
+ def to_xml(builder)
25
+ return if size.empty?
26
+
27
+ builder.size do
28
+ size.each { |s| s.to_xml builder }
29
+ end
30
+ end
31
+
32
+ #
33
+ # Render BibliographicSize object to AsciiBib.
34
+ #
35
+ # @param [String] prefix prefix for the size
36
+ #
37
+ # @return [String] AsciiBib string
38
+ #
39
+ def to_asciibib(prefix = "")
40
+ pref = prefix.empty? ? "size" : "#{prefix}.size"
41
+ size.map { |s| s.to_asciibib pref, size.size }.join
42
+ end
43
+
44
+ #
45
+ # Render BibliographicSize object to hash.
46
+ #
47
+ # @return [<Type>] <description>
48
+ #
49
+ def to_hash
50
+ size.map &:to_hash
51
+ end
52
+
53
+ class Value
54
+ # @return [String]
55
+ attr_reader :type, :value
56
+
57
+ #
58
+ # Initialize a BibliographicSize::Value object.
59
+ #
60
+ # @param [String] type the type of the size
61
+ # @param [String] value size value
62
+ #
63
+ def initialize(type:, value:)
64
+ @type = type
65
+ @value = value
66
+ end
67
+
68
+ #
69
+ # Render BibliographicSize::Value object to XML.
70
+ #
71
+ # @param [Nokogiri::XML::Builder] builder the XML builder
72
+ #
73
+ def to_xml(builder)
74
+ builder.value value, type: type
75
+ end
76
+
77
+ #
78
+ # Render BibliographicSize::Value object to hash.
79
+ #
80
+ # @return [<Type>] <description>
81
+ #
82
+ def to_hash
83
+ { type: type, value: value }
84
+ end
85
+
86
+ #
87
+ # Render BibliographicSize::Value object to AsciiBib.
88
+ #
89
+ # @param [String] prefix prefix for the size
90
+ # @param [Integer] size size of the array
91
+ #
92
+ # @return [String] AsciiBib string
93
+ #
94
+ def to_asciibib(prefix, size)
95
+ pref = prefix.empty? ? "" : "#{prefix}."
96
+ out = ""
97
+ out << "#{prefix}::\n" if size.size > 1
98
+ out << "#{pref}type:: #{type}\n"
99
+ out << "#{pref}value:: #{value}\n"
100
+ end
101
+ end
102
+ end
103
+ end
@@ -29,6 +29,7 @@ module RelatonBib
29
29
  medium_hash_to_bib(ret)
30
30
  place_hash_to_bib(ret)
31
31
  extent_hash_to_bib(ret)
32
+ size_hash_to_bib(ret)
32
33
  accesslocation_hash_to_bib(ret)
33
34
  classification_hash_to_bib(ret)
34
35
  validity_hash_to_bib(ret)
@@ -48,13 +49,32 @@ module RelatonBib
48
49
  def extent_hash_to_bib(ret)
49
50
  return unless ret[:extent]
50
51
 
51
- ret[:extent] = array(ret[:extent])
52
- ret[:extent]&.each_with_index do |e, i|
53
- ret[:extent][i] = BibItemLocality.new(e[:type], e[:reference_from],
54
- e[:reference_to])
52
+ ret[:extent] = array(ret[:extent]).map do |e|
53
+ locality e
54
+ # ret[:extent][i] = Locality.new(e[:type], e[:reference_from],
55
+ # e[:reference_to])
55
56
  end
56
57
  end
57
58
 
59
+ def locality(loc)
60
+ if loc[:locality_stack]
61
+ LocalityStack.new(loc[:locality_stack].map { |l| locality(l) })
62
+ else
63
+ l = loc[:locality]
64
+ Locality.new(l[:type], l[:reference_from], l[:reference_to])
65
+ end
66
+ end
67
+
68
+ def size_hash_to_bib(ret)
69
+ return unless ret[:size]
70
+
71
+ ret[:size] = array(ret[:size])
72
+ size = ret[:size]&.map do |val|
73
+ BibliographicSize::Value.new(**val)
74
+ end
75
+ ret[:size] = BibliographicSize.new(size)
76
+ end
77
+
58
78
  def title_hash_to_bib(ret)
59
79
  return unless ret[:title]
60
80
 
@@ -316,18 +336,19 @@ module RelatonBib
316
336
 
317
337
  # @param rel [Hash] relation
318
338
  # @return [RelatonBib::LocalityStack]
319
- def relation_locality_hash_to_bib(rel) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
339
+ def relation_locality_hash_to_bib(rel)
320
340
  rel[:locality] = array(rel[:locality])&.map do |bl|
321
- ls = if bl[:locality_stack]
322
- array(bl[:locality_stack]).map do |l|
323
- Locality.new(l[:type], l[:reference_from], l[:reference_to])
324
- end
325
- else
326
- l = Locality.new(bl[:type], bl[:reference_from],
327
- bl[:reference_to])
328
- [l]
329
- end
330
- LocalityStack.new ls
341
+ LocalityStack.new locality_locality_stack(bl)
342
+ end
343
+ end
344
+
345
+ def locality_locality_stack(lls)
346
+ if lls[:locality_stack]
347
+ array(lls[:locality_stack]).map do |l|
348
+ Locality.new(l[:type], l[:reference_from], l[:reference_to])
349
+ end
350
+ else
351
+ [Locality.new(lls[:type], lls[:reference_from], lls[:reference_to])]
331
352
  end
332
353
  end
333
354
 
@@ -1,41 +1,73 @@
1
1
  module RelatonBib
2
2
  class Medium
3
- # @return [String, NilClass]
4
- attr_reader :form, :size, :scale
3
+ # @return [String, nil]
4
+ attr_reader :content, :genre, :form, :carrier, :size, :scale
5
5
 
6
- # @param form [String, NilClass]
7
- # @param size [String, NilClass]
8
- # @param scale [String, NilClass]
9
- def initialize(form: nil, size: nil, scale: nil)
10
- @form = form
11
- @size = size
12
- @scale = scale
6
+ #
7
+ # Initialize a Medium object.
8
+ #
9
+ # @param content [String, nil] content of the medium
10
+ # @param genre [String, nil] genre of the medium
11
+ # @param form [String, nil] form of the medium
12
+ # @param carrier [String, nil] carrier of the medium
13
+ # @param size [String, nil] size of the medium
14
+ # @param scale [String, nil]
15
+ #
16
+ def initialize(**args)
17
+ @content = args[:content]
18
+ @genre = args[:genre]
19
+ @form = args[:form]
20
+ @carrier = args[:carrier]
21
+ @size = args[:size]
22
+ @scale = args[:scale]
13
23
  end
14
24
 
25
+ #
26
+ # Render Medium object to XML.
27
+ #
15
28
  # @param builder [Nokogiri::XML::Builder]
16
- def to_xml(builder)
29
+ #
30
+ def to_xml(builder) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
17
31
  builder.medium do
32
+ builder.content content if content
33
+ builder.genre genre if genre
18
34
  builder.form form if form
35
+ builder.carrier carrier if carrier
19
36
  builder.size size if size
20
37
  builder.scale scale if scale
21
38
  end
22
39
  end
23
40
 
41
+ #
42
+ # Render Medium object to hash.
43
+ #
24
44
  # @return [Hash]
25
- def to_hash
45
+ #
46
+ def to_hash # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
26
47
  hash = {}
48
+ hash["content"] = content if content
49
+ hash["genre"] = genre if genre
27
50
  hash["form"] = form if form
51
+ hash["carrier"] = carrier if carrier
28
52
  hash["size"] = size if size
29
53
  hash["scale"] = scale if scale
30
54
  hash
31
55
  end
32
56
 
57
+ #
58
+ # Render Medium object to AsciiBib.
59
+ #
33
60
  # @param prefix [String]
61
+ #
34
62
  # @return [String]
35
- def to_asciibib(prefix = "")
36
- pref = prefix.empty? ? "medium." : prefix + ".medium."
63
+ #
64
+ def to_asciibib(prefix = "") # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
65
+ pref = prefix.empty? ? "medium." : "#{prefix}.medium."
37
66
  out = ""
67
+ out += "#{pref}content:: #{content}\n" if content
68
+ out += "#{pref}genre:: #{genre}\n" if genre
38
69
  out += "#{pref}form:: #{form}\n" if form
70
+ out += "#{pref}carrier:: #{carrier}\n" if carrier
39
71
  out += "#{pref}size:: #{size}\n" if size
40
72
  out += "#{pref}scale:: #{scale}\n" if scale
41
73
  out
@@ -1,49 +1,141 @@
1
1
  module RelatonBib
2
2
  class Place
3
- # @return [String]
4
- attr_reader :name
5
-
6
- # @return [String, NilClass]
7
- attr_reader :uri, :region
8
-
9
- # @param name [String]
10
- # @param uri [String, NilClass]
11
- # @param region [String, NilClass]
12
- def initialize(name:, uri: nil, region: nil)
13
- @name = name
14
- @uri = uri
15
- @region = region
3
+ # @return [String, nil]
4
+ attr_reader :name, :city
5
+
6
+ # @return [Array<RelatonBib::Place::RegionType>]
7
+ attr_reader :region, :country
8
+
9
+ #
10
+ # Initialize place.
11
+ #
12
+ # @param name [String, nil] name of place, name or city should be provided
13
+ # @param city [String, nil] name of city, city or name should be provided
14
+ # @param region [Array<RelatonBib::Place::RegionType>] region of place
15
+ # @param country [Array<RelatonBib::Place::RegionType>] country of place
16
+ #
17
+ def initialize(name: nil, city: nil, region: [], country: []) # rubocop:disable Metrics/CyclomaticComplexity
18
+ if name.nil? && city.nil?
19
+ raise ArgumentError, "`name` or `city` should be provided"
20
+ end
21
+
22
+ @name = name
23
+ @city = city
24
+ @region = region.map { |r| r.is_a?(Hash) ? RegionType.new(**r) : r }
25
+ @country = country.map { |c| c.is_a?(Hash) ? RegionType.new(**c) : c }
16
26
  end
17
27
 
28
+ #
29
+ # Render place as XML.
30
+ #
18
31
  # @param builder [Nologiri::XML::Builder]
32
+ #
19
33
  def to_xml(builder)
20
- xml = builder.place name
21
- xml[:uri] = uri if uri
22
- xml[:region] = region if region
34
+ if name
35
+ builder.place name
36
+ else
37
+ builder.place do |b|
38
+ b.city city
39
+ region.each { |r| b.region { r.to_xml b } }
40
+ country.each { |c| b.country { c.to_xml b } }
41
+ end
42
+ end
23
43
  end
24
44
 
45
+ #
46
+ # Render place as Hash.
47
+ #
25
48
  # @return [Hash]
49
+ #
26
50
  def to_hash
27
- if uri || region
28
- hash = { "name" => name }
29
- hash["uri"] = uri if uri
30
- hash["region"] = region if region
31
- hash
51
+ if name then name
32
52
  else
33
- name
53
+ hash = { "city" => city }
54
+ hash["region"] = region.map(&:to_hash) if region.any?
55
+ hash["country"] = country.map(&:to_hash) if country.any?
56
+ hash
34
57
  end
35
58
  end
36
59
 
60
+ #
61
+ # Render place as AsciiBib.
62
+ #
37
63
  # @param prefix [String]
38
64
  # @param count [Integer] number of places
65
+ #
39
66
  # @return [Stirng]
40
- def to_asciibib(prefix = "", count = 1)
41
- pref = prefix.empty? ? "place" : prefix + ".place"
67
+ #
68
+ def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize
69
+ pref = prefix.empty? ? "place" : "#{prefix}.place"
42
70
  out = count > 1 ? "#{pref}::\n" : ""
43
- out += "#{pref}.name:: #{name}\n"
44
- out += "#{pref}.uri:: #{uri}\n" if uri
45
- out += "#{pref}.region:: #{region}\n" if region
46
- out
71
+ return "#{out}#{pref}.name:: #{name}\n" if name
72
+
73
+ out += "#{pref}.city:: #{city}\n"
74
+ out += region.map { |r| r.to_asciibib("#{pref}.region", region.size) }.join
75
+ out + country.map { |c| c.to_asciibib("#{pref}.country", country.size) }.join
76
+ end
77
+
78
+ class RegionType
79
+ # @return [Strign] name of region
80
+ attr_reader :name
81
+
82
+ # @return [Strign, nil] ISO code of region
83
+ attr_reader :iso
84
+
85
+ # @return [Boolean, nil] <description>
86
+ attr_reader :recommended
87
+
88
+ #
89
+ # Initialize region type.
90
+ #
91
+ # @param [String] name name of region
92
+ # @param [String, nil] iso ISO code of region
93
+ # @param [Boolean, nil] recommended recommended region
94
+ #
95
+ def initialize(name:, iso: nil, recommended: nil)
96
+ @name = name
97
+ @iso = iso
98
+ @recommended = recommended
99
+ end
100
+
101
+ #
102
+ # Render region type as XML.
103
+ #
104
+ # @param [Nokogiri::XML::Builder] builder XML builder
105
+ #
106
+ def to_xml(builder)
107
+ builder.parent["iso"] = iso if iso
108
+ builder.parent["recommended"] = recommended.to_s unless recommended.nil?
109
+ builder.text name
110
+ end
111
+
112
+ #
113
+ # Render region type as Hash.
114
+ #
115
+ # @return [Hash] region type as Hash
116
+ #
117
+ def to_hash
118
+ hash = { "name" => name }
119
+ hash["iso"] = iso if iso
120
+ hash["recommended"] = recommended unless recommended.nil?
121
+ hash
122
+ end
123
+
124
+ #
125
+ # Render region type as AsciiBib.
126
+ #
127
+ # @param [String] pref prefix
128
+ # @param [Integer] count number of region types
129
+ #
130
+ # @return [String] region type as AsciiBib
131
+ #
132
+ def to_asciibib(pref, count = 1) # rubocop:disable Metrics/AbcSize
133
+ out = count > 1 ? "#{pref}::\n" : ""
134
+ out += "#{pref}.name:: #{name}\n"
135
+ out += "#{pref}.iso:: #{iso}\n" if iso
136
+ out += "#{pref}.recommended:: #{recommended}\n" if recommended
137
+ out
138
+ end
47
139
  end
48
140
  end
49
141
  end
@@ -7,49 +7,35 @@ module RelatonBib
7
7
  class Series
8
8
  # TYPES = %w[main alt].freeze
9
9
 
10
- # @return [String, NilClass] allowed values: "main" or "alt"
10
+ # @return [String, nil] allowed values: "main" or "alt"
11
11
  attr_reader :type
12
12
 
13
- # @return [RelatonBib::FormattedRef, NilClass]
13
+ # @return [RelatonBib::FormattedRef, nil]
14
14
  attr_reader :formattedref
15
15
 
16
- # @return [RelatonBib::TypedTitleString, NilClass] title
16
+ # @return [RelatonBib::TypedTitleString, nil] title
17
17
  attr_reader :title
18
18
 
19
- # @return [String, NilClass]
20
- attr_reader :place
19
+ # @return [String, nil]
20
+ attr_reader :place, :organization, :from, :to, :number, :partnumber, :run
21
21
 
22
- # @return [String, NilClass]
23
- attr_reader :organization
24
-
25
- # @return [RelatonBib::LocalizedString, NilClass]
22
+ # @return [RelatonBib::LocalizedString, nil]
26
23
  attr_reader :abbreviation
27
24
 
28
- # @return [String, NilClass] date or year
29
- attr_reader :from
30
-
31
- # @return [String, NilClass] date or year
32
- attr_reader :to
33
-
34
- # @return [String, NilClass]
35
- attr_reader :number
36
-
37
- # @return [String, NilClass]
38
- attr_reader :partnumber
39
-
40
25
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
41
26
 
42
- # @param type [String, NilClass]
43
- # @param formattedref [RelatonBib::FormattedRef, NilClass]
44
- # @param title [RelatonBib::TypedTitleString, NilClass] title or
27
+ # @param type [String, nil]
28
+ # @param formattedref [RelatonBib::FormattedRef, nil]
29
+ # @param title [RelatonBib::TypedTitleString, nil] title or
45
30
  # formattedref argument should be passed
46
- # @param place [String, NilClass]
47
- # @param orgaization [String, NilClass]
48
- # @param abbreviation [RelatonBib::LocalizedString, NilClass]
49
- # @param from [String, NilClass]
50
- # @param to [String, NilClass]
51
- # @param number [String, NilClass]
52
- # @param partnumber [String, NilClass]
31
+ # @param place [String, nil]
32
+ # @param orgaization [String, nil]
33
+ # @param abbreviation [RelatonBib::LocalizedString, nil]
34
+ # @param from [String, nil]
35
+ # @param to [String, nil]
36
+ # @param number [String, nil]
37
+ # @param partnumber [String, nil]
38
+ # @param run [String, nil]
53
39
  def initialize(**args)
54
40
  unless args[:title].is_a?(RelatonBib::TypedTitleString) ||
55
41
  args[:formattedref]
@@ -70,6 +56,7 @@ module RelatonBib
70
56
  @to = args[:to]
71
57
  @number = args[:number]
72
58
  @partnumber = args[:partnumber]
59
+ @run = args[:run]
73
60
  end
74
61
  # rubocop:enable Metrics/MethodLength
75
62
 
@@ -89,6 +76,7 @@ module RelatonBib
89
76
  builder.to to if to
90
77
  builder.number number if number
91
78
  builder.partnumber partnumber if partnumber
79
+ builder.run run if run
92
80
  end
93
81
  end
94
82
  xml[:type] = type if type
@@ -109,6 +97,7 @@ module RelatonBib
109
97
  hash["to"] = to if to
110
98
  hash["number"] = number if number
111
99
  hash["partnumber"] = partnumber if partnumber
100
+ hash["run"] = run if run
112
101
  hash
113
102
  end
114
103
 
@@ -128,6 +117,7 @@ module RelatonBib
128
117
  out += "#{pref}.to:: #{to}\n" if to
129
118
  out += "#{pref}.number:: #{number}\n" if number
130
119
  out += "#{pref}.partnumber:: #{partnumber}\n" if partnumber
120
+ out += "#{pref}.run:: #{run}\n" if run
131
121
  out
132
122
  end
133
123
  end
@@ -1,3 +1,3 @@
1
1
  module RelatonBib
2
- VERSION = "1.10.7".freeze
2
+ VERSION = "1.11.2".freeze
3
3
  end
@@ -46,6 +46,7 @@ module RelatonBib
46
46
  medium: fetch_medium(bibitem),
47
47
  place: fetch_place(bibitem),
48
48
  extent: fetch_extent(bibitem),
49
+ size: fetch_size(bibitem),
49
50
  accesslocation: bibitem.xpath("./accesslocation").map(&:text),
50
51
  classification: fetch_classification(bibitem),
51
52
  keyword: bibitem.xpath("keyword").map(&:text),
@@ -71,7 +72,26 @@ module RelatonBib
71
72
 
72
73
  def fetch_place(item)
73
74
  item.xpath("./place").map do |pl|
74
- Place.new(name: pl.text, uri: pl[:uri], region: pl[:region])
75
+ if (city = pl.at("./city"))
76
+ Place.new(city: city.text, region: create_region_country(pl),
77
+ country: create_region_country(pl, "country"))
78
+ else
79
+ Place.new(name: pl.text)
80
+ end
81
+ end
82
+ end
83
+
84
+ #
85
+ # Create region or country from place element
86
+ #
87
+ # @param [Nokogiri::XML::Element] place place element
88
+ # @param [String] node name of the node to parse
89
+ #
90
+ # @return [Array<RelatonBib::Place::RegionType>] <description>
91
+ #
92
+ def create_region_country(place, node = "region")
93
+ place.xpath("./#{node}").map do |r|
94
+ Place::RegionType.new(name: r.text, iso: r[:iso], recommended: r[:recommended])
75
95
  end
76
96
  end
77
97
 
@@ -115,29 +135,38 @@ module RelatonBib
115
135
  organization: sr.at("organization")&.text,
116
136
  abbreviation: abbreviation, from: sr.at("from")&.text,
117
137
  to: sr.at("to")&.text, number: sr.at("number")&.text,
118
- partnumber: sr.at("partnumber")&.text
138
+ partnumber: sr.at("partnumber")&.text, run: sr.at("run")&.text,
119
139
  )
120
140
  end
121
141
  end
122
142
 
123
- def fetch_medium(item)
143
+ def fetch_medium(item) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/PerceivedComplexity
124
144
  medium = item.at("./medium")
125
145
  return unless medium
126
146
 
127
147
  Medium.new(
128
- form: medium.at("form")&.text, size: medium.at("size")&.text,
129
- scale: medium.at("scale")&.text
148
+ content: medium.at("content")&.text, genre: medium.at("genre")&.text,
149
+ form: medium.at("form")&.text, carrier: medium.at("carrier")&.text,
150
+ size: medium.at("size")&.text, scale: medium.at("scale")&.text
130
151
  )
131
152
  end
132
153
 
133
154
  def fetch_extent(item)
134
- item.xpath("./extent").map do |ex|
135
- BibItemLocality.new(
136
- ex[:type], ex.at("referenceFrom")&.text, ex.at("referenceTo")&.text
137
- )
155
+ item.xpath("./extent").reduce([]) do |a, ex|
156
+ a + localities(ex)
157
+ # Locality.new(
158
+ # ex[:type], ex.at("referenceFrom")&.text, ex.at("referenceTo")&.text
159
+ # )
138
160
  end
139
161
  end
140
162
 
163
+ def fetch_size(item)
164
+ size = item.xpath("./size/value").map do |sz|
165
+ BibliographicSize::Value.new type: sz[:type], value: sz.text
166
+ end
167
+ BibliographicSize.new size if size.any?
168
+ end
169
+
141
170
  def fetch_classification(item)
142
171
  item.xpath("classification").map do |cls|
143
172
  Classification.new type: cls[:type], value: cls.text
@@ -390,22 +419,26 @@ module RelatonBib
390
419
  # @return [Array<RelatonBib::Locality, RelatonBib::LocalityStack>]
391
420
  def localities(rel)
392
421
  rel.xpath("./locality|./localityStack").map do |lc|
393
- if lc[:type]
394
- LocalityStack.new [locality(lc)]
422
+ if lc.name == "locality"
423
+ locality lc
395
424
  else
396
425
  LocalityStack.new(lc.xpath("./locality").map { |l| locality l })
397
426
  end
398
427
  end
399
428
  end
400
429
 
430
+ #
431
+ # Create Locality object from Nokogiri::XML::Element
432
+ #
401
433
  # @param loc [Nokogiri::XML::Element]
434
+ # @param klass [RelatonBib::Locality.class, RelatonBib::LocalityStack.class]
435
+ #
402
436
  # @return [RelatonBib::Locality]
403
437
  def locality(loc, klass = Locality)
404
- ref_to = (rt = loc.at("./referenceTo")) && LocalizedString.new(rt.text)
405
438
  klass.new(
406
439
  loc[:type],
407
- LocalizedString.new(loc.at("./referenceFrom").text),
408
- ref_to,
440
+ loc.at("./referenceFrom")&.text,
441
+ loc.at("./referenceTo")&.text,
409
442
  )
410
443
  end
411
444
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-bib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.7
4
+ version: 1.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-06 00:00:00.000000000 Z
11
+ date: 2022-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -223,6 +223,7 @@ files:
223
223
  - lib/relaton_bib/biblio_version.rb
224
224
  - lib/relaton_bib/bibliographic_date.rb
225
225
  - lib/relaton_bib/bibliographic_item.rb
226
+ - lib/relaton_bib/bibliographic_size.rb
226
227
  - lib/relaton_bib/bibtex_parser.rb
227
228
  - lib/relaton_bib/bibxml_parser.rb
228
229
  - lib/relaton_bib/classification.rb