citeproc-ruby 1.1.8 → 1.1.10
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 +5 -5
- data/Gemfile +10 -32
- data/lib/citeproc/ruby/renderer.rb +2 -1
- data/lib/citeproc/ruby/version.rb +1 -1
- metadata +14 -84
- data/.rspec +0 -3
- data/.rubocop.yml +0 -1156
- data/.simplecov +0 -4
- data/Guardfile +0 -14
- data/features/bibliography.feature +0 -25
- data/features/locale_overrides.feature +0 -31
- data/features/name_options.feature +0 -37
- data/features/names.feature +0 -198
- data/features/renderer.feature +0 -94
- data/features/sort.feature +0 -50
- data/features/step_definitions/engine.rb +0 -21
- data/features/step_definitions/renderer.rb +0 -85
- data/features/style_immanent_locale_terms.feature +0 -30
- data/features/support/env.rb +0 -35
- data/features/support/hooks.rb +0 -10
- data/spec/citeproc/ruby/engine_spec.rb +0 -120
- data/spec/citeproc/ruby/formats/default_spec.rb +0 -168
- data/spec/citeproc/ruby/formats/html_spec.rb +0 -167
- data/spec/citeproc/ruby/renderer/choose_spec.rb +0 -293
- data/spec/citeproc/ruby/renderer/date_spec.rb +0 -173
- data/spec/citeproc/ruby/renderer/group_spec.rb +0 -114
- data/spec/citeproc/ruby/renderer/history_spec.rb +0 -47
- data/spec/citeproc/ruby/renderer/label_spec.rb +0 -225
- data/spec/citeproc/ruby/renderer/layout_spec.rb +0 -41
- data/spec/citeproc/ruby/renderer/macro_spec.rb +0 -31
- data/spec/citeproc/ruby/renderer/names_spec.rb +0 -396
- data/spec/citeproc/ruby/renderer/number_spec.rb +0 -120
- data/spec/citeproc/ruby/renderer/text_spec.rb +0 -125
- data/spec/citeproc/ruby/renderer_spec.rb +0 -65
- data/spec/fixtures/items.rb +0 -113
- data/spec/fixtures/locales/locales-de-DE.xml +0 -298
- data/spec/fixtures/locales/locales-en-US.xml +0 -304
- data/spec/fixtures/locales/locales-fr-FR.xml +0 -317
- data/spec/fixtures/styles/apa-with-different-translations.csl +0 -451
- data/spec/fixtures/styles/apa.csl +0 -443
- data/spec/fixtures/styles/modern-language-association-8th-edition.csl +0 -293
- data/spec/spec_helper.rb +0 -73
@@ -1,167 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module CiteProc
|
4
|
-
module Ruby
|
5
|
-
|
6
|
-
describe 'Formats::Html' do
|
7
|
-
it 'can be created with an options hash' do
|
8
|
-
expect(Formats::Html.new(:css_only => true)).to be_css_only
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe 'Formats::Html#apply' do
|
13
|
-
let(:format) { Format.load 'html' }
|
14
|
-
let(:node) { CSL::Style::Text.new }
|
15
|
-
|
16
|
-
describe 'text-case formats' do
|
17
|
-
it 'supports lowercase' do
|
18
|
-
node[:'text-case'] = 'lowercase'
|
19
|
-
expect(format.apply('Foo BAR', node)).to eq('foo bar')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'entity escaping' do
|
24
|
-
it 'escapes entities in the original text' do
|
25
|
-
node[:'text-case'] = 'lowercase'
|
26
|
-
expect(format.apply('Foo & BAR', node)).to eq('foo & bar')
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'does not not apply casing to escaped entities' do
|
30
|
-
node[:'text-case'] = 'uppercase'
|
31
|
-
expect(format.apply('Foo & BAR', node)).to eq('FOO & BAR')
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'escapes entities in affixes' do
|
35
|
-
node[:prefix] = '<'
|
36
|
-
node[:suffix] = '>'
|
37
|
-
expect(format.apply('foo', node)).to eq('<foo>')
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'escapes entities in quotes' do
|
41
|
-
locale = CSL::Locale.new
|
42
|
-
locale.store 'open-quote', '<'
|
43
|
-
locale.store 'close-quote', '>'
|
44
|
-
|
45
|
-
node[:quotes] = true
|
46
|
-
expect(format.apply('foo', node, locale)).to eq('<foo>')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe 'affixes' do
|
51
|
-
it 'are added after text formats have been applied' do
|
52
|
-
node[:prefix] = 'foo'
|
53
|
-
node[:suffix] = 'ooo'
|
54
|
-
node[:'font-style'] = 'italic'
|
55
|
-
|
56
|
-
expect(format.apply('ooo', node)).to eq('foo<i>ooo</i>ooo')
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'are added before text formats have been applied for layout nodes' do
|
60
|
-
layout = CSL::Style::Layout.new
|
61
|
-
|
62
|
-
layout[:prefix] = 'foo'
|
63
|
-
layout[:suffix] = 'ooo'
|
64
|
-
layout[:'font-style'] = 'italic'
|
65
|
-
|
66
|
-
expect(format.apply('ooo', layout)).to eq('<i>foooooooo</i>')
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe 'font-style' do
|
71
|
-
it 'supports italic in both modes' do
|
72
|
-
node[:'font-style'] = 'italic'
|
73
|
-
|
74
|
-
expect(format.apply('foo bar', node)).to eq('<i>foo bar</i>')
|
75
|
-
|
76
|
-
format.config[:italic] = 'em'
|
77
|
-
expect(format.apply('foo bar', node)).to eq('<em>foo bar</em>')
|
78
|
-
|
79
|
-
format.config[:css_only] = true
|
80
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-style: italic">foo bar</span>')
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'supports normal and oblique via css' do
|
84
|
-
node[:'font-style'] = 'oblique'
|
85
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-style: oblique">foo bar</span>')
|
86
|
-
|
87
|
-
node[:'font-style'] = 'normal'
|
88
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-style: normal">foo bar</span>')
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'supports font-variant via css' do
|
93
|
-
node[:'font-variant'] = 'small-caps'
|
94
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-variant: small-caps">foo bar</span>')
|
95
|
-
end
|
96
|
-
|
97
|
-
describe 'font-weight' do
|
98
|
-
it 'supports bold in both modes' do
|
99
|
-
node[:'font-weight'] = 'bold'
|
100
|
-
|
101
|
-
expect(format.apply('foo bar', node)).to eq('<b>foo bar</b>')
|
102
|
-
|
103
|
-
format.config[:bold] = 'strong'
|
104
|
-
expect(format.apply('foo bar', node)).to eq('<strong>foo bar</strong>')
|
105
|
-
|
106
|
-
format.config[:css_only] = true
|
107
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-weight: bold">foo bar</span>')
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'supports normal and light via css' do
|
111
|
-
node[:'font-weight'] = 'light'
|
112
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-weight: light">foo bar</span>')
|
113
|
-
|
114
|
-
node[:'font-weight'] = 'normal'
|
115
|
-
expect(format.apply('foo bar', node)).to eq('<span style="font-weight: normal">foo bar</span>')
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'supports text-decoration via css' do
|
120
|
-
node[:'text-decoration'] = 'underline'
|
121
|
-
expect(format.apply('foo bar', node)).to eq('<span style="text-decoration: underline">foo bar</span>')
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'supports vertical-align via css' do
|
125
|
-
node[:'vertical-align'] = 'sup'
|
126
|
-
expect(format.apply('foo bar', node)).to eq('<span style="vertical-align: super">foo bar</span>')
|
127
|
-
end
|
128
|
-
|
129
|
-
describe 'display' do
|
130
|
-
it 'is supported in an outer container' do
|
131
|
-
node[:'display'] = 'block'
|
132
|
-
node[:'text-decoration'] = 'underline'
|
133
|
-
expect(format.apply('foo bar', node)).to eq('<div class="csl-block"><span style="text-decoration: underline">foo bar</span></div>')
|
134
|
-
|
135
|
-
node[:prefix] = '('
|
136
|
-
expect(format.apply('foo bar', node)).to eq('<div class="csl-block">(<span style="text-decoration: underline">foo bar</span></div>')
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe 'bibliography formats' do
|
141
|
-
let(:bibliography) do
|
142
|
-
CiteProc::Bibliography.new do |b|
|
143
|
-
b.push 'id-1', 'foo'
|
144
|
-
b.push 'id-2', 'bar'
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'can be applied' do
|
149
|
-
format.config[:bib_indent] = nil
|
150
|
-
format.bibliography(bibliography)
|
151
|
-
expect(bibliography.join).to eq('<ol class="csl-bibliography"><li class="csl-entry">foo</li><li class="csl-entry">bar</li></ol>')
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'can be customized' do
|
155
|
-
format.config[:bib_indent] = nil
|
156
|
-
format.config[:bib_entry_class] = nil
|
157
|
-
format.config[:bib_entry] = 'span'
|
158
|
-
format.config[:bib_container] = 'div'
|
159
|
-
|
160
|
-
format.bibliography(bibliography)
|
161
|
-
expect(bibliography.join).to eq('<div class="csl-bibliography"><span>foo</span><span>bar</span></div>')
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
end
|
@@ -1,293 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module CiteProc
|
4
|
-
module Ruby
|
5
|
-
describe 'Conditional Rendering Elements' do
|
6
|
-
let(:renderer) { Renderer.new }
|
7
|
-
|
8
|
-
let(:item) {
|
9
|
-
i = CiteProc::CitationItem.new(:id => 'ID-1')
|
10
|
-
i.data = CiteProc::Item.new(:id => 'ID-1')
|
11
|
-
i
|
12
|
-
}
|
13
|
-
|
14
|
-
describe 'Renderer#render_choose' do
|
15
|
-
let(:node) { CSL::Style::Choose.new }
|
16
|
-
|
17
|
-
it 'returns an empty string by default' do
|
18
|
-
expect(renderer.render(item, node)).to eq('')
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'when there is a single nested block' do
|
22
|
-
let(:block) do
|
23
|
-
CSL::Style::Choose::Block.new do |b|
|
24
|
-
b << CSL::Style::Text.new( :term => 'retrieved')
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
before(:each) { node << block }
|
29
|
-
|
30
|
-
it 'returns the content of the nested node when the condition evaluates' do
|
31
|
-
block[:variable] = 'issue'
|
32
|
-
item.data[:issue] = 1
|
33
|
-
expect(renderer.render(item, node)).to eq('retrieved')
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'returns an empty string when the condition does not hold' do
|
37
|
-
block[:variable] = 'issue'
|
38
|
-
expect(renderer.render(item, node)).to eq('')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe 'Renderer#render_block' do
|
44
|
-
let(:node) { CSL::Style::Choose::Block.new }
|
45
|
-
|
46
|
-
it 'returns an empty string by default' do
|
47
|
-
expect(renderer.render(item, node)).to eq('')
|
48
|
-
end
|
49
|
-
|
50
|
-
describe 'when there is a text node in the block' do
|
51
|
-
before(:each) { node << CSL::Style::Text.new( :term => 'retrieved') }
|
52
|
-
|
53
|
-
it 'returns the content of the nested node when there is no condition' do
|
54
|
-
expect(renderer.render(item, node)).to eq('retrieved')
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe 'Renderer#evaluates?' do
|
60
|
-
let(:node) { CSL::Style::Choose::Block.new }
|
61
|
-
|
62
|
-
it 'returns true by default (else block)' do
|
63
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'fails if there is an unknown condition type' do
|
67
|
-
allow(node).to receive(:conditions).and_return([[:unknown, :all?, 'x']])
|
68
|
-
expect { renderer.evaluates?(item, node) }.to raise_error(RuntimeError)
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'returns false for disambiguate (implementation pending)' do
|
72
|
-
node[:disambiguate] = true
|
73
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'returns false for position (implementation pending)' do
|
77
|
-
node[:position] = 'first'
|
78
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'for is-numeric conditions' do
|
82
|
-
before { node[:'is-numeric'] = 'note archive' }
|
83
|
-
|
84
|
-
it 'returns false unless all variables are numeric' do
|
85
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
86
|
-
|
87
|
-
item.data[:archive] = 1
|
88
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
89
|
-
|
90
|
-
item.data[:note] = 'L2d'
|
91
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
92
|
-
|
93
|
-
item.data[:archive] = 'second'
|
94
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe 'for is-uncertain-date conditions' do
|
99
|
-
before { node[:'is-uncertain-date'] = 'issued' }
|
100
|
-
|
101
|
-
it 'returns false unless all variables contain uncertain dates' do
|
102
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
103
|
-
|
104
|
-
item.data[:issued] = 2012
|
105
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
106
|
-
|
107
|
-
item.data[:issued].uncertain!
|
108
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
describe 'for locator conditions' do
|
113
|
-
before { node[:locator] = 'figure book sub-verbo' }
|
114
|
-
|
115
|
-
it 'returns false unless the locator matches all of the given locators' do
|
116
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
117
|
-
|
118
|
-
item.locator = :book
|
119
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
120
|
-
|
121
|
-
item.locator = 'volume'
|
122
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
123
|
-
|
124
|
-
item.locator = 'figure'
|
125
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
126
|
-
end
|
127
|
-
|
128
|
-
describe 'when the match attribute is set to "any"' do
|
129
|
-
before { node[:match] = 'any' }
|
130
|
-
|
131
|
-
it 'returns false unless the locator matches any of the given locators' do
|
132
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
133
|
-
|
134
|
-
item.locator = :book
|
135
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
136
|
-
|
137
|
-
item.locator = 'volume'
|
138
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
139
|
-
|
140
|
-
item.locator = 'figure'
|
141
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'matches "sub verbo" as "sub-verbo"' do
|
145
|
-
item.locator = 'sub-verbo'
|
146
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
147
|
-
|
148
|
-
item.locator = 'sub verbo'
|
149
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
describe 'for type conditions' do
|
155
|
-
before { node[:type] = 'book treaty' }
|
156
|
-
|
157
|
-
it 'returns false unless the type matches all of the given types' do
|
158
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
159
|
-
|
160
|
-
item.data[:type] = :book
|
161
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
162
|
-
|
163
|
-
item.data[:type] = 'article'
|
164
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
165
|
-
|
166
|
-
item.data[:type] = 'treaty'
|
167
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
168
|
-
end
|
169
|
-
|
170
|
-
describe 'when the match attribute is set to "any"' do
|
171
|
-
before { node[:match] = 'any' }
|
172
|
-
|
173
|
-
it 'returns false unless the locator matches any of the given locators' do
|
174
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
175
|
-
|
176
|
-
item.data[:type] = :book
|
177
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
178
|
-
|
179
|
-
item.data[:type] = 'article'
|
180
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
181
|
-
|
182
|
-
item.data[:type] = 'treaty'
|
183
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
describe 'for variable conditions' do
|
189
|
-
before { node[:variable] = 'volume issue' }
|
190
|
-
|
191
|
-
it 'returns false unless the item has all variables' do
|
192
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
193
|
-
|
194
|
-
item.data[:volume] = 1
|
195
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
196
|
-
|
197
|
-
item.data[:issue] = 1
|
198
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
199
|
-
|
200
|
-
item.data[:volume] = nil
|
201
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
202
|
-
end
|
203
|
-
|
204
|
-
describe 'with internal negations' do
|
205
|
-
before { node[:variable] = 'volume not:issue' }
|
206
|
-
|
207
|
-
it 'returns false unless the item has (or does not have) all variables' do
|
208
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
209
|
-
|
210
|
-
item.data[:volume] = 1
|
211
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
212
|
-
|
213
|
-
item.data[:issue] = 1
|
214
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
215
|
-
|
216
|
-
item.data[:volume] = nil
|
217
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
describe 'and the any-matcher' do
|
222
|
-
before { node[:match] = 'any' }
|
223
|
-
|
224
|
-
it 'returns false unless the item has any of the variables' do
|
225
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
226
|
-
|
227
|
-
item.data[:volume] = 1
|
228
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
229
|
-
|
230
|
-
item.data[:issue] = 1
|
231
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
232
|
-
|
233
|
-
item.data[:volume] = nil
|
234
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
235
|
-
end
|
236
|
-
|
237
|
-
describe 'with internal negations' do
|
238
|
-
before { node[:variable] = 'volume not:issue' }
|
239
|
-
|
240
|
-
it 'returns false unless the item has (or does not have) any of the variables' do
|
241
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
242
|
-
|
243
|
-
item.data[:volume] = 1
|
244
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
245
|
-
|
246
|
-
item.data[:issue] = 1
|
247
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
248
|
-
|
249
|
-
item.data[:volume] = nil
|
250
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
describe 'and the none-matcher' do
|
256
|
-
before { node[:match] = 'none' }
|
257
|
-
|
258
|
-
it 'returns false unless the item has none of the variables' do
|
259
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
260
|
-
|
261
|
-
item.data[:volume] = 1
|
262
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
263
|
-
|
264
|
-
item.data[:issue] = 1
|
265
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
266
|
-
|
267
|
-
item.data[:volume] = nil
|
268
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
269
|
-
end
|
270
|
-
|
271
|
-
describe 'with internal negations' do
|
272
|
-
before { node[:variable] = 'volume not:issue' }
|
273
|
-
|
274
|
-
it 'returns false unless the item has (or does not have) none of the variables' do
|
275
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
276
|
-
|
277
|
-
item.data[:volume] = 1
|
278
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
279
|
-
|
280
|
-
item.data[:issue] = 1
|
281
|
-
expect(renderer.evaluates?(item, node)).to be_falsey
|
282
|
-
|
283
|
-
item.data[:volume] = nil
|
284
|
-
expect(renderer.evaluates?(item, node)).to be_truthy
|
285
|
-
end
|
286
|
-
end
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|