relaton-bib 1.14.4 → 1.14.5
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.
- checksums.yaml +4 -4
- data/lib/relaton_bib/bib_item_locality.rb +2 -1
- data/lib/relaton_bib/bibliographic_item.rb +4 -158
- data/lib/relaton_bib/bibtex_parser.rb +1 -0
- data/lib/relaton_bib/renderer/bibtex_builder.rb +312 -0
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2ee0b39ee5595e61f628004eeff3f73bb136de969d1897911fb414dbafee43c
|
4
|
+
data.tar.gz: 76ebf35457db552b454bcad1ca85387338cd85a1cb78761b0a701065a21f56c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9526cb48e9a8a36d71c0b1b560b15a4d20f53bda8836ec15f4d020314881c53791e2f9b5e59f8a27acd1191e1cb16a80e34dc3b7c0fb2823784be9b6ae992de
|
7
|
+
data.tar.gz: 7085340f765f6c27e588d79deefbaa72326a6b5f7c13130b880c0c2e2d97031d96668b4a88fe7d5dfcfd613c26a6434945e38f83558fe5ebed3fa3372b87ad64
|
@@ -62,9 +62,10 @@ module RelatonBib
|
|
62
62
|
when "chapter" then item.chapter = reference_from
|
63
63
|
when "page"
|
64
64
|
value = reference_from
|
65
|
-
value += "
|
65
|
+
value += "--#{reference_to}" if reference_to
|
66
66
|
item.pages = value
|
67
67
|
when "volume" then item.volume = reference_from
|
68
|
+
when "issue" then item.number = reference_from
|
68
69
|
end
|
69
70
|
end
|
70
71
|
end
|
@@ -448,7 +448,7 @@ module RelatonBib
|
|
448
448
|
# @return [String]
|
449
449
|
#
|
450
450
|
def to_bibtex(bibtex = nil)
|
451
|
-
|
451
|
+
Renderer::BibtexBuilder.build(self, bibtex).to_s
|
452
452
|
end
|
453
453
|
|
454
454
|
#
|
@@ -459,7 +459,9 @@ module RelatonBib
|
|
459
459
|
# @return [Hash] citeproc
|
460
460
|
#
|
461
461
|
def to_citeproc(bibtex = nil)
|
462
|
-
|
462
|
+
Renderer::BibtexBuilder.build(self, bibtex).to_citeproc.map do |cp|
|
463
|
+
cp.transform_keys(&:to_s)
|
464
|
+
end
|
463
465
|
end
|
464
466
|
|
465
467
|
# @param lang [String, nil] language code Iso639
|
@@ -590,162 +592,6 @@ module RelatonBib
|
|
590
592
|
|
591
593
|
private
|
592
594
|
|
593
|
-
#
|
594
|
-
# Create BibTeX item for this document
|
595
|
-
#
|
596
|
-
# @param [BibTeX::Bibliography, nil] bibtex <description>
|
597
|
-
#
|
598
|
-
# @return [BibTeX::Bibliography] BibTeX bibliography
|
599
|
-
#
|
600
|
-
def bibtext_item(bibtex) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
601
|
-
item = BibTeX::Entry.new
|
602
|
-
item.type = bibtex_type
|
603
|
-
item.key = id
|
604
|
-
title.to_bibtex item
|
605
|
-
item.edition = edition.content if edition
|
606
|
-
bibtex_author item
|
607
|
-
bibtex_contributor item
|
608
|
-
item.address = place.first.name if place.any?
|
609
|
-
bibtex_note item
|
610
|
-
bibtex_relation item
|
611
|
-
bibtex_extent item
|
612
|
-
bibtex_date item
|
613
|
-
bibtex_series item
|
614
|
-
bibtex_classification item
|
615
|
-
item.keywords = keyword.map(&:content).join(", ") if keyword.any?
|
616
|
-
bibtex_docidentifier item
|
617
|
-
item.timestamp = fetched.to_s if fetched
|
618
|
-
bibtex_link item
|
619
|
-
bibtex ||= BibTeX::Bibliography.new
|
620
|
-
bibtex << item
|
621
|
-
bibtex
|
622
|
-
end
|
623
|
-
|
624
|
-
# @return [String]
|
625
|
-
def bibtex_type
|
626
|
-
case type
|
627
|
-
when "standard", nil then "misc"
|
628
|
-
else type
|
629
|
-
end
|
630
|
-
end
|
631
|
-
|
632
|
-
# @param [BibTeX::Entry]
|
633
|
-
def bibtex_author(item) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/AbcSize
|
634
|
-
authors = contributor.select do |c|
|
635
|
-
c.entity.is_a?(Person) && c.role.map(&:type).include?("author")
|
636
|
-
end.map &:entity
|
637
|
-
|
638
|
-
return unless authors.any?
|
639
|
-
|
640
|
-
item.author = authors.map do |a|
|
641
|
-
if a.name.surname
|
642
|
-
"#{a.name.surname}, #{a.name.forename.map(&:to_s).join(' ')}"
|
643
|
-
else
|
644
|
-
a.name.completename.to_s
|
645
|
-
end
|
646
|
-
end.join " and "
|
647
|
-
end
|
648
|
-
|
649
|
-
# @param [BibTeX::Entry]
|
650
|
-
def bibtex_contributor(item) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
651
|
-
contributor.each do |c|
|
652
|
-
rls = c.role.map(&:type)
|
653
|
-
if rls.include?("publisher") then item.publisher = c.entity.name
|
654
|
-
elsif rls.include?("distributor")
|
655
|
-
case type
|
656
|
-
when "techreport" then item.institution = c.entity.name
|
657
|
-
when "inproceedings", "conference", "manual", "proceedings"
|
658
|
-
item.organization = c.entity.name
|
659
|
-
when "mastersthesis", "phdthesis" then item.school = c.entity.name
|
660
|
-
end
|
661
|
-
end
|
662
|
-
end
|
663
|
-
end
|
664
|
-
|
665
|
-
# @param [BibTeX::Entry]
|
666
|
-
def bibtex_note(item) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize
|
667
|
-
biblionote.each do |n|
|
668
|
-
case n.type
|
669
|
-
when "annote" then item.annote = n.content
|
670
|
-
when "howpublished" then item.howpublished = n.content
|
671
|
-
when "comment" then item.comment = n.content
|
672
|
-
when "tableOfContents" then item.content = n.content
|
673
|
-
when nil then item.note = n.content
|
674
|
-
end
|
675
|
-
end
|
676
|
-
end
|
677
|
-
|
678
|
-
# @param [BibTeX::Entry]
|
679
|
-
def bibtex_relation(item)
|
680
|
-
rel = relation.detect { |r| r.type == "partOf" }
|
681
|
-
if rel
|
682
|
-
title_main = rel.bibitem.title.detect { |t| t.type == "main" }
|
683
|
-
item.booktitle = title_main.title.content
|
684
|
-
end
|
685
|
-
end
|
686
|
-
|
687
|
-
# @param [BibTeX::Entry]
|
688
|
-
def bibtex_extent(item)
|
689
|
-
extent.each { |e| e.to_bibtex(item) }
|
690
|
-
end
|
691
|
-
|
692
|
-
# @param [BibTeX::Entry]
|
693
|
-
def bibtex_date(item)
|
694
|
-
date.each do |d|
|
695
|
-
case d.type
|
696
|
-
when "published"
|
697
|
-
item.year = d.on :year
|
698
|
-
item.month = d.on :month
|
699
|
-
when "accessed" then item.urldate = d.on.to_s
|
700
|
-
end
|
701
|
-
end
|
702
|
-
end
|
703
|
-
|
704
|
-
# @param [BibTeX::Entry]
|
705
|
-
def bibtex_series(item)
|
706
|
-
series.each do |s|
|
707
|
-
case s.type
|
708
|
-
when "journal"
|
709
|
-
item.journal = s.title.title
|
710
|
-
item.number = s.number if s.number
|
711
|
-
when nil then item.series = s.title.title
|
712
|
-
end
|
713
|
-
end
|
714
|
-
end
|
715
|
-
|
716
|
-
# @param [BibTeX::Entry]
|
717
|
-
def bibtex_classification(item)
|
718
|
-
classification.each do |c|
|
719
|
-
case c.type
|
720
|
-
when "type" then item["type"] = c.value
|
721
|
-
# when "keyword" then item.keywords = c.value
|
722
|
-
when "mendeley" then item["mendeley-tags"] = c.value
|
723
|
-
end
|
724
|
-
end
|
725
|
-
end
|
726
|
-
|
727
|
-
# @param [BibTeX::Entry]
|
728
|
-
def bibtex_docidentifier(item)
|
729
|
-
docidentifier.each do |i|
|
730
|
-
case i.type
|
731
|
-
when "isbn" then item.isbn = i.id
|
732
|
-
when "lccn" then item.lccn = i.id
|
733
|
-
when "issn" then item.issn = i.id
|
734
|
-
end
|
735
|
-
end
|
736
|
-
end
|
737
|
-
|
738
|
-
# @param [BibTeX::Entry]
|
739
|
-
def bibtex_link(item)
|
740
|
-
link.each do |l|
|
741
|
-
case l.type
|
742
|
-
when "doi" then item.doi = l.content
|
743
|
-
when "file" then item.file2 = l.content
|
744
|
-
when "src" then item.url = l.content
|
745
|
-
end
|
746
|
-
end
|
747
|
-
end
|
748
|
-
|
749
595
|
# @param opts [Hash]
|
750
596
|
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
751
597
|
# @option opts [Boolean] bibdata
|
@@ -0,0 +1,312 @@
|
|
1
|
+
# Monkey patch to fix the issue with month quotes in BibTeX
|
2
|
+
module BibTeX
|
3
|
+
class Value
|
4
|
+
def to_s(options = {})
|
5
|
+
if options.key?(:filter)
|
6
|
+
opts = options.reject { |k,| k == :filter || (k == :quotes && (!atomic? || symbol?)) }
|
7
|
+
return convert(options[:filter]).to_s(opts)
|
8
|
+
end
|
9
|
+
|
10
|
+
return value.to_s unless options.key?(:quotes) && atomic?
|
11
|
+
|
12
|
+
q = Array(options[:quotes])
|
13
|
+
[q[0], value, q[-1]].compact.join
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module RelatonBib
|
19
|
+
# BibTeX builder.
|
20
|
+
module Renderer
|
21
|
+
class BibtexBuilder
|
22
|
+
ATTRS = %i[
|
23
|
+
type id title author editor booktitle series number edition contributor
|
24
|
+
date address note relation extent classification keyword docidentifier
|
25
|
+
timestamp link
|
26
|
+
].freeze
|
27
|
+
|
28
|
+
#
|
29
|
+
# Build BibTeX bibliography.
|
30
|
+
#
|
31
|
+
# @param bib [RelatonBib::BibliographicItem]
|
32
|
+
# @param bibtex [BibTeX::Bibliography, nil] BibTeX bibliography
|
33
|
+
#
|
34
|
+
# @return [BibTeX::Bibliography] BibTeX bibliography
|
35
|
+
#
|
36
|
+
def self.build(bib, bibtex = nil)
|
37
|
+
new(bib).build bibtex
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Initialize BibTeX builder.
|
42
|
+
#
|
43
|
+
# @param bib [RelatonBib::BibliographicItem]
|
44
|
+
def initialize(bib)
|
45
|
+
@bib = bib
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Build BibTeX bibliography.
|
50
|
+
#
|
51
|
+
# @param bibtex [BibTeX::Bibliography, nil] BibTeX bibliography
|
52
|
+
#
|
53
|
+
# @return [BibTeX::Bibliography] BibTeX bibliography
|
54
|
+
#
|
55
|
+
def build(bibtex = nil)
|
56
|
+
@item = BibTeX::Entry.new
|
57
|
+
ATTRS.each { |a| send("add_#{a}") }
|
58
|
+
bibtex ||= BibTeX::Bibliography.new
|
59
|
+
bibtex << @item
|
60
|
+
bibtex
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
#
|
66
|
+
# Add type to BibTeX item
|
67
|
+
#
|
68
|
+
def add_type
|
69
|
+
@item.type = bibtex_type
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [String] BibTeX type
|
73
|
+
def bibtex_type
|
74
|
+
case @bib.type
|
75
|
+
when "standard", nil then "misc"
|
76
|
+
else @bib.type
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Add ID to BibTeX item
|
82
|
+
#
|
83
|
+
def add_id
|
84
|
+
@item.key = @bib.id
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Add title to BibTeX item
|
89
|
+
#
|
90
|
+
def add_title
|
91
|
+
@bib.title.to_bibtex @item
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Add booktitle to BibTeX item
|
96
|
+
#
|
97
|
+
def add_booktitle
|
98
|
+
included_in = @bib.relation.detect { |r| r.type == "includedIn" }
|
99
|
+
return unless included_in
|
100
|
+
|
101
|
+
@item.booktitle = included_in.bibitem.title.first.title
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Add author to BibTeX item
|
106
|
+
#
|
107
|
+
def add_author
|
108
|
+
add_author_editor "author"
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
# Add editor to BibTeX item
|
113
|
+
#
|
114
|
+
def add_editor
|
115
|
+
add_author_editor "editor"
|
116
|
+
end
|
117
|
+
|
118
|
+
#
|
119
|
+
# Add author or editor to BibTeX item
|
120
|
+
#
|
121
|
+
# @param [String] type "author" or "editor"
|
122
|
+
#
|
123
|
+
def add_author_editor(type)
|
124
|
+
contribs = @bib.contributor.select do |c|
|
125
|
+
c.entity.is_a?(Person) && c.role.any? { |e| e.type == type }
|
126
|
+
end.map &:entity
|
127
|
+
|
128
|
+
return unless contribs.any?
|
129
|
+
|
130
|
+
@item.send "#{type}=", concat_names(contribs)
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
# Concatenate names of contributors
|
135
|
+
#
|
136
|
+
# @param [Array<RelatonBib::Person>] contribs contributors
|
137
|
+
#
|
138
|
+
# @return [String] concatenated names
|
139
|
+
#
|
140
|
+
def concat_names(contribs)
|
141
|
+
contribs.map do |p|
|
142
|
+
if p.name.surname
|
143
|
+
"#{p.name.surname}, #{p.name.forename.map(&:to_s).join(' ')}"
|
144
|
+
else
|
145
|
+
p.name.completename.to_s
|
146
|
+
end
|
147
|
+
end.join(" and ")
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# Add series to BibTeX item
|
152
|
+
#
|
153
|
+
def add_series
|
154
|
+
@bib.series.each do |s|
|
155
|
+
case s.type
|
156
|
+
when "journal"
|
157
|
+
@item.journal = s.title.title
|
158
|
+
@item.number = s.number if s.number
|
159
|
+
when nil then @item.series = s.title.title
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
#
|
165
|
+
# Add number to BibTeX item
|
166
|
+
#
|
167
|
+
def add_number
|
168
|
+
return unless %w[techreport manual].include? @bib.type
|
169
|
+
|
170
|
+
did = @bib.docidentifier.detect { |i| i.primary == true }
|
171
|
+
did ||= @bib.docidentifier.first
|
172
|
+
@item.number = did.id if did
|
173
|
+
end
|
174
|
+
|
175
|
+
#
|
176
|
+
# Add edition to BibTeX item
|
177
|
+
#
|
178
|
+
def add_edition
|
179
|
+
@item.edition = @bib.edition.content if @bib.edition
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# Add contributor to BibTeX item
|
184
|
+
#
|
185
|
+
def add_contributor # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
186
|
+
@bib.contributor.each do |c|
|
187
|
+
rls = c.role.map(&:type)
|
188
|
+
if rls.include?("publisher") then @item.publisher = c.entity.name
|
189
|
+
elsif rls.include?("distributor")
|
190
|
+
case @bib.type
|
191
|
+
when "techreport" then @item.institution = c.entity.name
|
192
|
+
when "inproceedings", "conference", "manual", "proceedings"
|
193
|
+
@item.organization = c.entity.name
|
194
|
+
when "mastersthesis", "phdthesis" then @item.school = c.entity.name
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
#
|
201
|
+
# Add date to BibTeX item
|
202
|
+
#
|
203
|
+
def add_date
|
204
|
+
@bib.date.each do |d|
|
205
|
+
case d.type
|
206
|
+
when "published"
|
207
|
+
@item.year = d.on :year
|
208
|
+
month = d.on :month
|
209
|
+
@item.month = month if month
|
210
|
+
when "accessed" then @item.urldate = d.on.to_s
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
#
|
216
|
+
# Add address to BibTeX item
|
217
|
+
#
|
218
|
+
def add_address # rubocop:disable Metrics/AbcSize
|
219
|
+
return unless @bib.place.any?
|
220
|
+
|
221
|
+
reg = @bib.place[0].region[0].name if @bib.place[0].region.any?
|
222
|
+
addr = [@bib.place[0].name, @bib.place[0].city, reg]
|
223
|
+
@item.address = addr.compact.join(", ")
|
224
|
+
end
|
225
|
+
|
226
|
+
#
|
227
|
+
# Add note to BibTeX item
|
228
|
+
#
|
229
|
+
def add_note # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
230
|
+
@bib.biblionote.each do |n|
|
231
|
+
case n.type
|
232
|
+
when "annote" then @item.annote = n.content
|
233
|
+
when "howpublished" then @item.howpublished = n.content
|
234
|
+
when "comment" then @item.comment = n.content
|
235
|
+
when "tableOfContents" then @item.content = n.content
|
236
|
+
when nil then @item.note = n.content
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
#
|
242
|
+
# Add relation to BibTeX item
|
243
|
+
#
|
244
|
+
def add_relation
|
245
|
+
rel = @bib.relation.detect { |r| r.type == "partOf" }
|
246
|
+
if rel
|
247
|
+
title_main = rel.bibitem.title.detect { |t| t.type == "main" }
|
248
|
+
@item.booktitle = title_main.title.content
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
#
|
253
|
+
# Add extent to BibTeX item
|
254
|
+
#
|
255
|
+
def add_extent
|
256
|
+
@bib.extent.each { |e| e.to_bibtex(@item) }
|
257
|
+
end
|
258
|
+
|
259
|
+
#
|
260
|
+
# Add classification to BibTeX item
|
261
|
+
#
|
262
|
+
def add_classification
|
263
|
+
@bib.classification.each do |c|
|
264
|
+
case c.type
|
265
|
+
when "type" then @item["type"] = c.value
|
266
|
+
when "mendeley" then @item["mendeley-tags"] = c.value
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
#
|
272
|
+
# Add keywords to BibTeX item
|
273
|
+
#
|
274
|
+
def add_keyword
|
275
|
+
@item.keywords = @bib.keyword.map(&:content).join(", ") if @bib.keyword.any?
|
276
|
+
end
|
277
|
+
|
278
|
+
#
|
279
|
+
# Add docidentifier to BibTeX item
|
280
|
+
#
|
281
|
+
def add_docidentifier
|
282
|
+
@bib.docidentifier.each do |i|
|
283
|
+
case i.type
|
284
|
+
when "isbn" then @item.isbn = i.id
|
285
|
+
when "lccn" then @item.lccn = i.id
|
286
|
+
when "issn" then @item.issn = i.id
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
#
|
292
|
+
# Add identifier to BibTeX item
|
293
|
+
#
|
294
|
+
def add_timestamp
|
295
|
+
@item.timestamp = @bib.fetched.to_s if @bib.fetched
|
296
|
+
end
|
297
|
+
|
298
|
+
#
|
299
|
+
# Add link to BibTeX item
|
300
|
+
#
|
301
|
+
def add_link
|
302
|
+
@bib.link.each do |l|
|
303
|
+
case l.type&.downcase
|
304
|
+
when "doi" then @item.doi = l.content
|
305
|
+
when "file" then @item.file2 = l.content
|
306
|
+
when "src" then @item.url = l.content
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
data/lib/relaton_bib/version.rb
CHANGED
data/lib/relaton_bib.rb
CHANGED
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.14.
|
4
|
+
version: 1.14.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
11
|
+
date: 2023-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -266,6 +266,7 @@ files:
|
|
266
266
|
- lib/relaton_bib/organization.rb
|
267
267
|
- lib/relaton_bib/person.rb
|
268
268
|
- lib/relaton_bib/place.rb
|
269
|
+
- lib/relaton_bib/renderer/bibtex_builder.rb
|
269
270
|
- lib/relaton_bib/series.rb
|
270
271
|
- lib/relaton_bib/structured_identifier.rb
|
271
272
|
- lib/relaton_bib/technical_committee.rb
|