bolognese 0.8.5 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +10 -9
  3. data/README.md +15 -1
  4. data/lib/bolognese.rb +2 -0
  5. data/lib/bolognese/bibtex.rb +57 -1
  6. data/lib/bolognese/citeproc.rb +116 -0
  7. data/lib/bolognese/codemeta.rb +9 -1
  8. data/lib/bolognese/crossref.rb +20 -0
  9. data/lib/bolognese/datacite.rb +9 -1
  10. data/lib/bolognese/datacite_json.rb +9 -1
  11. data/lib/bolognese/datacite_utils.rb +1 -1
  12. data/lib/bolognese/metadata.rb +185 -1
  13. data/lib/bolognese/ris.rb +117 -0
  14. data/lib/bolognese/schema_org.rb +8 -0
  15. data/lib/bolognese/utils.rb +84 -17
  16. data/lib/bolognese/version.rb +1 -1
  17. data/resources/kernel-3/metadata.xsd +3 -3
  18. data/spec/bibtex_spec.rb +34 -0
  19. data/spec/citeproc_spec.rb +48 -0
  20. data/spec/codemeta_spec.rb +33 -3
  21. data/spec/crossref_spec.rb +80 -2
  22. data/spec/datacite_json_spec.rb +28 -12
  23. data/spec/datacite_spec.rb +72 -0
  24. data/spec/datacite_utils_spec.rb +1 -1
  25. data/spec/fixtures/citeproc.json +21 -0
  26. data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_citeproc/maremma.yml +100 -0
  27. data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_ris/BlogPosting.yml +100 -0
  28. data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_ris/maremma.yml +100 -0
  29. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata_as_citeproc/journal_article.yml +723 -0
  30. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata_as_citeproc/with_pages.yml +370 -0
  31. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata_as_ris/journal_article.yml +723 -0
  32. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata_as_ris/with_pages.yml +370 -0
  33. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Citeproc_JSON.yml +173 -0
  34. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_citeproc/BlogPosting.yml +155 -0
  35. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_citeproc/Dataset.yml +173 -0
  36. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_ris/BlogPosting.yml +155 -0
  37. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_ris/Dataset.yml +173 -0
  38. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/read/datacite.yml +173 -0
  39. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write/datacite_to_bibtex.yml +173 -0
  40. data/spec/fixtures/vcr_cassettes/Bolognese_SchemaOrg/get_metadata_as_citeproc/BlogPosting.yml +653 -0
  41. data/spec/fixtures/vcr_cassettes/Bolognese_SchemaOrg/get_metadata_as_ris/BlogPosting.yml +653 -0
  42. data/spec/schema_org_spec.rb +30 -0
  43. data/spec/utils_spec.rb +50 -0
  44. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7ecdd8495d5c59b4745c4e474f00fdfb43bc689
4
- data.tar.gz: c067a911205b6ca30f82ceee7579a3b7e2cfa45f
3
+ metadata.gz: 7649099d379d9ce1513465ff2d9f012139542c2a
4
+ data.tar.gz: 476243eda3bd701c7677e36c7f49692c202347f6
5
5
  SHA512:
6
- metadata.gz: 08628597e24777b6116c7cd6106206e528211444daab260c609fa3f8beb08fd56fc0eba55db6f2d262686601fc9fa190f34cf4f6a0baa8f0607367f22fed7ea3
7
- data.tar.gz: 62470519d4523414df33e4b546db7d41057af0f68c62e4b8af537d97c281f972b549a88b02d81660688b0f7418c523a2666d0e8014cdcdf15b43af5908a68443
6
+ metadata.gz: 35d1ec8c50ddb12e3fd155b020bc0c4b542740b57c553ccf05739f0832eecef7c0fadc099ce17be355c42b24cd7711146540fd53d37fb995d1e2caefc3b169a7
7
+ data.tar.gz: a1ac1c3e04f106c0161d6e6fcc2f7a21a7691ee77f0c1f4f66a309758d5a6f20e3555fe8b7a4384df564d518a1df17f62ad6085a3d09fde54bef8e31edb7517a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bolognese (0.8.5)
4
+ bolognese (0.8.7)
5
5
  activesupport (~> 4.2, >= 4.2.5)
