prawn 0.14.0 → 0.15.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 +4 -4
- data/.yardopts +2 -1
- data/Rakefile +12 -0
- data/lib/prawn.rb +9 -21
- data/lib/prawn/document.rb +95 -68
- data/lib/prawn/document/bounding_box.rb +22 -4
- data/lib/prawn/document/column_box.rb +2 -0
- data/lib/prawn/document/graphics_state.rb +1 -1
- data/lib/prawn/document/internals.rb +2 -2
- data/lib/prawn/document/snapshot.rb +2 -1
- data/lib/prawn/document/span.rb +2 -0
- data/lib/prawn/encoding.rb +1 -1
- data/lib/prawn/font.rb +89 -75
- data/lib/prawn/font/afm.rb +3 -0
- data/lib/prawn/font/dfont.rb +1 -0
- data/lib/prawn/font/ttf.rb +2 -0
- data/lib/prawn/font_metric_cache.rb +3 -1
- data/lib/prawn/graphics.rb +2 -14
- data/lib/prawn/graphics/cap_style.rb +1 -0
- data/lib/prawn/graphics/color.rb +1 -0
- data/lib/prawn/graphics/dash.rb +3 -2
- data/lib/prawn/graphics/join_style.rb +2 -0
- data/lib/prawn/graphics/patterns.rb +1 -0
- data/lib/prawn/graphics/transformation.rb +1 -0
- data/lib/prawn/graphics/transparency.rb +2 -0
- data/lib/prawn/image_handler.rb +2 -0
- data/lib/prawn/images.rb +5 -0
- data/lib/prawn/images/image.rb +1 -0
- data/lib/prawn/images/jpg.rb +3 -0
- data/lib/prawn/images/png.rb +2 -0
- data/lib/prawn/layout.rb +8 -13
- data/lib/prawn/layout/grid.rb +15 -3
- data/lib/prawn/measurement_extensions.rb +4 -0
- data/lib/prawn/measurements.rb +2 -0
- data/lib/prawn/outline.rb +3 -1
- data/lib/prawn/repeater.rb +3 -1
- data/lib/prawn/security.rb +15 -7
- data/lib/prawn/security/arcfour.rb +52 -0
- data/lib/prawn/soft_mask.rb +3 -1
- data/lib/prawn/stamp.rb +2 -0
- data/lib/prawn/table.rb +2 -0
- data/lib/prawn/table/cell.rb +4 -1
- data/lib/prawn/table/cell/image.rb +1 -2
- data/lib/prawn/table/cell/in_table.rb +2 -0
- data/lib/prawn/table/cell/span_dummy.rb +1 -0
- data/lib/prawn/table/cells.rb +7 -2
- data/lib/prawn/table/column_width_calculator.rb +8 -2
- data/lib/prawn/text.rb +4 -2
- data/lib/prawn/text/box.rb +3 -0
- data/lib/prawn/text/formatted/arranger.rb +2 -0
- data/lib/prawn/text/formatted/box.rb +55 -50
- data/lib/prawn/text/formatted/fragment.rb +2 -0
- data/lib/prawn/text/formatted/line_wrap.rb +1 -0
- data/lib/prawn/text/formatted/parser.rb +2 -0
- data/lib/prawn/text/formatted/wrap.rb +2 -0
- data/lib/prawn/utilities.rb +5 -3
- data/manual/graphics/common_lines.rb +2 -0
- data/manual/text/group.rb +2 -0
- data/manual/text/text.rb +1 -1
- data/prawn.gemspec +4 -3
- data/spec/grid_spec.rb +11 -0
- data/spec/object_store_spec.rb +1 -96
- data/spec/reference_spec.rb +0 -57
- data/spec/spec_helper.rb +7 -0
- data/spec/table_spec.rb +26 -0
- metadata +172 -185
- data/lib/pdf/core.rb +0 -35
- data/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -79
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -89
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -311
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -99
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/prawn/templates.rb +0 -75
- data/spec/filters_spec.rb +0 -34
- data/spec/name_tree_spec.rb +0 -112
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/stream_spec.rb +0 -58
- data/spec/template_spec_obsolete.rb +0 -352
    
        data/lib/prawn/images/image.rb
    CHANGED
    
    
    
        data/lib/prawn/images/jpg.rb
    CHANGED
    
    | @@ -10,10 +10,13 @@ require 'stringio' | |
| 10 10 |  | 
| 11 11 | 
             
            module Prawn
         | 
| 12 12 | 
             
              module Images
         | 
