Class: BibTeX::Value

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Comparable
Defined in:
lib/bibtex/value.rb

Overview

A BibTeX Value is something very much like a string. In BibTeX files it can appear on the right hand side of @string or @entry field assignments or as @preamble contents. In the example below [VALUE] indicates possible occurences of values in BibTeX:

@preamble{ "foo" [VALUE] }
@string{ foo = "foo" [VALUE] }
@book{id,
  author = {John Doe} [VALUE],
  title = foo # "bar" [VALUE]
}

All Values have in common that they can be simple strings in curly braces or double quotes or complex BibTeX string-concatenations (using the ‘#’ symbol).

Generally, Values try to behave as much as normal Ruby strings as possible; If you do not require any of the advanced BibTeX functionality (string replacement or concatentaion) you can simply convert them to strings using to_s. Note that BibTeX Names are special instances of Values which currently do not support string concatenation or replacement.

Direct Known Subclasses

Names

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*arguments) ⇒ Value

Returns a new instance of Value.



59
60
61
62
63
64
# File 'lib/bibtex/value.rb', line 59

def initialize(*arguments)
  @tokens = []
  arguments.flatten.compact.each do |argument|
    add(argument)
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



232
233
234
235
236
237
238
239
# File 'lib/bibtex/value.rb', line 232

def method_missing (name, *args)
  case
  when name.to_s =~ /^(?:convert|from)_([a-z]+)(!)?$/
    $2 ? convert!($1) : convert($1)
  else
    super
  end
end

Instance Attribute Details

#tokensObject (readonly) Also known as: to_a

Returns the value of attribute tokens.



52
53
54
# File 'lib/bibtex/value.rb', line 52

def tokens
  @tokens
end

Instance Method Details

#<=>(other) ⇒ Object



245
246
247
# File 'lib/bibtex/value.rb', line 245

def <=> (other)
  to_s <=> other.to_s
end

#add(argument) ⇒ Object Also known as: <<, push



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/bibtex/value.rb', line 70

def add(argument)
  case argument
  when Value
    @tokens += argument.tokens.dup
  when ::String
    @tokens << argument
  when Symbol
    @tokens << argument
  else
    if argument.respond_to?(:to_s)
      @tokens << argument.to_s
    else
      raise(ArgumentError, "Failed to create Value from argument #{ argument.inspect }; expected String, Symbol or Value instance.")
    end
  end
  self
end

#atomic?Boolean

Returns true if the Value is empty or consists of a single token.

Returns:

  • (Boolean)


167
168
169
# File 'lib/bibtex/value.rb', line 167

def atomic?
  @tokens.length < 2
end

#convert(filter) ⇒ Object

Returns a new Value with all string values converted according to the given filter.



217
218
219
# File 'lib/bibtex/value.rb', line 217

def convert (filter)
  dup.convert!(filter)
end

#convert!(filter) ⇒ Object

Converts all string values according to the given filter.



222
223
224
225
226
227
228
229
230
# File 'lib/bibtex/value.rb', line 222

def convert! (filter)
  if f = Filters.resolve(filter)
    tokens.map! { |t| f.apply(t) }
  else
    raise ArgumentError, "Failed to load filter #{filter.inspect}"
  end
  
  self
end

#date?Boolean

Returns true if the Value’s content is a date.

Returns:

  • (Boolean)


183
184
185
# File 'lib/bibtex/value.rb', line 183

def date?
  !to_date.nil?
end

#initialize_copy(other) ⇒ Object



66
67
68
# File 'lib/bibtex/value.rb', line 66

def initialize_copy(other)
  @tokens = other.tokens.dup
end

#inspectObject



162
163
164
# File 'lib/bibtex/value.rb', line 162

def inspect
  "#<#{self.class} #{tokens.map(&:inspect).join(', ')}>"
end

#joinObject

call-seq:

Value.new('foo', 'bar').join #=> <'foobar'>
Value.new(:foo, 'bar').join  #=> <:foo, 'bar'>

Returns the Value instance with all consecutive String tokens joined.



121
122
123
124
125
126
# File 'lib/bibtex/value.rb', line 121

def join
  @tokens = @tokens.inject([]) do |a,b|
    a[-1].is_a?(::String) && b.is_a?(::String) ? a[-1] += b : a << b; a
  end
  self
end

#name?Boolean Also known as: names?

Returns true if the value is a BibTeX name value.

Returns:

  • (Boolean)


172
# File 'lib/bibtex/value.rb', line 172

def name?; false; end

#numeric?Boolean

Returns true if the Value’s content is numeric.

Returns:

  • (Boolean)


196
197
198
# File 'lib/bibtex/value.rb', line 196

def numeric?
  to_s =~ /^\s*[+-]?\d+[\/\.]?\d*\s*$/
end

#replace(*arguments) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/bibtex/value.rb', line 100

def replace(*arguments)
  return self unless has_symbol?
  arguments.flatten.each do |argument|
    case argument
    when ::String # simulates Ruby's String#replace
      @tokens = [argument]
    when String
      @tokens = @tokens.map { |v| argument.key == v ? argument.value.tokens : v }.flatten
    when Hash
      @tokens = @tokens.map { |v| argument[v] || v }
    end
  end
  self
end

#respond_to?(method) ⇒ Boolean

Returns:

  • (Boolean)


241
242
243
# File 'lib/bibtex/value.rb', line 241

def respond_to? (method)
  method =~ /^(?:convert|from)_([a-z]+)(!)?$/ || super
end

#symbol?Boolean Also known as: has_symbol?

Returns true if the Value contains at least one symbol.

Returns:

  • (Boolean)


205
206
207
# File 'lib/bibtex/value.rb', line 205

def symbol?
  tokens.detect { |v| v.is_a?(Symbol) }
end

#symbolsObject

Returns all symbols contained in the Value.



212
213
214
# File 'lib/bibtex/value.rb', line 212

def symbols
  tokens.select { |v| v.is_a?(Symbol) }
end

#to_citeproc(options = {}) ⇒ Object



200
201
202
# File 'lib/bibtex/value.rb', line 200

def to_citeproc (options = {})
  to_s(options)
end

#to_dateObject

Returns the string as a date.



188
189
190
191
192
193
# File 'lib/bibtex/value.rb', line 188

def to_date
  require 'date'
  Date.parse(to_s)
rescue
  nil
end

#to_nameObject Also known as: to_names



176
177
178
# File 'lib/bibtex/value.rb', line 176

def to_name
  Names.parse(to_s)
end

#to_s(options = {}) ⇒ Object

call-seq:

Value.new('foo').to_s                       #=> "foo"
Value.new(:foo).to_s                        #=> "foo"
Value.new('foo').to_s(:quotes => '"')       #=> "\"foo\""
Value.new('foo').to_s(:quotes => ['"','"']) #=> "\"foo\""
Value.new('foo').to_s(:quotes => ['{','}']) #=> "{foo}"
Value.new(:foo, 'bar').to_s                 #=> "foo # \"bar\""
Value.new('foo', 'bar').to_s                #=> "\"foo\" # \"bar\""
Value.new('\"u').to_s(:filter => :latex)    #=> "ü"

Returns a the Value as a string. @see #value; the only difference is that single symbols are returned as String, too. If the Value is atomic and the option :quotes is given, the string will be quoted using the quote symbols specified.

If the option :filter is given, the Value will be converted using the filter(s) specified.



145
146
147
148
149
150
# File 'lib/bibtex/value.rb', line 145

def to_s(options = {})
  return convert(options.delete(:filter)).to_s(options) if options.has_key?(:filter)
  return value.to_s unless options.has_key?(:quotes) && atomic?
  q = [options[:quotes]].flatten
  [q[0], value, q[-1]].compact.join
end

#valueObject Also known as: v

Returns the Value as a string or, if it consists of a single symbol, as a Symbol instance. If the Value contains multiple tokens, they will be joined by a ‘#’, additionally, all string tokens will be turned into string literals (i.e., delimitted by quotes).



156
157
158
# File 'lib/bibtex/value.rb', line 156

def value
  atomic? ? @tokens[0] : @tokens.map { |v|  v.is_a?(::String) ? v.inspect : v }.join(' # ')
end