bibtex-ruby 2.0.1 → 2.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bibtex-ruby (2.0.0)
4
+ bibtex-ruby (2.0.1)
5
5
  latex-decode (>= 0.0.6)
6
6
  multi_json (~> 1.0)
7
7
 
@@ -27,7 +27,7 @@ GEM
27
27
  gnuplot (2.3.6)
28
28
  json (1.5.4)
29
29
  json (1.5.4-java)
30
- latex-decode (0.0.6)
30
+ latex-decode (0.0.9)
31
31
  unicode (~> 0.4)
32
32
  linecache (0.46)
33
33
  rbx-require-relative (> 0.0.4)
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ 2.0.2 / 2011-11-25
2
+ ==================
3
+
4
+ * Fixed (#33): error in Entry#respond_to? (kudos to @houshuang)
5
+
1
6
  2.0.1 / 2011-10-20
2
7
  ==================
3
8
 
data/lib/bibtex.rb CHANGED
@@ -16,22 +16,20 @@
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  #++
18
18
 
19
- $:.unshift(File.dirname(__FILE__)) unless
20
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
21
-
22
19
  require 'digest/md5'
23
-
24
- require 'bibtex/version'
20
+ require 'forwardable'
25
21
  require 'logger'
22
+ require 'open-uri'
26
23
 
27
24
  require 'multi_json'
28
25
 
26
+ require 'bibtex/version'
27
+
29
28
  # = BibTeX
30
29
  #
31
30
  # This module encompasses a parser for BibTeX files and
32
- # auxiliary classes to model the individual
33
- # BibTeX objects: +String+, +Preamble+, +Comment+, and
34
- # +Entry+.
31
+ # an API to the individual BibTeX objects: +String+,
32
+ # +Preamble+, +Comment+, and +Entry+.
35
33
  #
36
34
  # Author:: {Sylvester Keil}[http://sylvester.keil.or.at]
37
35
  # Copyright:: Copyright (c) 2010-2011 Sylvester Keil
@@ -43,11 +41,13 @@ module BibTeX
43
41
  # An instance of the Ruby core class +Logger+.
44
42
  # Used for logging by BibTeX-Ruby.
45
43
  #
46
- Log = Logger.new(STDERR)
47
- Log.level = ENV.has_key?('DEBUG') ? Logger::DEBUG : Logger::WARN
48
- Log.datetime_format = '%Y-%m-%d %H:%M:%S'
44
+ @log = Logger.new(STDERR)
45
+ @log.level = ENV.has_key?('DEBUG') ? Logger::DEBUG : Logger::WARN
46
+ @log.datetime_format = '%Y-%m-%d %H:%M:%S'
49
47
 
50
- def self.log; BibTeX::Log; end
48
+ class << self
49
+ attr_reader :log
50
+ end
51
51
 
52
52
  end
53
53
 
@@ -16,9 +16,6 @@
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  #++
18
18
 
19
- require 'forwardable'
20
- require 'open-uri'
21
-
22
19
  module BibTeX
23
20
 
24
21
  #
@@ -35,8 +32,8 @@ module BibTeX
35
32
 
36
33
  class << self
37
34
 
38
- attr_reader :defaults
39
-
35
+ attr_reader :defaults
36
+
40
37
  # Opens and parses the `.bib' file at the given +path+. Returns
41
38
  # a new Bibliography instance corresponding to the file, or, if a block
42
39
  # is given, yields the instance to the block, ensuring that the file
@@ -53,7 +50,7 @@ module BibTeX
53
50
  #
54
51
  def open(path, options = {})
55
52
  b = parse(Kernel.open(path, 'r:UTF-8').read, options)
56
- b.path = path
53
+ b.path = path
57
54
  return b unless block_given?
58
55
 
59
56
  begin
@@ -65,14 +62,14 @@ module BibTeX
65
62
 
66
63
  # Parses the given string and returns a corresponding Bibliography instance.
67
64
  def parse(input, options = {})
68
- case input
69
- when Array, Hash, Element
70
- Bibliography.new(options).add(input)
71
- when ::String
72
- Parser.new(options).parse(input) || Bibliography.new(options)
73
- else
74
- raise ArgumentError, "failed to parse #{input.inspect}"
75
- end
65
+ case input
66
+ when Array, Hash, Element
67
+ Bibliography.new(options).add(input)
68
+ when ::String
69
+ Parser.new(options).parse(input) || Bibliography.new(options)
70
+ else
71
+ raise ArgumentError, "failed to parse #{input.inspect}"
72
+ end
76
73
  end
77
74
 
78
75
  # Defines a new accessor that selects elements by type.
@@ -88,22 +85,30 @@ module BibTeX
88
85
 
89
86
  attr_reader :data, :strings, :entries, :errors, :options
90
87
 
91
- attr_by_type :article, :book, :journal, :collection, :preamble, :comment,
92
- :meta_content
88
+ attr_by_type :article, :book, :journal, :collection, :preamble,
89
+ :comment, :meta_content
93
90
 
94
- def_delegators :@data, :length, :size, :each, :empty?, :last
95
- def_delegators :@entries, :has_key?
91
+ def_delegators :@data, :length, :size, :empty?
92
+ def_delegators :@entries, :key?, :has_key?
96
93
 
97
94
 
98
95
  # Creates a new bibliography.
99
96
  def initialize(options = {})
100
97
  @options = Bibliography.defaults.merge(options)
101
- @data, @strings = [], {}
102
- @entries = Hash.new { |h,k| h.fetch(k.to_s, nil) }
98
+ @data, @strings, @errors = [], {}, []
99
+ @entries = Hash.new { |h,k| h.fetch(k.to_s, nil) }
103
100
 
104
101
  yield self if block_given?
105
102
  end
106
103
 
104
+ def initialize_copy(other)
105
+ @options = other.options.dup
106
+ @errors = other.errors.dup
107
+ @data, @strings = [], {}
108
+ @entries = Hash.new { |h,k| h.fetch(k.to_s, nil) }
109
+ add(other.data)
110
+ end
111
+
107
112
  # Adds a new element, or a list of new elements to the bibliography.
108
113
  # Returns the Bibliography for chainability.
109
114
  def add(*arguments)
@@ -127,11 +132,21 @@ module BibTeX
127
132
  options[:quotes] ||= %w({ })
128
133
 
129
134
  File.open(path, 'w:UTF-8') do |f|
130
- f.write(to_s(options))
131
- end
132
-
135
+ f.write(to_s(options))
136
+ end
137
+
133
138
  self
134
139
  end
140
+
141
+
142
+ def each
143
+ if block_given?
144
+ data.each(&Proc.new)
145
+ self
146
+ else
147
+ to_enum
148
+ end
149
+ end
135
150
 
136
151
 
137
152
  def parse_names
@@ -150,12 +165,12 @@ module BibTeX
150
165
  # entry). @see Entry#convert!
151
166
  def convert (filter)
152
167
  entries.each_value do |entry|
153
- entry.convert!(filter) if !block_given? || yield(entry)
154
- end
155
-
168
+ entry.convert!(filter) if !block_given? || yield(entry)
169
+ end
170
+
156
171
  self
157
172
  end
158
-
173
+
159
174
 
160
175
  # Deletes an object, or a list of objects from the bibliography.
161
176
  # If a list of objects is to be deleted, you can either supply the list
@@ -173,10 +188,6 @@ module BibTeX
173
188
  alias rm delete
174
189
 
175
190
 
176
- # Returns an element or a list of elements according to the given index,
177
- # range, or query. Contrary to the Bibliography#query this method does
178
- # not yield to a block for additional refinement of the query.
179
- #
180
191
  # call-seq:
181
192
  # >> bib[-1]
182
193
  # => Returns the last element of the Bibliography or nil
@@ -196,34 +207,35 @@ module BibTeX
196
207
  # => Returns all objects that match 'ruby' anywhere or []
197
208
  # >> bib['@book[keywords=ruby]']
198
209
  # => Returns all books whose keywords attribute equals 'ruby' or []
210
+ #
211
+ # Returns an element or a list of elements according to the given index,
212
+ # range, or query. Contrary to the Bibliography#query this method does
213
+ # not yield to a block for additional refinement of the query.
214
+ #
199
215
  def [](*arguments)
200
216
  raise(ArgumentError, "wrong number of arguments (#{arguments.length} for 1..2)") unless arguments.length.between?(1,2)
201
217
 
202
218
  case
203
219
  when arguments[0].is_a?(Numeric) || arguments[0].is_a?(Range)
204
220
  data[*arguments]
205
- when arguments.length == 1
206
- case
207
- when arguments[0].nil?
208
- nil
209
- when arguments[0].respond_to?(:empty?) && arguments[0].empty?
210
- nil
211
- when arguments[0].is_a?(Symbol)
212
- entries[arguments[0]]
213
- when arguments[0].respond_to?(:start_with?) && !arguments[0].start_with?('@')
214
- entries[arguments[0]]
215
- else
216
- query(*arguments)
217
- end
221
+ when arguments.length == 1
222
+ case
223
+ when arguments[0].nil?
224
+ nil
225
+ when arguments[0].respond_to?(:empty?) && arguments[0].empty?
226
+ nil
227
+ when arguments[0].is_a?(Symbol)
228
+ entries[arguments[0]]
229
+ when arguments[0].respond_to?(:start_with?) && !arguments[0].start_with?('@')
230
+ entries[arguments[0]]
231
+ else
232
+ query(*arguments)
233
+ end
218
234
  else
219
235
  query(*arguments)
220
236
  end
221
237
  end
222
238
 
223
- # Returns all objects which could not be parsed successfully.
224
- def errors
225
- @errors ||= []
226
- end
227
239
 
228
240
  # Returns true if there are object which could not be parsed.
229
241
  def errors?
@@ -233,14 +245,14 @@ module BibTeX
233
245
  # Returns true if the +Bibliography+ contains no errors and only
234
246
  # valid BibTeX objects (meta content is ignored).
235
247
  def valid?
236
- !errors? && @entries.values.all?(&:valid?)
248
+ !errors? && entries.values.all?(&:valid?)
249
+ end
250
+
251
+ # Returns a list of the names of all authors, editors and translators in the Bibliography.
252
+ def names
253
+ map(&:names).flatten
237
254
  end
238
255
 
239
- # Returns a list of the names of all authors, editors and translators in the Bibliography.
240
- def names
241
- map(&:names).flatten
242
- end
243
-
244
256
  # Replaces all string symbols which are defined in the bibliography.
245
257
  #
246
258
  # By default symbols in @string, @preamble and entries are replaced; this
@@ -273,8 +285,9 @@ module BibTeX
273
285
  self
274
286
  end
275
287
 
288
+
276
289
  def sort(*arguments, &block)
277
- @data.sort(*arguments, &block)
290
+ data.sort(*arguments, &block)
278
291
  self
279
292
  end
280
293
 
@@ -283,6 +296,10 @@ module BibTeX
283
296
  map { |o| o.to_s(options) }.join
284
297
  end
285
298
 
299
+ def inspect
300
+ "#<#{self.class} data=[#{length}]>"
301
+ end
302
+
286
303
  def to_a(options = {})
287
304
  map { |o| o.to_hash(options) }
288
305
  end
@@ -308,16 +325,16 @@ module BibTeX
308
325
  end
309
326
 
310
327
  # Returns a REXML::Document representation of the bibliography using the
311
- # BibTeXML format.
328
+ # BibTeXML format.
312
329
  def to_xml(options = {})
313
330
  require 'rexml/document'
314
-
331
+
315
332
  xml = REXML::Document.new
316
333
  xml << REXML::XMLDecl.new('1.0','UTF-8')
317
334
 
318
335
  root = REXML::Element.new('bibtex:file')
319
- root.add_namespace('bibtex', 'http://bibtexml.sf.net/')
320
-
336
+ root.add_namespace('bibtex', 'http://bibtexml.sf.net/')
337
+
321
338
  each { |e| root.add_element(e.to_xml(options)) }
322
339
 
323
340
  xml.add_element(root)
@@ -342,11 +359,11 @@ module BibTeX
342
359
  # #=> same as above without using a block
343
360
  #
344
361
  def query(*arguments, &block)
345
- raise(ArgumentError, "wrong number of arguments (#{arguments.length} for 0..2)") unless arguments.length.between?(0,2)
362
+ raise ArgumentError, "wrong number of arguments (#{arguments.length} for 0..2)" unless arguments.length.between?(0,2)
346
363
 
347
364
  q, selector = arguments.reverse
348
365
  filter = block ? Proc.new { |e| e.match?(q) && block.call(e) } :
349
- Proc.new { |e| e.match?(q) }
366
+ Proc.new { |e| e.match?(q) }
350
367
 
351
368
  send(query_handler(selector), &filter)
352
369
  end
@@ -363,26 +380,26 @@ module BibTeX
363
380
  other.respond_to?(:to_a) ? to_a <=> other.to_a : nil
364
381
  end
365
382
 
366
- # TODO this should be faster than select_duplicates_by
367
- # def detect_duplicates_by(*arguments)
368
- # end
369
-
370
- def select_duplicates_by(*arguments)
371
- d, fs = Hash.new([]), arguments.flatten.map(&:to_sym)
372
- q('@entry') do |e|
373
- d[e.generate_hash(fs)] << e
374
- end
375
-
376
- d.values.dup
377
- end
378
-
379
- alias duplicates select_duplicates_by
380
-
381
- def duplicates?
382
- !select_duplicates_by?.empty?
383
- end
384
-
385
-
383
+ # TODO this should be faster than select_duplicates_by
384
+ # def detect_duplicates_by(*arguments)
385
+ # end
386
+
387
+ def select_duplicates_by(*arguments)
388
+ d, fs = Hash.new([]), arguments.flatten.map(&:to_sym)
389
+ q('@entry') do |e|
390
+ d[e.generate_hash(fs)] << e
391
+ end
392
+
393
+ d.values.dup
394
+ end
395
+
396
+ alias duplicates select_duplicates_by
397
+
398
+ def duplicates?
399
+ !select_duplicates_by?.empty?
400
+ end
401
+
402
+
386
403
  private
387
404
 
388
405
  def query_handler(selector)
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # BibTeX-Ruby
3
- # Copyright (C) 2010-2011 Sylvester Keil <sylvester.keil.or.at>
3
+ # Copyright (C) 2010-2011 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,45 +9,45 @@
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. See the
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. If not, see <http://www.gnu.org/licenses/>.
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  #++
18
18
 
19
19
  module BibTeX
20
20
 
21
- #
22
- # The base class for BibTeX objects.
23
- #
24
- class Element
21
+ #
22
+ # The base class for BibTeX objects.
23
+ #
24
+ class Element
25
25
  include Comparable
26
26
 
27
27
  attr_writer :id
28
- attr_reader :bibliography
29
-
30
- # Returns an array of BibTeX elements.
28
+ attr_reader :bibliography
29
+
30
+ # Returns an array of BibTeX elements.
31
31
  def self.parse(input, options = {})
32
- case input
33
- when Element
34
- [input]
35
- when Hash
36
- [Entry.new(input)]
37
- when Array
38
- input.inject([]) { |s,a| s.concat(parse(a, options)) }
39
- when ::String
40
- Parser.new(options).parse(input).data.each do |e|
41
- e.parse_names unless !e.respond_to?(:parse_names) || options[:parse_names] == false
42
- e.parse_month unless !e.respond_to?(:parse_month) || options[:parse_months] == false
43
- end
44
- else
45
- raise ArgumentError, "failed to parse Element from #{input.inspect}"
46
- end
32
+ case input
33
+ when Element
34
+ [input]
35
+ when Hash
36
+ [Entry.new(input)]
37
+ when Array
38
+ input.inject([]) { |s,a| s.concat(parse(a, options)) }
39
+ when ::String
40
+ Parser.new(options).parse(input).data.each do |e|
41
+ e.parse_names unless !e.respond_to?(:parse_names) || options[:parse_names] == false
42
+ e.parse_month unless !e.respond_to?(:parse_month) || options[:parse_months] == false
43
+ end
44
+ else
45
+ raise ArgumentError, "failed to parse Element from #{input.inspect}"
46
+ end
47
47
  end
48
48
 
49
- # Returns a string containing the object's content.
50
- def content(options = {}); ''; end
49
+ # Returns a string containing the object's content.
50
+ def content(options = {}); ''; end
51
51
 
52
52
  # Invokes BibTeX string replacement on this element.
53
53
  def replace(*arguments); self; end
@@ -63,19 +63,19 @@ module BibTeX
63
63
  self.class.name.split(/::/).last.gsub(/([[:lower:]])([[:upper:]])/) { "#{$1}_#{$2}" }.downcase.intern
64
64
  end
65
65
 
66
- # Returns a list of names for that Element. All Elements except Entries return an empty list.
67
- def names
68
- []
69
- end
70
-
66
+ # Returns a list of names for that Element. All Elements except Entries return an empty list.
67
+ def names
68
+ []
69
+ end
70
+
71
71
  def has_type?(type)
72
72
  self.type == type.intern || defined?(type) == 'constant' && is_a?(type)
73
73
  end
74
74
 
75
75
  [:entry, :book, :article, :collection, :string, :preamble, :comment]. each do |type|
76
- method_id = "#{type}?"
77
- define_method(method_id) { has_type?(type) } unless method_defined?(method_id)
78
- end
76
+ method_id = "#{type}?"
77
+ define_method(method_id) { has_type?(type) } unless method_defined?(method_id)
78
+ end
79
79
 
80
80
  # Returns true if the element matches the given query.
81
81
  def matches?(query)
@@ -112,85 +112,85 @@ module BibTeX
112
112
 
113
113
  alias meet? meets?
114
114
 
115
- alias to_s content
116
-
117
- def to_hash(options = {})
118
- { type => content }
119
- end
120
-
121
- def to_yaml(options = {})
122
- require 'yaml'
115
+ alias to_s content
116
+
117
+ def to_hash(options = {})
118
+ { type => content }
119
+ end
120
+
121
+ def to_yaml(options = {})
122
+ require 'yaml'
123
123
  to_hash.to_yaml
124
- end
125
-
126
- def to_json(options = {})
127
- MultiJson.encode(to_hash(options))
128
- end
129
-
130
- def to_xml(options = {})
131
- require 'rexml/document'
132
- xml = REXML::Element.new(type)
133
- xml.text = content
134
- xml
135
- end
124
+ end
125
+
126
+ def to_json(options = {})
127
+ MultiJson.encode(to_hash(options))
128
+ end
129
+
130
+ def to_xml(options = {})
131
+ require 'rexml/document'
132
+ xml = REXML::Element.new(type)
133
+ xml.text = content
134
+ xml
135
+ end
136
136
 
137
- # Called when the element was added to a bibliography.
138
- def added_to_bibliography(bibliography)
139
- # raise BibTeXError, "failed to add element to Bibliography: already registered with another Bibliography" unless @bibliography.nil?
140
- @bibliography = bibliography
141
- self
142
- end
143
-
144
- # Called when the element was removed from a bibliography.
145
- def removed_from_bibliography(bibliography)
146
- @bibliography = nil
147
- self
148
- end
149
-
150
- def <=>(other)
151
- return nil unless other.respond_to? :type and other.respond_to? :to_s
152
- [type, to_s] <=> [other.type, other.to_s]
153
- end
154
-
155
- # Returns the Element as a nicely formatted string.
156
- def inspect
157
- "#<#{self.class} #{content.gsub(/\n/, ' ')}>"
158
- end
159
- end
137
+ # Called when the element was added to a bibliography.
138
+ def added_to_bibliography(bibliography)
139
+ # raise BibTeXError, "failed to add element to Bibliography: already registered with another Bibliography" unless @bibliography.nil?
140
+ @bibliography = bibliography
141
+ self
142
+ end
143
+
144
+ # Called when the element was removed from a bibliography.
145
+ def removed_from_bibliography(bibliography)
146
+ @bibliography = nil
147
+ self
148
+ end
149
+
150
+ def <=>(other)
151
+ return nil unless other.respond_to? :type and other.respond_to? :to_s
152
+ [type, to_s] <=> [other.type, other.to_s]
153
+ end
154
+
155
+ # Returns the Element as a nicely formatted string.
156
+ def inspect
157
+ "#<#{self.class} #{content.gsub(/\n/, ' ')}>"
158
+ end
159
+ end
160
160
 
161
161
 
162
- #
163
- # Represents a @string object.
164
- #
165
- # In BibTeX @string objects contain a single string constant
166
- # assignment. For example, @string{ foo = "bar" } defines the
167
- # constant `foo'; this constant can be used (using BibTeX's
168
- # string concatenation syntax) in susbsequent
169
- # @string and @preamble objects, as well as in field values
170
- # of regular entries.
171
- #
172
- class String < Element
162
+ #
163
+ # Represents a @string object.
164
+ #
165
+ # In BibTeX @string objects contain a single string constant
166
+ # assignment. For example, @string{ foo = "bar" } defines the
167
+ # constant `foo'; this constant can be used (using BibTeX's
168
+ # string concatenation syntax) in susbsequent
169
+ # @string and @preamble objects, as well as in field values
170
+ # of regular entries.
171
+ #
172
+ class String < Element
173
173
  include Replaceable
174
174
 
175
- attr_reader :key
175
+ attr_reader :key
176
176
 
177
- # Creates a new instance.
178
- def initialize(key = nil, value = nil)
179
- @key, @value = key.to_sym, Value.new(value)
180
- yield self if block_given?
181
- end
177
+ # Creates a new instance.
178
+ def initialize(key = nil, value = nil)
179
+ @key, @value = key.to_sym, Value.new(value)
180
+ yield self if block_given?
181
+ end
182
182
 
183
- # Sets the string's key (i.e., the symbol identifying the constant).
184
- def key=(key)
185
- raise(ArgumentError, "keys must be convertible to Symbol; was: #{type.class.name}.") unless type.respond_to?(:to_sym)
186
-
187
- unless bibliography.nil?
188
- bibliography.strings.delete(@key)
189
- bibliography.strings[key.to_sym] = self
190
- end
183
+ # Sets the string's key (i.e., the symbol identifying the constant).
184
+ def key=(key)
185
+ raise(ArgumentError, "keys must be convertible to Symbol; was: #{type.class.name}.") unless type.respond_to?(:to_sym)
186
+
187
+ unless bibliography.nil?
188
+ bibliography.strings.delete(@key)
189
+ bibliography.strings[key.to_sym] = self
190
+ end
191
191
 
192
- @key = key.to_sym
193
- end
192
+ @key = key.to_sym
193
+ end
194
194
 
195
195
  # Retuns the string's value if parameter matches the key; nil otherwise.
196
196
  def [](key)
@@ -198,104 +198,104 @@ module BibTeX
198
198
  end
199
199
 
200
200
 
201
- # Called when the element was added to a bibliography.
202
- def added_to_bibliography(bibliography)
203
- super
204
- bibliography.strings[@key] = self
205
- self
206
- end
207
-
208
- # Called when the element was removed from a bibliography.
209
- def removed_from_bibliography(bibliography)
210
- super
211
- bibliography.strings[@key] = nil
212
- self
213
- end
201
+ # Called when the element was added to a bibliography.
202
+ def added_to_bibliography(bibliography)
203
+ super
204
+ bibliography.strings[@key] = self
205
+ self
206
+ end
207
+
208
+ # Called when the element was removed from a bibliography.
209
+ def removed_from_bibliography(bibliography)
210
+ super
211
+ bibliography.strings[@key] = nil
212
+ self
213
+ end
214
214
 
215
- # Returns a string representation of the @string's content.
216
- def content
217
- "#@key = #{@value.to_s(:quotes => '"')}"
218
- end
215
+ # Returns a string representation of the @string's content.
216
+ def content
217
+ "#@key = #{@value.to_s(:quotes => '"')}"
218
+ end
219
219
 
220
- # Returns a string representation of the @string object.
221
- def to_s(options = {})
222
- "@string{ #{content} }"
223
- end
224
-
225
- def to_hash(options = {})
226
- { :string => { @key => @value.to_s(:quotes => '"') } }
227
- end
228
-
229
- def to_xml(options = {})
230
- require 'rexml/document'
231
-
232
- xml = REXML::Element.new(:string)
233
-
234
- k, v = REXML::Element.new(:key), REXML::Element.new(:value)
235
- k.text = key.to_s
236
- v.text = value.to_s(:quotes => '"')
237
-
238
- xml.add_elements(k)
239
- xml.add_elements(v)
240
-
241
- xml
242
- end
243
- end
220
+ # Returns a string representation of the @string object.
221
+ def to_s(options = {})
222
+ "@string{ #{content} }"
223
+ end
224
+
225
+ def to_hash(options = {})
226
+ { :string => { @key => @value.to_s(:quotes => '"') } }
227
+ end
228
+
229
+ def to_xml(options = {})
230
+ require 'rexml/document'
231
+
232
+ xml = REXML::Element.new(:string)
233
+
234
+ k, v = REXML::Element.new(:key), REXML::Element.new(:value)
235
+ k.text = key.to_s
236
+ v.text = value.to_s(:quotes => '"')
237
+
238
+ xml.add_elements(k)
239
+ xml.add_elements(v)
240
+
241
+ xml
242
+ end
243
+ end
244
244
 
245
- #
246
- # Represents a @preamble object.
247
- #
248
- # In BibTeX an @preamble object contains a single string literal,
249
- # a single constant, or a concatenation of string literals and
250
- # constants.
251
- class Preamble < Element
252
- include Replaceable
245
+ #
246
+ # Represents a @preamble object.
247
+ #
248
+ # In BibTeX an @preamble object contains a single string literal,
249
+ # a single constant, or a concatenation of string literals and
250
+ # constants.
251
+ class Preamble < Element
252
+ include Replaceable
253
253
 
254
- # Creates a new instance.
255
- def initialize(value = '')
254
+ # Creates a new instance.
255
+ def initialize(value = '')
256
256
  @value = Value.new(value)
257
- end
257
+ end
258
258
 
259
- # Returns a string representation of the @preamble's content.
260
- def content
261
- @value.to_s(:quotes => '"')
262
- end
259
+ # Returns a string representation of the @preamble's content.
260
+ def content
261
+ @value.to_s(:quotes => '"')
262
+ end
263
263
 
264
- # Returns a string representation of the @preamble object
265
- def to_s(options = {})
266
- "@preamble{ #{content} }"
267
- end
268
- end
264
+ # Returns a string representation of the @preamble object
265
+ def to_s(options = {})
266
+ "@preamble{ #{content} }"
267
+ end
268
+ end
269
269
 
270
- # Represents a @comment object.
271
- class Comment < Element
270
+ # Represents a @comment object.
271
+ class Comment < Element
272
272
  attr_accessor :content
273
273
 
274
- def initialize(content = '')
275
- @content = content
276
- end
274
+ def initialize(content = '')
275
+ @content = content
276
+ end
277
277
 
278
- def to_s(options = {})
279
- "@comment{ #@content }"
280
- end
281
- end
278
+ def to_s(options = {})
279
+ "@comment{ #@content }"
280
+ end
281
+ end
282
282
 
283
- # Represents text in a `.bib' file, but outside of an
284
- # actual BibTeX object; typically, such text is treated
285
- # as a comment and is ignored by the parser.
286
- # BibTeX-Ruby offers this class to allows for
287
- # post-processing of this type of `meta' content. If you
288
- # want the parser to include +MetaComment+ objects, you
289
- # need to add +:meta_content+ to the parser's +:include+
290
- # option.
291
- class MetaContent < Element
292
- attr_accessor :content
293
-
294
- def initialize(content = '')
295
- @content = content
296
- end
283
+ # Represents text in a `.bib' file, but outside of an
284
+ # actual BibTeX object; typically, such text is treated
285
+ # as a comment and is ignored by the parser.
286
+ # BibTeX-Ruby offers this class to allows for
287
+ # post-processing of this type of `meta' content. If you
288
+ # want the parser to include +MetaComment+ objects, you
289
+ # need to add +:meta_content+ to the parser's +:include+
290
+ # option.
291
+ class MetaContent < Element
292
+ attr_accessor :content
293
+
294
+ def initialize(content = '')
295
+ @content = content
296
+ end
297
297
 
298
- def to_s(options = {}); @content; end
299
- end
298
+ def to_s(options = {}); @content; end
299
+ end
300
300
 
301
301
  end