citeproc 1.0.0.pre12 → 1.0.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.
- checksums.yaml +7 -0
 - data/.simplecov +4 -0
 - data/AGPL +1 -1
 - data/BSDL +2 -2
 - data/Gemfile +39 -19
 - data/README.md +123 -14
 - data/Rakefile +22 -8
 - data/cucumber.yml +1 -1
 - data/features/step_definitions/processor.rb +59 -0
 - data/features/support/env.rb +45 -2
 - data/lib/citeproc.rb +8 -8
 - data/lib/citeproc/abbreviate.rb +5 -4
 - data/lib/citeproc/assets.rb +109 -109
 - data/lib/citeproc/attributes.rb +11 -11
 - data/lib/citeproc/bibliography.rb +107 -71
 - data/lib/citeproc/citation_data.rb +175 -150
 - data/lib/citeproc/compatibility.rb +5 -108
 - data/lib/citeproc/date.rb +23 -12
 - data/lib/citeproc/engine.rb +9 -4
 - data/lib/citeproc/errors.rb +6 -6
 - data/lib/citeproc/extensions.rb +66 -66
 - data/lib/citeproc/item.rb +60 -2
 - data/lib/citeproc/names.rb +103 -24
 - data/lib/citeproc/number.rb +27 -8
 - data/lib/citeproc/processor.rb +31 -41
 - data/lib/citeproc/selector.rb +132 -126
 - data/lib/citeproc/utilities.rb +6 -6
 - data/lib/citeproc/variable.rb +5 -4
 - data/lib/citeproc/version.rb +1 -1
 - data/spec/citeproc/assets_spec.rb +17 -15
 - data/spec/citeproc/bibliography_spec.rb +17 -17
 - data/spec/citeproc/citation_data_spec.rb +90 -90
 - data/spec/citeproc/engine_spec.rb +3 -4
 - data/spec/citeproc/item_spec.rb +76 -68
 - data/spec/citeproc/names_spec.rb +187 -148
 - data/spec/citeproc/processor_spec.rb +119 -115
 - data/spec/citeproc/selector_spec.rb +87 -78
 - data/spec/citeproc/variable_spec.rb +30 -30
 - data/spec/fixtures/locales/locales-en-US.xml +304 -0
 - data/spec/spec_helper.rb +32 -1
 - data/tasks/testsuite.rb +209 -0
 - metadata +19 -87
 - data/.gitignore +0 -6
 - data/.travis.yml +0 -21
 - data/citeproc.gemspec +0 -40
 
    
        data/lib/citeproc/date.rb
    CHANGED
    
    | 
         @@ -200,6 +200,7 @@ module CiteProc 
     | 
|
| 
       200 
200 
     | 
    
         | 
| 
       201 
201 
     | 
    
         
             
                include Attributes
         
     | 
| 
       202 
202 
     | 
    
         | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
       203 
204 
     | 
    
         
             
                alias attributes value
         
     | 
| 
       204 
205 
     | 
    
         
             
                protected :value, :attributes
         
     | 
| 
       205 
206 
     | 
    
         | 
| 
         @@ -214,7 +215,7 @@ module CiteProc 
     | 
|
| 
       214 
215 
     | 
    
         
             
                    require date_parser
         
     | 
| 
       215 
216 
     | 
    
         
             
                    @parsers << ::Object.const_get(module_id)
         
     | 
| 
       216 
217 
     | 
    
         
             
                  rescue LoadError
         
     | 
| 
       217 
     | 
    
         
            -
                    warn "failed to load `#{date_parser}' gem"
         
     | 
| 
      
 218 
     | 
    
         
            +
                    # warn "failed to load `#{date_parser}' gem"
         
     | 
| 
       218 
219 
     | 
    
         
             
                  end
         
     | 
| 
       219 
220 
     | 
    
         
             
                end
         
     | 
| 
       220 
221 
     | 
    
         | 
| 
         @@ -272,16 +273,15 @@ module CiteProc 
     | 
|
| 
       272 
273 
     | 
    
         
             
                  end
         
     | 
| 
       273 
274 
     | 
    
         | 
| 
       274 
275 
     | 
    
         
             
                  alias now today
         
     | 
| 
       275 
     | 
    
         
            -
             
     | 
| 
       276 
276 
     | 
    
         
             
                end
         
     | 
| 
       277 
277 
     | 
    
         | 
| 
       278 
278 
     | 
    
         | 
| 
       279 
     | 
    
         
            -
                attr_predicates :circa, :season, :literal, :'date-parts'
         
     | 
| 
       280 
     | 
    
         
            -
             
     | 
| 
       281 
279 
     | 
    
         
             
                # Make Date behave like a regular Ruby Date
         
     | 
| 
       282 
     | 
    
         
            -
                def_delegators :to_ruby,
         
     | 
| 
       283 
     | 
    
         
            -
                   
     | 
| 
      
 280 
     | 
    
         
            +
                def_delegators :to_ruby, *::Date.instance_methods(false).reject { |m|
         
     | 
| 
      
 281 
     | 
    
         
            +
                  m.to_s =~ /^[\W_]|[!=_]$|^(to_s|inspect|dup|clone|change)$|^(marshal|season|year|month|day|certain|uncertain)/
         
     | 
| 
      
 282 
     | 
    
         
            +
                }
         
     | 
| 
       284 
283 
     | 
    
         | 
| 
      
 284 
     | 
    
         
            +
                attr_predicates :circa, :season, :literal, :'date-parts'
         
     | 
| 
       285 
285 
     | 
    
         | 
| 
       286 
286 
     | 
    
         
             
                def initialize(value = {})
         
     | 
| 
       287 
287 
     | 
    
         
             
                  super
         
     | 
| 
         @@ -292,6 +292,14 @@ module CiteProc 
     | 
|
| 
       292 
292 
     | 
    
         
             
                  @value = other.value.deep_copy
         
     | 
| 
       293 
293 
     | 
    
         
             
                end
         
     | 
| 
       294 
294 
     | 
    
         | 
| 
      
 295 
     | 
    
         
            +
                def marshal_dump
         
     | 
| 
      
 296 
     | 
    
         
            +
                  to_citeproc
         
     | 
| 
      
 297 
     | 
    
         
            +
                end
         
     | 
| 
      
 298 
     | 
    
         
            +
             
     | 
| 
      
 299 
     | 
    
         
            +
                def marshal_load(value)
         
     | 
| 
      
 300 
     | 
    
         
            +
                  replace(value)
         
     | 
| 
      
 301 
     | 
    
         
            +
                end
         
     | 
| 
      
 302 
     | 
    
         
            +
             
     | 
| 
       295 
303 
     | 
    
         
             
                def merge(other)
         
     | 
| 
       296 
304 
     | 
    
         
             
                  super
         
     | 
| 
       297 
305 
     | 
    
         
             
                  convert_parts!
         
     | 
| 
         @@ -330,7 +338,7 @@ module CiteProc 
     | 
|
| 
       330 
338 
     | 
    
         
             
                        DateParts.new(value.max)
         
     | 
| 
       331 
339 
     | 
    
         
             
                      ]}
         
     | 
| 
       332 
340 
     | 
    
         
             
                  when value.is_a?(String) && /^\s*\{/ =~ value
         
     | 
| 
       333 
     | 
    
         
            -
                    return replace( 
     | 
| 
      
 341 
     | 
    
         
            +
                    return replace(::JSON.parse(value, :symbolize_names => true))
         
     | 
| 
       334 
342 
     | 
    
         
             
                  when value.respond_to?(:to_s)
         
     | 
| 
       335 
343 
     | 
    
         
             
                    @value = Date.parse!(value.to_s).value
         
     | 
| 
       336 
344 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -340,9 +348,11 @@ module CiteProc 
     | 
|
| 
       340 
348 
     | 
    
         
             
                  self
         
     | 
| 
       341 
349 
     | 
    
         
             
                end
         
     | 
| 
       342 
350 
     | 
    
         | 
| 
      
 351 
     | 
    
         
            +
                remove_method :date_parts
         
     | 
| 
      
 352 
     | 
    
         
            +
             
     | 
| 
       343 
353 
     | 
    
         
             
                # @return [Array<DateParts>]
         
     | 
| 
       344 
354 
     | 
    
         
             
                def date_parts
         
     | 
| 
       345 
     | 
    
         
            -
                   
     | 
| 
      
 355 
     | 
    
         
            +
                  value[:'date-parts'] ||= []
         
     | 
| 
       346 
356 
     | 
    
         
             
                end
         
     | 
| 
       347 
357 
     | 
    
         | 
| 
       348 
358 
     | 
    
         
             
                alias parts  date_parts
         
     | 
| 
         @@ -442,14 +452,14 @@ module CiteProc 
     | 
|
| 
       442 
452 
     | 
    
         
             
                # Marks the date as uncertain
         
     | 
| 
       443 
453 
     | 
    
         
             
                # @return [self]
         
     | 
| 
       444 
454 
     | 
    
         
             
                def uncertain!
         
     | 
| 
       445 
     | 
    
         
            -
                   
     | 
| 
      
 455 
     | 
    
         
            +
                  value[:circa] = true
         
     | 
| 
       446 
456 
     | 
    
         
             
                  self
         
     | 
| 
       447 
457 
     | 
    
         
             
                end
         
     | 
| 
       448 
458 
     | 
    
         | 
| 
       449 
459 
     | 
    
         
             
                # Marks the date as a certain date
         
     | 
| 
       450 
460 
     | 
    
         
             
                # @return [self]
         
     | 
| 
       451 
461 
     | 
    
         
             
                def certain!
         
     | 
| 
       452 
     | 
    
         
            -
                   
     | 
| 
      
 462 
     | 
    
         
            +
                  value[:circa] = false
         
     | 
| 
       453 
463 
     | 
    
         
             
                  self
         
     | 
| 
       454 
464 
     | 
    
         
             
                end
         
     | 
| 
       455 
465 
     | 
    
         | 
| 
         @@ -479,7 +489,7 @@ module CiteProc 
     | 
|
| 
       479 
489 
     | 
    
         | 
| 
       480 
490 
     | 
    
         
             
                # @return [Hash] a hash representation of the date.
         
     | 
| 
       481 
491 
     | 
    
         
             
                def to_citeproc
         
     | 
| 
       482 
     | 
    
         
            -
                  cp =  
     | 
| 
      
 492 
     | 
    
         
            +
                  cp = value.stringify_keys
         
     | 
| 
       483 
493 
     | 
    
         | 
| 
       484 
494 
     | 
    
         
             
                  # Convert (or suppress empty) date-parts
         
     | 
| 
       485 
495 
     | 
    
         
             
                  if parts.all?(&:empty?)
         
     | 
| 
         @@ -505,7 +515,8 @@ module CiteProc 
     | 
|
| 
       505 
515 
     | 
    
         | 
| 
       506 
516 
     | 
    
         
             
                def <=>(other)
         
     | 
| 
       507 
517 
     | 
    
         
             
                  case other
         
     | 
| 
       508 
     | 
    
         
            -
                  when Date
         
     | 
| 
      
 518 
     | 
    
         
            +
                  when CiteProc::Date
         
     | 
| 
      
 519 
     | 
    
         
            +
                    return nil if season? || other.season?
         
     | 
| 
       509 
520 
     | 
    
         
             
                    parts <=> other.parts
         
     | 
| 
       510 
521 
     | 
    
         
             
                  when ::Date
         
     | 
| 
       511 
522 
     | 
    
         
             
                    parts <=> [other]
         
     | 
    
        data/lib/citeproc/engine.rb
    CHANGED
    
    | 
         @@ -25,7 +25,7 @@ module CiteProc 
     | 
|
| 
       25 
25 
     | 
    
         
             
                  def default
         
     | 
| 
       26 
26 
     | 
    
         
             
                    @default ||= autodetect or warn 'no citeproc engine found'
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       29 
29 
     | 
    
         
             
                  # Returns the engine class for the given name or nil. If no suitable
         
     | 
| 
       30 
30 
     | 
    
         
             
                  # class is found and a block is given, executes the block and returns
         
     | 
| 
       31 
31 
     | 
    
         
             
                  # the result. The list of available engines will be passed to the block.
         
     | 
| 
         @@ -42,6 +42,8 @@ module CiteProc 
     | 
|
| 
       42 
42 
     | 
    
         | 
| 
       43 
43 
     | 
    
         
             
                  # Returns the best available engine class or nil.
         
     | 
| 
       44 
44 
     | 
    
         
             
                  def autodetect(options = {})
         
     | 
| 
      
 45 
     | 
    
         
            +
                    load('citeproc-ruby') if subclasses.empty?
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       45 
47 
     | 
    
         
             
                    subclasses.detect { |e|
         
     | 
| 
       46 
48 
     | 
    
         
             
                      !options.has_key?(:engine) || e.name == options[:engine] and
         
     | 
| 
       47 
49 
     | 
    
         
             
                      !options.has_key?(:name) || e.name == options[:name]
         
     | 
| 
         @@ -66,13 +68,12 @@ module CiteProc 
     | 
|
| 
       66 
68 
     | 
    
         | 
| 
       67 
69 
     | 
    
         
             
                  def priority
         
     | 
| 
       68 
70 
     | 
    
         
             
                    @priority ||= 0
         
     | 
| 
       69 
     | 
    
         
            -
                  end 
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
       70 
72 
     | 
    
         
             
                end
         
     | 
| 
       71 
73 
     | 
    
         | 
| 
       72 
74 
     | 
    
         
             
                attr_accessor :processor
         
     | 
| 
       73 
75 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                def_delegators :@processor, :options, : 
     | 
| 
       75 
     | 
    
         
            -
                  :items, :language, :region, :abbreviate
         
     | 
| 
      
 76 
     | 
    
         
            +
                def_delegators :@processor, :options, :abbreviate
         
     | 
| 
       76 
77 
     | 
    
         | 
| 
       77 
78 
     | 
    
         
             
                def initialize(processor = nil)
         
     | 
| 
       78 
79 
     | 
    
         
             
                  @processor = processor
         
     | 
| 
         @@ -97,6 +98,10 @@ module CiteProc 
     | 
|
| 
       97 
98 
     | 
    
         
             
                  raise NotImplementedByEngine
         
     | 
| 
       98 
99 
     | 
    
         
             
                end
         
     | 
| 
       99 
100 
     | 
    
         | 
| 
      
 101 
     | 
    
         
            +
                def render
         
     | 
| 
      
 102 
     | 
    
         
            +
                  raise NotImplementedByEngine
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
       100 
105 
     | 
    
         
             
                def update_items
         
     | 
| 
       101 
106 
     | 
    
         
             
                  raise NotImplementedByEngine
         
     | 
| 
       102 
107 
     | 
    
         
             
                end
         
     | 
    
        data/lib/citeproc/errors.rb
    CHANGED
    
    | 
         @@ -6,14 +6,14 @@ module CiteProc 
     | 
|
| 
       6 
6 
     | 
    
         
             
                def initialize(message, original = $!)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  @original = original
         
     | 
| 
       8 
8 
     | 
    
         
             
            			super(message)
         
     | 
| 
       9 
     | 
    
         
            -
                end 
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       10 
10 
     | 
    
         
             
              end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       12 
12 
     | 
    
         
             
            	ParseError = Class.new(Error)
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
       14 
14 
     | 
    
         
             
              EngineError = Class.new(Error)
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       16 
16 
     | 
    
         
             
              NotImplementedByEngine = Class.new(Error)
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
       18 
18 
     | 
    
         
             
              RenderingError = Class.new(Error)
         
     | 
| 
       19 
     | 
    
         
            -
            end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/citeproc/extensions.rb
    CHANGED
    
    | 
         @@ -1,38 +1,38 @@ 
     | 
|
| 
       1 
1 
     | 
    
         | 
| 
       2 
2 
     | 
    
         
             
            module CiteProc
         
     | 
| 
       3 
3 
     | 
    
         
             
              module Extensions
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                module Underscore
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def underscore(word)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    word = word.to_s.dup
         
     | 
| 
      
 8 
     | 
    
         
            +
                    word.gsub!(/::/, '/')
         
     | 
| 
      
 9 
     | 
    
         
            +
                    word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
         
     | 
| 
      
 10 
     | 
    
         
            +
                    word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
         
     | 
| 
      
 11 
     | 
    
         
            +
                    word.tr!('-', '_')
         
     | 
| 
      
 12 
     | 
    
         
            +
                    word.downcase!
         
     | 
| 
      
 13 
     | 
    
         
            +
                    word
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       17 
17 
     | 
    
         
             
                module DeepCopy
         
     | 
| 
       18 
18 
     | 
    
         
             
                  # See Matz, Flanagan: 'The Ruby Programming Language', p.83
         
     | 
| 
       19 
19 
     | 
    
         
             
                  def deep_copy
         
     | 
| 
       20 
20 
     | 
    
         
             
                    Marshal.load(Marshal.dump(self))
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         
             
                end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                module DeepFetch 
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                module DeepFetch
         
     | 
| 
       25 
25 
     | 
    
         
             
                  def deep_fetch(*arguments)
         
     | 
| 
       26 
26 
     | 
    
         
             
                    arguments.reduce(self) { |s,a| s[a] } rescue nil
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       29 
29 
     | 
    
         
             
                  def [](*arguments)
         
     | 
| 
       30 
30 
     | 
    
         
             
                    return super if arguments.length == 1
         
     | 
| 
       31 
31 
     | 
    
         
             
                    deep_fetch(*arguments)
         
     | 
| 
       32 
32 
     | 
    
         
             
                  end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       34 
34 
     | 
    
         
             
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       36 
36 
     | 
    
         
             
                # shamelessly copied from active_support
         
     | 
| 
       37 
37 
     | 
    
         
             
                module SymbolizeKeys
         
     | 
| 
       38 
38 
     | 
    
         
             
                  def symbolize_keys
         
     | 
| 
         @@ -41,53 +41,53 @@ module CiteProc 
     | 
|
| 
       41 
41 
     | 
    
         
             
                      options
         
     | 
| 
       42 
42 
     | 
    
         
             
                    end
         
     | 
| 
       43 
43 
     | 
    
         
             
                  end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       45 
45 
     | 
    
         
             
                  def symbolize_keys!
         
     | 
| 
       46 
46 
     | 
    
         
             
                    replace(symbolize_keys)
         
     | 
| 
       47 
47 
     | 
    
         
             
                  end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                end
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
                module StringifyKeys
         
     | 
| 
      
 52 
     | 
    
         
            +
                  def stringify_keys
         
     | 
| 
      
 53 
     | 
    
         
            +
                    inject({}) do |options, (key, value)|
         
     | 
| 
      
 54 
     | 
    
         
            +
                      options[(key.to_s rescue key) || key] = value
         
     | 
| 
      
 55 
     | 
    
         
            +
                      options
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  def stringify_keys!
         
     | 
| 
      
 60 
     | 
    
         
            +
                    replace(symbolize_keys)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                module CompactJoin
         
     | 
| 
      
 65 
     | 
    
         
            +
                  def compact_join(delimiter = ' ')
         
     | 
| 
      
 66 
     | 
    
         
            +
                    reject { |t| t.nil? || (t.respond_to?(:empty?) && t.empty?) }.join(delimiter)
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                # based and compatible to the active support version
         
     | 
| 
      
 71 
     | 
    
         
            +
                # module ToSentence
         
     | 
| 
      
 72 
     | 
    
         
            +
                #   def to_sentence(options = {})
         
     | 
| 
      
 73 
     | 
    
         
            +
                #     options = {
         
     | 
| 
      
 74 
     | 
    
         
            +
                #       :words_connector => ", ",
         
     | 
| 
      
 75 
     | 
    
         
            +
                #       :two_words_connector => " and ",
         
     | 
| 
      
 76 
     | 
    
         
            +
                #       :last_word_connector => ", and "
         
     | 
| 
      
 77 
     | 
    
         
            +
                #     }.merge!(options)
         
     | 
| 
      
 78 
     | 
    
         
            +
                #
         
     | 
| 
      
 79 
     | 
    
         
            +
                #     case length
         
     | 
| 
      
 80 
     | 
    
         
            +
                #     when 0
         
     | 
| 
      
 81 
     | 
    
         
            +
                #       ""
         
     | 
| 
      
 82 
     | 
    
         
            +
                #     when 1
         
     | 
| 
      
 83 
     | 
    
         
            +
                #       self[0].to_s.dup
         
     | 
| 
      
 84 
     | 
    
         
            +
                #     when 2
         
     | 
| 
      
 85 
     | 
    
         
            +
                #       "#{self[0]}#{options[:two_words_connector]}#{self[1]}"
         
     | 
| 
      
 86 
     | 
    
         
            +
                #     else
         
     | 
| 
      
 87 
     | 
    
         
            +
                #       "#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
         
     | 
| 
      
 88 
     | 
    
         
            +
                #     end
         
     | 
| 
      
 89 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 90 
     | 
    
         
            +
                # end
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
       92 
92 
     | 
    
         
             
                module AliasMethods
         
     | 
| 
       93 
93 
     | 
    
         
             
                  private
         
     | 
| 
         @@ -101,10 +101,10 @@ module CiteProc 
     | 
|
| 
       101 
101 
     | 
    
         
             
            end
         
     | 
| 
       102 
102 
     | 
    
         | 
| 
       103 
103 
     | 
    
         
             
            class Hash
         
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
      
 104 
     | 
    
         
            +
              warn "citeproc: re-defining Hash#deep_copy, this may cause conflicts with other libraries" if method_defined?(:deep_copy)
         
     | 
| 
       105 
105 
     | 
    
         
             
              include CiteProc::Extensions::DeepCopy
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
              warn "citeproc: re-defining Hash#deep_copy, this may cause conflicts with other libraries" if method_defined?(:deep_fetch)
         
     | 
| 
       108 
108 
     | 
    
         
             
              include CiteProc::Extensions::DeepFetch
         
     | 
| 
       109 
109 
     | 
    
         | 
| 
       110 
110 
     | 
    
         
             
              include CiteProc::Extensions::SymbolizeKeys unless method_defined?(:symbolize_keys)
         
     | 
| 
         @@ -112,15 +112,15 @@ class Hash 
     | 
|
| 
       112 
112 
     | 
    
         
             
            end
         
     | 
| 
       113 
113 
     | 
    
         | 
| 
       114 
114 
     | 
    
         
             
            class Array
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
      
 115 
     | 
    
         
            +
              include CiteProc::Extensions::CompactJoin
         
     | 
| 
      
 116 
     | 
    
         
            +
              # include CiteProc::Extensions::ToSentence unless method_defined?(:to_sentence)
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              warn "citeproc: re-defining Array#deep_copy, this may cause conflicts with other libraries" if method_defined?(:deep_copy)
         
     | 
| 
       119 
119 
     | 
    
         
             
              include CiteProc::Extensions::DeepCopy
         
     | 
| 
       120 
120 
     | 
    
         
             
            end
         
     | 
| 
       121 
121 
     | 
    
         | 
| 
       122 
122 
     | 
    
         
             
            class String
         
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
      
 123 
     | 
    
         
            +
              include CiteProc::Extensions::Underscore unless method_defined?(:underscore)
         
     | 
| 
       124 
124 
     | 
    
         
             
            end
         
     | 
| 
       125 
125 
     | 
    
         | 
| 
       126 
126 
     | 
    
         
             
            # module Kernel
         
     | 
    
        data/lib/citeproc/item.rb
    CHANGED
    
    | 
         @@ -84,16 +84,37 @@ module CiteProc 
     | 
|
| 
       84 
84 
     | 
    
         
             
                end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         | 
| 
      
 87 
     | 
    
         
            +
                # Returns a CitationItem with a copy of this item
         
     | 
| 
      
 88 
     | 
    
         
            +
                # attached as data.
         
     | 
| 
      
 89 
     | 
    
         
            +
                #
         
     | 
| 
      
 90 
     | 
    
         
            +
                # If given, number is added as the item's
         
     | 
| 
      
 91 
     | 
    
         
            +
                # citation-number variable.
         
     | 
| 
      
 92 
     | 
    
         
            +
                #
         
     | 
| 
      
 93 
     | 
    
         
            +
                # @params [Fixnum] number the item's citation-number
         
     | 
| 
      
 94 
     | 
    
         
            +
                # @returns [CitationItem] a citation item for this item
         
     | 
| 
      
 95 
     | 
    
         
            +
                def cite(number = nil)
         
     | 
| 
      
 96 
     | 
    
         
            +
                  CitationItem.new :id => id do |c|
         
     | 
| 
      
 97 
     | 
    
         
            +
                    c.data = dup
         
     | 
| 
      
 98 
     | 
    
         
            +
                    c.data[:'citation-number'] = number unless number.nil?
         
     | 
| 
      
 99 
     | 
    
         
            +
                  end
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
       87 
102 
     | 
    
         
             
                def observable_read_attribute(key)
         
     | 
| 
       88 
103 
     | 
    
         
             
                  value = original_read_attribute(key)
         
     | 
| 
      
 104 
     | 
    
         
            +
                  return if suppressed?(key)
         
     | 
| 
      
 105 
     | 
    
         
            +
                  value
         
     | 
| 
       89 
106 
     | 
    
         
             
                ensure
         
     | 
| 
       90 
107 
     | 
    
         
             
                  changed
         
     | 
| 
       91 
108 
     | 
    
         
             
                  notify_observers :read, key, value
         
     | 
| 
       92 
109 
     | 
    
         
             
                end
         
     | 
| 
       93 
110 
     | 
    
         | 
| 
       94 
111 
     | 
    
         
             
                alias original_read_attribute read_attribute
         
     | 
| 
      
 112 
     | 
    
         
            +
                alias unobservable_read_attribute read_attribute
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
       95 
114 
     | 
    
         
             
                alias read_attribute observable_read_attribute
         
     | 
| 
       96 
115 
     | 
    
         | 
| 
      
 116 
     | 
    
         
            +
                # Update [] alias!
         
     | 
| 
      
 117 
     | 
    
         
            +
                alias [] read_attribute
         
     | 
| 
       97 
118 
     | 
    
         | 
| 
       98 
119 
     | 
    
         
             
                # @param name [Symbol] the name of the variable
         
     | 
| 
       99 
120 
     | 
    
         
             
                #
         
     | 
| 
         @@ -111,6 +132,20 @@ module CiteProc 
     | 
|
| 
       111 
132 
     | 
    
         
             
                  read_attribute name
         
     | 
| 
       112 
133 
     | 
    
         
             
                end
         
     | 
| 
       113 
134 
     | 
    
         | 
| 
      
 135 
     | 
    
         
            +
                def language
         
     | 
| 
      
 136 
     | 
    
         
            +
                  unobservable_read_attribute(:language)
         
     | 
| 
      
 137 
     | 
    
         
            +
                end
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                # An Item is interpreted as being English unless it has
         
     | 
| 
      
 140 
     | 
    
         
            +
                # an attribute 'language' set to something other than 'en'.
         
     | 
| 
      
 141 
     | 
    
         
            +
                #
         
     | 
| 
      
 142 
     | 
    
         
            +
                # @return [Boolean] whether or not this is an English Item
         
     | 
| 
      
 143 
     | 
    
         
            +
                def english?
         
     | 
| 
      
 144 
     | 
    
         
            +
                  lang = language
         
     | 
| 
      
 145 
     | 
    
         
            +
                  lang.nil? || lang == 'en'
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
                alias en? english?
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
       114 
149 
     | 
    
         
             
                # Calls a block once for each field in the item, passing the field's
         
     | 
| 
       115 
150 
     | 
    
         
             
                # name-value pair as parameters.
         
     | 
| 
       116 
151 
     | 
    
         
             
                #
         
     | 
| 
         @@ -133,7 +168,6 @@ module CiteProc 
     | 
|
| 
       133 
168 
     | 
    
         
             
                    to_enum
         
     | 
| 
       134 
169 
     | 
    
         
             
                  end
         
     | 
| 
       135 
170 
     | 
    
         
             
                end
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
171 
     | 
    
         
             
                alias each_pair each
         
     | 
| 
       138 
172 
     | 
    
         | 
| 
       139 
173 
     | 
    
         
             
                # Calls a block once for each field in the item, passing the field's
         
     | 
| 
         @@ -158,6 +192,30 @@ module CiteProc 
     | 
|
| 
       158 
192 
     | 
    
         
             
                  end
         
     | 
| 
       159 
193 
     | 
    
         
             
                end
         
     | 
| 
       160 
194 
     | 
    
         | 
| 
      
 195 
     | 
    
         
            +
                def suppressed?(key)
         
     | 
| 
      
 196 
     | 
    
         
            +
                  suppressed.include?(key.to_s)
         
     | 
| 
      
 197 
     | 
    
         
            +
                end
         
     | 
| 
      
 198 
     | 
    
         
            +
             
     | 
| 
      
 199 
     | 
    
         
            +
                def suppress!(*keys)
         
     | 
| 
      
 200 
     | 
    
         
            +
                  keys.flatten.each do |key|
         
     | 
| 
      
 201 
     | 
    
         
            +
                    suppressed << key.to_s
         
     | 
| 
      
 202 
     | 
    
         
            +
                  end
         
     | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
      
 204 
     | 
    
         
            +
                  suppressed.sort!
         
     | 
| 
      
 205 
     | 
    
         
            +
                  suppressed.uniq!
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
                  self
         
     | 
| 
      
 208 
     | 
    
         
            +
                end
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
                def suppressed
         
     | 
| 
      
 211 
     | 
    
         
            +
                  @suppressed ||= []
         
     | 
| 
      
 212 
     | 
    
         
            +
                end
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
                def ==(other)
         
     | 
| 
      
 215 
     | 
    
         
            +
                  return false unless other.is_a?(Item)
         
     | 
| 
      
 216 
     | 
    
         
            +
                  id == other.id
         
     | 
| 
      
 217 
     | 
    
         
            +
                end
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
       161 
219 
     | 
    
         
             
                def <=>(other)
         
     | 
| 
       162 
220 
     | 
    
         
             
                  return nil unless other.is_a?(Attributes)
         
     | 
| 
       163 
221 
     | 
    
         
             
                  eql?(other) ? 0 : length <=> other.length
         
     | 
| 
         @@ -210,4 +268,4 @@ module CiteProc 
     | 
|
| 
       210 
268 
     | 
    
         
             
                end
         
     | 
| 
       211 
269 
     | 
    
         
             
              end
         
     | 
| 
       212 
270 
     | 
    
         | 
| 
       213 
     | 
    
         
            -
            end
         
     | 
| 
      
 271 
     | 
    
         
            +
            end
         
     |