asciidoctor-bibliography 0.3.0 → 0.4.0

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +23 -4
  3. data/asciidoctor-bibliography.gemspec +8 -8
  4. data/lib/asciidoctor-bibliography.rb +6 -0
  5. data/lib/asciidoctor-bibliography/asciidoctor/bibliographer_preprocessor.rb +35 -23
  6. data/lib/asciidoctor-bibliography/bibliographer.rb +0 -15
  7. data/lib/asciidoctor-bibliography/citation.rb +29 -22
  8. data/lib/asciidoctor-bibliography/databases/bibtex.rb +4 -1
  9. data/lib/asciidoctor-bibliography/formatter.rb +28 -0
  10. data/lib/asciidoctor-bibliography/index.rb +24 -16
  11. data/lib/asciidoctor-bibliography/options.rb +65 -32
  12. data/lib/asciidoctor-bibliography/version.rb +1 -1
  13. data/lib/citeproc/ruby/formats/adoc.rb +36 -0
  14. data/lib/csl/styles/tex-citealp-authoryear.csl +117 -0
  15. data/lib/csl/styles/tex-citealp-numeric.csl +116 -0
  16. data/lib/csl/styles/tex-citealps-authoryear.csl +117 -0
  17. data/lib/csl/styles/tex-citealps-numeric.csl +116 -0
  18. data/lib/csl/styles/tex-citealt-authoryear.csl +119 -0
  19. data/lib/csl/styles/tex-citealt-numeric.csl +119 -0
  20. data/lib/csl/styles/tex-citealts-authoryear.csl +119 -0
  21. data/lib/csl/styles/tex-citealts-numeric.csl +119 -0
  22. data/lib/csl/styles/tex-citeauthor-authoryear.csl +116 -0
  23. data/lib/csl/styles/tex-citeauthor-numeric.csl +116 -0
  24. data/lib/csl/styles/tex-citeauthors-authoryear.csl +116 -0
  25. data/lib/csl/styles/tex-citeauthors-numeric.csl +116 -0
  26. data/lib/csl/styles/tex-citep-authoryear.csl +117 -0
  27. data/lib/csl/styles/tex-citep-numeric.csl +116 -0
  28. data/lib/csl/styles/tex-citeps-authoryear.csl +117 -0
  29. data/lib/csl/styles/tex-citeps-numeric.csl +116 -0
  30. data/lib/csl/styles/tex-citet-authoryear.csl +119 -0
  31. data/lib/csl/styles/tex-citet-numeric.csl +119 -0
  32. data/lib/csl/styles/tex-citets-authoryear.csl +119 -0
  33. data/lib/csl/styles/tex-citets-numeric.csl +119 -0
  34. data/lib/csl/styles/tex-citeyear-authoryear.csl +116 -0
  35. data/lib/csl/styles/tex-citeyear-numeric.csl +116 -0
  36. data/lib/csl/styles/tex-citeyearpar-authoryear.csl +116 -0
  37. data/lib/csl/styles/tex-citeyearpar-numeric.csl +116 -0
  38. data/samples/tex/sample-numbers.adoc +1 -1
  39. data/samples/tex/sample-sort.adoc +1 -1
  40. data/spec/citation_helper.rb +46 -0
  41. data/spec/citation_item_spec.rb +0 -2
  42. data/spec/csl/styles/tex_citealp_authoryear_spec.rb +42 -0
  43. data/spec/csl/styles/tex_citealp_numeric_spec.rb +42 -0
  44. data/spec/csl/styles/tex_citealps_authoryear_spec.rb +42 -0
  45. data/spec/csl/styles/tex_citealps_numeric_spec.rb +42 -0
  46. data/spec/csl/styles/tex_citealt_authoryear_spec.rb +42 -0
  47. data/spec/csl/styles/tex_citealt_numeric_spec.rb +42 -0
  48. data/spec/csl/styles/tex_citealts_authoryear_spec.rb +42 -0
  49. data/spec/csl/styles/tex_citealts_numeric_spec.rb +42 -0
  50. data/spec/csl/styles/tex_citeauthor_authoryear_spec.rb +42 -0
  51. data/spec/csl/styles/tex_citeauthor_numeric_spec.rb +42 -0
  52. data/spec/csl/styles/tex_citeauthors_authoryear_spec.rb +42 -0
  53. data/spec/csl/styles/tex_citeauthors_numeric_spec.rb +42 -0
  54. data/spec/csl/styles/tex_citep_authoryear_spec.rb +42 -0
  55. data/spec/csl/styles/tex_citep_numeric_spec.rb +42 -0
  56. data/spec/csl/styles/tex_citeps_authoryear_spec.rb +42 -0
  57. data/spec/csl/styles/tex_citeps_numeric_spec.rb +42 -0
  58. data/spec/csl/styles/tex_citet_authoryear_spec.rb +42 -0
  59. data/spec/csl/styles/tex_citet_numeric_spec.rb +42 -0
  60. data/spec/csl/styles/tex_citets_authoryear_spec.rb +42 -0
  61. data/spec/csl/styles/tex_citets_numeric_spec.rb +42 -0
  62. data/spec/csl/styles/tex_citeyear_authoryear_spec.rb +42 -0
  63. data/spec/csl/styles/tex_citeyear_numeric_spec.rb +42 -0
  64. data/spec/csl/styles/tex_citeyearpar_authoryear_spec.rb +42 -0
  65. data/spec/csl/styles/tex_citeyearpar_numeric_spec.rb +42 -0
  66. data/spec/database_spec.rb +20 -1
  67. data/spec/macros_spec.rb +21 -0
  68. data/spec/options_spec.rb +105 -1
  69. metadata +72 -24
  70. data/lib/asciidoctor-bibliography/formatters/csl.rb +0 -28
  71. data/lib/asciidoctor-bibliography/formatters/tex.rb +0 -187
  72. data/lib/asciidoctor-bibliography/helpers.rb +0 -41
  73. data/spec/helpers_spec.rb +0 -73
