bibtex-ruby 1.3.0 → 1.3.1

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/README.md CHANGED
@@ -2,12 +2,13 @@ BibTeX-Ruby
2
2
  ===========
3
3
 
4
4
  BibTeX-Ruby is a fairly complete library and parser for BibTeX bibliography
5
- files; it offers an interface to manage, search, or convert BibTeX objects in
5
+ files; it offers a rich interface to manage, search, or convert BibTeX objects in
6
6
  Ruby. It is designed to support all BibTeX objects (including @comment,
7
7
  string-replacements via @string, as well as string concatenation using '#')
8
- and handles all content outside of BibTeX objects as 'meta content' which may
9
- or may not be included in post-processing. BibTeX-Ruby also includes a name
10
- parser to support comfortable access to the individual tokens of name values.
8
+ and optionally handles all content outside of BibTeX objects as 'meta content'
9
+ which may or may not be included in post-processing. BibTeX-Ruby also includes
10
+ a name parser to support comfortable access to the individual tokens of name
11
+ values.
11
12
 
12
13
 
13
14
  Quickstart
@@ -32,9 +33,29 @@ Quickstart
32
33
  => 3
33
34
  >> b['@article'].length
34
35
  => 0
35
- >> bib['@book[year=2009]'].length
36
+ >> b['@book[year=2009]'].length
36
37
  => 1
37
38
 
39
+ BibTeX-Ruby helps you convert your bibliography to JSON, XML, or YAML;
40
+ alternatively, you can export to the JSON format used by
41
+ [CSL](http://citationstyles.org) processors and render the bibliography in
42
+ many styles:
43
+
44
+ >> require 'citeproc' # requires the citeproc-ruby gem
45
+ => true
46
+ >> CiteProc.process b[:pickaxe].to_citeproc, :style => :apa
47
+ => "Thomas, D., Fowler, C., & Hunt, A. (2009). Programming Ruby 1.9:
48
+ The Pragmatic Programmer's Guide. The Facets of Ruby.
49
+ Raleigh, North Carolina: The Pragmatic Bookshelf."
50
+ >> CiteProc.process b[:pickaxe].to_citeproc, :style => 'chicago-author-date'
51
+ => "Thomas, Dave, Chad Fowler, and Andy Hunt. 2009. Programming Ruby 1.9:
52
+ The Pragmatic Programmer's Guide. The Facets of Ruby.
53
+ Raleigh, North Carolina: The Pragmatic Bookshelf."
54
+ >> CiteProc.process b[:pickaxe].to_citeproc, :style => :mla
55
+ => "Thomas, Dave, Chad Fowler, and Andy Hunt. Programming Ruby 1.9:
56
+ The Pragmatic Programmer's Guide. Raleigh, North Carolina:
57
+ The Pragmatic Bookshelf, 2009."
58
+
38
59
 
39
60
  Installation
40
61
  ------------
@@ -255,7 +276,8 @@ BibTeX to YAML converter:
255
276
  >> BibTeX.open('example.bib').to_yaml
256
277
 
257
278
  Look at the 'examples' directory for more elaborate examples of a BibTeX to YAML
258
- and a BibTeX to HTML converter.
279
+ and a BibTeX to HTML converter using **#to_citeproc** to format a bibliography
280
+ using [CSL](http://citationstyles.org/).
259
281
 
260
282
  BibTeX-Ruby offers an API which lets you manipulate BibTeX objects (string
261
283
  replacement, name parsing etc.); however, sometimes you just want quick access
data/examples/bib2html.rb CHANGED
@@ -11,17 +11,16 @@ bib = BibTeX.open File.expand_path('../markdown.bib',__FILE__),
11
11
  # converts each BibTeX entries to a string using Chicago style
12
12
  # (all other elements are mapped to simple strings)
13
13
 
14
- # TODO 1.3.1
15
- # begin
16
- # require 'citeproc'
17
- # rescue LoadError
18
- # puts 'this example depends on the citeproc-ruby gem'
19
- # exit
20
- # end
14
+ begin
15
+ require 'citeproc'
16
+ rescue LoadError
17
+ puts 'this example depends on the citeproc-ruby gem'
18
+ exit
19
+ end
21
20
 
22
21
  content = bib.replace.q('@entry, @meta_content').map do |b|
23
22
  if b.entry?
24
- [b.author, '. ', b.title, '. ', b.publisher, ': ', b.address, ', ', b.year, '.'].join
23
+ CiteProc.process b.to_citeproc
25
24
  else
26
25
  b.to_s
27
26
  end
data/lib/bibtex/entry.rb CHANGED
@@ -45,9 +45,40 @@ module BibTeX
45
45
  }).freeze
46
46
 
