lib/bolognese/readers/datacite_reader.rb in bolognese-1.8.18 vs lib/bolognese/readers/datacite_reader.rb in bolognese-1.9
- old
+ new
@@ -90,19 +90,11 @@
"citeproc" => Bolognese::Utils::CR_TO_CP_TRANSLATIONS[resource_type.to_s.underscore.camelcase] || Bolognese::Utils::SO_TO_CP_TRANSLATIONS[schema_org] || "article",
"bibtex" => Bolognese::Utils::CR_TO_BIB_TRANSLATIONS[resource_type.to_s.underscore.camelcase] || Bolognese::Utils::SO_TO_BIB_TRANSLATIONS[schema_org] || "misc",
"ris" => Bolognese::Utils::CR_TO_RIS_TRANSLATIONS[resource_type.to_s.underscore.camelcase] || Bolognese::Utils::DC_TO_RIS_TRANSLATIONS[resource_type_general.to_s.dasherize] || "GEN"
}.compact
- titles = Array.wrap(meta.dig("titles", "title")).map do |r|
- if r.blank?
- nil
- elsif r.is_a?(String)
- { "title" => sanitize(r) }
- else
- { "title" => sanitize(r["__content__"]), "titleType" => r["titleType"], "lang" => r["lang"] }.compact
- end
- end.compact
+ titles = get_titles(meta)
descriptions = Array.wrap(meta.dig("descriptions", "description")).map do |r|
if r.blank?
nil
elsif r.is_a?(String)
@@ -118,11 +110,11 @@
name_to_spdx(r)
elsif r.is_a?(Hash)
hsh_to_spdx(r)
end
end.compact
-
+
subjects = Array.wrap(meta.dig("subjects", "subject")).reduce([]) do |sum, subject|
if subject.is_a?(String)
sum += name_to_fos(subject)
elsif subject.is_a?(Hash)
sum += hsh_to_fos(subject)
@@ -192,10 +184,46 @@
"relatedMetadataScheme" => ri["relatedMetadataScheme"],
"schemeUri" => ri["schemeURI"],
"schemeType" => ri["schemeType"]
}.compact
end
+
+ related_items = Array.wrap(meta.dig("relatedItems", "relatedItem")).map do |ri|
+ rii = ri["relatedItemIdentifier"]
+ if rii["relatedItemIdentifierType"] == "DOI"
+ rid = validate_doi(rii["__content__"].to_s.downcase)
+ else
+ rid = rii["__content__"]
+ end
+
+ relatedItemIdentifier = {
+ "relatedItemIdentifier" => rid,
+ "relatedItemIdentifierType" => rii["relatedItemIdentifierType"],
+ "relatedMetadataScheme" => rii["relatedMetadataScheme"],
+ "schemeURI" => rii["schemeURI"],
+ "schemeType" => rii["schemeType"]
+ }.compact
+
+ {
+ "relationType" => ri["relationType"],
+ "relatedItemType" => ri["relatedItemType"],
+ "relatedItemIdentifier" => relatedItemIdentifier,
+ "creators" => get_authors(Array.wrap(ri.dig("creators", "creator"))),
+ "titles" => get_titles(ri),
+ "publicationYear" => ri["publicationYear"],
+ "volume" => ri["volume"],
+ "issue" => ri["issue"],
+ "number" => ri.dig("number", "__content__"),
+ "numberType" => ri.dig("number", "numberType"),
+ "firstPage" => ri["firstPage"],
+ "lastPage" => ri["lastPage"],
+ "publisher" => ri["publisher"],
+ "edition" => ri["edition"],
+ "contributors" => get_authors(Array.wrap(ri.dig("contributors", "contributor"))),
+ }.compact
+ end
+
geo_locations = Array.wrap(meta.dig("geoLocations", "geoLocation")).map do |gl|
if !gl.is_a?(Hash) || gl["geoLocationPoint"].is_a?(String) || gl["geoLocationBox"].is_a?(String) || gl["geoLocationPolygon"].is_a?(String)
nil
else
{
@@ -207,11 +235,13 @@
"westBoundLongitude" => gl.dig("geoLocationBox", "westBoundLongitude"),
"eastBoundLongitude" => gl.dig("geoLocationBox", "eastBoundLongitude"),
"southBoundLatitude" => gl.dig("geoLocationBox", "southBoundLatitude"),
"northBoundLatitude" => gl.dig("geoLocationBox", "northBoundLatitude")
}.compact.presence,
- "geoLocationPolygon" => Array.wrap(gl.dig("geoLocationPolygon", "polygonPoint")).map { |glp| { "polygonPoint" => glp } }.compact.presence,
+ "geoLocationPolygon" => Array.wrap(gl.dig("geoLocationPolygon")).map do |glp|
+ Array.wrap(glp.dig("polygonPoint")).map { |glpp| { "polygonPoint" => glpp } }.compact.presence
+ end.compact.presence,
"geoLocationPlace" => parse_attributes(gl["geoLocationPlace"], first: true).to_s.strip.presence
}.compact
end
end.compact
@@ -236,10 +266,11 @@
"version_info" => meta.fetch("version", nil).to_s.presence,
"subjects" => subjects,
"language" => parse_attributes(meta.fetch("language", nil), first: true).to_s.strip.presence,
"geo_locations" => geo_locations,
"related_identifiers" => related_identifiers,
+ "related_items" => related_items,
"formats" => formats,
"sizes" => sizes,
"schema_version" => schema_version,
"state" => state
}.merge(read_options)
@@ -264,8 +295,23 @@
}.compact
else
{}
end
end
+
+ def get_titles(meta)
+ titles = Array.wrap(meta.dig("titles", "title")).map do |r|
+ if r.blank?
+ nil
+ elsif r.is_a?(String)
+ { "title" => sanitize(r) }
+ else
+ { "title" => sanitize(r["__content__"]), "titleType" => r["titleType"], "lang" => r["lang"] }.compact
+ end
+ end.compact
+
+ titles
+ end
+
end
end
end