bibtex-ruby 2.0.8 → 2.0.9
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.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- data/Gemfile.lock +1 -1
- data/History.txt +6 -0
- data/README.md +42 -9
- data/lib/bibtex/bibliography.rb +71 -1
- data/lib/bibtex/names.rb +1 -1
- data/lib/bibtex/version.rb +1 -1
- data/test/bibtex/test_bibliography.rb +42 -4
- metadata +14 -14
data/Gemfile.lock
CHANGED
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -54,6 +54,25 @@ Extend first name initials throughout your bibliography:
|
|
54
54
|
b[:pickaxe].author.to_s
|
55
55
|
#=> "Thomas, Dave and Fowler, Chad and Hunt, Andy"
|
56
56
|
|
57
|
+
You can also extend all names in the bibliography to their prototypical
|
58
|
+
(i.e., the longest available) form:
|
59
|
+
|
60
|
+
b.extend_initials! #=> extends all names in the bibliography
|
61
|
+
|
62
|
+
Use with caution as this method will treat two names as identical if they
|
63
|
+
look the same in their `#sort_order(:initials => true)` form.
|
64
|
+
|
65
|
+
Unify certain fields across the bibliography:
|
66
|
+
|
67
|
+
b.unify :publisher, /o'?reilly/i, "O'Reilly"
|
68
|
+
|
69
|
+
b.unify :publisher, /^penguin/i do |entry|
|
70
|
+
entry.publisher = 'Penguin Books'
|
71
|
+
entry.address = 'London'
|
72
|
+
end
|
73
|
+
|
74
|
+
This will unify various spellings of entries published by O'Reilly and Penguin.
|
75
|
+
|
57
76
|
Render your bibliography in one of
|
58
77
|
[many different citation styles](https://github.com/citation-style-language/styles)
|
59
78
|
(requires the **citeproc-ruby** gem):
|
@@ -161,17 +180,17 @@ BibTeX-Ruby will return any fields inherited from the parent entry:
|
|
161
180
|
|
162
181
|
> b = BibTeX.parse <<-END
|
163
182
|
@inbook{fraassen_1989b,
|
164
|
-
|
165
|
-
|
166
|
-
|
183
|
+
Crossref = {fraassen_1989},
|
184
|
+
Pages = {40-64},
|
185
|
+
Title = {Ideal Science: David Lewis's Account of Laws},
|
167
186
|
}
|
168
187
|
|
169
188
|
@book{fraassen_1989,
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
189
|
+
Address = {Oxford},
|
190
|
+
Author = {Bas C. van Fraassen},
|
191
|
+
Publisher = {Oxford University Press},
|
192
|
+
Title = {Laws and Symmetry},
|
193
|
+
Year = 1989
|
175
194
|
}
|
176
195
|
END
|
177
196
|
> b['fraassen_1989b'].booktitle
|
@@ -313,6 +332,20 @@ use the following snippet:
|
|
313
332
|
end
|
314
333
|
end
|
315
334
|
|
335
|
+
There is also a short-hand for this use case:
|
336
|
+
|
337
|
+
b.extend_initials ['Edgar Allen', 'Poe']
|
338
|
+
|
339
|
+
Alternatively, if your bibliography contains the same names in various
|
340
|
+
forms (e.g., 'Poe, Edgar A.', 'Poe, E.A.', 'Poe, E. Allen') you can also
|
341
|
+
set all names to their longest available form:
|
342
|
+
|
343
|
+
b.extend_initials!
|
344
|
+
|
345
|
+
Use with caution, though, as this method will treat names as identical
|
346
|
+
as long as their initials are the same. That is to say, 'Poe, Eric A.' would
|
347
|
+
be extend to 'Poe, Edgar Allen'.
|
348
|
+
|
316
349
|
|
317
350
|
### Filters
|
318
351
|
|
@@ -351,7 +384,7 @@ apply the filter upon opening or parsing the Bibliography. You can do this,
|
|
351
384
|
by passing the `:filter` option:
|
352
385
|
|
353
386
|
BibTeX.open 'references.bib', :filter => :latex
|
354
|
-
|
387
|
+
|
355
388
|
|
356
389
|
### Exports
|
357
390
|
|
data/lib/bibtex/bibliography.rb
CHANGED
@@ -290,12 +290,74 @@ module BibTeX
|
|
290
290
|
# b.extend_initials(['Edgar Allen', 'Poe'], ['Nathaniel', 'Hawthorne'])
|
291
291
|
# #=> Extends the initials in names like 'E.A. Poe' or 'Hawethorne, N.'
|
292
292
|
# in the bibliography.
|
293
|
+
#
|
294
|
+
# Extends the initials for the given names. Returns the Bibliography.
|
293
295
|
def extend_initials(*arguments)
|
294
296
|
arguments.each do |with_first, for_last|
|
295
297
|
names.each do |name|
|
296
298
|
name.extend_initials(with_first, for_last)
|
297
299
|
end
|
298
300
|
end
|
301
|
+
|
302
|
+
self
|
303
|
+
end
|
304
|
+
|
305
|
+
# This method combines all names in the bibliography that look identical
|
306
|
+
# when using initials as first names and then tries to extend the first
|
307
|
+
# names for all names in each group to the longest available form.
|
308
|
+
# Returns the bibliography.
|
309
|
+
#
|
310
|
+
# If your bibliography contains the names 'Poe, Edgar A.', 'Poe, E.A.',
|
311
|
+
# and 'Poe, E. A.' calling this method would convert all three names to
|
312
|
+
# 'Poe, Edgar A.'.
|
313
|
+
def extend_initials!
|
314
|
+
groups = Hash.new do |h,k|
|
315
|
+
h[k] = { :prototype => nil, :names => [] }
|
316
|
+
end
|
317
|
+
|
318
|
+
# group names together
|
319
|
+
names.each do |name|
|
320
|
+
group = groups[name.sort_order(:initials => true).gsub(/\s+/, '')]
|
321
|
+
group[:names] << name
|
322
|
+
|
323
|
+
if group[:prototype].nil? || group[:prototype].first.length < name.first.length
|
324
|
+
group[:prototype] = name
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
# extend all names in group to prototype
|
329
|
+
groups.each_value do |group|
|
330
|
+
group[:names].each do |name|
|
331
|
+
name.set(group[:prototype])
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
self
|
336
|
+
end
|
337
|
+
|
338
|
+
# call-seq:
|
339
|
+
# b.unify :publisher, /o'?reilly/i, "O'Reilly"
|
340
|
+
# #=> Unifies the publisher name "O'Reilly" in the bibliography
|
341
|
+
#
|
342
|
+
# Sets all fields matching the passed-in pattern to the supplied value.
|
343
|
+
# If a block is given, each matching entry will be passed to the block
|
344
|
+
# instead. Returns the bibliography.
|
345
|
+
def unify(field, pattern, value = nil)
|
346
|
+
pattern = Regexp.new(pattern) unless pattern.is_a?(Regexp)
|
347
|
+
|
348
|
+
block = if block_given?
|
349
|
+
Proc.new
|
350
|
+
else
|
351
|
+
Proc.new { |e| e[field] = value }
|
352
|
+
end
|
353
|
+
|
354
|
+
each_entry do |entry|
|
355
|
+
if entry.field?(field) && entry[field].to_s =~ pattern
|
356
|
+
block.call(entry)
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
self
|
299
361
|
end
|
300
362
|
|
301
363
|
def sort(*arguments, &block)
|
@@ -416,7 +478,15 @@ module BibTeX
|
|
416
478
|
end
|
417
479
|
|
418
480
|
alias q query
|
419
|
-
|
481
|
+
|
482
|
+
def each_entry
|
483
|
+
if block_given?
|
484
|
+
q('@entry').each(&Proc.new)
|
485
|
+
else
|
486
|
+
q('@entry').to_enum
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
420
490
|
def find_by_type(*types, &block)
|
421
491
|
q(types.flatten.compact.map { |t| "@#{t}" }.join(', '), &block)
|
422
492
|
end
|
data/lib/bibtex/names.rb
CHANGED
@@ -151,7 +151,7 @@ module BibTeX
|
|
151
151
|
|
152
152
|
# Set the name tokens to the values defined in the passed-in hash.
|
153
153
|
def set(attributes = {})
|
154
|
-
attributes.
|
154
|
+
attributes.each_pair do |key, value|
|
155
155
|
send("#{key}=", value) if respond_to?(key)
|
156
156
|
end
|
157
157
|
|
data/lib/bibtex/version.rb
CHANGED
@@ -68,6 +68,14 @@ module BibTeX
|
|
68
68
|
publisher={O'Reilly}
|
69
69
|
}
|
70
70
|
@string{ foo = "foobar" }
|
71
|
+
@misc{flanagan-1,
|
72
|
+
title={{Foo Bar}},
|
73
|
+
author={Flanagan, Dav}
|
74
|
+
}
|
75
|
+
@misc{flanagan-2,
|
76
|
+
title={{Foo Bar}},
|
77
|
+
author={Flanagan, David}
|
78
|
+
}
|
71
79
|
END
|
72
80
|
end
|
73
81
|
|
@@ -85,6 +93,36 @@ module BibTeX
|
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
96
|
+
describe '#extend_initials!' do
|
97
|
+
it 'extends the initials of all names to the longest prototype' do
|
98
|
+
assert_equal "Ruby, Sam Thomas, Dave Hansson Heinemeier, David Flanagan, David Matsumoto, Y. Segaran, T.",
|
99
|
+
@bib.extend_initials!.names.map(&:sort_order).uniq.join(' ')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#unify' do
|
104
|
+
it 'sets all fields matching the given pattern to the passed-in value' do
|
105
|
+
@bib.unify :publisher, /reilly/i, 'OReilly'
|
106
|
+
assert_equal 'OReilly', @bib['segaran2007'].publisher
|
107
|
+
assert_equal 'OReilly', @bib['flanagan2008'].publisher
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'does not change the value of fields that do not match' do
|
111
|
+
@bib.unify :publisher, /reilly/i, 'OReilly'
|
112
|
+
assert_equal 'The Pragmatic Bookshelf', @bib['rails'].publisher
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'passes each entry with matching fields to the block if given' do
|
116
|
+
years = []
|
117
|
+
@bib.unify(:publisher, /reilly/i) { |e| years << e.year.to_s }
|
118
|
+
assert_equal ['2007','2008'], years.sort
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'returns the bibliography' do
|
122
|
+
assert_equal @bib, @bib.unify(:publisher, /reilly/i, 'OReilly')
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
88
126
|
it 'supports access by index' do
|
89
127
|
assert_equal 'ruby', @bib[1].keywords
|
90
128
|
end
|
@@ -139,7 +177,7 @@ module BibTeX
|
|
139
177
|
end
|
140
178
|
|
141
179
|
it 'supports queries with negative conditions' do
|
142
|
-
assert_equal
|
180
|
+
assert_equal 4, @bib['@*[keywords!=ruby]'].length
|
143
181
|
end
|
144
182
|
|
145
183
|
it 'supports queries with pattern conditions' do
|
@@ -186,15 +224,15 @@ module BibTeX
|
|
186
224
|
describe '#query' do
|
187
225
|
|
188
226
|
it 'returns all elements when passed no arguments' do
|
189
|
-
@bib.query.length.must_be :==,
|
227
|
+
@bib.query.length.must_be :==, 6
|
190
228
|
end
|
191
229
|
|
192
230
|
it 'returns all elements when passed :all and an empty condition' do
|
193
|
-
@bib.query(:all, '').length.must_be :==,
|
231
|
+
@bib.query(:all, '').length.must_be :==, 6
|
194
232
|
end
|
195
233
|
|
196
234
|
it 'returns all entries when passed a * wildcard' do
|
197
|
-
@bib.query('@*').length.must_be :==,
|
235
|
+
@bib.query('@*').length.must_be :==, 5
|
198
236
|
end
|
199
237
|
|
200
238
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bibtex-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: latex-decode
|
16
|
-
requirement: &
|
16
|
+
requirement: &70317354105840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70317354105840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multi_json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70317354105180 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.3'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70317354105180
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70317354104100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0.9'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70317354104100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: racc
|
49
|
-
requirement: &
|
49
|
+
requirement: &70317354103320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '1.4'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70317354103320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rdoc
|
60
|
-
requirement: &
|
60
|
+
requirement: &70317354102160 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '3.9'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70317354102160
|
69
69
|
description: ! "\t\tBibTeX-Ruby is the Rubyist's swiss-army-knife for all things BibTeX.
|
70
70
|
It\n includes a parser for all common BibTeX objects (@string, @preamble,\n @comment
|
71
71
|
and regular entries) and a sophisticated name parser that\n tokenizes correctly
|
@@ -182,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
182
|
version: '0'
|
183
183
|
segments:
|
184
184
|
- 0
|
185
|
-
hash: -
|
185
|
+
hash: -50105295349997103
|
186
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
187
|
none: false
|
188
188
|
requirements:
|
@@ -191,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
191
|
version: '0'
|
192
192
|
segments:
|
193
193
|
- 0
|
194
|
-
hash: -
|
194
|
+
hash: -50105295349997103
|
195
195
|
requirements: []
|
196
196
|
rubyforge_project:
|
197
197
|
rubygems_version: 1.8.10
|