relaton-bib 1.14.4 → 1.14.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|