| 13 | 
            +
             | 
| 13 14 | 
             
                # A convenience class that wraps the logic for extracting the parts
         | 
| 14 15 | 
             
                # of a JPG image that we need to embed them in a PDF
         | 
| 15 16 | 
             
                #
         | 
| 16 17 | 
             
                class JPG < Image
         | 
| 18 | 
            +
                  # @group Extension API
         | 
| 19 | 
            +
                  
         | 
| 17 20 | 
             
                  attr_reader :width, :height, :bits, :channels
         | 
| 18 21 | 
             
                  attr_accessor :scaled_width, :scaled_height
         | 
| 19 22 |  | 
    
        data/lib/prawn/images/png.rb
    CHANGED
    
    | @@ -17,6 +17,8 @@ module Prawn | |
| 17 17 | 
             
                # of a PNG image that we need to embed them in a PDF
         | 
| 18 18 | 
             
                #
         | 
| 19 19 | 
             
                class PNG < Image
         | 
| 20 | 
            +
                  # @group Extension API
         | 
| 21 | 
            +
             | 
| 20 22 | 
             
                  attr_reader :palette, :img_data, :transparency
         | 
| 21 23 | 
             
                  attr_reader :width, :height, :bits
         | 
| 22 24 | 
             
                  attr_reader :color_type, :compression_method, :filter_method
         | 
    
        data/lib/prawn/layout.rb
    CHANGED
    
    | @@ -2,19 +2,14 @@ require_relative "table" | |
| 2 2 | 
             
            require_relative "layout/grid"
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Prawn
         | 
| 5 | 
            +
              module Errors
         | 
| 5 6 |  | 
| 6 | 
            -
              | 
| 7 | 
            +
                # This error is raised when table data is malformed
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                InvalidTableData = Class.new(StandardError)
         | 
| 7 10 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
               # This error is raised when an empty or nil table is rendered
         | 
| 13 | 
            -
               #
         | 
| 14 | 
            -
               EmptyTable = Class.new(StandardError)
         | 
| 15 | 
            -
             end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
             module Layout
         | 
| 18 | 
            -
             | 
| 19 | 
            -
             end
         | 
| 11 | 
            +
                # This error is raised when an empty or nil table is rendered
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                EmptyTable = Class.new(StandardError)
         | 
| 14 | 
            +
              end
         | 
| 20 15 | 
             
            end
         | 
    
        data/lib/prawn/layout/grid.rb
    CHANGED
    
    | @@ -1,11 +1,18 @@ | |
| 1 1 | 
             
            module Prawn
         | 
| 2 2 | 
             
              class Document
         | 
| 3 | 
            +
                # @group Experimental API
         | 
| 3 4 |  | 
| 4 5 | 
             
                # Defines the grid system for a particular document.  Takes the number of
         | 
| 5 6 | 
             
                # rows and columns and the width to use for the gutter as the
         | 
| 6 7 | 
             
                # keys :rows, :columns, :gutter, :row_gutter, :column_gutter
         | 
| 7 8 | 
             
                #
         | 
| 9 | 
            +
                # Note that a completely new grid object is built each time define_grid()
         | 
| 10 | 
            +
                # is called. This means that all subsequent calls to grid() will use
         | 
| 11 | 
            +
                # the newly defined Grid object -- grids are not nestable like 
         | 
| 12 | 
            +
                # bounding boxes are.
         | 
| 13 | 
            +
             | 
| 8 14 | 
             
                def define_grid(options = {})
         | 
| 15 | 
            +
                  @boxes = nil
         | 
| 9 16 | 
             
                  @grid = Grid.new(self, options)
         | 
| 10 17 | 
             
                end
         | 
| 11 18 |  | 
| @@ -33,6 +40,8 @@ module Prawn | |
| 33 40 |  | 
| 34 41 | 
             
                # A Grid represents the entire grid system of a Page and calculates
         | 
| 35 42 | 
             
                # the column width and row height of the base box.
         | 
| 43 | 
            +
                #
         | 
| 44 | 
            +
                # @private
         | 
| 36 45 | 
             
                class Grid
         | 
| 37 46 | 
             
                  attr_reader :pdf, :columns, :rows, :gutter, :row_gutter, :column_gutter
         | 
| 38 47 | 
             
                  def initialize(pdf, options = {}) # :nodoc:
         | 
| @@ -86,7 +95,8 @@ module Prawn | |
| 86 95 | 
             
                # A Grid object has methods that allow easy access to the coordinates of
         | 
