bibtex-ruby 1.3.0 → 1.3.1

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.

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