6
6
  bibtex-ruby (~> 4.1)
7
7
  builder (~> 3.2, >= 3.2.2)
@@ -21,12 +21,13 @@ GEM
21
21
  minitest (~> 5.1)
22
22
  thread_safe (~> 0.3, >= 0.3.4)
23
23
  tzinfo (~> 1.1)
24
- addressable (2.3.8)
24
+ addressable (2.5.1)
25
+ public_suffix (~> 2.0, >= 2.0.2)
25
26
  bibtex-ruby (4.4.3)
26
27
  latex-decode (~> 0.0)
27
28
  builder (3.2.3)
28
- codeclimate-test-reporter (1.0.6)
29
- simplecov
29
+ codeclimate-test-reporter (1.0.8)
30
+ simplecov (<= 0.13)
30
31
  colorize (0.8.1)
31
32
  crack (0.4.3)
32
33
  safe_yaml (~> 1.0.0)
@@ -64,8 +65,8 @@ GEM
64
65
  namae (0.10.2)
65
66
  nokogiri (1.6.8.1)
66
67
  mini_portile2 (~> 2.1.0)
67
- oj (2.18.2)
68
- postrank-uri (1.0.20)
68
+ oj (2.18.5)
69
+ postrank-uri (1.0.22)
69
70
  addressable (>= 2.3.0, < 2.6)
70
71
  nokogiri (>= 1.6.1, < 1.8)
71
72
  public_suffix (>= 2.0.0, < 2.1)
@@ -98,9 +99,9 @@ GEM
98
99
  simplecov-html (0.10.0)
99
100
  thor (0.19.4)
100
101
  thread_safe (0.3.6)
101
- tzinfo (1.2.2)
102
+ tzinfo (1.2.3)
102
103
  thread_safe (~> 0.1)
103
- unicode (0.4.4.2)
104
+ unicode (0.4.4.4)
104
105
  vcr (3.0.3)
105
106
  webmock (1.24.6)
106
107
  addressable (>= 2.3.6)
@@ -123,4 +124,4 @@ DEPENDENCIES
123
124
  webmock (~> 1.22, >= 1.22.3)
124
125
 
125
126
  BUNDLED WITH
126
- 1.12.5
127
+ 1.14.6
data/README.md CHANGED
@@ -39,7 +39,7 @@ Bolognese reads and/or writes these metadata formats:
39
39
  </tr>
40
40
  <tr>
41
41
  <td><a href='https://api.datacite.org/'>DataCite JSON</a></td>
42
- <td>datacite</td>
42
+ <td>datacite_json</td>
43
43
  <td>application/vnd.datacite+json</td>
44
44
  <td>Yes</td>
45
45
  <td>Yes</td>
@@ -51,6 +51,13 @@ Bolognese reads and/or writes these metadata formats:
51
51
  <td>Yes</td>
52
52
  <td>Yes</td>
53
53
  </tr>
54
+ <tr>
55
+ <td><a href='http://gsl-nagoya-u.net/http/pub/citeproc-doc.html'>Citeproc JSON</a></td>
56
+ <td>citeproc</td>
57
+ <td>application/vnd.citationstyles.csl+json</td>
58
+ <td>Yes</td>
59
+ <td>Yes</td>
60
+ </tr>
54
61
  <tr>
55
62
  <td><a href='https://codemeta.github.io/'>Codemeta</a></td>
56
63
  <td>codemeta</td>
@@ -65,6 +72,13 @@ Bolognese reads and/or writes these metadata formats:
65
72
  <td>Yes</td>
66
73
  <td>Yes</td>
67
74
  </tr>
75
+ <tr>
76
+ <td><a href='http://en.wikipedia.org/wiki/RIS_(file_format)'>RIS</a></td>
77
+ <td>ris</td>
78
+ <td>application/x-research-info-systems</td>
79
+ <td>Yes</td>
80
+ <td>Yes</td>
81
+ </tr>
68
82
  </tbody>
69
83
  </table>
70
84
 
data/lib/bolognese.rb CHANGED
@@ -14,6 +14,8 @@ require "bolognese/datacite_json"
14
14
  require "bolognese/schema_org"
15
15
  require "bolognese/codemeta"
16
16
  require "bolognese/bibtex"
17
+ require "bolognese/ris"
18
+ require "bolognese/citeproc"
17
19
  require "bolognese/orcid"
18
20
  require "bolognese/cli"
19
21
  require "bolognese/string"
@@ -26,6 +26,44 @@ module Bolognese
26
26
  "WebSite" => "misc"
27
27
  }
28
28
 
29
+ BIB_TO_CP_TRANSLATIONS = {
30
+ "article" => "article-journal"
31
+ }
32
+
33
+ BIB_TO_RIS_TRANSLATIONS = {
34
+ "article" => "JOUR",
35
+ "book" => "BOOK",
36
+ "inbook" => "CHAP",
37
+ "inproceedings" => "CPAPER",
38
+ "manual" => nil,
39
+ "misc" => "GEN",
40
+ "phdthesis" => "THES",
41
+ "proceedings" => "CONF",
42
+ "techreport" => "RPRT",
43
+ "unpublished" => "UNPD"
44
+ }
45
+
46
+ SO_TO_RIS_TRANSLATIONS = {
47
+ "Article" => "",
48
+ "AudioObject" => "song",
49
+ "Blog" => nil,
50
+ "BlogPosting" => "BLOG",
51
+ "Collection" => nil,
52
+ "CreativeWork" => "GEN",
53
+ "DataCatalog" => "CTLG",
54
+ "Dataset" => "DATA",
55
+ "Event" => nil,
56
+ "ImageObject" => "FIGURE",
57
+ "Movie" => "MPCT",
58
+ "PublicationIssue" => nil,
59
+ "ScholarlyArticle" => "JOUR",
60
+ "Service" => nil,
61
+ "SoftwareSourceCode" => "COMP",
62
+ "VideoObject" => "VIDEO",
63
+ "WebPage" => "ELEC",
64
+ "WebSite" => nil
65
+ }
66
+
29
67
  def initialize(string: nil)
30
68
  @raw = string
31
69
  end
@@ -46,6 +84,14 @@ module Bolognese
46
84
  BIB_TO_SO_TRANSLATIONS[metadata.type.to_s] || "ScholarlyArticle"
47
85
  end
48
86
 
87
+ def citeproc_type
88
+ BIB_TO_CP_TRANSLATIONS[metadata.type.to_s] || "misc"
89
+ end
90
+
91
+ def ris_type
92
+ BIB_TO_RIS_TRANSLATIONS[metadata.type.to_s] || "GEN"
93
+ end
94
+
49
95
  def resource_type_general
50
96
  SO_TO_DC_TRANSLATIONS[type]
51
97
  end
@@ -75,9 +121,11 @@ module Bolognese
75
121
  end
76
122
 
77
123
  def container_title
78
- metadata.journal.to_s.presence || metadata.pubisher.to_s
124
+ metadata.journal.to_s.presence || metadata.publisher.to_s
79
125
  end
80
126
 
127
+ alias_method :journal, :container_title
128
+
81
129
  def date_published
82
130
  metadata.date.to_s.presence
83
131
  end
@@ -86,6 +134,14 @@ module Bolognese
86
134
  metadata.year.to_s.presence
87
135
  end
88
136
 
137
+ def volume
138
+ metadata.volume.to_s.presence
139
+ end
140
+
141
+ def pagination
142
+ metadata.pages.to_s.presence
143
+ end
144
+
89
145
  def is_part_of
90
146
  if metadata.journal.present?