| 87 96 | 
             
                # its corners, which can be plugged into most existing prawnmethods.
         | 
| 88 97 | 
             
                #
         | 
| 89 | 
            -
                 | 
| 98 | 
            +
                # @private
         | 
| 99 | 
            +
                class GridBox
         | 
| 90 100 | 
             
                  attr_reader :pdf
         | 
| 91 101 |  | 
| 92 102 | 
             
                  def initialize(pdf, i, j)
         | 
| @@ -187,7 +197,9 @@ module Prawn | |
| 187 197 | 
             
                end
         | 
| 188 198 |  | 
| 189 199 | 
             
                # A MultiBox is specified by 2 Boxes and spans the areas between.
         | 
| 190 | 
            -
                 | 
| 200 | 
            +
                #
         | 
| 201 | 
            +
                # @private
         | 
| 202 | 
            +
                class MultiBox < GridBox #:nodoc:
         | 
| 191 203 | 
             
                  def initialize(pdf, b1, b2)
         | 
| 192 204 | 
             
                    @pdf = pdf
         | 
| 193 205 | 
             
                    @bs = [b1, b2]
         | 
| @@ -249,7 +261,7 @@ module Prawn | |
| 249 261 |  | 
| 250 262 | 
             
                private
         | 
| 251 263 | 
             
                def single_box(i, j)
         | 
| 252 | 
            -
                   | 
| 264 | 
            +
                  GridBox.new(self, i, j)
         | 
| 253 265 | 
             
                end
         | 
| 254 266 |  | 
| 255 267 | 
             
                def multi_box(b1, b2)
         | 
| @@ -7,11 +7,15 @@ | |
| 7 7 |  | 
| 8 8 | 
             
            require_relative 'measurements'
         | 
| 9 9 |  | 
| 10 | 
            +
            # @group Stable API
         | 
| 11 | 
            +
             | 
| 10 12 | 
             
            class Numeric
         | 
| 11 13 | 
             
              include Prawn::Measurements
         | 
| 12 14 | 
             
              # prawns' basic unit is PostScript-Point
         | 
| 13 15 | 
             
              # 72 points per inch
         | 
| 14 16 |  | 
| 17 | 
            +
              # @group Experimental API
         | 
| 18 | 
            +
              
         | 
| 15 19 | 
             
              def mm
         | 
| 16 20 | 
             
                return mm2pt(self)
         | 
| 17 21 | 
             
              end
         | 
    
        data/lib/prawn/measurements.rb
    CHANGED
    
    
    
        data/lib/prawn/outline.rb
    CHANGED
    
    | @@ -5,12 +5,14 @@ | |
| 5 5 | 
             
            # Author Jonathan Greenberg
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'forwardable'
         | 
| 8 | 
            -
             | 
| 8 | 
            +
            require "pdf/core/outline"
         | 
| 9 9 |  | 
| 10 10 | 
             
            module Prawn
         | 
| 11 11 |  | 
| 12 12 | 
             
              class Document
         | 
| 13 13 |  | 
| 14 | 
            +
                # @group Experimental API
         | 
| 15 | 
            +
             | 
| 14 16 | 
             
                # Lazily instantiates an Outline object for document. This is used as point of entry
         | 
| 15 17 | 
             
                # to methods to build the outline tree.
         | 
| 16 18 | 
             
                def outline
         | 
    
        data/lib/prawn/repeater.rb
    CHANGED
    
    | @@ -11,14 +11,16 @@ | |
| 11 11 | 
             
            module Prawn
         | 
| 12 12 |  | 
| 13 13 | 
             
              class Document
         | 
| 14 | 
            -
             | 
| 15 14 | 
             
                # A list of all repeaters in the document.
         | 
| 16 15 | 
             
                # See Document#repeat for details
         | 
| 17 16 | 
             
                #
         | 
| 17 | 
            +
                # @private
         | 
| 18 18 | 
             
                def repeaters
         | 
| 19 19 | 
             
                  @repeaters ||= []
         | 
| 20 20 | 
             
                end
         | 
| 21 21 |  | 
| 22 | 
            +
                # @group Experimental API
         | 
| 23 | 
            +
             | 
| 22 24 | 
             
                # Provides a way to execute a block of code repeatedly based on a
         | 
| 23 25 | 
             
                # page_filter.  Since Stamp is used under the hood, this method is very space
         | 
| 24 26 | 
             
                # efficient.
         | 
    
        data/lib/prawn/security.rb
    CHANGED
    
    | @@ -7,9 +7,10 @@ | |
