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