csl 1.0.0.pre21 → 1.0.0.pre22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d4cb72ec6f5e2c4a369fe2fb0a5a36df75da5df9
4
+ data.tar.gz: 4910056174f713025c28fd9a8136468fd785651a
5
+ SHA512:
6
+ metadata.gz: 74f0b979d50b5348d4f6a2b1e33c373e53abee501f840e9926f949ad2f4fb77c9a9bb07dbd302caffdfa2dc3b729cf06ddf1fb67ca4f7eebfc9efa998cdc3d34
7
+ data.tar.gz: 6330e92fe3e39b5a4cb8b6fd365f2cfb5a95d425a8b74f046a02a83bd4580c4b9a9932e400c9e8491cc85e5a422ebcf542665a65c3b99e94b436615e2148bbde
data/.gitignore CHANGED
@@ -7,3 +7,5 @@ Gemfile.lock
7
7
  /.rbx
8
8
  *.rbc
9
9
  *.gem
10
+ .ruby-version
11
+ .rvm
data/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  language: ruby
2
2
  bundler_args: --without debug extra
3
3
  rvm:
4
+ - 2.0.0
4
5
  - 1.9.2
5
6
  - 1.9.3
6
7
  - jruby-18mode
@@ -12,10 +13,10 @@ rvm:
12
13
  notifications:
13
14
  email:
14
15
  recipients:
15
- - i@nukshuk.io
16
+ - sylvester@keil.or.at
16
17
  on_success: change
17
18
  on_failure: always
18
19
  matrix:
19
20
  allow_failures:
20
- - rvm: rbx-18mode
21
- - rvm: rbx-19mode
21
+ - rvm: jruby-19mode
22
+ - rvm: rbx-19mode
data/Gemfile CHANGED
@@ -1,9 +1,16 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
+ group :development, :test do
5
+ gem 'rake', '~>10.0'
6
+ gem 'rspec', '~>2.13'
7
+ gem 'cucumber', '~>1.2'
8
+ end
9
+
4
10
  group :debug do
5
11
  gem 'ruby-debug', :platforms => [:mri_18, :jruby]
6
12
  gem 'debugger', :platforms => [:mri_19]
13
+ gem 'debugger2', :platforms => [:mri_20]
7
14
  end
8
15
 
9
16
  group :optional do
@@ -16,10 +23,10 @@ group :extra do
16
23
  gem 'guard', '~>1.2'
17
24
  gem 'guard-rspec', '~>1.1'
18
25
  gem 'guard-cucumber', '~>1.2'
19
- gem 'rb-fsevent', '~>0.9.1', :platforms => [:mri_19, :rbx]
26
+ gem 'rb-fsevent', '~>0.9.1', :platforms => [:mri_19, :mri_20, :rbx]
20
27
 
21
- gem 'yard', '~>0.8', :platforms => [:mri_19]
22
- gem 'redcarpet', '~>2.1', :platforms => [:mri_19]
28
+ gem 'yard', '~>0.8', :platforms => [:mri_19, :mri_20]
29
+ gem 'redcarpet', '~>2.1', :platforms => [:mri_19, :mri_20]
23
30
  end
24
31
 
25
32
  # vim: syntax=ruby
data/Rakefile CHANGED
@@ -43,3 +43,10 @@ task :release do |t|
43
43
  end
44
44
 
45
45
  task :default => [:spec, :cucumber]
46
+
47
+ begin
48
+ require 'yard'
49
+ YARD::Rake::YardocTask.new
50
+ rescue LoadError => e
51
+ # ignore
52
+ end
data/csl.gemspec CHANGED
@@ -14,9 +14,9 @@ Gem::Specification.new do |s|
14
14
  s.summary = 'A Ruby CSL parser and library'
15
15
  s.description =
16
16
  """
17
- A Ruby parser and library for the Citation Style Language (CSL), an open
18
- XML-based language to describe the formatting of citations and
19
- bibliographies.
17
+ A Ruby parser and library for the Citation Style Language (CSL),
18
+ an open XML-based language to describe the formatting of citations
19
+ and bibliographies.
20
20
  """
21
21
 
22
22
  s.license = 'AGPL'
@@ -24,10 +24,6 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.add_dependency('namae', ['~>0.3'])
26
26
 
27
- s.add_development_dependency('cucumber', ['~>1.1'])
28
- s.add_development_dependency('rspec', ['~>2.7'])
29
- s.add_development_dependency('rake', ['~>0.9'])
30
-
31
27
  s.files = `git ls-files`.split("\n")
32
28
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
33
29
  s.executables = []
@@ -4,7 +4,9 @@ When /^I parse the CSL string(?: in the (\w+) scope)?$/ do |scope, string|
4
4
  end