| 7 7 | 
             
            # This is free software. Please see the LICENSE and COPYING files for details.
         | 
| 8 8 |  | 
| 9 9 | 
             
            require 'digest/md5'
         | 
| 10 | 
            -
            require 'rc4'
         | 
| 11 10 |  | 
| 12 | 
            -
             | 
| 11 | 
            +
            require 'pdf/core/byte_string'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            require 'prawn/security/arcfour'
         | 
| 13 14 |  | 
| 14 15 | 
             
            module Prawn
         | 
| 15 16 | 
             
              class Document
         | 
| @@ -19,6 +20,8 @@ module Prawn | |
| 19 20 | 
             
                module Security
         | 
| 20 21 | 
             
                  include PDF::Core
         | 
| 21 22 |  | 
| 23 | 
            +
                  # @group Experimental API
         | 
| 24 | 
            +
             | 
| 22 25 | 
             
                  # Encrypts the document, to protect confidential data or control
         | 
| 23 26 | 
             
                  # modifications to the document. The encryption algorithm used is
         | 
| 24 27 | 
             
                  # detailed in the PDF Reference 1.3, section 3.5 "Encryption", and it is
         | 
| @@ -117,7 +120,7 @@ module Prawn | |
| 117 120 |  | 
| 118 121 | 
             
                    # Compute the RC4 key from the extended key and perform the encryption
         | 
| 119 122 | 
             
                    rc4_key = Digest::MD5.digest(extended_key)[0, 10]
         | 
| 120 | 
            -
                     | 
| 123 | 
            +
                    Arcfour.new(rc4_key).encrypt(str)
         | 
| 121 124 | 
             
                  end
         | 
| 122 125 |  | 
| 123 126 | 
             
                  private
         | 
| @@ -187,13 +190,13 @@ module Prawn | |
| 187 190 | 
             
                  def owner_password_hash
         | 
| 188 191 | 
             
                    @owner_password_hash ||= begin
         | 
| 189 192 | 
             
                      key = Digest::MD5.digest(pad_password(@owner_password))[0, 5]
         | 
| 190 | 
            -
                       | 
| 193 | 
            +
                      Arcfour.new(key).encrypt(pad_password(@user_password))
         | 
| 191 194 | 
             
                    end
         | 
| 192 195 | 
             
                  end
         | 
| 193 196 |  | 
| 194 197 | 
             
                  # The U (user) value in the encryption dictionary. Algorithm 3.4.
         | 
| 195 198 | 
             
                  def user_password_hash
         | 
| 196 | 
            -
                     | 
| 199 | 
            +
                    Arcfour.new(user_encryption_key).encrypt(PasswordPadding)
         | 
| 197 200 | 
             
                  end
         | 
| 198 201 |  | 
| 199 202 | 
             
                end
         | 
| @@ -201,14 +204,17 @@ module Prawn | |
| 201 204 | 
             
              end
         | 
| 202 205 | 
             
            end
         | 
| 203 206 |  | 
| 204 | 
            -
             | 
| 207 | 
            +
            # @private
         | 
| 208 | 
            +
            module PDF
         | 
| 205 209 | 
             
              module Core
         | 
| 206 210 | 
             
                module_function
         | 
| 207 211 |  | 
| 208 212 | 
             
                # Like PdfObject, but returns an encrypted result if required.
         | 
| 209 213 | 
             
                # For direct objects, requires the object identifier and generation number
         | 
| 210 214 | 
             
                # from the indirect object referencing obj.
         | 
| 211 | 
            -
                 | 
| 215 | 
            +
                #
         | 
| 216 | 
            +
                # @private
         | 
| 217 | 
            +
                def EncryptedPdfObject(obj, key, id, gen, in_content_stream=false) 
         | 
| 212 218 | 
             
                  case obj
         | 
| 213 219 | 
             
                  when Array
         | 