47
47
  NAME_FIELDS = [:author, :editor, :translator].freeze
48
+ DATE_FIELDS = [:year].freeze
49
+
50
+ CSL_FIELDS = Hash.new {|h,k|k}.merge(Hash[*%w{
51
+ date issued
52
+ isbn ISBN
53
+ booktitle container-title
54
+ journal container-title
55
+ series collection-title
56
+ address publisher-place
57
+ pages page
58
+ number issue
59
+ url URL
60
+ doi DOI
61
+ year issued
62
+ }.map(&:intern)]).freeze
63
+
64
+ CSL_TYPES = Hash.new {|h,k|k}.merge(Hash[*%w{
65
+ booklet pamphlet
66
+ conference paper-conference
67
+ inbook chapter
68
+ incollection chapter
69
+ inproceedings paper-conference
70
+ manual book
71
+ mastersthesis thesis
72
+ misc article
73
+ phdthesis thesis
74
+ proceedings paper-conference
75
+ techreport report
76
+ unpublished manuscript
77
+ }.map(&:intern)]).freeze
78
+
48
79
 
49
80
  attr_reader :type, :fields
50
- def_delegators :@fields, :empty?, :each
81
+ def_delegators :@fields, :empty?, :each, :each_pair
51
82
 
52
83
  # Creates a new instance. If a hash is given, the entry is populated accordingly.
53
84
  def initialize(attributes = {})
@@ -90,6 +121,10 @@ module BibTeX
90
121
  type.to_s.match(/^entry$/i) || @type == type.to_sym || super
91
122
  end
92
123
 
124
+ def has_field?(field)
125
+ @fields.has_key?(field)
126
+ end
127
+
93
128
  def method_missing(name, *args)
94
129
  return self[name] if @fields.has_key?(name)
95
130
  return self.send(:add, name.to_s.chop.to_sym, args[0]) if name.to_s.match(/=$/)
@@ -100,19 +135,25 @@ module BibTeX
100
135
  @fields.has_key?(method.to_sym) || method.to_s.match(/=$/) || super
101
136
  end
102
137
 
138
+ # Returns a copy of the Entry with all the field names renamed.
139
+ def rename(*arguments)
140
+ dup.rename!(*arguments)
141
+ end
142
+
103
143
  # Renames the given field names unless a field with the new name already
104
144
  # exists.
105
- def rename(*arguments)
145
+ def rename!(*arguments)
106
146
  Hash[*arguments.flatten].each_pair do |from,to|
107
- if @field.has_key?(from) && !@field.has_key?(to)
108
- @field[to] = @field[from]
109
- @field.delete(from)
147
+ if @fields.has_key?(from) && !@fields.has_key?(to)
148
+ @fields[to] = @fields[from]
149
+ @fields.delete(from)
110
150
  end
111
151
  end
112
152
  self
113
153
  end
114
154
 
115
155
  alias :rename_fields :rename
156
+ alias :rename_fields! :rename!
116
157
 
117
158
  # Returns the value of the field with the given name.
118
159
  def [](name)
@@ -209,11 +250,18 @@ module BibTeX
209
250
 
210
251
  def to_hash(options = {})
211
252
  options[:quotes] ||= %w({ })
212
- Hash[*([:key, key, :type, type] + @fields.map { |k,v| [k, v.to_s(options)] }.flatten)]
253
+ hash = { :key => key, :type => type }
254
+ each_pair { |k,v| hash[k] = v.to_s(options) }
255
+ hash
213
256
  end
214
257
 
215
258
  def to_citeproc(options = {})
216
- to_hash(options)
259
+ options[:quotes] ||= []
260
+ hash = { 'id' => key.to_s, 'type' => CSL_TYPES[type].to_s }
261
+ each_pair do |k,v|
262
+ hash[CSL_FIELDS[k].to_s] = k == :year ? v.to_date : v.to_citeproc(options)
263
+ end
264
+ hash
217
265
  end
218
266
 
219
267
  def to_xml(options = {})
data/lib/bibtex/names.rb CHANGED
@@ -59,6 +59,14 @@ module BibTeX
59
59
 
60
60
  def to_name; self; end
61
61
 
62
+ def to_citeproc(options = {})
63
+ map { |n| n.to_citeproc(options) }
64
+ end
65
+
66
+ def strip_braces
67
+ gsub!(/\{|\}/,'')
68
+ end
69
+
62
70
  def add(name)
63
71
  case
64
72
  when name.is_a?(Name)
@@ -141,12 +149,13 @@ module BibTeX
141
149
  end
142
150
  end
143
151
 