metadata CHANGED
@@ -1,85 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-bibliography
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-21 00:00:00.000000000 Z
11
+ date: 2017-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.5.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.5.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: citeproc-ruby
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.1.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.1.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: csl-styles
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1'
47
+ version: 1.0.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1'
54
+ version: 1.0.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: latex-decode
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.2'
61
+ version: 0.2.2
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.2'
68
+ version: 0.2.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bibtex-ruby
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 4.4.4
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 4.4.4
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bundler
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -186,11 +186,11 @@ description: |
186
186
  * contextual cite `cite[key, page=3]`;
187
187
  * multiple cites `cite:[key1]+[key2]`;
188
188
  * full cite `fullcite:[key]`; and
189
- * TeX-compatible macros including `citep:[key]`, `citet:[]key` and friends.
189
+ * TeX-compatible macros including `citep:[key]`, `citet:[key]` and friends.
190
190
 
191
191
  Citation output styles are fully bridged to the CSL library, supporting formats such as IEEE, APA, Chicago, DIN and ISO 690.
192
192
 
193
- The `bibliography:[]` command generates a full reference list that adheres to your configured citation style.
193
+ The `bibliography::[]` command generates a full reference list that adheres to your configured citation style.
194
194
  email:
195
195
  - open.source@ribose.com
196
196
  executables: []
@@ -220,12 +220,35 @@ files:
220
220
  - lib/asciidoctor-bibliography/database.rb
221
221
  - lib/asciidoctor-bibliography/databases/bibtex.rb
222
222
  - lib/asciidoctor-bibliography/errors.rb
223
- - lib/asciidoctor-bibliography/formatters/csl.rb
224
- - lib/asciidoctor-bibliography/formatters/tex.rb
225
- - lib/asciidoctor-bibliography/helpers.rb
223
+ - lib/asciidoctor-bibliography/formatter.rb
226
224
  - lib/asciidoctor-bibliography/index.rb
227
225
  - lib/asciidoctor-bibliography/options.rb
228
226
  - lib/asciidoctor-bibliography/version.rb