| 214 220 | 
             
                    "[" << obj.map { |e|
         | 
| @@ -248,6 +254,7 @@ module PDF #:nodoc: | |
| 248 254 | 
             
                end
         | 
| 249 255 |  | 
| 250 256 |  | 
| 257 | 
            +
                # @private
         | 
| 251 258 | 
             
                class Stream
         | 
| 252 259 | 
             
                  def encrypted_object(key, id, gen)
         | 
| 253 260 | 
             
                    if filtered_stream
         | 
| @@ -258,6 +265,7 @@ module PDF #:nodoc: | |
| 258 265 | 
             
                  end
         | 
| 259 266 | 
             
                end
         | 
| 260 267 |  | 
| 268 | 
            +
                # @private
         | 
| 261 269 | 
             
                class Reference
         | 
| 262 270 |  | 
| 263 271 | 
             
                  # Returns the object definition for the object this references, keyed from
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            # Implementation of the "ARCFOUR" algorithm ("alleged RC4 (tm)"). Implemented
         | 
| 2 | 
            +
            # as described at:
         | 
| 3 | 
            +
            # http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # "RC4" is a trademark of RSA Data Security, Inc.
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # Copyright August 2009, Brad Ediger. All Rights Reserved.
         | 
| 8 | 
            +
            #
         | 
| 9 | 
            +
            # This is free software. Please see the LICENSE and COPYING files for details.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            # @private
         | 
| 12 | 
            +
            class Arcfour
         | 
| 13 | 
            +
              def initialize(key)
         | 
| 14 | 
            +
                # Convert string key to Array of integers
         | 
| 15 | 
            +
                key = key.unpack('c*') if key.is_a?(String)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # 1. Allocate an 256 element array of 8 bit bytes to be used as an S-box
         | 
| 18 | 
            +
                # 2. Initialize the S-box.  Fill each entry first with it's index
         | 
| 19 | 
            +
                @sbox = (0..255).to_a
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                # 3. Fill another array of the same size (256) with the key, repeating
         | 
| 22 | 
            +
                #    bytes as necessary.
         | 
| 23 | 
            +
                s2 = []
         | 
| 24 | 
            +
                while s2.length < 256
         | 
| 25 | 
            +
                  s2 += key
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                s2 = s2[0, 256]
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # 4. Set j to zero and initialize the S-box
         | 
| 30 | 
            +
                j = 0
         | 
| 31 | 
            +
                (0..255).each do |i|
         | 
| 32 | 
            +
                  j = (j + @sbox[i] + s2[i]) % 256
         | 
| 33 | 
            +
                  @sbox[i], @sbox[j] = @sbox[j], @sbox[i]
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                @i = @j = 0
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              def encrypt(string)
         | 
| 40 | 
            +
                string.unpack('c*').map{|byte| byte ^ key_byte}.pack('c*')
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
              
         | 
| 43 | 
            +
              private
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              # Produces the next byte of key material in the stream (3.2 Stream Generation)
         | 
| 46 | 
            +
              def key_byte
         | 
| 47 | 
            +
                @i = (@i + 1) % 256
         | 
| 48 | 
            +
                @j = (@j + @sbox[@i]) % 256
         | 
| 49 | 
            +
                @sbox[@i], @sbox[@j] = @sbox[@j], @sbox[@i]
         | 
| 50 | 
            +
                @sbox[(@sbox[@i] + @sbox[@j]) % 256]
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
    
        data/lib/prawn/soft_mask.rb
    CHANGED
    
    | @@ -10,7 +10,7 @@ | |
| 10 10 | 
             
            module Prawn
         | 
| 11 11 |  | 
| 12 12 | 
             
              # The Prawn::SoftMask module is used to create arbitrary transparency in
         | 
| 13 | 
            -
              # document. Using a soft mask allows  | 
| 13 | 
            +
              # document. Using a soft mask allows creating more visually rich documents.
         | 
| 14 14 | 
             
              #
         | 
| 15 15 | 
             
              # You must group soft mask and graphics it's applied to under
         | 
| 16 16 | 
             
              # save_graphics_state because soft mask is a part of graphic state in PDF.
         | 
| @@ -26,6 +26,8 @@ module Prawn | |
| 26 26 | 
             
              #   end
         | 
| 27 27 | 
             
              #
         | 
| 28 28 | 
             
              module SoftMask
         | 
| 29 | 
            +
                # @group Stable API
         | 
| 30 | 
            +
             | 
| 29 31 | 
             
                def soft_mask(&block)
         | 
| 30 32 | 
             
                  min_version(1.4)
         | 
| 31 33 |  | 
    
        data/lib/prawn/stamp.rb
    CHANGED
    
    
    
        data/lib/prawn/table.rb
    CHANGED
    
    
    
        data/lib/prawn/table/cell.rb
    CHANGED
    
    | @@ -10,6 +10,8 @@ require 'date' | |
| 10 10 | 
             
            module Prawn
         | 
| 11 11 | 
             
              class Document
         | 
| 12 12 |  | 
| 13 | 
            +
                # @group Experimental API
         | 
| 14 | 
            +
             | 
| 13 15 | 
             
                # Instantiates and draws a cell on the document.
         | 
| 14 16 | 
             
                #
         | 
| 15 17 | 
             
                #   cell(:content => "Hello world!", :at => [12, 34])
         | 
| @@ -151,7 +153,8 @@ module Prawn | |
| 151 153 | 
             
                  # this span group. They know their own width / height, but do not draw
         | 
| 152 154 | 
             
                  # anything.
         | 
| 153 155 | 
             
                  #
         | 
| 154 | 
            -
                   | 
| 156 | 
            +
                  # @private
         | 
| 157 | 
            +
                  attr_reader :dummy_cells 
         | 
| 155 158 |  | 
| 156 159 | 
             
                  # Instantiates a Cell based on the given options. The particular class of
         | 
| 157 160 | 
             
                  # cell returned depends on the :content argument. See the Prawn::Table
         | 
    
        data/lib/prawn/table/cells.rb
    CHANGED
    
    | @@ -8,7 +8,6 @@ | |
| 8 8 |  | 
| 9 9 | 
             
            module Prawn
         | 
| 10 10 | 
             
              class Table
         | 
| 11 | 
            -
             | 
| 12 11 | 
             
                # Selects the given rows (0-based) for styling. Returns a Cells object --
         | 
| 13 12 | 
             
                # see the documentation on Cells for things you can do with cells.
         | 
| 14 13 | 
             
                #
         | 
| @@ -38,6 +37,8 @@ module Prawn | |
| 38 37 | 
             
                #
         | 
| 39 38 | 
             
                class Cells < Array
         | 
| 40 39 |  | 
| 40 | 
            +
                  # @group Experimental API
         | 
| 41 | 
            +
             | 
| 41 42 | 
             
                  # Limits selection to the given row or rows. +row_spec+ can be anything
         | 
| 42 43 | 
             
                  # that responds to the === operator selecting a set of 0-based row
         | 
| 43 44 | 
             
                  # numbers; most commonly a number or a range.
         | 
| @@ -254,7 +255,11 @@ module Prawn | |
| 254 255 |  | 
| 255 256 | 
             
                        #calculate future return value
         | 
| 256 257 | 
             
                        new_sum = cell.send(meth) * cell.colspan
         | 
| 257 | 
            -
             | 
| 258 | 
            +
             | 
| 259 | 
            +
                        #due to float rounding errors we need to ignore a small difference in the new 
         | 
| 260 | 
            +
                        #and the old sum the same had to be done in
         | 
| 261 | 
            +
                        #the column_width_calculator#natural_width
         | 
| 262 | 
            +
                        spanned_width_needs_fixing = ((new_sum - old_sum) > Prawn::FLOAT_PRECISION)
         | 
| 258 263 |  | 
| 259 264 | 
             
                        if spanned_width_needs_fixing
         | 
| 260 265 | 
             
                          #not entirely sure why we need this line, but with it the tests pass
         | 
| @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            module Prawn
         | 
| 2 2 | 
             
              class Table
         | 
| 3 | 
            -
                 | 
| 3 | 
            +
                # @private
         | 
| 4 | 
            +
                class ColumnWidthCalculator 
         | 
| 4 5 | 
             
                  def initialize(cells)
         | 
| 5 6 | 
             
                    @cells = cells
         | 
| 6 7 |  | 
| @@ -37,7 +38,12 @@ module Prawn | |
| 37 38 | 
             
                                           .collect{|key, value| value}.inject(0, :+)
         | 
| 38 39 |  | 
| 39 40 | 
             
                        #update the Hash only if the new with is at least equal to the old one
         | 
| 40 | 
            -
                         | 
| 41 | 
            +
                        #due to arithmetic errors we need to ignore a small difference in the new and the old sum
         | 
| 42 | 
            +
                        #the same had to be done in the column_widht_calculator#natural_width
         | 
| 43 | 
            +
                        update_hash = ((cell.width.to_f - current_width_of_spanned_cells) > 
         | 
| 44 | 
            +
                                       Prawn::FLOAT_PRECISION)
         | 
| 45 | 
            +
                        
         | 
| 46 | 
            +
                        if update_hash
         | 
| 41 47 | 
             
                          # Split the width of colspanned cells evenly by columns
         | 
| 42 48 | 
             
                          width_per_column = cell.width.to_f / cell.colspan
         | 
| 43 49 | 
             
                          # Update the Hash
         |