citeproc-ruby 1.0.3 → 1.0.4
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/features/renderer.feature +2 -2
- data/features/step_definitions/renderer.rb +7 -7
- data/features/support/env.rb +1 -1
- data/lib/citeproc/ruby/format.rb +7 -13
- data/lib/citeproc/ruby/version.rb +1 -1
- data/spec/citeproc/ruby/engine_spec.rb +16 -16
- data/spec/citeproc/ruby/formats/default_spec.rb +43 -43
- data/spec/citeproc/ruby/formats/html_spec.rb +24 -24
- data/spec/citeproc/ruby/renderer/choose_spec.rb +59 -59
- data/spec/citeproc/ruby/renderer/date_spec.rb +23 -23
- data/spec/citeproc/ruby/renderer/group_spec.rb +10 -10
- data/spec/citeproc/ruby/renderer/history_spec.rb +8 -8
- data/spec/citeproc/ruby/renderer/label_spec.rb +31 -31
- data/spec/citeproc/ruby/renderer/layout_spec.rb +3 -3
- data/spec/citeproc/ruby/renderer/macro_spec.rb +2 -2
- data/spec/citeproc/ruby/renderer/names_spec.rb +76 -76
- data/spec/citeproc/ruby/renderer/number_spec.rb +13 -13
- data/spec/citeproc/ruby/renderer/text_spec.rb +17 -17
- data/spec/citeproc/ruby/renderer_spec.rb +32 -32
- metadata +12 -12
@@ -14,36 +14,36 @@ module CiteProc
|
|
14
14
|
let(:node) { CSL::Style::Group.new }
|
15
15
|
|
16
16
|
it 'returns an empty string by default' do
|
17
|
-
renderer.render(item, node).
|
17
|
+
expect(renderer.render(item, node)).to eq('')
|
18
18
|
|
19
19
|
node[:prefix] = '!'
|
20
|
-
renderer.render(item, node).
|
20
|
+
expect(renderer.render(item, node)).to eq('')
|
21
21
|
end
|
22
22
|
|
23
23
|
describe 'when there is a text node in the group' do
|
24
24
|
before(:each) { node << CSL::Style::Text.new( :term => 'retrieved') }
|
25
25
|
|
26
26
|
it 'returns the content of the nested node' do
|
27
|
-
renderer.render_group(item, node).
|
27
|
+
expect(renderer.render_group(item, node)).to eq('retrieved')
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'applies formatting options to the nested node' do
|
31
31
|
node[:'text-case'] = 'uppercase'
|
32
|
-
renderer.render(item, node).
|
32
|
+
expect(renderer.render(item, node)).to eq('RETRIEVED')
|
33
33
|
end
|
34
34
|
|
35
35
|
describe 'when there is a second text node in the group' do
|
36
36
|
before(:each) { node << CSL::Style::Text.new( :term => 'from') }
|
37
37
|
|
38
38
|
it 'returns the content of both nested nodes' do
|
39
|
-
renderer.render_group(item, node).
|
39
|
+
expect(renderer.render_group(item, node)).to eq('retrievedfrom')
|
40
40
|
end
|
41
41
|
|
42
42
|
describe 'when there is a delimter set on the group node' do
|
43
43
|
before(:each) { node[:delimiter] = ' ' }
|
44
44
|
|
45
45
|
it 'applies the delimiter to the output' do
|
46
|
-
renderer.render_group(item, node).
|
46
|
+
expect(renderer.render_group(item, node)).to eq('retrieved from')
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'applies formatting options to the nested nodes only' do
|
@@ -51,7 +51,7 @@ module CiteProc
|
|
51
51
|
node[:delimiter] = ' foo '
|
52
52
|
node[:prefix] = '('
|
53
53
|
node[:suffix] = ')'
|
54
|
-
renderer.render(item, node).
|
54
|
+
expect(renderer.render(item, node)).to eq('(RETRIEVED FOO FROM)')
|
55
55
|
end
|
56
56
|
|
57
57
|
describe 'when a nested node produces no output' do
|
@@ -61,7 +61,7 @@ module CiteProc
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'the delimiter does not apply to it' do
|
64
|
-
renderer.render_group(item, node).
|
64
|
+
expect(renderer.render_group(item, node)).to eq('retrieved from from')
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -69,14 +69,14 @@ module CiteProc
|
|
69
69
|
before(:each) { node << CSL::Style::Text.new( :variable => 'URL') }
|
70
70
|
|
71
71
|
it 'returns the empty string when the variable is not present in the item' do
|
72
|
-
renderer.render_group(item, node).
|
72
|
+
expect(renderer.render_group(item, node)).to eq('')
|
73
73
|
end
|
74
74
|
|
75
75
|
describe 'when the variable is present' do
|
76
76
|
before(:each) { item.data[:URL] = 'http://example.org' };
|
77
77
|
|
78
78
|
it 'returns all nested renditions' do
|
79
|
-
renderer.render_group(item, node).
|
79
|
+
expect(renderer.render_group(item, node)).to eq('retrieved from http://example.org')
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -8,37 +8,37 @@ module CiteProc
|
|
8
8
|
let(:history) { state.history }
|
9
9
|
|
10
10
|
it 'has an empty citation history' do
|
11
|
-
history.memory['citation'].
|
11
|
+
expect(history.memory['citation']).to eq([])
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'has an empty bibliography history' do
|
15
|
-
history.memory['bibliogrpahy'].
|
15
|
+
expect(history.memory['bibliogrpahy']).to eq([])
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '#update' do
|
19
19
|
it 'saves the passed in items for :store!' do
|
20
|
-
|
20
|
+
expect {
|
21
21
|
history.update :store!, 'citation', { :x => 1 }
|
22
|
-
}.
|
22
|
+
}.to change { history.citation }.to([{ :x => 1 }])
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'drops remembered items when they are too old' do
|
26
|
-
|
26
|
+
expect {
|
27
27
|
history.update :store!, 'citation', { :x => 1 }
|
28
28
|
history.update :store!, 'citation', { :x => 2 }
|
29
29
|
history.update :store!, 'citation', { :x => 3 }
|
30
30
|
history.update :store!, 'citation', { :x => 4 }
|
31
31
|
history.update :store!, 'citation', { :x => 5 }
|
32
|
-
}.
|
32
|
+
}.to change { history.citation.length }.to(3)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
describe '#discard' do
|
37
37
|
it 'clears the history' do
|
38
38
|
history.update :store!, 'bibliography', { :x => 1 }
|
39
|
-
history.memory.
|
39
|
+
expect(history.memory).not_to be_empty
|
40
40
|
history.discard
|
41
|
-
history.memory.
|
41
|
+
expect(history.memory).to be_empty
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -16,12 +16,12 @@ module CiteProc
|
|
16
16
|
|
17
17
|
describe 'given an empty node' do
|
18
18
|
it 'returns an empty string for an empty item' do
|
19
|
-
renderer.render_label(item, node).
|
19
|
+
expect(renderer.render_label(item, node)).to eq('')
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns an empty string for an item with variables' do
|
23
23
|
item.data.edition = 'foo'
|
24
|
-
renderer.render_label(item, node).
|
24
|
+
expect(renderer.render_label(item, node)).to eq('')
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -33,27 +33,27 @@ module CiteProc
|
|
33
33
|
|
34
34
|
describe "for an item with no page value" do
|
35
35
|
it 'returns an empty string' do
|
36
|
-
renderer.render_label(item, node).
|
36
|
+
expect(renderer.render_label(item, node)).to eq('')
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe 'for an item with a page value' do
|
41
41
|
it 'returns the singular label for a number' do
|
42
42
|
item.write_attribute :page, '23'
|
43
|
-
renderer.render_label(item, node).
|
43
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'returns the plural label for a page-range' do
|
47
47
|
item.write_attribute :page, '23-24'
|
48
|
-
renderer.render_label(item, node).
|
48
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'returns the plural label for multiple pages' do
|
52
52
|
item.write_attribute :page, '23 & 24'
|
53
|
-
renderer.render_label(item, node).
|
53
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
54
54
|
|
55
55
|
item.write_attribute :page, '23, 24, 25'
|
56
|
-
renderer.render_label(item, node).
|
56
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
57
57
|
end
|
58
58
|
|
59
59
|
describe 'when pluralization is contextual' do
|
@@ -61,12 +61,12 @@ module CiteProc
|
|
61
61
|
|
62
62
|
it 'returns the singular label for a number' do
|
63
63
|
item.write_attribute :page, '23'
|
64
|
-
renderer.render_label(item, node).
|
64
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'returns the plural label for a page-range' do
|
68
68
|
item.write_attribute :page, '23-24'
|
69
|
-
renderer.render_label(item, node).
|
69
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -75,12 +75,12 @@ module CiteProc
|
|
75
75
|
|
76
76
|
it 'returns the singular label for a number' do
|
77
77
|
item.write_attribute :page, '1'
|
78
|
-
renderer.render_label(item, node).
|
78
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'returns the plural label for a page-range' do
|
82
82
|
item.write_attribute :page, '1-3'
|
83
|
-
renderer.render_label(item, node).
|
83
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -89,12 +89,12 @@ module CiteProc
|
|
89
89
|
|
90
90
|
it 'returns the singular label for a number' do
|
91
91
|
item.write_attribute :page, '1'
|
92
|
-
renderer.render_label(item, node).
|
92
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'returns the plural label for a page-range' do
|
96
96
|
item.write_attribute :page, '1-3'
|
97
|
-
renderer.render_label(item, node).
|
97
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -108,22 +108,22 @@ module CiteProc
|
|
108
108
|
|
109
109
|
describe "for an item with no 'number-of-pages' value" do
|
110
110
|
it 'returns an empty string' do
|
111
|
-
renderer.render_label(item, node).
|
111
|
+
expect(renderer.render_label(item, node)).to eq('')
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
115
|
describe "for an item with a 'number-of-pages' value" do
|
116
116
|
it 'returns the singular label for number 1' do
|
117
117
|
item.data[:'number-of-pages'] = 1
|
118
|
-
renderer.render_label(item, node).
|
118
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
119
119
|
end
|
120
120
|
|
121
121
|
it 'returns the plural label for numbers higher than 1' do
|
122
122
|
item.data[:'number-of-pages'] = '2'
|
123
|
-
renderer.render_label(item, node).
|
123
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
124
124
|
|
125
125
|
item.data[:'number-of-pages'] = 42
|
126
|
-
renderer.render_label(item, node).
|
126
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
127
127
|
end
|
128
128
|
|
129
129
|
describe 'when pluralization is set to "contextual"' do
|
@@ -131,15 +131,15 @@ module CiteProc
|
|
131
131
|
|
132
132
|
it 'returns the singular label for number 1' do
|
133
133
|
item.data[:'number-of-pages'] = '1'
|
134
|
-
renderer.render_label(item, node).
|
134
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
135
135
|
end
|
136
136
|
|
137
137
|
it 'returns the plural label for numbers higher than 1' do
|
138
138
|
item.data[:'number-of-pages'] = '2'
|
139
|
-
renderer.render_label(item, node).
|
139
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
140
140
|
|
141
141
|
item.data[:'number-of-pages'] = 42
|
142
|
-
renderer.render_label(item, node).
|
142
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
@@ -148,15 +148,15 @@ module CiteProc
|
|
148
148
|
|
149
149
|
it 'returns the singular label for number 1' do
|
150
150
|
item.data[:'number-of-pages'] = 1
|
151
|
-
renderer.render_label(item, node).
|
151
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
152
152
|
end
|
153
153
|
|
154
154
|
it 'returns the plural label for numbers higher than 1' do
|
155
155
|
item.data[:'number-of-pages'] = '2'
|
156
|
-
renderer.render_label(item, node).
|
156
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
157
157
|
|
158
158
|
item.data[:'number-of-pages'] = 42
|
159
|
-
renderer.render_label(item, node).
|
159
|
+
expect(renderer.render_label(item, node)).to eq('pages')
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
@@ -165,15 +165,15 @@ module CiteProc
|
|
165
165
|
|
166
166
|
it 'returns the singular label for number 1' do
|
167
167
|
item.data[:'number-of-pages'] = 1
|
168
|
-
renderer.render_label(item, node).
|
168
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
169
169
|
end
|
170
170
|
|
171
171
|
it 'returns the plural label for numbers higher than 1' do
|
172
172
|
item.data[:'number-of-pages'] = '2'
|
173
|
-
renderer.render_label(item, node).
|
173
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
174
174
|
|
175
175
|
item.data[:'number-of-pages'] = 42
|
176
|
-
renderer.render_label(item, node).
|
176
|
+
expect(renderer.render_label(item, node)).to eq('page')
|
177
177
|
end
|
178
178
|
end
|
179
179
|
end
|
@@ -187,15 +187,15 @@ module CiteProc
|
|
187
187
|
describe "for an item with a 'number-of-volumes' value" do
|
188
188
|
it 'returns the singular label for number 1' do
|
189
189
|
item.data[:'number-of-volumes'] = 1
|
190
|
-
renderer.render_label(item, node).
|
190
|
+
expect(renderer.render_label(item, node)).to eq('volume')
|
191
191
|
end
|
192
192
|
|
193
193
|
it 'returns the plural label for numbers higher than 1' do
|
194
194
|
item.data[:'number-of-volumes'] = '2'
|
195
|
-
renderer.render_label(item, node).
|
195
|
+
expect(renderer.render_label(item, node)).to eq('volumes')
|
196
196
|
|
197
197
|
item.data[:'number-of-volumes'] = 42
|
198
|
-
renderer.render_label(item, node).
|
198
|
+
expect(renderer.render_label(item, node)).to eq('volumes')
|
199
199
|
end
|
200
200
|
end
|
201
201
|
end
|
@@ -209,13 +209,13 @@ module CiteProc
|
|
209
209
|
it "returns the singular label for a single number" do
|
210
210
|
item.locator = 2
|
211
211
|
item.label = 'book'
|
212
|
-
renderer.render_label(item, node).
|
212
|
+
expect(renderer.render_label(item, node)).to eq('book')
|
213
213
|
end
|
214
214
|
|
215
215
|
it "returns the plural label for multiple numbers" do
|
216
216
|
item.locator = '23 & 4'
|
217
217
|
item.label = 'book'
|
218
|
-
renderer.render_label(item, node).
|
218
|
+
expect(renderer.render_label(item, node)).to eq('books')
|
219
219
|
end
|
220
220
|
end
|
221
221
|
end
|
@@ -15,7 +15,7 @@ module CiteProc
|
|
15
15
|
}
|
16
16
|
|
17
17
|
it 'returns an empty string when empty' do
|
18
|
-
renderer.render(item, node).
|
18
|
+
expect(renderer.render(item, node)).to eq('')
|
19
19
|
end
|
20
20
|
|
21
21
|
describe 'with child nodes' do
|
@@ -25,12 +25,12 @@ module CiteProc
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'renders each child' do
|
28
|
-
renderer.render(item, node).
|
28
|
+
expect(renderer.render(item, node)).to eq('foobar')
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'uses the delimiters if specified' do
|
32
32
|
node[:delimiter] = '-'
|
33
|
-
renderer.render(item, node).
|
33
|
+
expect(renderer.render(item, node)).to eq('foo-bar')
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -15,14 +15,14 @@ module CiteProc
|
|
15
15
|
}
|
16
16
|
|
17
17
|
it 'returns an empty string when empty' do
|
18
|
-
renderer.render(item, node).
|
18
|
+
expect(renderer.render(item, node)).to eq('')
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'renders each child' do
|
22
22
|
node << CSL::Style::Text.new(:value => 'foo')
|
23
23
|
node << CSL::Style::Text.new(:value => 'bar')
|
24
24
|
|
25
|
-
renderer.render(item, node).
|
25
|
+
expect(renderer.render(item, node)).to eq('foobar')
|
26
26
|
end
|
27
27
|
|
28
28
|
end
|
@@ -21,12 +21,12 @@ module CiteProc
|
|
21
21
|
|
22
22
|
describe 'given an empty node' do
|
23
23
|
it 'returns an empty string for an empty item' do
|
24
|
-
renderer.render(item, node).
|
24
|
+
expect(renderer.render(item, node)).to eq('')
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'returns an empty string for an item with variables' do
|
28
28
|
item.data.edition = 'foo'
|
29
|
-
renderer.render_names(item, node).
|
29
|
+
expect(renderer.render_names(item, node)).to eq('')
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -37,17 +37,17 @@ module CiteProc
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'formats it in long form' do
|
40
|
-
renderer.render_names(item, node).
|
40
|
+
expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'supports nested name node options' do
|
44
44
|
node << CSL::Style::Name.new(:form => 'short')
|
45
|
-
renderer.render_names(item, node).
|
45
|
+
expect(renderer.render_names(item, node)).to eq('Poe')
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'supports nested label node' do
|
49
49
|
node << CSL::Style::Label.new(:prefix => ' [', :suffix => ']')
|
50
|
-
renderer.render_names(item, node).
|
50
|
+
expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe [author]')
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -58,17 +58,17 @@ module CiteProc
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'formats them as a list' do
|
61
|
-
renderer.render_names(item, node).
|
61
|
+
expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle')
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'supports nested name node options' do
|
65
65
|
node << CSL::Style::Name.new(:and => 'symbol')
|
66
|
-
renderer.render_names(item, node).
|
66
|
+
expect(renderer.render_names(item, node)).to eq('Plato, Socrates, & Aristotle')
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'supports nested label node' do
|
70
70
|
node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
|
71
|
-
renderer.render_names(item, node).
|
71
|
+
expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle (editors)')
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -79,13 +79,13 @@ module CiteProc
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'renders all matching lists combinded using default delimiter' do
|
82
|
-
renderer.render_names(item, node).
|
82
|
+
expect(renderer.render_names(item, node)).to eq('')
|
83
83
|
|
84
84
|
item.data.author = poe
|
85
|
-
renderer.render_names(item, node).
|
85
|
+
expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
|
86
86
|
|
87
87
|
item.data.editor = philosophers
|
88
|
-
renderer.render_names(item, node).
|
88
|
+
expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe; Plato, Socrates, Aristotle')
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'keeps the variable order' do
|
@@ -93,7 +93,7 @@ module CiteProc
|
|
93
93
|
item.data.editor = philosophers
|
94
94
|
|
95
95
|
node[:variable] = 'editor author'
|
96
|
-
renderer.render_names(item, node).
|
96
|
+
expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle; Edgar Allen Poe')
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'supports labels' do
|
@@ -102,7 +102,7 @@ module CiteProc
|
|
102
102
|
|
103
103
|
node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
|
104
104
|
|
105
|
-
renderer.render_names(item, node).
|
105
|
+
expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe (author); Plato, Socrates, Aristotle (editors)')
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'resolves the editor translator special case' do
|
@@ -116,14 +116,14 @@ module CiteProc
|
|
116
116
|
node.name = { :and => 'symbol', :form => 'short' }
|
117
117
|
node.label = { :prefix => ' (', :suffix => ')' }
|
118
118
|
|
119
|
-
renderer.render_names(item, node).
|
119
|
+
expect(renderer.render_names(item, node)).to eq('Poe (author); Quinn & Thompson (editors)')
|
120
120
|
|
121
121
|
item.data.translator = poe
|
122
|
-
renderer.render_names(item, node).
|
122
|
+
expect(renderer.render_names(item, node)).to eq('Poe (translator); Poe (author); Quinn & Thompson (editors)')
|
123
123
|
|
124
124
|
item.data.translator = 'Patrick F. Quinn and G. R. Thompson'
|
125
125
|
|
126
|
-
renderer.render(item, node).
|
126
|
+
expect(renderer.render(item, node)).to eq('Quinn & Thompson (editors & translators); Poe (author)')
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
@@ -138,65 +138,65 @@ module CiteProc
|
|
138
138
|
|
139
139
|
describe 'given an empty node' do
|
140
140
|
it 'returns an empty string given no names' do
|
141
|
-
renderer.render_name(CiteProc::Names.new, node).
|
141
|
+
expect(renderer.render_name(CiteProc::Names.new, node)).to eq('')
|
142
142
|
end
|
143
143
|
|
144
144
|
it 'formats the given name in long form' do
|
145
|
-
renderer.render_name(poe, node).
|
145
|
+
expect(renderer.render_name(poe, node)).to eq('Edgar Allen Poe')
|
146
146
|
end
|
147
147
|
|
148
148
|
it 'formats multiple names delimitted by commas' do
|
149
|
-
renderer.render_name(philosophers, node).
|
149
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
153
|
describe 'given a node with and "and" attribute' do
|
154
154
|
it 'inserts a delimited connector' do
|
155
155
|
node[:and] = 'symbol'
|
156
|
-
renderer.render_name(philosophers, node).
|
156
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, & Aristotle')
|
157
157
|
|
158
158
|
node[:and] = 'text'
|
159
|
-
renderer.render_name(philosophers, node).
|
159
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
163
|
describe 'given a node with delimier-precedes-last' do
|
164
164
|
it 'inserts final delimiter only for three or more names when set to "contextual"' do
|
165
165
|
node.delimiter_contextually_precedes_last!
|
166
|
-
renderer.render_name(philosophers, node).
|
166
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
|
167
167
|
|
168
168
|
node[:and] = 'text'
|
169
|
-
renderer.render_name(philosophers, node).
|
169
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
|
170
170
|
|
171
|
-
renderer.render_name(philosophers.take(2), node).
|
171
|
+
expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato and Socrates')
|
172
172
|
|
173
173
|
node[:and] = nil
|
174
|
-
renderer.render_name(philosophers.take(2), node).
|
174
|
+
expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
|
175
175
|
end
|
176
176
|
|
177
177
|
it 'inserts final delimiter when set to "always"' do
|
178
178
|
node.delimiter_always_precedes_last!
|
179
179
|
|
180
|
-
renderer.render_name(philosophers, node).
|
180
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
|
181
181
|
|
182
182
|
node[:and] = 'text'
|
183
|
-
renderer.render_name(philosophers, node).
|
183
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
|
184
184
|
|
185
|
-
renderer.render_name(philosophers.take(2), node).
|
185
|
+
expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, and Socrates')
|
186
186
|
|
187
187
|
node[:and] = nil
|
188
|
-
renderer.render_name(philosophers.take(2), node).
|
188
|
+
expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
|
189
189
|
end
|
190
190
|
|
191
191
|
it 'never inserts final delimiter when set to "never" (unless there is no "and")' do
|
192
192
|
node.delimiter_never_precedes_last!
|
193
193
|
|
194
|
-
renderer.render_name(philosophers, node).
|
195
|
-
renderer.render_name(philosophers.take(2), node).
|
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
196
|
|
197
197
|
node[:and] = 'text'
|
198
|
-
renderer.render_name(philosophers, node).
|
199
|
-
renderer.render_name(philosophers.take(2), node).
|
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
200
|
end
|
201
201
|
|
202
202
|
it 'supports only-after-inverted-name rule' do
|
@@ -204,20 +204,20 @@ module CiteProc
|
|
204
204
|
node.delimiter_precedes_last_after_inverted_name!
|
205
205
|
|
206
206
|
# always delimit when there is no and!
|
207
|
-
renderer.render_name(names, node).
|
208
|
-
renderer.render_name(names.take(2), node).
|
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
209
|
|
210
210
|
node[:and] = 'text'
|
211
|
-
renderer.render_name(names, node).
|
212
|
-
renderer.render_name(names.take(2), node).
|
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
213
|
|
214
214
|
node[:'name-as-sort-order'] = 'first'
|
215
|
-
renderer.render_name(names, node).
|
216
|
-
renderer.render_name(names.take(2), node).
|
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
217
|
|
218
218
|
node[:'name-as-sort-order'] = 'all'
|
219
|
-
renderer.render_name(names, node).
|
220
|
-
renderer.render_name(names.take(2), node).
|
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
221
|
end
|
222
222
|
end
|
223
223
|
|
@@ -229,12 +229,12 @@ module CiteProc
|
|
229
229
|
node[:'et-al-use-first'] = 2
|
230
230
|
|
231
231
|
others = CSL::Style::EtAl.new(:prefix => '!!')
|
232
|
-
node.
|
232
|
+
allow(node).to receive(:et_al).and_return(others)
|
233
233
|
|
234
|
-
renderer.render_name(names, node).
|
234
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!et al.')
|
235
235
|
|
236
236
|
others[:term] = 'and others'
|
237
|
-
renderer.render_name(names, node).
|
237
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!and others')
|
238
238
|
end
|
239
239
|
|
240
240
|
it 'supports et-al-use-last' do
|
@@ -243,10 +243,10 @@ module CiteProc
|
|
243
243
|
node[:'et-al-use-last'] = true
|
244
244
|
|
245
245
|
# truncated list must be at least two names short!
|
246
|
-
renderer.render_name(names, node).
|
246
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
|
247
247
|
|
248
248
|
node[:'et-al-use-first'] = 1
|
249
|
-
renderer.render_name(names, node).
|
249
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, … T. Williams')
|
250
250
|
end
|
251
251
|
|
252
252
|
describe 'with default delimiter settings' do
|
@@ -254,17 +254,17 @@ module CiteProc
|
|
254
254
|
node[:'et-al-min'] = 3
|
255
255
|
node[:'et-al-use-first'] = 2
|
256
256
|
|
257
|
-
renderer.render_name(names, node).
|
257
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
|
258
258
|
|
259
259
|
node[:'et-al-use-first'] = 1
|
260
|
-
renderer.render_name(names, node).
|
260
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe et al.')
|
261
261
|
end
|
262
262
|
|
263
263
|
it 'does not truncate the list if it is less than et-al-min' do
|
264
264
|
node[:'et-al-min'] = 4
|
265
265
|
node[:'et-al-use-first'] = 2
|
266
266
|
|
267
|
-
renderer.render_name(names, node).
|
267
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, T. Williams')
|
268
268
|
end
|
269
269
|
end
|
270
270
|
|
@@ -274,17 +274,17 @@ module CiteProc
|
|
274
274
|
node.truncate_at! 2
|
275
275
|
|
276
276
|
# default behaviour should match contextual!
|
277
|
-
renderer.render_name(philosophers, node).
|
277
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
|
278
278
|
|
279
279
|
node.truncate_at! 1
|
280
|
-
renderer.render_name(philosophers, node).
|
280
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
|
281
281
|
|
282
282
|
# set contextual explicitly
|
283
283
|
node.delimiter_contextually_precedes_et_al!
|
284
|
-
renderer.render_name(philosophers, node).
|
284
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
|
285
285
|
|
286
286
|
node.truncate_at! 2
|
287
|
-
renderer.render_name(philosophers, node).
|
287
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
|
288
288
|
end
|
289
289
|
|
290
290
|
it 'inserts delimiter when set to "always"' do
|
@@ -292,10 +292,10 @@ module CiteProc
|
|
292
292
|
node.truncate_at! 2
|
293
293
|
|
294
294
|
node.delimiter_always_precedes_et_al!
|
295
|
-
renderer.render_name(philosophers, node).
|
295
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
|
296
296
|
|
297
297
|
node.truncate_at! 1
|
298
|
-
renderer.render_name(philosophers, node).
|
298
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, et al.')
|
299
299
|
end
|
300
300
|
|
301
301
|
it 'never inserts delimiter when set to "never"' do
|
@@ -303,10 +303,10 @@ module CiteProc
|
|
303
303
|
node.truncate_at! 2
|
304
304
|
|
305
305
|
node.delimiter_never_precedes_et_al!
|
306
|
-
renderer.render_name(philosophers, node).
|
306
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates et al.')
|
307
307
|
|
308
308
|
node.truncate_at! 1
|
309
|
-
renderer.render_name(philosophers, node).
|
309
|
+
expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
|
310
310
|
end
|
311
311
|
|
312
312
|
it 'supports only-after-inverted-name rule' do
|
@@ -315,19 +315,19 @@ module CiteProc
|
|
315
315
|
|
316
316
|
node.delimiter_precedes_et_al_after_inverted_name!
|
317
317
|
|
318
|
-
renderer.render_name(names, node).
|
318
|
+
expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith et al.')
|
319
319
|
|
320
320
|
node[:'name-as-sort-order'] = 'first'
|
321
|
-
renderer.render_name(names, node).
|
321
|
+
expect(renderer.render_name(names, node)).to eq('Doe, J., S. Smith et al.')
|
322
322
|
|
323
323
|
node.truncate_at! 1
|
324
|
-
renderer.render_name(names, node).
|
324
|
+
expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
|
325
325
|
|
326
326
|
node[:'name-as-sort-order'] = 'all'
|
327
|
-
renderer.render_name(names, node).
|
327
|
+
expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
|
328
328
|
|
329
329
|
node.truncate_at! 2
|
330
|
-
renderer.render_name(names, node).
|
330
|
+
expect(renderer.render_name(names, node)).to eq('Doe, J., Smith, S., et al.')
|
331
331
|
end
|
332
332
|
end
|
333
333
|
end
|
@@ -338,15 +338,15 @@ module CiteProc
|
|
338
338
|
|
339
339
|
it 'supports family name formatting' do
|
340
340
|
part[:name] = 'family'
|
341
|
-
renderer.render_name(poe, node).
|
341
|
+
expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
|
342
342
|
end
|
343
343
|
|
344
344
|
it 'family part includes non-demoted particles' do
|
345
345
|
part[:name] = 'family'
|
346
346
|
|
347
|
-
renderer.render_name(people(:la_fontaine), node).
|
348
|
-
renderer.render_name(people(:humboldt), node).
|
349
|
-
renderer.render_name(people(:van_gogh), node).
|
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
350
|
end
|
351
351
|
|
352
352
|
it 'family part affixes includes name suffix for non-inverted names' do
|
@@ -355,20 +355,20 @@ module CiteProc
|
|
355
355
|
la_fontaine = people(:la_fontaine)
|
356
356
|
la_fontaine[0].suffix = 'Jr.'
|
357
357
|
|
358
|
-
renderer.render_name(la_fontaine, node).
|
358
|
+
expect(renderer.render_name(la_fontaine, node)).to eq('Jean de (LA FONTAINE Jr.)')
|
359
359
|
end
|
360
360
|
|
361
361
|
it 'supports given name formatting' do
|
362
362
|
part[:name] = 'given'
|
363
|
-
renderer.render_name(poe, node).
|
363
|
+
expect(renderer.render_name(poe, node)).to eq('EDGAR ALLEN Poe')
|
364
364
|
end
|
365
365
|
|
366
366
|
it 'given part includes particles' do
|
367
367
|
part[:name] = 'given'
|
368
368
|
|
369
|
-
renderer.render_name(people(:la_fontaine), node).
|
370
|
-
renderer.render_name(people(:humboldt), node).
|
371
|
-
renderer.render_name(people(:van_gogh), node).
|
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
372
|
end
|
373
373
|
|
374
374
|
it 'given part affixes enclose demoted particles' do
|
@@ -376,19 +376,19 @@ module CiteProc
|
|
376
376
|
|
377
377
|
la_fontaine = people(:la_fontaine)
|
378
378
|
|
379
|
-
renderer.render_name(la_fontaine, node).
|
379
|
+
expect(renderer.render_name(la_fontaine, node)).to eq('(JEAN DE) La Fontaine')
|
380
380
|
|
381
381
|
node.all_names_as_sort_order!
|
382
|
-
renderer.render_name(la_fontaine, node).
|
382
|
+
expect(renderer.render_name(la_fontaine, node)).to eq('La Fontaine, (JEAN DE)')
|
383
383
|
|
384
384
|
la_fontaine[0].always_demote_particle!
|
385
|
-
renderer.render_name(la_fontaine, node).
|
385
|
+
expect(renderer.render_name(la_fontaine, node)).to eq('Fontaine, (JEAN DE La)')
|
386
386
|
end
|
387
387
|
|
388
388
|
it 'does not alter the passed-in name object' do
|
389
389
|
part[:name] = 'family'
|
390
|
-
renderer.render_name(poe, node).
|
391
|
-
poe.to_s.
|
390
|
+
expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
|
391
|
+
expect(poe.to_s).to eq('Edgar Allen Poe')
|
392
392
|
end
|
393
393
|
end
|
394
394
|
end
|