5
5
 
6
6
  Then /^(?:the )?(\w+[\?!]?) should be "([^"]*)"$/ do |name, expected|
7
- @csl.send(name).to_s.should == expected
7
+ actual = @csl.send(name)
8
+ actual = !!actual if expected =~ /^true|false$/
9
+ actual.to_s.should == expected
8
10
  end
9
11
 
10
12
  Then /^the (\w+) (\w+) should be "([^"]*)"$/ do |outer, inner, expected|
@@ -1,7 +1,7 @@
1
1
 
2
2
  class Symbol
3
3
  include Comparable
4
-
4
+
5
5
  def <=>(other)
6
6
  return unless other.kind_of? Symbol
7
7
  to_s <=> other.to_s
@@ -20,4 +20,35 @@ end
20
20
 
21
21
  class Struct
22
22
  alias_method :__class__, :class
23
- end unless Struct.instance_methods.include?(:__class__)
23
+ end unless Struct.instance_methods.include?(:__class__)
24
+
25
+ module CSL
26
+ module_function
27
+
28
+ if RUBY_VERSION < '1.9'
29
+
30
+ XML_ENTITY_SUBSTITUTION = Hash[*%w{
31
+ & &amp; < &lt; > &gt; ' &apos; " &quot;
32
+ }].freeze
33
+
34
+ def encode_xml_text(string)
35
+ string.gsub(/[&<>]/) { |match|
36
+ XML_ENTITY_SUBSTITUTION[match]
37
+ }
38
+ end
39
+
40
+ def encode_xml_attr(string)
41
+ string.gsub(/[&<>'"]/) { |match|
42
+ XML_ENTITY_SUBSTITUTION[match]
43
+ }.inspect
44
+ end
45
+ else
46
+ def encode_xml_text(string)
47
+ string.encode(:xml => :text)
48
+ end
49
+
50
+ def encode_xml_attr(string)
51
+ string.encode(:xml => :attr)
52
+ end
53
+ end
54
+ end
data/lib/csl/errors.rb CHANGED
@@ -5,14 +5,14 @@ module CSL
5
5
 
6
6
  def initialize(message, original = $!)
7
7
  @original = original
8
- super(message)
8
+ super(message)
9
9
  end
10
10
  end
11
11
 
12
- class ParseError < Error
13
- end
12
+ class ParseError < Error
13
+ end
14
14
 
15
- class ValidationError < Error
16
- end
15
+ class ValidationError < Error
16
+ end
17
17
 
18
18
  end
@@ -35,11 +35,11 @@ module CSL
35
35
  end
36
36
  end
37
37
 
38
- module Nesting
39
- def nesting
40
- name.split(/::/).inject([]) { |ns, n| ns << (ns[-1] || Object).const_get(n) }
41
- end
42
- end
38
+ module Nesting
39
+ def nesting
40
+ name.split(/::/).inject([]) { |ns, n| ns << (ns[-1] || Object).const_get(n) }
41
+ end
42
+ end
43
43
 
44
44
  module Blank
45
45
  def blank?
@@ -55,7 +55,7 @@ class Hash
55
55
  end
56
56
 
57
57
  class Module
58
- include CSL::Extensions::Nesting
58
+ include CSL::Extensions::Nesting
59
59
  end
60
60
 
61
61
  class Object
data/lib/csl/info.rb CHANGED
@@ -37,7 +37,7 @@ module CSL
37
37
 
38
38
  attr_children :title, :'title-short', :id, :issn, :eissn, :issnl,
39
39
  :link, :author, :contributor, :translator, :category, :published,
40
- :summary, :updated, :rights, :'link-dependent-style'
40
+ :summary, :updated, :rights, :'link-dependent-style'
41
41
 
42
42
  alias_child :contributors, :contributor
43
43
  alias_child :authors, :author
@@ -96,6 +96,11 @@ module CSL
96
96
 
97
97
  alias id= set_child_id
98
98
 
99
+ def self_link!
100
+ return unless has_id?
101
+ self.self_link = id
102
+ end
103
+
99
104
  # @return [Time,nil] when the info node's parent was last updated
100
105
  def updated_at
101
106
  return unless has_updated?
@@ -108,9 +113,9 @@ module CSL
108
113
  ts = timestamp.respond_to?(:xmlschema) ? timestamp.xmlschema : timestamp.to_s
109
114
 
110
115
  if has_updated?
111
- updated = Updated.new { |u| u.text = ts }
112
- else
113
116
  updated.text = ts
117
+ else
118
+ add_child Updated.new { |u| u.text = ts }
114
119
  end
115
120
 
116
121
  self
@@ -128,14 +133,43 @@ module CSL
128
133
  ts = timestamp.respond_to?(:xmlschema) ? timestamp.xmlschema : timestamp.to_s
129
134
 
130
135
  if has_published?
131
- published = Published.new { |u| u.text = ts }
132
- else
133
136
  published.text = ts
137
+ else
138
+ add_child Published.new { |u| u.text = ts }
134
139
  end
135
140
 
136
141
  self
137
142
  end
138
143
 
144
+ def license
145
+ return unless has_rights?
146
+ rights[:license] || rights.to_s
147
+ end
148
+
149
+ def license=(license)
150
+ if has_rights?
151
+ rights[:license] = license
152
+ else
153
+ add_child Rights.new(:license => license)
154
+ end
155
+ end
156
+
157
+ def default_license?
158
+ has_rights? && rights[:license] == Schema.default_license &&
159
+ rights.to_s == Schema.default_rights_string
160
+ end
161
+
162
+ def default_license!
163
+ if has_rights?
164
+ rights[:license] = Schema.default_license
165
+ rights.text = Schema.default_rights_string
166
+ else
167
+ add_child Rights.new(:license => Schema.default_license) { |r|
168
+ r.text = Schema.default_rights_string
169
+ }
170
+ end
171
+ end
172
+
139
173
  # @return [Symbol] the parent style's citation format
140
174
  def citation_format
141
175
  return unless has_categories?
@@ -159,21 +193,21 @@ module CSL
159
193
 
160
194
  class Contributor < Node
161
195
  attr_children :name, :email, :uri
162
- def_delegators :name, *Namae::Name.members
196
+ def_delegators :name, *Namae::Name.members
163
197
  end
164
198
 
165
199
  class Author < Node
166
200
  attr_children :name, :email, :uri
167
- def_delegators :name, *Namae::Name.members
201
+ def_delegators :name, *Namae::Name.members
168
202
  end
169
203
 
170
204
  class Translator < Node
171
205
  attr_children :name, :email, :uri
172
- def_delegators :name, *Namae::Name.members
206
+ def_delegators :name, *Namae::Name.members
173
207
  end
174
208
 
175
209
  class Link < Node
176
- has_language
210
+ has_language
177
211
  attr_struct :href, :rel
178
212
  end
179
213
 
@@ -191,17 +225,17 @@ module CSL
191
225
 
192
226
  class Name < TextNode
193
227
 
194
- def_delegators :namae, *Namae::Name.members
228
+ def_delegators :namae, *Namae::Name.members
195
229
 
196
- private
230
+ private
197
231
 
198
- def namae
199
- @namae || namae!
200
- end
232
+ def namae
233
+ @namae || namae!
234
+ end
201
235
 
202
- def namae!
203
- @namae = Namae::Name.parse to_s
204
- end
236
+ def namae!
237
+ @namae = Namae::Name.parse to_s
238
+ end
205
239
  end
206
240
 
207
241
  class Email < TextNode
@@ -211,19 +245,19 @@ module CSL
211
245
  end
212
246
 
213
247
  class Title < TextNode
214
- has_language
248
+ has_language
215
249
  end
216
250
 
217
251
  class TitleShort < TextNode
218
- has_language
252
+ has_language
219
253
  end
220
254
 
221
255
  class Summary < TextNode
222
- has_language
256
+ has_language
223
257
  end
224
258
 
225
259
  class Rights < TextNode
226
- has_language
260
+ has_language
227
261
  attr_struct :license
228
262
  end
229
263
 
data/lib/csl/loader.rb CHANGED
@@ -37,26 +37,26 @@ module CSL
37
37
 
38
38
  input = input.to_s
39
39
 
40
- case
41
- when File.exists?(input)
42
- location = input
43
- when File.exists?(extend_name(input))
44
- location = extend_name(input)
45
- when File.exists?(extend_path(input))
46
- location = extend_path(input)
47
- else
48
- location = input
49
- end
40
+ case
41
+ when File.exists?(input)
42
+ location = input
43
+ when File.exists?(extend_name(input))
44
+ location = extend_name(input)
45
+ when File.exists?(extend_path(input))
46
+ location = extend_path(input)
47
+ else
48
+ location = input
49
+ end
50
50
 
51
- Kernel.open(location, 'r:UTF-8') do |io|
51
+ Kernel.open(location, 'r:UTF-8') do |io|
52
52
  data = io.read
53
53
  end
54
54
  end
55
55
 
56
- parse(data)
56
+ parse(data)
57
57
 
58
- rescue => e
59
- raise ParseError, "failed to load #{input.inspect}: #{e.message}"
58
+ rescue => e
59
+ raise ParseError, "failed to load #{input.inspect}: #{e.message}"
60
60
  end
61
61
 
62
62
  def list
data/lib/csl/locale.rb CHANGED
@@ -72,12 +72,15 @@ module CSL
72
72
  attr_reader :tag_pattern
73
73
  end
74
74
 
75
- attr_defaults :version => Schema.version, :xmlns => Schema.namespace
76
- attr_struct :xmlns, :version
75
+ attr_defaults :version => Schema.major_version,
76
+ :xmlns => Schema.namespace
77
+
78
+ show_default_attributes!
77
79
 
78
- attr_children :'style-options', :info, :date, :terms
80
+ attr_struct :xmlns, :version
81
+ attr_children :info, :'style-options', :date, :terms
79
82
 
80
- has_language
83
+ has_language
81
84
 
82
85
  attr_accessor :region
83
86
 
@@ -165,7 +168,7 @@ module CSL
165
168
 
166
169
  # @return [Boolean] whether or not the Locale's version is less than CSL-Ruby's default version
167
170
  def legacy?
168
- version < Schema.version
171
+ version < Schema.major_version
169
172
  end
170
173
 
171
174
  # @example
@@ -178,18 +181,18 @@ module CSL
178
181
  # region to the default region for the given language.
179
182
  #
180
183
  # @raise [ArgumentError] if the argument is no valid locale string.
181
- # A valid locale string is based on the syntax of IETF language tags;
182
- # it consists of either a language or region tag (or both), separated
183
- # by a hyphen.
184
- #
185
- # @return [self]
184
+ # A valid locale string is based on the syntax of IETF language tags;
185
+ # it consists of either a language or region tag (or both), separated
186
+ # by a hyphen.
187
+ #
188
+ # @return [self]
186
189
  def set(locale)
187
190
  @language, @region = Locale.normalize(locale).split(/-/).map(&:to_sym)
188
191
  self
189
192
  end
190
193
 
191
194
  # Sets the locale's language and region to nil.
192
- # @return [self]
195
+ # @return [self]
193
196
  def clear
194
197
  @language, @region = nil
195
198
  self
@@ -238,12 +241,12 @@ module CSL
238
241
  raise ArgumentError, "unable to ordinalize #{number}; integer expected" unless
239
242
  number.respond_to?(:to_i)
240
243
 
241
- number = number.to_i
244
+ number = number.to_i
242
245
  ordinal = terms.ordinalize number, options
243
246
 
244
247
  return number.to_s if ordinal.nil?
245
248
  return ordinal.to_s(options) if ordinal.long_ordinal?
246
-
249
+
247
250
  [number, ordinal.to_s(options)].join
248
251
  end
249
252
 
@@ -301,20 +304,20 @@ module CSL
301
304
  validate.empty?
302
305
  end
303
306
 
304
- # @return [Locale]
305
- def merge(*others)
306
- deep_copy.merge!(*others)
307
- end
307
+ # @return [Locale]
308
+ def merge(*others)
309
+ deep_copy.merge!(*others)
310
+ end
308
311
 
309
- # @return [self]
310
- def merge!(*others)
311
- others.each do |other|
312
- merge_options other
313
- merge_dates other
314
- end
312
+ # @return [self]
313
+ def merge!(*others)
314
+ others.each do |other|
315
+ merge_options other
316
+ merge_dates other
317
+ end
315
318
 
316
- self
317
- end
319
+ self
320
+ end
318
321
 
319
322
 
320
323
  # Locales are sorted first by language, then by region; sort order is
@@ -373,22 +376,22 @@ module CSL
373
376
  Schema.preamble.dup
374
377
  end
375
378
 
376
- # @param other [Locale] an other locale whose options should be merged
377
- # @return [self]
378
- def merge_options(other)
379
- return self unless other.has_options?
379
+ # @param other [Locale] an other locale whose options should be merged
380
+ # @return [self]
381
+ def merge_options(other)
382
+ return self unless other.has_options?
380
383
 
381
- if has_options?
382
- options.attributes.merge! other.options.attributes
383
- else
384
- add_child other.options.dup
385
- end
384
+ if has_options?
385
+ options.attributes.merge! other.options.attributes
386
+ else
387
+ add_child other.options.dup
388
+ end
386
389
 
387
- self
388
- end
390
+ self
391
+ end
389
392
 
390
- # @param other [Locale] an other locale whose date nodes should be merged
391
- # @return [self]
393
+ # @param other [Locale] an other locale whose date nodes should be merged
394
+ # @return [self]
392
395
  def merge_dates(other)
393
396
  return self unless other.has_dates?
394
397