citeproc-ruby 1.1.8 → 1.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +10 -32
  3. data/lib/citeproc/ruby/renderer.rb +2 -1
  4. data/lib/citeproc/ruby/version.rb +1 -1
  5. metadata +14 -84
  6. data/.rspec +0 -3
  7. data/.rubocop.yml +0 -1156
  8. data/.simplecov +0 -4
  9. data/Guardfile +0 -14
  10. data/features/bibliography.feature +0 -25
  11. data/features/locale_overrides.feature +0 -31
  12. data/features/name_options.feature +0 -37
  13. data/features/names.feature +0 -198
  14. data/features/renderer.feature +0 -94
  15. data/features/sort.feature +0 -50
  16. data/features/step_definitions/engine.rb +0 -21
  17. data/features/step_definitions/renderer.rb +0 -85
  18. data/features/style_immanent_locale_terms.feature +0 -30
  19. data/features/support/env.rb +0 -35
  20. data/features/support/hooks.rb +0 -10
  21. data/spec/citeproc/ruby/engine_spec.rb +0 -120
  22. data/spec/citeproc/ruby/formats/default_spec.rb +0 -168
  23. data/spec/citeproc/ruby/formats/html_spec.rb +0 -167
  24. data/spec/citeproc/ruby/renderer/choose_spec.rb +0 -293
  25. data/spec/citeproc/ruby/renderer/date_spec.rb +0 -173
  26. data/spec/citeproc/ruby/renderer/group_spec.rb +0 -114
  27. data/spec/citeproc/ruby/renderer/history_spec.rb +0 -47
  28. data/spec/citeproc/ruby/renderer/label_spec.rb +0 -225
  29. data/spec/citeproc/ruby/renderer/layout_spec.rb +0 -41
  30. data/spec/citeproc/ruby/renderer/macro_spec.rb +0 -31
  31. data/spec/citeproc/ruby/renderer/names_spec.rb +0 -396
  32. data/spec/citeproc/ruby/renderer/number_spec.rb +0 -120
  33. data/spec/citeproc/ruby/renderer/text_spec.rb +0 -125
  34. data/spec/citeproc/ruby/renderer_spec.rb +0 -65
  35. data/spec/fixtures/items.rb +0 -113
  36. data/spec/fixtures/locales/locales-de-DE.xml +0 -298
  37. data/spec/fixtures/locales/locales-en-US.xml +0 -304
  38. data/spec/fixtures/locales/locales-fr-FR.xml +0 -317
  39. data/spec/fixtures/styles/apa-with-different-translations.csl +0 -451
  40. data/spec/fixtures/styles/apa.csl +0 -443
  41. data/spec/fixtures/styles/modern-language-association-8th-edition.csl +0 -293
  42. data/spec/spec_helper.rb +0 -73
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module CiteProc
4
- module Ruby
5
-
6
- describe 'Renderer#render_layout' do
7
- let(:renderer) { Renderer.new }
8
-
9
- let(:node) { CSL::Style::Layout.new }
10
-
11
- let(:item) {
12
- i = CiteProc::CitationItem.new(:id => 'ID-1')
13
- i.data = CiteProc::Item.new(:id => 'ID-1')
14
- i
15
- }
16
-
17
- it 'returns an empty string when empty' do
18
- expect(renderer.render(item, node)).to eq('')
19
- end
20
-
21
- describe 'with child nodes' do
22
- before(:each) do
23
- node << CSL::Style::Text.new(:value => 'foo')
24
- node << CSL::Style::Text.new(:value => 'bar')
25
- end
26
-
27
- it 'renders each child' do
28
- expect(renderer.render(item, node)).to eq('foobar')
29
- end
30
-
31
- it 'uses the delimiters if specified' do
32
- node[:delimiter] = '-'
33
- expect(renderer.render(item, node)).to eq('foo-bar')
34
- end
35
- end
36
-
37
- end
38
-
39
- end
40
- end
41
-
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module CiteProc
4
- module Ruby
5
-
6
- describe 'Renderer#render_macro' do
7
- let(:renderer) { Renderer.new }
8
-
9
- let(:node) { CSL::Style::Macro.new }
10
-
11
- let(:item) {
12
- i = CiteProc::CitationItem.new(:id => 'ID-1')
13
- i.data = CiteProc::Item.new(:id => 'ID-1')
14
- i
15
- }
16
-
17
- it 'returns an empty string when empty' do
18
- expect(renderer.render(item, node)).to eq('')
19
- end
20
-
21
- it 'renders each child' do
22
- node << CSL::Style::Text.new(:value => 'foo')
23
- node << CSL::Style::Text.new(:value => 'bar')
24
-
25
- expect(renderer.render(item, node)).to eq('foobar')
26
- end
27
-
28
- end
29
-
30
- end
31
- end
@@ -1,396 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require 'spec_helper'
4
-
5
- module CiteProc
6
- module Ruby
7
-
8
- describe "Renderer#render_names" do
9
- let(:renderer) { Renderer.new }
10
-
11
- let(:node) { CSL::Style::Names.new }
12
-
13
- let(:item) {
14
- i = CiteProc::CitationItem.new(:id => 'ID-1')
15
- i.data = CiteProc::Item.new(:id => 'ID-1')
16
- i
17
- }
18
-
19
- let(:poe) { people(:poe) }
20
- let(:philosophers) { CiteProc::Names.new('Plato and Socrates and Aristotle') }
21
-
22
- describe 'given an empty node' do
23
- it 'returns an empty string for an empty item' do
24
- expect(renderer.render(item, node)).to eq('')
25
- end
26
-
27
- it 'returns an empty string for an item with variables' do
28
- item.data.edition = 'foo'
29
- expect(renderer.render_names(item, node)).to eq('')
30
- end
31
- end
32
-
33
- describe 'given a single name for the variable' do
34
- before do
35
- item.data.author = poe
36
- node[:variable] = 'author'
37
- end
38
-
39
- it 'formats it in long form' do
40
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
41
- end
42
-
43
- it 'supports nested name node options' do
44
- node << CSL::Style::Name.new(:form => 'short')
45
- expect(renderer.render_names(item, node)).to eq('Poe')
46
- end
47
-
48
- it 'supports nested label node' do
49
- node << CSL::Style::Label.new(:prefix => ' [', :suffix => ']')
50
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe [author]')
51
- end
52
- end
53
-
54
- describe 'given multiple names for a single variable' do
55
- before do
56
- item.data.editor = philosophers
57
- node[:variable] = 'editor'
58
- end
59
-
60
- it 'formats them as a list' do
61
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle')
62
- end
63
-
64
- it 'supports nested name node options' do
65
- node << CSL::Style::Name.new(:and => 'symbol')
66
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, & Aristotle')
67
- end
68
-
69
- it 'supports nested label node' do
70
- node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
71
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle (editors)')
72
- end
73
- end
74
-
75
- describe 'given multiple variables' do
76
- before do
77
- node[:variable] = 'author editor'
78
- node[:delimiter] = '; '
79
- end
80
-
81
- it 'renders all matching lists combinded using default delimiter' do
82
- expect(renderer.render_names(item, node)).to eq('')
83
-
84
- item.data.author = poe
85
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
86
-
87
- item.data.editor = philosophers
88
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe; Plato, Socrates, Aristotle')
89
- end
90
-
91
- it 'keeps the variable order' do
92
- item.data.author = poe
93
- item.data.editor = philosophers
94
-
95
- node[:variable] = 'editor author'
96
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle; Edgar Allen Poe')
97
- end
98
-
99
- it 'supports labels' do
100
- item.data.author = poe
101
- item.data.editor = philosophers
102
-
103
- node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
104
-
105
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe (author); Plato, Socrates, Aristotle (editors)')
106
- end
107
-
108
- it 'resolves the editor translator special case' do
109
- renderer.format = :text
110
-
111
- node[:variable] = 'translator author editor'
112
-
113
- item.data.editor = 'Patrick F. Quinn and G. R. Thompson'
114
- item.data.author = poe
115
-
116
- node.name = { :and => 'symbol', :form => 'short' }
117
- node.label = { :prefix => ' (', :suffix => ')' }
118
-
119
- expect(renderer.render_names(item, node)).to eq('Poe (author); Quinn & Thompson (editors)')
120
-
121
- item.data.translator = poe
122
- expect(renderer.render_names(item, node)).to eq('Poe (translator); Poe (author); Quinn & Thompson (editors)')
123
-
124
- item.data.translator = 'Patrick F. Quinn and G. R. Thompson'
125
-
126
- expect(renderer.render(item, node)).to eq('Quinn & Thompson (editors & translators); Poe (author)')
127
- end
128
- end
129
- end
130
-
131
- describe "Renderer#render_name" do
132
- let(:renderer) { Renderer.new }
133
-
134
- let(:node) { CSL::Style::Name.new }
135
-
136
- let(:poe) { people(:poe) }
137
- let(:philosophers) { CiteProc::Names.new('Plato and Socrates and Aristotle') }
138
-
139
- describe 'given an empty node' do
140
- it 'returns an empty string given no names' do
141
- expect(renderer.render_name(CiteProc::Names.new, node)).to eq('')
142
- end
143
-
144
- it 'formats the given name in long form' do
145
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen Poe')
146
- end
147
-
148
- it 'formats multiple names delimitted by commas' do
149
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
150
- end
151
- end
152
-
153
- describe 'given a node with and "and" attribute' do
154
- it 'inserts a delimited connector' do
155
- node[:and] = 'symbol'
156
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, & Aristotle')
157
-
158
- node[:and] = 'text'
159
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
160
- end
161
- end
162
-
163
- describe 'given a node with delimier-precedes-last' do
164
- it 'inserts final delimiter only for three or more names when set to "contextual"' do
165
- node.delimiter_contextually_precedes_last!
166
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
167
-
168
- node[:and] = 'text'
169
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
170
-
171
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato and Socrates')
172
-
173
- node[:and] = nil
174
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
175
- end
176
-
177
- it 'inserts final delimiter when set to "always"' do
178
- node.delimiter_always_precedes_last!
179
-
180
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
181
-
182
- node[:and] = 'text'
183
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
184
-
185
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, and Socrates')
186
-
187
- node[:and] = nil
188
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
189
- end
190
-
191
- it 'never inserts final delimiter when set to "never" (unless there is no "and")' do
192
- node.delimiter_never_precedes_last!
193
-
194
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
195
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
196
-
197
- node[:and] = 'text'
198
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates and Aristotle')
199
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato and Socrates')
200
- end
201
-
202
- it 'supports only-after-inverted-name rule' do
203
- names = CiteProc::Names.new('Doe, J. and Smith, S. and Williams, T.')
204
- node.delimiter_precedes_last_after_inverted_name!
205
-
206
- # always delimit when there is no and!
207
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, T. Williams')
208
- expect(renderer.render_name(names.take(2), node)).to eq('J. Doe, S. Smith')
209
-
210
- node[:and] = 'text'
211
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith and T. Williams')
212
- expect(renderer.render_name(names.take(2), node)).to eq('J. Doe and S. Smith')
213
-
214
- node[:'name-as-sort-order'] = 'first'
215
- expect(renderer.render_name(names, node)).to eq('Doe, J., S. Smith and T. Williams')
216
- expect(renderer.render_name(names.take(2), node)).to eq('Doe, J., and S. Smith')
217
-
218
- node[:'name-as-sort-order'] = 'all'
219
- expect(renderer.render_name(names, node)).to eq('Doe, J., Smith, S., and Williams, T.')
220
- expect(renderer.render_name(names.take(2), node)).to eq('Doe, J., and Smith, S.')
221
- end
222
- end
223
-
224
- describe 'truncation of name lists' do
225
- let(:names) { CiteProc::Names.new('Doe, J. and Smith, S. and Williams, T.') }
226
-
227
- it 'supports et-al formatting via an et-al node' do
228
- node[:'et-al-min'] = 3
229
- node[:'et-al-use-first'] = 2
230
-
231
- others = CSL::Style::EtAl.new(:prefix => '!!')
232
- allow(node).to receive(:et_al).and_return(others)
233
-
234
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!et al.')
235
-
236
- others[:term] = 'and others'
237
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!and others')
238
- end
239
-
240
- it 'supports et-al-use-last' do
241
- node[:'et-al-min'] = 3
242
- node[:'et-al-use-first'] = 2
243
- node[:'et-al-use-last'] = true
244
-
245
- # truncated list must be at least two names short!
246
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
247
-
248
- node[:'et-al-use-first'] = 1
249
- expect(renderer.render_name(names, node)).to eq('J. Doe, … T. Williams')
250
- end
251
-
252
- describe 'with default delimiter settings' do
253
- it 'truncates the list if it matches or exceeds et-al-min' do
254
- node[:'et-al-min'] = 3
255
- node[:'et-al-use-first'] = 2
256
-
257
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
258
-
259
- node[:'et-al-use-first'] = 1
260
- expect(renderer.render_name(names, node)).to eq('J. Doe et al.')
261
- end
262
-
263
- it 'does not truncate the list if it is less than et-al-min' do
264
- node[:'et-al-min'] = 4
265
- node[:'et-al-use-first'] = 2
266
-
267
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, T. Williams')
268
- end
269
- end
270
-
271
- describe 'with delimiter-precedes-et-al set' do
272
- it 'inserts delimiter only for two or more names when set to "contextual" or nil' do
273
- node.truncate_when! 3
274
- node.truncate_at! 2
275
-
276
- # default behaviour should match contextual!
277
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
278
-
279
- node.truncate_at! 1
280
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
281
-
282
- # set contextual explicitly
283
- node.delimiter_contextually_precedes_et_al!
284
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
285
-
286
- node.truncate_at! 2
287
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
288
- end
289
-
290
- it 'inserts delimiter when set to "always"' do
291
- node.truncate_when! 3
292
- node.truncate_at! 2
293
-
294
- node.delimiter_always_precedes_et_al!
295
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
296
-
297
- node.truncate_at! 1
298
- expect(renderer.render_name(philosophers, node)).to eq('Plato, et al.')
299
- end
300
-
301
- it 'never inserts delimiter when set to "never"' do
302
- node.truncate_when! 3
303
- node.truncate_at! 2
304
-
305
- node.delimiter_never_precedes_et_al!
306
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates et al.')
307
-
308
- node.truncate_at! 1
309
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
310
- end
311
-
312
- it 'supports only-after-inverted-name rule' do
313
- node.truncate_when! 3
314
- node.truncate_at! 2
315
-
316
- node.delimiter_precedes_et_al_after_inverted_name!
317
-
318
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith et al.')
319
-
320
- node[:'name-as-sort-order'] = 'first'
321
- expect(renderer.render_name(names, node)).to eq('Doe, J., S. Smith et al.')
322
-
323
- node.truncate_at! 1
324
- expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
325
-
326
- node[:'name-as-sort-order'] = 'all'
327
- expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
328
-
329
- node.truncate_at! 2
330
- expect(renderer.render_name(names, node)).to eq('Doe, J., Smith, S., et al.')
331
- end
332
- end
333
- end
334
-
335
- describe 'name-part formatting' do
336
- let(:part) { CSL::Style::NamePart.new(:'text-case' => 'uppercase') }
337
- before { node.parts << part }
338
-
339
- it 'supports family name formatting' do
340
- part[:name] = 'family'
341
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
342
- end
343
-
344
- it 'family part includes non-demoted particles' do
345
- part[:name] = 'family'
346
-
347
- expect(renderer.render_name(people(:la_fontaine), node)).to eq('Jean de LA FONTAINE')
348
- expect(renderer.render_name(people(:humboldt), node)).to eq('Alexander von HUMBOLDT')
349
- expect(renderer.render_name(people(:van_gogh), node)).to eq('Vincent VAN GOGH')
350
- end
351
-
352
- it 'family part affixes includes name suffix for non-inverted names' do
353
- part.merge! :name => 'family', :prefix => '(', :suffix => ')'
354
-
355
- la_fontaine = people(:la_fontaine)
356
- la_fontaine[0].suffix = 'Jr.'
357
-
358
- expect(renderer.render_name(la_fontaine, node)).to eq('Jean de (LA FONTAINE Jr.)')
359
- end
360
-
361
- it 'supports given name formatting' do
362
- part[:name] = 'given'
363
- expect(renderer.render_name(poe, node)).to eq('EDGAR ALLEN Poe')
364
- end
365
-
366
- it 'given part includes particles' do
367
- part[:name] = 'given'
368
-
369
- expect(renderer.render_name(people(:la_fontaine), node)).to eq('JEAN DE La Fontaine')
370
- expect(renderer.render_name(people(:humboldt), node)).to eq('ALEXANDER VON Humboldt')
371
- expect(renderer.render_name(people(:van_gogh), node)).to eq('VINCENT van Gogh')
372
- end
373
-
374
- it 'given part affixes enclose demoted particles' do
375
- part.merge! :name => 'given', :prefix => '(', :suffix => ')'
376
-
377
- la_fontaine = people(:la_fontaine)
378
-
379
- expect(renderer.render_name(la_fontaine, node)).to eq('(JEAN DE) La Fontaine')
380
-
381
- node.all_names_as_sort_order!
382
- expect(renderer.render_name(la_fontaine, node)).to eq('La Fontaine, (JEAN DE)')
383
-
384
- la_fontaine[0].always_demote_particle!
385
- expect(renderer.render_name(la_fontaine, node)).to eq('Fontaine, (JEAN DE La)')
386
- end
387
-
388
- it 'does not alter the passed-in name object' do
389
- part[:name] = 'family'
390
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
391
- expect(poe.to_s).to eq('Edgar Allen Poe')
392
- end
393
- end
394
- end
395
- end
396
- end