28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/briard/readers/citeproc_reader.rb', line 28
def read_citeproc(string: nil, **options)
if string.present?
errors = jsonlint(string)
return { 'errors' => errors } if errors.present?
end
read_options = ActiveSupport::HashWithIndifferentAccess.new(options.except(:doi, :id, :url,
:sandbox, :validate, :ra))
meta = string.present? ? Maremma.from_json(string) : {}
citeproc_type = meta.fetch('type', nil)
schema_org = CP_TO_SO_TRANSLATIONS[citeproc_type] || 'CreativeWork'
types = {
'resourceTypeGeneral' => Briard::Utils::CP_TO_DC_TRANSLATIONS[citeproc_type],
'reourceType' => meta.fetch('additionalType', nil),
'schemaOrg' => schema_org,
'citeproc' => citeproc_type,
'bibtex' => Briard::Utils::SO_TO_BIB_TRANSLATIONS[schema_org] || 'misc',
'ris' => CP_TO_RIS_TRANSLATIONS[schema_org] || 'GEN'
}.compact
creators = if meta.fetch('author', nil).present?
get_authors(from_citeproc(Array.wrap(meta.fetch('author', nil))))
else
[{ 'nameType' => 'Organizational', 'name' => ':(unav)' }]
end
contributors = get_authors(from_citeproc(Array.wrap(meta.fetch('editor', nil))))
dates = if (date = get_date_from_date_parts(meta.fetch('issued',
nil))) && Date.edtf(date).present?
[{ 'date' => date,
'dateType' => 'Issued' }]
end
publication_year = get_date_from_date_parts(meta.fetch('issued', nil)).to_s[0..3]
rights_list = if meta.fetch('copyright', nil)
[hsh_to_spdx('rightsURI' => meta.fetch('copyright'))]
end
related_identifiers = if meta.fetch('container-title',
nil).present? && meta.fetch('ISSN', nil).present?
[{ 'type' => 'Periodical',
'relationType' => 'IsPartOf',
'relatedIdentifierType' => 'ISSN',
'title' => meta.fetch('container-title', nil),
'relatedIdentifier' => meta.fetch('ISSN', nil) }.compact]
end
container = if meta.fetch('container-title', nil).present?
first_page = if meta.fetch('page', nil).present?
meta.fetch('page').split('-').map(&:strip)[0]
end
last_page = if meta.fetch('page', nil).present?
meta.fetch('page').split('-').map(&:strip)[1]
end
{ 'type' => 'Periodical',
'title' => meta.fetch('container-title', nil),
'identifier' => meta.fetch('ISSN', nil),
'identifierType' => meta.fetch('ISSN', nil).present? ? 'ISSN' : nil,
'volume' => meta.fetch('volume', nil),
'issue' => meta.fetch('issue', nil),
'firstPage' => first_page,
'lastPage' => last_page }.compact
end
id = normalize_id(meta.fetch('id', nil) || meta.fetch('DOI', nil))
state = id.present? || read_options.present? ? 'findable' : 'not_found'
subjects = Array.wrap(meta.fetch('categories', nil)).reduce([]) do |sum, subject|
sum += name_to_fos(subject)
sum
end
{ 'id' => id,
'types' => types,
'doi' => doi_from_url(id),
'url' => normalize_id(meta.fetch('URL', nil)),
'titles' => [{ 'title' => meta.fetch('title', nil) }],
'creators' => creators,
'contributors' => contributors,
'container' => container,
'publisher' => meta.fetch('publisher', nil),
'related_identifiers' => related_identifiers,
'dates' => dates,
'publication_year' => publication_year,
'descriptions' => if meta.fetch('abstract', nil).present?
[{ 'description' => sanitize(meta.fetch('abstract')),
'descriptionType' => 'Abstract' }]
else
[]
end,
'rights_list' => rights_list,
'version_info' => meta.fetch('version', nil),
'subjects' => subjects,
'state' => state }.merge(read_options)
end
|