bibtex-ruby 4.4.7 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +23 -24
- data/History.txt +4 -0
- data/Rakefile +23 -25
- data/bibtex-ruby.gemspec +1 -1
- data/examples/bib2html.rb +5 -6
- data/examples/bib2yaml.rb +2 -2
- data/features/step_definitions/bibtex_steps.rb +3 -6
- data/features/step_definitions/name_steps.rb +1 -2
- data/lib/bibtex.rb +11 -13
- data/lib/bibtex/bibliography.rb +45 -58
- data/lib/bibtex/compatibility.rb +3 -5
- data/lib/bibtex/elements.rb +49 -42
- data/lib/bibtex/entry.rb +80 -84
- data/lib/bibtex/entry/citeproc_converter.rb +47 -52
- data/lib/bibtex/entry/rdf_converter.rb +97 -63
- data/lib/bibtex/error.rb +10 -11
- data/lib/bibtex/extensions.rb +2 -5
- data/lib/bibtex/filters.rb +4 -9
- data/lib/bibtex/filters/latex.rb +0 -2
- data/lib/bibtex/filters/linebreaks.rb +0 -2
- data/lib/bibtex/lexer.rb +81 -81
- data/lib/bibtex/names.rb +24 -28
- data/lib/bibtex/replaceable.rb +15 -17
- data/lib/bibtex/utilities.rb +5 -10
- data/lib/bibtex/value.rb +28 -34
- data/lib/bibtex/version.rb +6 -6
- data/test/benchmark.rb +20 -22
- data/test/bibtex/entry/test_rdf_converter.rb +3 -5
- data/test/bibtex/test_bibliography.rb +22 -35
- data/test/bibtex/test_elements.rb +7 -15
- data/test/bibtex/test_entry.rb +78 -87
- data/test/bibtex/test_filters.rb +8 -7
- data/test/bibtex/test_lexer.rb +10 -13
- data/test/bibtex/test_name_parser.rb +6 -9
- data/test/bibtex/test_names.rb +50 -55
- data/test/bibtex/test_parser.rb +30 -34
- data/test/bibtex/test_string.rb +8 -9
- data/test/bibtex/test_utilities.rb +6 -9
- data/test/bibtex/test_value.rb +41 -43
- data/test/helper.rb +3 -6
- data/test/macruby.rb +12 -13
- data/test/profile.rb +16 -16
- data/test/test_bibtex.rb +10 -15
- data/test/test_export.rb +5 -13
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f116d02973cd3647ce69ab85bee28bfa5a361cb8eadc006905c4688839895b8
|
4
|
+
data.tar.gz: 8770d47027cf981318066773c7f7656317e69c3e47c81422429e38b830ac5ce3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5123a130e935e4710b6d907e9af2a9fe8e6e56f836ffd41acebc546faad2bd9f448508da7286d403f1ee5276737065fb85718609b680f32095dfa5ef6fdea43
|
7
|
+
data.tar.gz: c088b05105b9371a0578ebb7502518b974103168b59bcb9d3172c1a166b9f63e100eedf003aaf1d2772086e8c00df9581555f98c5f38913a006f4a2c7e45528d
|
data/Gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
|
-
gem 'json', '~>1.8', :
|
4
|
+
gem 'json', '~>1.8', platforms: %i[mri_18 jruby rbx]
|
5
5
|
|
6
6
|
if RUBY_VERSION >= '2.0'
|
7
7
|
gem 'rdf', '~>2.0.0'
|
@@ -10,57 +10,56 @@ else
|
|
10
10
|
gem 'rdf', '~>1.1'
|
11
11
|
end
|
12
12
|
|
13
|
-
gem 'rubysl', '~>2.0', :
|
13
|
+
gem 'rubysl', '~>2.0', platforms: :rbx
|
14
14
|
|
15
15
|
group :debug do
|
16
16
|
if RUBY_VERSION >= '2.0'
|
17
|
-
gem 'byebug', :
|
17
|
+
gem 'byebug', require: false, platforms: :mri
|
18
18
|
else
|
19
|
-
gem 'debugger', :
|
19
|
+
gem 'debugger', require: false, platforms: :mri
|
20
20
|
end
|
21
21
|
|
22
|
-
gem 'ruby-debug', :
|
22
|
+
gem 'ruby-debug', require: false, platforms: :jruby
|
23
23
|
|
24
|
-
gem 'rubinius-
|
25
|
-
gem 'rubinius-
|
24
|
+
gem 'rubinius-compiler', require: false, platforms: :rbx
|
25
|
+
gem 'rubinius-debugger', require: false, platforms: :rbx
|
26
26
|
end
|
27
27
|
|
28
28
|
group :test do
|
29
|
-
gem 'minitest', '~>4.7', :require => false
|
30
|
-
gem 'rubysl-test-unit', '~>2.0', :platforms => :rbx
|
31
|
-
gem 'minitest-ansi'
|
32
29
|
gem 'cucumber', '~>1.3'
|
33
|
-
gem '
|
30
|
+
gem 'minitest', '~>4.7', require: false
|
31
|
+
gem 'minitest-ansi'
|
32
|
+
gem 'rubysl-test-unit', '~>2.0', platforms: :rbx
|
33
|
+
gem 'unicode', '~>0.4', platforms: %i[rbx mswin mingw mri]
|
34
34
|
end
|
35
35
|
|
36
36
|
group :extra do
|
37
|
-
if RUBY_PLATFORM =~ /darwin/i
|
38
|
-
gem 'rb-fsevent', :require => false
|
39
|
-
end
|
37
|
+
gem 'rb-fsevent', require: false if RUBY_PLATFORM =~ /darwin/i
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
gem 'guard-cucumber', platforms: [:ruby]
|
40
|
+
gem 'guard-minitest', platforms: [:ruby]
|
41
|
+
gem 'redcarpet', platforms: [:ruby]
|
44
42
|
end
|
45
43
|
|
46
44
|
group :profile do
|
47
|
-
|
48
|
-
|
45
|
+
gem 'gnuplot', '~>2.4', platforms: [:mri]
|
46
|
+
gem 'ruby-prof', '~>0.14', platforms: [:mri]
|
49
47
|
end
|
50
48
|
|
51
49
|
group :coverage do
|
52
|
-
|
53
|
-
gem 'rubinius-coverage', :
|
54
|
-
gem '
|
50
|
+
gem 'coveralls', '~>0.7', require: false
|
51
|
+
gem 'rubinius-coverage', require: false, platforms: :rbx
|
52
|
+
gem 'simplecov', '~>0.8', require: false, platforms: [:ruby]
|
55
53
|
end
|
56
54
|
|
57
55
|
group :development do
|
56
|
+
gem 'iconv', platforms: [:ruby]
|
58
57
|
gem 'rake'
|
58
|
+
gem 'rubocop', '~> 0.71.0', require: false
|
59
59
|
gem 'yard'
|
60
|
-
gem 'iconv', :platforms => [:ruby]
|
61
60
|
end
|
62
61
|
|
63
62
|
group :travis do
|
64
63
|
# Gem is required at runtime for RBX!
|
65
|
-
gem 'racc', :
|
64
|
+
gem 'racc', platforms: [:ruby]
|
66
65
|
end
|
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,19 +1,17 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'bundler'
|
4
2
|
begin
|
5
3
|
Bundler.setup
|
6
4
|
rescue Bundler::BundlerError => e
|
7
|
-
|
8
|
-
|
5
|
+
warn e.message
|
6
|
+
warn 'Run `bundle install` to install missing gems'
|
9
7
|
exit e.status_code
|
10
8
|
end
|
11
9
|
|
12
|
-
|
13
|
-
|
10
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), './lib'))
|
14
11
|
|
15
12
|
require 'rake/clean'
|
16
13
|
require 'rake/testtask'
|
14
|
+
require 'rubocop/rake_task'
|
17
15
|
|
18
16
|
require 'bibtex/version'
|
19
17
|
|
@@ -29,7 +27,7 @@ end
|
|
29
27
|
begin
|
30
28
|
require 'cucumber/rake/task'
|
31
29
|
Cucumber::Rake::Task.new(:features) do |t|
|
32
|
-
t.cucumber_opts =
|
30
|
+
t.cucumber_opts = '--format progress'
|
33
31
|
end
|
34
32
|
rescue LoadError
|
35
33
|
desc 'Cucumber rake task not available'
|
@@ -41,17 +39,19 @@ end
|
|
41
39
|
begin
|
42
40
|
require 'coveralls/rake/task'
|
43
41
|
Coveralls::RakeTask.new
|
44
|
-
task :
|
42
|
+
task test_with_coveralls: [:test, :features, 'coveralls:push']
|
45
43
|
rescue LoadError
|
46
44
|
# ignore
|
47
45
|
end
|
48
46
|
|
49
|
-
|
47
|
+
RuboCop::RakeTask.new
|
48
|
+
|
49
|
+
task default: %i[test features rubocop]
|
50
50
|
|
51
51
|
desc 'Generates the BibTeX parser'
|
52
|
-
task :
|
52
|
+
task racc: ['lib/bibtex/parser.rb', 'lib/bibtex/name_parser.rb']
|
53
53
|
|
54
|
-
task :
|
54
|
+
task test: %w[racc test_task]
|
55
55
|
|
56
56
|
file 'lib/bibtex/parser.output' => ['lib/bibtex/parser.rb']
|
57
57
|
file 'lib/bibtex/parser.rb' => ['lib/bibtex/bibtex.y'] do
|
@@ -65,7 +65,7 @@ file 'lib/bibtex/name_parser.rb' => ['lib/bibtex/names.y'] do
|
|
65
65
|
end
|
66
66
|
|
67
67
|
desc 'Run an IRB session with BibTeX-Ruby loaded'
|
68
|
-
task :console, [:script] do |
|
68
|
+
task :console, [:script] do |_t, args|
|
69
69
|
ARGV.clear
|
70
70
|
|
71
71
|
require 'irb'
|
@@ -82,37 +82,35 @@ task :check_warnings do
|
|
82
82
|
puts BibTeX::Version::STRING
|
83
83
|
end
|
84
84
|
|
85
|
-
|
86
85
|
desc 'Runs the benchmarks (and plots the results)'
|
87
|
-
task :
|
88
|
-
require File.expand_path('
|
86
|
+
task benchmark: ['racc'] do
|
87
|
+
require File.expand_path('test/benchmark.rb', __dir__)
|
89
88
|
end
|
90
|
-
task :
|
89
|
+
task bm: ['benchmark']
|
91
90
|
|
92
91
|
desc 'Runs the profiler'
|
93
|
-
task :
|
94
|
-
require File.expand_path('
|
92
|
+
task profile: ['racc'] do
|
93
|
+
require File.expand_path('test/profile.rb', __dir__)
|
95
94
|
end
|
96
95
|
|
97
|
-
|
98
96
|
desc 'Updates the Manifest file'
|
99
|
-
task :
|
97
|
+
task manifest: %w[clean racc] do
|
100
98
|
m = File.open('Manifest', 'w')
|
101
|
-
m.print FileList['**/*'].reject{ |f|
|
99
|
+
m.print FileList['**/*'].reject { |f|
|
102
100
|
f.start_with?('coverage') || f =~ /(rbc|swp|~|lock)$/
|
103
101
|
}.join("\n")
|
104
102
|
m.close
|
105
103
|
end
|
106
104
|
|
107
105
|
desc 'Builds the gem file'
|
108
|
-
task :
|
106
|
+
task build: ['manifest'] do
|
109
107
|
system 'gem build bibtex-ruby.gemspec'
|
110
108
|
end
|
111
109
|
|
112
110
|
desc 'Pushes the gem file to rubygems.org'
|
113
|
-
task :
|
114
|
-
system %
|
115
|
-
system
|
111
|
+
task release: ['build'] do
|
112
|
+
system %(git tag "#{BibTeX::Version::STRING}")
|
113
|
+
system 'git push --tags'
|
116
114
|
system "gem push bibtex-ruby-#{BibTeX::Version::STRING}.gem"
|
117
115
|
end
|
118
116
|
|
data/bibtex-ruby.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
lib = File.expand_path('../lib/', __FILE__)
|
3
2
|
$:.unshift lib unless $:.include?(lib)
|
4
3
|
|
@@ -8,6 +7,7 @@ Gem::Specification.new do |s|
|
|
8
7
|
s.name = 'bibtex-ruby'
|
9
8
|
s.version = BibTeX::Version::STRING.dup
|
10
9
|
s.platform = Gem::Platform::RUBY
|
10
|
+
s.required_ruby_version = '>= 2.3.0'
|
11
11
|
s.authors = ['Sylvester Keil']
|
12
12
|
s.email = ['sylvester@keil.or.at']
|
13
13
|
s.homepage = 'http://inukshuk.github.com/bibtex-ruby'
|
data/examples/bib2html.rb
CHANGED
@@ -10,28 +10,27 @@ rescue LoadError
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# Open a bibliography file
|
13
|
-
bib = BibTeX.open File.expand_path('
|
14
|
-
|
13
|
+
bib = BibTeX.open File.expand_path('markdown.bib', __dir__),
|
14
|
+
include: [:meta_content]
|
15
15
|
|
16
16
|
# Replaces all strings in the Bibliography and then
|
17
17
|
# converts each BibTeX entries to a string using Chicago style
|
18
18
|
# (all other elements are mapped to simple strings)
|
19
19
|
bib.replace
|
20
20
|
|
21
|
-
cp = CiteProc::Processor.new :
|
22
|
-
|
21
|
+
cp = CiteProc::Processor.new style: 'apa',
|
22
|
+
format: 'html', locale: 'en'
|
23
23
|
|
24
24
|
cp.import bib.to_citeproc
|
25
25
|
|
26
26
|
content = bib['@entry, @meta_content'].map do |e|
|
27
27
|
if e.entry?
|
28
|
-
cp.render :bibliography, :
|
28
|
+
cp.render :bibliography, id: e.key
|
29
29
|
else
|
30
30
|
e.to_s
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
34
|
begin
|
36
35
|
require 'redcarpet'
|
37
36
|
rescue LoadError
|
data/examples/bib2yaml.rb
CHANGED
@@ -4,8 +4,8 @@ require 'rubygems'
|
|
4
4
|
require 'bibtex'
|
5
5
|
require 'yaml'
|
6
6
|
|
7
|
-
if ARGV.
|
8
|
-
puts "Usage: #{$
|
7
|
+
if ARGV.empty?
|
8
|
+
puts "Usage: #{$PROGRAM_NAME} <bib> [<yml>]"
|
9
9
|
else
|
10
10
|
out = ARGV.length == 2 ? File.open(ARGV[1], 'w') : STDOUT
|
11
11
|
out.puts BibTeX.open(ARGV[0]).to_yaml
|
@@ -14,7 +14,7 @@ When /^I search for :(.+)$/ do |query|
|
|
14
14
|
@result = @bibliography.query(query.to_sym)
|
15
15
|
end
|
16
16
|
|
17
|
-
When
|
17
|
+
When %r{^I search for /(.+)/$} do |query|
|
18
18
|
@result = @bibliography.query(Regexp.new(query))
|
19
19
|
end
|
20
20
|
|
@@ -50,7 +50,6 @@ When /^I create entries with these elements:$/ do |table|
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
|
54
53
|
Then /^my bibliography should contain the following objects:$/ do |table|
|
55
54
|
@bibliography.each_with_index do |object, index|
|
56
55
|
table.hashes[index].each_pair do |key, value|
|
@@ -69,7 +68,7 @@ end
|
|
69
68
|
|
70
69
|
Then /^my bibliography should contain the following numbers of elements:$/ do |table|
|
71
70
|
counts = table.hashes.first
|
72
|
-
counts[[]] = counts.delete('total') if counts.
|
71
|
+
counts[[]] = counts.delete('total') if counts.key?('total')
|
73
72
|
counts.each_pair do |type, length|
|
74
73
|
assert_equal length.to_i, @bibliography.find_by_type(type).length
|
75
74
|
end
|
@@ -83,12 +82,11 @@ Then /^my bibliography should contain an entry with an? (?:key|id) like "([^"]*)
|
|
83
82
|
pattern = Regexp.compile key
|
84
83
|
refute_nil @bibliography.detect { |e| e.key.to_s =~ pattern }
|
85
84
|
end
|
86
|
-
Then /^my bibliography should contain an entry with (?:key|id) "([^"]*)" and a?n? (\w+) value of "([^"]*)"$/ do |key,field,value|
|
85
|
+
Then /^my bibliography should contain an entry with (?:key|id) "([^"]*)" and a?n? (\w+) value of "([^"]*)"$/ do |key, field, value|
|
87
86
|
refute_nil @bibliography[key.to_s]
|
88
87
|
assert_equal value, @bibliography[key.to_s][field.downcase.to_sym].to_s
|
89
88
|
end
|
90
89
|
|
91
|
-
|
92
90
|
Then /^my bibliography should not contain an entry with (?:key|id) "([^"]*)"$/ do |key|
|
93
91
|
assert_nil @bibliography[key.to_sym]
|
94
92
|
end
|
@@ -97,7 +95,6 @@ Then /^there should be exactly (\d+) match(?:es)?$/ do |matches|
|
|
97
95
|
assert_equal matches.to_i, @result.length
|
98
96
|
end
|
99
97
|
|
100
|
-
|
101
98
|
Then /^my bibliography should contain (\d+) (\w+)$/ do |count, type|
|
102
99
|
assert_equal count.to_i, @bibliography.q("@#{type.chomp('s')}").length
|
103
100
|
end
|
@@ -6,11 +6,10 @@ When /^I parse the names "(.*)"$/ do |string|
|
|
6
6
|
@names = BibTeX::Names.parse(string)
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
9
|
Then /^the parts should be:$/ do |table|
|
11
10
|
table.hashes.each do |row|
|
12
11
|
assert_equal [row['first'], row['von'], row['last'], row['jr']],
|
13
|
-
|
12
|
+
[@name.first, @name.von, @name.last, @name.jr].map(&:to_s)
|
14
13
|
# row.each do |k,v|
|
15
14
|
# assert_equal v, @name.send(k).to_s
|
16
15
|
# end
|
data/lib/bibtex.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#--
|
2
2
|
# BibTeX-Ruby
|
3
|
-
# Copyright (C) 2010-2015
|
3
|
+
# Copyright (C) 2010-2015 Sylvester Keil <sylvester.keil.or.at>
|
4
4
|
#
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -9,11 +9,11 @@
|
|
9
9
|
#
|
10
10
|
# This program is distributed in the hope that it will be useful,
|
11
11
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
13
|
# GNU General Public License for more details.
|
14
14
|
#
|
15
15
|
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with this program.
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#++
|
18
18
|
|
19
19
|
require 'digest/md5'
|
@@ -36,19 +36,17 @@ require 'bibtex/version'
|
|
36
36
|
# License:: GNU GPL 3.0
|
37
37
|
#
|
38
38
|
module BibTeX
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
@log.datetime_format = '%Y-%m-%d %H:%M:%S'
|
39
|
+
#
|
40
|
+
# An instance of the Ruby core class +Logger+.
|
41
|
+
# Used for logging by BibTeX-Ruby.
|
42
|
+
#
|
43
|
+
@log = Logger.new(STDERR)
|
44
|
+
@log.level = ENV.key?('DEBUG') ? Logger::DEBUG : Logger::WARN
|
45
|
+
@log.datetime_format = '%Y-%m-%d %H:%M:%S'
|
47
46
|
|
48
47
|
class << self
|
49
48
|
attr_accessor :log
|
50
49
|
end
|
51
|
-
|
52
50
|
end
|
53
51
|
|
54
52
|
# Load debugger
|
@@ -79,5 +77,5 @@ begin
|
|
79
77
|
require 'bibtex/entry/rdf_converter'
|
80
78
|
require 'bibtex/bibliography/rdf_converter'
|
81
79
|
rescue LoadError
|
82
|
-
# ignored
|
80
|
+
# ignored
|
83
81
|
end
|
data/lib/bibtex/bibliography.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
#++
|
18
18
|
|
19
19
|
module BibTeX
|
20
|
-
|
21
20
|
#
|
22
21
|
# The Bibliography class models a BibTeX bibliography;
|
23
22
|
# typically, it corresponds to a `.bib' file.
|
@@ -28,10 +27,9 @@ module BibTeX
|
|
28
27
|
include Enumerable
|
29
28
|
include Comparable
|
30
29
|
|
31
|
-
@defaults = { :
|
30
|
+
@defaults = { parse_names: true, parse_months: true }.freeze
|
32
31
|
|
33
32
|
class << self
|
34
|
-
|
35
33
|
attr_reader :defaults
|
36
34
|
|
37
35
|
# Opens and parses the `.bib' file at the given +path+. Returns
|
@@ -86,7 +84,7 @@ module BibTeX
|
|
86
84
|
attr_reader :data, :strings, :entries, :errors, :options
|
87
85
|
|
88
86
|
attr_by_type :article, :book, :journal, :collection, :preamble,
|
89
|
-
|
87
|
+
:comment, :meta_content
|
90
88
|
|
91
89
|
def_delegators :@data, :length, :size, :empty?
|
92
90
|
def_delegators :@entries, :key?, :has_key?, :values_at
|
@@ -96,8 +94,10 @@ module BibTeX
|
|
96
94
|
# Creates a new bibliography.
|
97
95
|
def initialize(options = {})
|
98
96
|
@options = Bibliography.defaults.merge(options)
|
99
|
-
@data
|
100
|
-
@
|
97
|
+
@data = []
|
98
|
+
@strings = {}
|
99
|
+
@errors = []
|
100
|
+
@entries = Hash.new { |h, k| h.fetch(k.to_s, nil) }
|
101
101
|
|
102
102
|
yield self if block_given?
|
103
103
|
end
|
@@ -105,8 +105,9 @@ module BibTeX
|
|
105
105
|
def initialize_copy(other)
|
106
106
|
@options = other.options.dup
|
107
107
|
@errors = other.errors.dup
|
108
|
-
@data
|
109
|
-
@
|
108
|
+
@data = []
|
109
|
+
@strings = {}
|
110
|
+
@entries = Hash.new { |h, k| h.fetch(k.to_s, nil) }
|
110
111
|
|
111
112
|
other.each do |element|
|
112
113
|
add element.dup
|
@@ -127,7 +128,6 @@ module BibTeX
|
|
127
128
|
alias << add
|
128
129
|
alias push add
|
129
130
|
|
130
|
-
|
131
131
|
# Saves the bibliography to the current path.
|
132
132
|
def save(options = {})
|
133
133
|
save_to(@path, options)
|
@@ -135,7 +135,7 @@ module BibTeX
|
|
135
135
|
|
136
136
|
# Saves the bibliography to a file at the given path. Returns the bibliography.
|
137
137
|
def save_to(path, options = {})
|
138
|
-
options[:quotes] ||= %w
|
138
|
+
options[:quotes] ||= %w[{ }]
|
139
139
|
|
140
140
|
File.open(path, 'w:UTF-8') do |f|
|
141
141
|
f.write(to_s(options))
|
@@ -144,7 +144,6 @@ module BibTeX
|
|
144
144
|
self
|
145
145
|
end
|
146
146
|
|
147
|
-
|
148
147
|
def each
|
149
148
|
if block_given?
|
150
149
|
data.each(&Proc.new)
|
@@ -154,18 +153,16 @@ module BibTeX
|
|
154
153
|
end
|
155
154
|
end
|
156
155
|
|
157
|
-
|
158
156
|
def parse_names
|
159
|
-
entries.each_value
|
157
|
+
entries.each_value(&:parse_names)
|
160
158
|
self
|
161
159
|
end
|
162
160
|
|
163
161
|
def parse_months
|
164
|
-
entries.each_value
|
162
|
+
entries.each_value(&:parse_month)
|
165
163
|
self
|
166
164
|
end
|
167
165
|
|
168
|
-
|
169
166
|
# Converts all enties using the given filter(s). If an optional block is given
|
170
167
|
# the block is used as a condition (the block will be called with each
|
171
168
|
# entry). @see Entry#convert!
|
@@ -179,7 +176,6 @@ module BibTeX
|
|
179
176
|
self
|
180
177
|
end
|
181
178
|
|
182
|
-
|
183
179
|
# Deletes an object, or a list of objects from the bibliography.
|
184
180
|
# If a list of objects is to be deleted, you can either supply the list
|
185
181
|
# of objects or use a query or block to define the list.
|
@@ -188,14 +184,13 @@ module BibTeX
|
|
188
184
|
# if the object was not part of the bibliography.
|
189
185
|
def delete(*arguments, &block)
|
190
186
|
objects = q(*arguments, &block).map { |o| o.removed_from_bibliography(self) }
|
191
|
-
@data
|
187
|
+
@data -= objects
|
192
188
|
objects.length == 1 ? objects[0] : objects
|
193
189
|
end
|
194
190
|
|
195
191
|
alias remove delete
|
196
192
|
alias rm delete
|
197
193
|
|
198
|
-
|
199
194
|
# call-seq:
|
200
195
|
# >> bib[-1]
|
201
196
|
# => Returns the last element of the Bibliography or nil
|
@@ -221,20 +216,18 @@ module BibTeX
|
|
221
216
|
# not yield to a block for additional refinement of the query.
|
222
217
|
#
|
223
218
|
def [](*arguments)
|
224
|
-
raise(ArgumentError, "wrong number of arguments (#{arguments.length} for 1..2)") unless arguments.length.between?(1,2)
|
219
|
+
raise(ArgumentError, "wrong number of arguments (#{arguments.length} for 1..2)") unless arguments.length.between?(1, 2)
|
225
220
|
|
226
|
-
|
227
|
-
when arguments[0].is_a?(Numeric) || arguments[0].is_a?(Range)
|
221
|
+
if arguments[0].is_a?(Numeric) || arguments[0].is_a?(Range)
|
228
222
|
data[*arguments]
|
229
|
-
|
230
|
-
|
231
|
-
when arguments[0].nil?
|
223
|
+
elsif arguments.length == 1
|
224
|
+
if arguments[0].nil?
|
232
225
|
nil
|
233
|
-
|
226
|
+
elsif arguments[0].respond_to?(:empty?) && arguments[0].empty?
|
234
227
|
nil
|
235
|
-
|
228
|
+
elsif arguments[0].is_a?(Symbol)
|
236
229
|
entries[arguments[0]]
|
237
|
-
|
230
|
+
elsif arguments[0].respond_to?(:start_with?) && !arguments[0].start_with?('@', '!@')
|
238
231
|
entries[arguments[0]]
|
239
232
|
else
|
240
233
|
query(*arguments)
|
@@ -244,7 +237,6 @@ module BibTeX
|
|
244
237
|
end
|
245
238
|
end
|
246
239
|
|
247
|
-
|
248
240
|
# Returns true if there are object which could not be parsed.
|
249
241
|
def errors?
|
250
242
|
!errors.empty?
|
@@ -279,7 +271,7 @@ module BibTeX
|
|
279
271
|
self
|
280
272
|
end
|
281
273
|
|
282
|
-
alias
|
274
|
+
alias replace_strings replace
|
283
275
|
|
284
276
|
def join(filter = '')
|
285
277
|
q(filter, &:join)
|
@@ -318,18 +310,16 @@ module BibTeX
|
|
318
310
|
# and 'Poe, E. A.' calling this method would convert all three names to
|
319
311
|
# 'Poe, Edgar A.'.
|
320
312
|
def extend_initials!
|
321
|
-
groups = Hash.new do |h,k|
|
322
|
-
h[k] = { :
|
313
|
+
groups = Hash.new do |h, k|
|
314
|
+
h[k] = { prototype: nil, names: [] }
|
323
315
|
end
|
324
316
|
|
325
317
|
# group names together
|
326
318
|
names.each do |name|
|
327
|
-
group = groups[name.sort_order(:
|
319
|
+
group = groups[name.sort_order(initials: true).downcase]
|
328
320
|
group[:names] << name
|
329
321
|
|
330
|
-
if group[:prototype].nil? || group[:prototype].first.to_s.length < name.first.to_s.length
|
331
|
-
group[:prototype] = name
|
332
|
-
end
|
322
|
+
group[:prototype] = name if group[:prototype].nil? || group[:prototype].first.to_s.length < name.first.to_s.length
|
333
323
|
end
|
334
324
|
|
335
325
|
# extend all names in group to prototype
|
@@ -353,22 +343,20 @@ module BibTeX
|
|
353
343
|
pattern = Regexp.new(pattern) unless pattern.is_a?(Regexp)
|
354
344
|
|
355
345
|
block = if block_given?
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
346
|
+
Proc.new
|
347
|
+
else
|
348
|
+
proc { |e| e[field] = value }
|
349
|
+
end
|
360
350
|
|
361
351
|
each_entry do |entry|
|
362
|
-
if entry.field?(field) && entry[field].to_s =~ pattern
|
363
|
-
block.call(entry)
|
364
|
-
end
|
352
|
+
block.call(entry) if entry.field?(field) && entry[field].to_s =~ pattern
|
365
353
|
end
|
366
354
|
|
367
355
|
self
|
368
356
|
end
|
369
357
|
|
370
358
|
def group_by(*arguments, &block)
|
371
|
-
groups = Hash.new { |h,k| h[k] = [] }
|
359
|
+
groups = Hash.new { |h, k| h[k] = [] }
|
372
360
|
|
373
361
|
entries.values.each do |e|
|
374
362
|
groups[e.digest(arguments, &block)] << e
|
@@ -406,7 +394,7 @@ module BibTeX
|
|
406
394
|
|
407
395
|
# Returns a Ruby hash representation of the bibliography.
|
408
396
|
def to_hash(options = {})
|
409
|
-
{ :
|
397
|
+
{ bibliography: map { |o| o.to_hash(options) } }
|
410
398
|
end
|
411
399
|
|
412
400
|
# Returns a YAML representation of the bibliography.
|
@@ -430,7 +418,7 @@ module BibTeX
|
|
430
418
|
require 'rexml/document'
|
431
419
|
|
432
420
|
xml = REXML::Document.new
|
433
|
-
xml << REXML::XMLDecl.new('1.0','UTF-8')
|
421
|
+
xml << REXML::XMLDecl.new('1.0', 'UTF-8')
|
434
422
|
|
435
423
|
root = REXML::Element.new('bibtex:file')
|
436
424
|
root.add_namespace('bibtex', 'http://bibtexml.sf.net/')
|
@@ -443,7 +431,7 @@ module BibTeX
|
|
443
431
|
|
444
432
|
# Returns an RDF::Graph representation of the bibliography. The graph
|
445
433
|
# can be serialized using any of the RDF serializer plugins.
|
446
|
-
def to_rdf(
|
434
|
+
def to_rdf(_options = {})
|
447
435
|
if defined?(::RDF)
|
448
436
|
RDFConverter.convert(self)
|
449
437
|
else
|
@@ -482,17 +470,19 @@ module BibTeX
|
|
482
470
|
def query(*arguments, &block)
|
483
471
|
case arguments.length
|
484
472
|
when 0
|
485
|
-
selector
|
473
|
+
selector = :all
|
474
|
+
q = nil
|
486
475
|
when 1
|
487
|
-
selector
|
476
|
+
selector = :all
|
477
|
+
q = arguments[0]
|
488
478
|
when 2
|
489
479
|
selector, q = arguments
|
490
480
|
else
|
491
481
|
raise ArgumentError, "wrong number of arguments (#{arguments.length} for 0..2)"
|
492
482
|
end
|
493
483
|
|
494
|
-
filter = block ?
|
495
|
-
|
484
|
+
filter = block ? proc { |e| e.match?(q) && block.call(e) } :
|
485
|
+
proc { |e| e.match?(q) }
|
496
486
|
|
497
487
|
send(query_handler(selector), &filter)
|
498
488
|
end
|
@@ -518,19 +508,17 @@ module BibTeX
|
|
518
508
|
end
|
519
509
|
|
520
510
|
def select_duplicates_by(*arguments)
|
521
|
-
arguments = [
|
511
|
+
arguments = %i[year title] if arguments.empty?
|
522
512
|
block = Proc.new if block_given?
|
523
513
|
|
524
|
-
group_by(*arguments)
|
525
|
-
|
514
|
+
group_by(*arguments) do |digest, entry|
|
526
515
|
# 1.8 compatibility
|
527
516
|
# digest = digest[0] if digest.is_a?(Array)
|
528
517
|
|
529
518
|
digest.gsub(/\s+/, '').downcase
|
530
519
|
digest = block.call(digest, entry) unless block.nil?
|
531
520
|
digest
|
532
|
-
|
533
|
-
}.values.select { |d| d.length > 1 }
|
521
|
+
end.values.select { |d| d.length > 1 }
|
534
522
|
end
|
535
523
|
|
536
524
|
alias duplicates select_duplicates_by
|
@@ -564,7 +552,7 @@ module BibTeX
|
|
564
552
|
select_duplicates_by(*arguments, &block).each do |dupes|
|
565
553
|
dupes.shift
|
566
554
|
dupes.each do |dupe|
|
567
|
-
|
555
|
+
remove dupe
|
568
556
|
end
|
569
557
|
end
|
570
558
|
|
@@ -573,7 +561,7 @@ module BibTeX
|
|
573
561
|
|
574
562
|
# Experimental!
|
575
563
|
# Returns a new Bibliography with all duplicates removed.
|
576
|
-
def uniq(*
|
564
|
+
def uniq(*_arguments)
|
577
565
|
dup.uniq!
|
578
566
|
end
|
579
567
|
|
@@ -589,6 +577,5 @@ module BibTeX
|
|
589
577
|
:select
|
590
578
|
end
|
591
579
|
end
|
592
|
-
|
593
580
|
end
|
594
581
|
end
|