91
147
  { "type" => "Periodical",
@@ -0,0 +1,116 @@
1
+ module Bolognese
2
+ class Citeproc < Metadata
3
+
4
+ SO_TO_DC_RELATION_TYPES = {
5
+ "citation" => "References",
6
+ "sameAs" => "IsIdenticalTo",
7
+ "isPartOf" => "IsPartOf",
8
+ "hasPart" => "HasPart",
9
+ "isPredecessor" => "IsPreviousVersionOf",
10
+ "isSuccessor" => "IsNewVersionOf"
11
+ }
12
+
13
+ def initialize(string: nil)
14
+ @raw = string
15
+ end
16
+
17
+ def metadata
18
+ @metadata ||= raw.present? ? Maremma.from_json(raw) : {}
19
+ end
20
+
21
+ def exists?
22
+ metadata.present?
23
+ end
24
+
25
+ def valid?
26
+ citeproc.present?
27
+ end
28
+
29
+ def doi
30
+ metadata.fetch("DOI", nil)
31
+ end
32
+
33
+ def id
34
+ normalize_id(metadata.fetch("id", nil))
35
+ end
36
+
37
+ def url
38
+ normalize_id(metadata.fetch("URL", nil))
39
+ end
40
+
41
+ def resource_type_general
42
+ SO_TO_DC_TRANSLATIONS[type]
43
+ end
44
+
45
+ def type
46
+ CP_TO_SO_TRANSLATIONS[citeproc_type] || "CreativeWork"
47
+ end
48
+
49
+ def citeproc_type
50
+ metadata.fetch("type", nil)
51
+ end
52
+
53
+ def additional_type
54
+ metadata.fetch("additionalType", nil)
55
+ end
56
+
57
+ def bibtex_type
58
+ Bolognese::Bibtex::SO_TO_BIB_TRANSLATIONS[type] || "misc"
59
+ end
60
+
61
+ def ris_type
62
+ CP_TO_RIS_TRANSLATIONS[type] || "GEN"
63
+ end
64
+
65
+ def title
66
+ metadata.fetch("title", nil)
67
+ end
68
+
69
+ def author
70
+ authors = from_citeproc(Array.wrap(metadata.fetch("author", nil)))
71
+ get_authors(authors)
72
+ end
73
+
74
+ def editor
75
+ editors = from_citeproc(Array.wrap(metadata.fetch("editor", nil)))
76
+ get_authors(editors)
77
+ end
78
+
79
+ def description
80
+ { "text" => metadata.fetch("abstract", nil) }
81
+ end
82
+
83
+ def version
84
+ metadata.fetch("version", nil)
85
+ end
86
+
87
+ def keywords
88
+ metadata.fetch("categories", nil)
89
+ end
90
+
91
+ def date_published
92
+ issued = metadata.fetch("issued", nil)
93
+ get_date_from_date_parts(issued)
94
+ end
95
+
96
+ def publication_year
97
+ date_published[0..3].to_i.presence
98
+ end
99
+
100
+ def is_part_of
101
+ if container_title.present?
102
+ { "type" => "Periodical",
103
+ "name" => container_title,
104
+ "issn" => metadata.fetch("ISSN", nil) }.compact
105
+ end
106
+ end
107
+
108
+ def publisher
109
+ metadata.fetch("publisher", nil)
110
+ end
111
+
112
+ def container_title
113
+ metadata.fetch("container-title", nil)
114
+ end
115
+ end
116
+ end
@@ -48,6 +48,14 @@ module Bolognese
48
48
  metadata.fetch("@type", nil)
49
49
  end
50
50
 
51
+ def citeproc_type
52
+ "computer_program"
53
+ end
54
+
55
+ def ris_type
56
+ SO_TO_RIS_TRANSLATIONS[type] || "GEN"
57
+ end
58
+
51
59
  def additional_type
52
60
  metadata.fetch("additionalType", nil)
53
61
  end
@@ -87,7 +95,7 @@ module Bolognese
87
95
  end
88
96
 
89
97
  def keywords
90
- Array(metadata.fetch("tags", nil)).join(", ").presence
98
+ Array.wrap(metadata.fetch("tags", nil)).join(", ").presence
91
99
  end
92
100
 
93
101
  def date_created
@@ -102,6 +102,10 @@ module Bolognese
102
102
  metadata.dig("crossref", "journal", "journal_metadata").presence || {}
103
103
  end
104
104
 
105
+ def journal_issue
106
+ metadata.dig("crossref", "journal", "journal_issue").presence || {}
107
+ end
108
+
105
109
  def bibliographic_metadata
106
110
  metadata.dig("crossref", "journal", "journal_article").presence ||
107
111
  metadata.dig("crossref", "conference", "conference_paper").presence ||
@@ -121,6 +125,14 @@ module Bolognese
121
125
  CR_TO_SO_TRANSLATIONS[additional_type] || "ScholarlyArticle"
122
126
  end
123
127
 
128
+ def citeproc_type
129
+ CR_TO_CP_TRANSLATIONS[additional_type] || "article-journal"
130
+ end
131
+
132
+ def ris_type
133
+ CR_TO_RIS_TRANSLATIONS[additional_type] || "JOUR"
134
+ end
135
+
124
136
  def additional_type
125
137
  if metadata.dig("crossref", "journal").present?
126
138
  metadata.dig("crossref", "journal").keys.last.camelize
@@ -204,6 +216,14 @@ module Bolognese
204
216
  Time.parse(metadata.fetch("timestamp", "")).utc.iso8601
205
217
  end
206
218
 
219
+ def volume
220
+ journal_issue.dig("journal_volume", "volume")
221
+ end
222
+
223
+ def issue
224
+ journal_issue.dig("issue")
225
+ end
226
+
207
227
  def page_start
208
228
  bibliographic_metadata.dig("pages", "first_page")
209
229
  end
@@ -66,6 +66,14 @@ module Bolognese
66
66
  DC_TO_SO_TRANSLATIONS[resource_type_general.to_s.dasherize] || "CreativeWork"
67
67
  end
68
68
 
69
+ def citeproc_type
70
+ DC_TO_CP_TRANSLATIONS[resource_type_general.to_s.dasherize] || "other"
71
+ end
72
+
73
+ def ris_type
74
+ SO_TO_RIS_TRANSLATIONS[resource_type_general.to_s.dasherize] || "GEN"
75
+ end
76
+
69
77
  def additional_type
70
78
  metadata.fetch("resourceType", {}).fetch("__content__", nil) ||
71
79
  metadata.fetch("resourceType", {}).fetch("resourceTypeGeneral", nil)
@@ -187,7 +195,7 @@ module Bolognese
187
195
  end
188
196
 
189
197
  def publication_year
190
- metadata.fetch("publicationYear")
198
+ metadata.fetch("publicationYear", nil)
191
199
  end
192
200
 
193
201
  def language
@@ -35,6 +35,14 @@ module Bolognese
35
35
  DC_TO_SO_TRANSLATIONS[resource_type_general.to_s.dasherize] || "CreativeWork"
36
36
  end
37
37
 
38
+ def citeproc_type
39
+ DC_TO_CP_TRANSLATIONS[resource_type_general.to_s.dasherize] || "other"
40
+ end
41
+
42
+ def ris_type
43
+ SO_TO_RIS_TRANSLATIONS[resource_type_general.to_s.dasherize] || "GEN"
44
+ end
45
+
38
46
  def additional_type
39
47
  metadata.fetch("resource-type", nil)
40
48
  end
@@ -60,7 +68,7 @@ module Bolognese
60
68
  end
61
69
 
62
70
  def keywords
63
- metadata.fetch("subject", nil)
71
+ Array.wrap(metadata.fetch("subject", nil)).join(", ").presence
64
72
  end
65
73
 
66
74
  def author
@@ -67,7 +67,7 @@ module Bolognese
67
67
  end
68
68
 
69
69
  def insert_person(xml, person, type)
70
- person_name = person["name"].presence || [person["familyName"], person["givenName"]].compact.join(", ")
70
+ person_name = person["familyName"].present? ? [person["familyName"], person["givenName"]].compact.join(", ") : person["name"]
71
71
 
72
72
  xml.send(type + "Name", person_name)
73
73
  xml.givenName(person["givenName"]) if person["givenName"].present?
@@ -29,6 +29,51 @@ module Bolognese
29
29
  "Other" => "CreativeWork"
30
30
  }