144
- def to_citeproc
145
- {
146
- 'family' => [prefix, last].compact.join(' '),
147
- 'given' => [first, suffix].compact.join(', '),
148
- 'parse-names' => true
149
- }
152
+ def to_citeproc(options = {})
153
+ hash = {}
154
+ hash['family'] = family unless family.nil?
155
+ hash['given'] = given unless given.nil?
156
+ hash['suffix'] = suffix unless suffix.nil?
157
+ hash['dropping-particle'] = prefix unless prefix.nil?
158
+ hash
150
159
  end
151
160
 
152
161
  alias :family :last
data/lib/bibtex/value.rb CHANGED
@@ -73,7 +73,11 @@ module BibTeX
73
73
  when Symbol
74
74
  @tokens << argument
75
75
  else
76
- raise(ArgumentError, "Failed to create Value from argument #{ argument.inspect }; expected String, Symbol or Value instance.")
76
+ if argument.respond_to?(:to_s)
77
+ @tokens << argument.to_s
78
+ else
79
+ raise(ArgumentError, "Failed to create Value from argument #{ argument.inspect }; expected String, Symbol or Value instance.")
80
+ end
77
81
  end
78
82
  self
79
83
  end
@@ -158,9 +162,8 @@ module BibTeX
158
162
  @tokens.length < 2
159
163
  end
160
164
 
161
- # Returns true if the Value looks like a BibTeX name value.
162
- def name?
163
- end
165
+ # Returns true if the value is a BibTeX name value.
166
+ def name?; false; end
164
167
 
165
168
  alias :names? :name?
166
169
  alias :is_name? :name?
@@ -170,8 +173,17 @@ module BibTeX
170
173
  end
171
174
 
172
175
  alias :to_names :to_name
176
+
177
+ # Returns true if the Value's content looks like a date.
178
+ def date?
179
+ end
180
+
181
+ alias :is_date? :date?
173
182
 
174
-
183
+ # Returns the string as a citeproc date. TODO use edtf format instead.
184
+ def to_date
185
+ numeric? ? { 'date-parts' => [[to_i]] } : { 'literal' => to_s(:quotes => [])}
186
+ end
175
187
 
176
188
  # Returns true if the Value's content is numeric.
177
189
  def numeric?
@@ -180,6 +192,10 @@ module BibTeX
180
192
 
181
193
  alias :is_numeric? :numeric?
182
194
 
195
+ def to_citeproc(options = {})
196
+ to_s(options)
197
+ end
198
+
183
199
  # Returns true if the Value contains at least one symbol.
184
200
  def symbol?
185
201
  @tokens.detect { |v| v.is_a?(Symbol) }
@@ -18,6 +18,6 @@
18
18
 
19
19
  module BibTeX
20
20
  module Version
21
- STRING = '1.3.0'.freeze
21
+ STRING = '1.3.1'.freeze
22
22
  end
23
23
  end
@@ -3,12 +3,43 @@ require 'helper.rb'
3
3
  module BibTeX
4
4
  class EntryTest < MiniTest::Spec
5
5
 
6
- context 'a new Entry' do
6
+ context 'a new entry' do
7
7
  should 'not be nil' do
8
8
  assert Entry.new
9
9
  end
10
10
  end
11
11
 
12
+ context 'given an entry' do
13
+ setup do
14
+ @entry = Entry.new do |e|
15
+ e.type = :book
16
+ e.key = :key
17
+ e.title = 'Moby Dick'
18
+ e.author = 'Herman Melville'
19
+ e.publisher = 'Penguin'
20
+ e.address = 'New York'
21
+ e.year = 1993
22
+ e.parse_names
23
+ end
24
+ end
25
+
26
+ should 'support renaming of field attributes' do
27
+ @entry.rename(:title => :foo)
28
+ refute @entry.has_field?(:title)
29
+ assert_equal 'Moby Dick', @entry[:foo]
30
+ end
31
+
32
+ should 'support citeproc export' do
33
+ e = @entry.to_citeproc
34
+ assert_equal 'book', e['type']
35
+ assert_equal 'New York', e['publisher-place']
36
+ assert_equal [1993], e['issued']['date-parts'][0]
37
+ assert_equal 1, e['author'].length
38
+ assert_equal 'Herman', e['author'][0]['given']
39
+ assert_equal 'Melville', e['author'][0]['family']
40
+ end
41
+ end
42
+
12
43
  def test_simple
13
44
  bib = BibTeX::Bibliography.open(Test.fixtures(:entry), :debug => false)
14
45
  refute_nil(bib)
@@ -94,6 +125,5 @@ module BibTeX
94
125
 
95
126
  end
96
127
 
97
-
98
128
  end
99
129
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: bibtex-ruby
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.3.0
5
+ version: 1.3.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sylvester Keil
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-12 00:00:00 +02:00
13
+ date: 2011-05-14 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency