Class: Array

Inherits:
Object
  • Object
show all
Defined in:
lib/joined.rb

Overview

Joins elements of array.

Author

Yegor Bugayenko ([email protected])

Copyright

Copyright © 2025 Yegor Bugayenko

License

MIT

Instance Method Summary collapse

Instance Method Details

#joined(oxford: true, words_connector: ', ', last_word_connector: ', and ', comma_before: false, max: nil, etc: ', etc.') ⇒ String

Join strings into a single line, splitting them with comma and placing “AND” between the last two items.

Parameters:

  • words_connector (String) (defaults to: ', ')

    The string used to join all but the last element of the list

  • last_word_connector (String) (defaults to: ', and ')

    The string used to join the last element of the list.

  • oxford (Boolean) (defaults to: true)

    Should we place a comma before the :last_word_connector? If false, it will remove a leading comma from the :last_word_connector. If true, it will preserve the leading comma specified in the :last_word_connector, but it will not insert one if not already present.

  • comma_before (Boolean) (defaults to: false)

    Should we move comma before the quotes symbol If false, adds the comma outside quotation marks If true, adds the comma inside quotation marks

  • max (Integer) (defaults to: nil)

    Maximum number of elements to show. If array has more elements, append the etc suffix to the result.

  • etc (String) (defaults to: ', etc.')

    The suffix to append when max is specified and array is truncated.

Returns:

  • (String)

    The text generated (with items joined)



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/joined.rb', line 35

def joined(oxford: true, words_connector: ', ', last_word_connector: ', and ',
           comma_before: false, max: nil, etc: ', etc.')
  return '' if empty?
  return etc if max&.zero?
  array = self
  truncated = false
  if max && length > max
    array = self[0...max]
    truncated = true
  end
  if array.length == 1
    result = array.first
    result += etc if truncated
    return result
  end
  if truncated
    result = array.join(words_connector)
  else
    final = (last_word_connector || '').dup
    final.sub!(/^,/, '') unless oxford && array.length > 2
    result = "#{array[0...-1].join(words_connector)}#{final}#{array[-1]}"
  end
  result.gsub!(/"([^"]+)"\s*,/, '"\1,"') if comma_before
  result += etc if truncated
  result
end