31
31
 
32
+ DC_TO_CP_TRANSLATIONS = {
33
+ "Audiovisual" => "motion_picture",
34
+ "Collection" => nil,
35
+ "Dataset" => "dataset",
36
+ "Event" => nil,
37
+ "Image" => "graphic",
38
+ "InteractiveResource" => nil,
39
+ "Model" => nil,
40
+ "PhysicalObject" => nil,
41
+ "Service" => nil,
42
+ "Software" => "computer_program",
43
+ "Sound" => "song",
44
+ "Text" => "report",
45
+ "Workflow" => nil,
46
+ "Other" => nil
47
+ }
48
+
49
+ CR_TO_CP_TRANSLATIONS = {
50
+ "proceedings" => nil,
51
+ "reference-book" => nil,
52
+ "journal-issue" => nil,
53
+ "proceedings-article" => "paper-conference",
54
+ "other" => nil,
55
+ "dissertation" => "thesis",
56
+ "dataset" => "dataset",
57
+ "edited-book" => "book",
58
+ "journal-article" => "article-journal",
59
+ "journal" => nil,
60
+ "report" => "report",
61
+ "book-series" => nil,
62
+ "report-series" => nil,
63
+ "book-track" => nil,
64
+ "standard" => nil,
65
+ "book-section" => "chapter",
66
+ "book-part" => nil,
67
+ "book" => "book",
68
+ "book-chapter" => "chapter",
69
+ "standard-series" => nil,
70
+ "monograph" => "book",
71
+ "component" => nil,
72
+ "reference-entry" => "entry-dictionary",
73
+ "journal-volume" => nil,
74
+ "book-set" => nil
75
+ }
76
+
32
77
  SO_TO_DC_TRANSLATIONS = {
33
78
  "Article" => "Text",
34
79
  "AudioObject" => "Sound",
@@ -50,6 +95,100 @@ module Bolognese
50
95
  "WebSite" => "Text"
51
96
  }