227
+ - lib/citeproc/ruby/formats/adoc.rb
228
+ - lib/csl/styles/tex-citealp-authoryear.csl
229
+ - lib/csl/styles/tex-citealp-numeric.csl
230
+ - lib/csl/styles/tex-citealps-authoryear.csl
231
+ - lib/csl/styles/tex-citealps-numeric.csl
232
+ - lib/csl/styles/tex-citealt-authoryear.csl
233
+ - lib/csl/styles/tex-citealt-numeric.csl
234
+ - lib/csl/styles/tex-citealts-authoryear.csl
235
+ - lib/csl/styles/tex-citealts-numeric.csl
236
+ - lib/csl/styles/tex-citeauthor-authoryear.csl
237
+ - lib/csl/styles/tex-citeauthor-numeric.csl
238
+ - lib/csl/styles/tex-citeauthors-authoryear.csl
239
+ - lib/csl/styles/tex-citeauthors-numeric.csl
240
+ - lib/csl/styles/tex-citep-authoryear.csl
241
+ - lib/csl/styles/tex-citep-numeric.csl
242
+ - lib/csl/styles/tex-citeps-authoryear.csl
243
+ - lib/csl/styles/tex-citeps-numeric.csl
244
+ - lib/csl/styles/tex-citet-authoryear.csl
245
+ - lib/csl/styles/tex-citet-numeric.csl
246
+ - lib/csl/styles/tex-citets-authoryear.csl
247
+ - lib/csl/styles/tex-citets-numeric.csl
248
+ - lib/csl/styles/tex-citeyear-authoryear.csl
249
+ - lib/csl/styles/tex-citeyear-numeric.csl
250
+ - lib/csl/styles/tex-citeyearpar-authoryear.csl
251
+ - lib/csl/styles/tex-citeyearpar-numeric.csl
229
252
  - samples/latex_macros_in_bibtex/reference.bib
230
253
  - samples/latex_macros_in_bibtex/sample.adoc
231
254
  - samples/standard/biblio.bib
@@ -241,12 +264,37 @@ files:
241
264
  - samples/tex/sample-numbers.adoc
242
265
  - samples/tex/sample-numbers.html
243
266
  - samples/tex/sample-sort.adoc
267
+ - spec/citation_helper.rb
244
268
  - spec/citation_item_spec.rb
269
+ - spec/csl/styles/tex_citealp_authoryear_spec.rb
270
+ - spec/csl/styles/tex_citealp_numeric_spec.rb
271
+ - spec/csl/styles/tex_citealps_authoryear_spec.rb
272
+ - spec/csl/styles/tex_citealps_numeric_spec.rb
273
+ - spec/csl/styles/tex_citealt_authoryear_spec.rb
274
+ - spec/csl/styles/tex_citealt_numeric_spec.rb
275
+ - spec/csl/styles/tex_citealts_authoryear_spec.rb
276
+ - spec/csl/styles/tex_citealts_numeric_spec.rb
277
+ - spec/csl/styles/tex_citeauthor_authoryear_spec.rb
278
+ - spec/csl/styles/tex_citeauthor_numeric_spec.rb
279
+ - spec/csl/styles/tex_citeauthors_authoryear_spec.rb
280
+ - spec/csl/styles/tex_citeauthors_numeric_spec.rb
281
+ - spec/csl/styles/tex_citep_authoryear_spec.rb
282
+ - spec/csl/styles/tex_citep_numeric_spec.rb
283
+ - spec/csl/styles/tex_citeps_authoryear_spec.rb
284
+ - spec/csl/styles/tex_citeps_numeric_spec.rb
285
+ - spec/csl/styles/tex_citet_authoryear_spec.rb
286
+ - spec/csl/styles/tex_citet_numeric_spec.rb
287
+ - spec/csl/styles/tex_citets_authoryear_spec.rb
288
+ - spec/csl/styles/tex_citets_numeric_spec.rb
289
+ - spec/csl/styles/tex_citeyear_authoryear_spec.rb
290
+ - spec/csl/styles/tex_citeyear_numeric_spec.rb
291
+ - spec/csl/styles/tex_citeyearpar_authoryear_spec.rb
292
+ - spec/csl/styles/tex_citeyearpar_numeric_spec.rb
245
293
  - spec/database_spec.rb
246
294
  - spec/fixtures/database.bib
247
295
  - spec/fixtures/database.bibtex
248
296
  - spec/fixtures/database.unk
249
- - spec/helpers_spec.rb
297
+ - spec/macros_spec.rb
250
298
  - spec/options_spec.rb
251
299
  - spec/spec_helper.rb
252
300
  - spec/throwaway_spec.rb
@@ -1,28 +0,0 @@
1
- require "citeproc"
2
- require "csl/styles"
3
- require "yaml"
4
-
5
- module AsciidoctorBibliography
6
- module Formatters
7
- class CSL < ::CiteProc::Processor
8
- def initialize(style)
9
- super style: style, format: :html
10
- end
11
-
12
- def replace_bibliography_sort(array)
13
- new_keys = array.map(&::CSL::Style::Sort::Key.method(:new))
14
- new_sort = ::CSL::Style::Sort.new.add_children(*new_keys)
15
-
16
- bibliography = engine.style.find_child("bibliography")
17
- bibliography.find_child("sort")&.unlink
18
-
19
- bibliography.add_child new_sort
20
- end
21
-
22
- def sort(mode:)
23
- # Valid modes are :citation and :bibliography
24
- engine.sort! data, engine.style.send(mode).sort_keys if engine.style.send(mode).sort?
25
- end
26
- end
27
- end
28
- end
@@ -1,187 +0,0 @@
1
- module AsciidoctorBibliography
2
- module Formatters
3
- # This formatter emulates the behaviour of traditional Bib(La)TeX/NatBib citations.
4
- class TeX
5
- MACROS = {
6
- # NOTE: \citet is equivalent to \cite, so we reserve the latter for CSL styling.
7
- "citet" => { type: :textual, bracketed: true, authors: :abbreviated },
8
- "citet*" => { type: :textual, bracketed: true, authors: :full },
9
- "citealt" => { type: :textual, bracketed: false, authors: :abbreviated },
10
- "citealt*" => { type: :textual, bracketed: false, authors: :full },
11
- "citep" => { type: :parenthetical, bracketed: true, authors: :abbreviated },
12
- "citep*" => { type: :parenthetical, bracketed: true, authors: :full },
13
- "citealp" => { type: :parenthetical, bracketed: false, authors: :abbreviated },
14
- "citealp*" => { type: :parenthetical, bracketed: false, authors: :full },
15
- "citeauthor" => { type: :authors_only, bracketed: false, authors: :abbreviated },
16
- "citeauthor*" => { type: :authors_only, bracketed: false, authors: :full },
17
- "citeyear" => { type: :years_only, bracketed: false },
18
- "citeyearpar" => { type: :years_only, bracketed: true },
19
- }.freeze
20
-
21
- attr_accessor :opening_bracket,
22
- :closing_bracket,
23
- :cites_separator,
24
- :style,
25
- :author_year_separator,
26
- :years_separator
27
-
28
- def initialize(format)
29
- if format == "numbers"
30
- bibpunct = "{[}{]}{,}{n}{,}{,}"
31
- elsif format == "authoryear"
32
- bibpunct = "{(}{)}{;}{a}{,}{,}"
33
- else
34
- raise StandardError, "Unknown TeX citation format: #{format}"
35
- end
36
- @opening_bracket,
37
- @closing_bracket,
38
- @cites_separator,
39
- @style,
40
- @author_year_separator,
41
- @years_separator = bibpunct.scan(/{.*?}/).map { |s| s[1..-2] }
42
- end
43
-
44
- def import(database)
45
- @database = database
46
- end
47
-
48
- def render(bibliographer, citation)
49
- macro_options = MACROS[citation.macro]
50
- output = []
51
- case macro_options[:type]
52
- # NOTE: deliberately repetitive to improve redability.
53
- when :textual
54
- citation.citation_items.each do |cite|
55
- authors = authors(macro_options[:authors], cite)
56
- year = if @style == "n"
57
- bibliographer.appearance_index_of(cite.key)
58
- else
59
- year(cite)
60
- end
61
- cetera = Helpers.join_nonempty([year].concat(extra(cite)), @years_separator + " ")
62
- cetera = bracket(cetera) if macro_options[:bracketed]
63
- label = Helpers.join_nonempty([authors, cetera], " ")
64
- output << citation.xref(cite.key, label)
65
- end
66
- output = output.join(@cites_separator + " ")
67
- when :parenthetical
68
- citation.citation_items.each do |cite|
69
- if @style == "n"
70
- authors = nil
71
- year = bibliographer.appearance_index_of(cite.key)
72
- else
73
- authors = authors(macro_options[:authors], cite)
74
- year = year(cite)
75
- end
76
- cetera = Helpers.join_nonempty([year].concat(extra(cite)), @years_separator + " ")
77
- label = Helpers.join_nonempty([authors, cetera], @author_year_separator + " ")
78
- output << citation.xref(cite.key, label)
79
- end
80
- output = output.join(@cites_separator + " ")
81
- output = bracket(output) if macro_options[:bracketed]
82
- when :authors_only
83
- citation.citation_items.each do |cite|
84
- authors = authors(macro_options[:authors], cite)
85
- year = nil
86
- cetera = Helpers.join_nonempty([year].concat(extra(cite)), @years_separator + " ")
87
- label = Helpers.join_nonempty([authors, cetera], @author_year_separator + " ")
88
- output << citation.xref(cite.key, label)
89
- end
90
- output = output.join(@cites_separator + " ")
91
- output = bracket(output) if macro_options[:bracketed]
92
- when :years_only
93
- citation.citation_items.each do |cite|
94
- authors = nil
95
- year = year(cite)
96
- cetera = Helpers.join_nonempty([year].concat(extra(cite)), @years_separator + " ")
97
- label = Helpers.join_nonempty([authors, cetera], @author_year_separator + " ")
98
- output << citation.xref(cite.key, label)
99
- end
100
- output = output.join(@cites_separator + " ")
101
- output = bracket(output) if macro_options[:bracketed]
102
- else
103
- raise StandardError, "Unknown TeX citation macro type: #{macro_options[:type]}"
104
- end
105
-
106
- output
107
- end
108
-
109
- private
110
-
111
- def bracket(string)
112
- [@opening_bracket, string, @closing_bracket].compact.join
113
- end
114
-
115
- def find_entry(key)
116
- entry = @database.detect { |h| h["id"] == key }
117
- raise StandardError, "Can't find entry: #{key}" if entry.nil?
118
- entry
119
- end
120
-
121
- def year(cite)
122
- entry = find_entry(cite.key)
123
- issued = entry["issued"]
124
-
125
- if issued.nil?
126
- warn "asciidoctor-bibliography: citation (#{cite.key}) has no 'issued' information"
127
- return ""
128
- end
129
-
130
- date_parts = issued["date-parts"]
131
- return "" if date_parts.nil?
132
-
133
- return "" if date_parts.first.nil?
134
- date_parts.first.first
135
- end
136
-
137
- def extra(cite)
138
- na = cite.named_attributes
139
- extra = []
140
- return extra if na.nil?
141
-
142
- Citation::REF_ATTRIBUTES.each do |sym|
143
- next if na[sym.to_s].nil?
144
- extra << ref_content(sym, na[sym.to_s])
145
- end
146
-
147
- extra
148
- end
149
-
150
- # TODO: should this be configurable?
151
- # TODO RT: Yes, and i18n!
152
- def ref_content(sym, content)
153
- "#{sym.to_s.capitalize} #{content}"
154
- end
155
-
156
- def authors(mode, cite)
157
- case mode
158
- when :full
159
- authors_full(cite)
160
- when :abbreviated
161
- authors_abbreviated(cite)
162
- else
163
- raise StandardError, "Unknown TeX citation authors mode: #{mode}"
164
- end
165
- end
166
-
167
- def authors_list(cite)
168
- entry = find_entry(cite.key)
169
- authors = entry["author"]
170
- return [] if authors.nil?
171
- authors.map { |h| h["family"] }.compact
172
- end
173
-
174
- def authors_abbreviated(cite)
175
- authors = authors_list(cite)
176
- return "" if authors.empty?
177
- authors.length > 1 ? "#{authors.first} et al." : authors.first
178
- end
179
-
180
- def authors_full(cite)
181
- authors = authors_list(cite)
182
- return "" if authors.empty?
183
- Helpers.to_sentence authors
184
- end
185
- end
186
- end
187
- end
@@ -1,41 +0,0 @@
1
- module AsciidoctorBibliography
2
- module Helpers
3
- def self.slice(hash, *array_of_keys)
4
- Hash[[array_of_keys, hash.values_at(*array_of_keys)].transpose]
5
- end
6
-
7
- def self.join_nonempty(array, separator)
8
- array.compact.map(&:to_s).reject(&:empty?).join(separator)
9
- end
10
-
11
- def self.html_to_asciidoc(string)
12
- string.
13
- gsub(%r{<\/?i>}, "_").
14
- gsub(%r{<\/?b>}, "*").
15
- gsub(%r{<\/?span.*?>}, "").
16
- gsub(/\{|\}/, "")
17
- # TODO: bracket dropping is inappropriate here.
18
- end
19
-
20
- # NOTE: mostly stolen from ActiveSupport.
21
- def self.to_sentence(array, options = {})
22
- default_connectors = {
23
- words_connector: ", ",
24
- two_words_connector: " and ",
25
- last_word_connector: ", and ",
26
- }
27
- options = default_connectors.merge!(options)
28
-
29
- case array.length
30
- when 0
31
- ""
32
- when 1
33
- array[0].to_s.dup
34
- when 2
35
- "#{array[0]}#{options[:two_words_connector]}#{array[1]}"
36
- else
37
- "#{array[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{array[-1]}"
38
- end
39
- end
40
- end
41
- end