52
97
 
98
+ SO_TO_CP_TRANSLATIONS = {
99
+ "Article" => "",
100
+ "AudioObject" => "song",
101
+ "Blog" => "report",
102
+ "BlogPosting" => "post-weblog",
103
+ "Collection" => nil,
104
+ "CreativeWork" => nil,
105
+ "DataCatalog" => "dataset",
106
+ "Dataset" => "dataset",
107
+ "Event" => nil,
108
+ "ImageObject" => "graphic",
109
+ "Movie" => "motion_picture",
110
+ "PublicationIssue" => nil,
111
+ "ScholarlyArticle" => "article-journal",
112
+ "Service" => nil,
113
+ "SoftwareSourceCode" => "computer_program",
114
+ "VideoObject" => "broadcast",
115
+ "WebPage" => "webpage",
116
+ "WebSite" => "webpage"
117
+ }
118
+
119
+ CP_TO_SO_TRANSLATIONS = {
120
+ "song" => "AudioObject",
121
+ "post-weblog" => "BlogPosting",
122
+ "dataset" => "Dataset",
123
+ "graphic" => "ImageObject",
124
+ "motion_picture" => "Movie",
125
+ "article-journal" => "ScholarlyArticle",
126
+ "computer_program" => "SoftwareSourceCode",
127
+ "broadcast" => "VideoObject",
128
+ "webpage" => "WebPage"
129
+ }
130
+
131
+ SO_TO_RIS_TRANSLATIONS = {
132
+ "Article" => nil,
133
+ "AudioObject" => nil,
134
+ "Blog" => nil,
135
+ "BlogPosting" => "BLOG",
136
+ "Collection" => nil,
137
+ "CreativeWork" => "GEN",
138
+ "DataCatalog" => "CTLG",
139
+ "Dataset" => "DATA",
140
+ "Event" => nil,
141
+ "ImageObject" => "FIGURE",
142
+ "Movie" => "MPCT",
143
+ "PublicationIssue" => nil,
144
+ "ScholarlyArticle" => "JOUR",
145
+ "Service" => nil,
146
+ "SoftwareSourceCode" => "COMP",
147
+ "VideoObject" => "VIDEO",
148
+ "WebPage" => "ELEC",
149
+ "WebSite" => nil
150
+ }
151
+
152
+ CR_TO_RIS_TRANSLATIONS = {
153
+ "proceedings" => "CONF",
154
+ "reference-book" => "BOOK",
155
+ "journal-issue" => nil,
156
+ "proceedings-article" => "CPAPER",
157
+ "other" => "GEN",
158
+ "dissertation" => "THES",
159
+ "dataset" => "DATA",
160
+ "edited-book" => "BOOK",
161
+ "journal-article" => "JOUR",
162
+ "journal" => nil,
163
+ "report" => nil,
164
+ "book-series" => nil,
165
+ "report-series" => nil,
166
+ "book-track" => nil,
167
+ "standard" => nil,
168
+ "book-section" => "CHAP",
169
+ "book-part" => "CHAP",
170
+ "book" => "BOOK",
171
+ "book-chapter" => "CHAP",
172
+ "standard-series" => nil,
173
+ "monograph" => "BOOK",
174
+ "component" => nil,
175
+ "reference-entry" => "DICT",
176
+ "journal-volume" => nil,
177
+ "book-set" => nil
178
+ }
179
+
180
+ CP_TO_RIS_TRANSLATIONS = {
181
+ "post-weblog" => "BLOG",
182
+ "dataset" => "DATA",
183
+ "graphic" => "FIGURE",
184
+ "book" => "BOOK",
185
+ "motion_picture" => "MPCT",
186
+ "article-journal" => "JOUR",
187
+ "computer_program" => "COMP",
188
+ "broadcast" => "MPCT",
189
+ "webpage" => "ELEC"
190
+ }
191
+
53
192
  attr_reader :id, :raw, :provider, :schema_version, :license, :citation,
54
193
  :additional_type, :alternate_name, :url, :version, :keywords, :editor,
55
194
  :page_start, :page_end, :date_modified, :language, :spatial_coverage,
@@ -62,7 +201,7 @@ module Bolognese
62
201
  :is_referenced_by, :references, :is_documented_by, :documents,
63
202
  :is_compiled_by, :compiles, :is_variant_form_of, :is_original_form_of,
64
203
  :is_reviewed_by, :reviews, :is_derived_from, :is_source_of, :format,
65
- :related_identifier, :reverse
204
+ :related_identifier, :reverse, :citeproc_type, :ris_type, :volume, :issue
66
205
 
67
206
  def publication_year
68
207
  date_published && date_published[0..3]
@@ -156,6 +295,30 @@ module Bolognese
156
295
  JSON.pretty_generate hsh
157
296
  end
158
297
 
298
+ def citeproc
299
+ hsh = {
300
+ "type" => citeproc_type,
301
+ "id" => id,
302
+ "categories" => keywords.present? ? keywords.split(", ") : nil,
303
+ "language" => language,
304
+ "author" => to_citeproc(author),
305
+ "editor" => to_citeproc(editor),
306
+ "issued" => get_date_parts(date_published),
307
+ "submitted" => get_date_parts(date_submitted),
308
+ "abstract" => description.is_a?(Hash) ? description.fetch("text", nil) : description,
309
+ "container-title" => journal,
310
+ "DOI" => doi,
311
+ "issue" => issue,
312
+ "page" => pagination,
313
+ "publisher" => publisher,
314
+ "title" => title,
315
+ "URL" => url,
316
+ "version" => version,
317
+ "volume" => volume
318
+ }.compact
319
+ JSON.pretty_generate hsh
320
+ end
321
+
159
322
  def codemeta
160
323
  hsh = {
161
324
  "@context" => id.present? ? "https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld" : nil,
@@ -193,5 +356,26 @@ module Bolognese
193
356
  }.compact
194
357
  BibTeX::Entry.new(bib).to_s
195
358
  end
359
+
360
+ def ris
361
+ {
362
+ "TY" => ris_type,
363
+ "T1" => title,
364
+ "T2" => container_title,
365
+ "AU" => to_ris(author),
366
+ "DO" => doi,
367
+ "UR" => url,
368
+ "AB" => description.present? ? description["text"] : nil,
369
+ "KW" => keywords.to_s.split(", ").presence,
370
+ "PY" => publication_year,
371
+ "PB" => publisher,
372
+ "AN" => alternate_name.present? ? alternate_name["name"] : nil,
373
+ "LA" => language,
374
+ "VL" => volume,
375
+ "IS" => issue,
376
+ "SP" => pagination,
377
+ "ER" => ""
378
+ }.compact.map { |k, v| v.is_a?(Array) ? v.map { |vi| "#{k} - #{vi}" }.join("\r\n") : "#{k} - #{v}" }.join("\r\n")
379
+ end
196
380
  end
197
381
  end