prawn 2.0.1 → 2.0.2

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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +7 -5
  3. data/lib/prawn.rb +4 -4
  4. data/lib/prawn/document.rb +47 -46
  5. data/lib/prawn/document/bounding_box.rb +13 -19
  6. data/lib/prawn/document/column_box.rb +3 -5
  7. data/lib/prawn/document/internals.rb +0 -1
  8. data/lib/prawn/document/span.rb +12 -12
  9. data/lib/prawn/errors.rb +32 -33
  10. data/lib/prawn/font.rb +29 -36
  11. data/lib/prawn/font/afm.rb +20 -20
  12. data/lib/prawn/font/dfont.rb +0 -1
  13. data/lib/prawn/font/ttf.rb +30 -27
  14. data/lib/prawn/font_metric_cache.rb +4 -8
  15. data/lib/prawn/graphics.rb +37 -42
  16. data/lib/prawn/graphics/cap_style.rb +1 -1
  17. data/lib/prawn/graphics/color.rb +21 -23
  18. data/lib/prawn/graphics/dash.rb +5 -6
  19. data/lib/prawn/graphics/join_style.rb +1 -2
  20. data/lib/prawn/graphics/patterns.rb +25 -21
  21. data/lib/prawn/graphics/transformation.rb +4 -5
  22. data/lib/prawn/graphics/transparency.rb +6 -8
  23. data/lib/prawn/grid.rb +21 -14
  24. data/lib/prawn/image_handler.rb +2 -2
  25. data/lib/prawn/images.rb +29 -31
  26. data/lib/prawn/images/image.rb +1 -1
  27. data/lib/prawn/images/jpg.rb +10 -12
  28. data/lib/prawn/images/png.rb +13 -13
  29. data/lib/prawn/measurements.rb +7 -14
  30. data/lib/prawn/outline.rb +6 -6
  31. data/lib/prawn/repeater.rb +1 -5
  32. data/lib/prawn/security.rb +17 -25
  33. data/lib/prawn/security/arcfour.rb +1 -1
  34. data/lib/prawn/soft_mask.rb +11 -12
  35. data/lib/prawn/stamp.rb +16 -8
  36. data/lib/prawn/text.rb +23 -20
  37. data/lib/prawn/text/box.rb +3 -6
  38. data/lib/prawn/text/formatted/arranger.rb +9 -12
  39. data/lib/prawn/text/formatted/box.rb +23 -22
  40. data/lib/prawn/text/formatted/fragment.rb +0 -4
  41. data/lib/prawn/text/formatted/line_wrap.rb +13 -24
  42. data/lib/prawn/text/formatted/parser.rb +16 -20
  43. data/lib/prawn/text/formatted/wrap.rb +2 -7
  44. data/lib/prawn/utilities.rb +6 -3
  45. data/lib/prawn/version.rb +1 -1
  46. data/manual/basic_concepts/basic_concepts.rb +0 -2
  47. data/manual/basic_concepts/view.rb +1 -1
  48. data/manual/bounding_box/bounding_box.rb +0 -3
  49. data/manual/bounding_box/russian_boxes.rb +7 -8
  50. data/manual/bounding_box/stretchy.rb +0 -1
  51. data/manual/contents.rb +2 -2
  52. data/manual/cover.rb +11 -12
  53. data/manual/document_and_page_options/document_and_page_options.rb +2 -5
  54. data/manual/document_and_page_options/metadata.rb +10 -10
  55. data/manual/document_and_page_options/page_size.rb +0 -1
  56. data/manual/graphics/fill_rules.rb +5 -4
  57. data/manual/graphics/graphics.rb +0 -3
  58. data/manual/graphics/lines_and_curves.rb +1 -1
  59. data/manual/graphics/rotate.rb +0 -2
  60. data/manual/graphics/scale.rb +4 -2
  61. data/manual/graphics/soft_masks.rb +0 -1
  62. data/manual/graphics/stroke_cap.rb +1 -1
  63. data/manual/graphics/stroke_join.rb +1 -1
  64. data/manual/graphics/translate.rb +3 -3
  65. data/manual/graphics/transparency.rb +0 -1
  66. data/manual/how_to_read_this_manual.rb +0 -1
  67. data/manual/images/images.rb +0 -3
  68. data/manual/layout/boxes.rb +5 -5
  69. data/manual/layout/content.rb +2 -2
  70. data/manual/layout/layout.rb +0 -3
  71. data/manual/outline/outline.rb +0 -3
  72. data/manual/repeatable_content/page_numbering.rb +1 -1
  73. data/manual/repeatable_content/repeatable_content.rb +0 -3
  74. data/manual/repeatable_content/repeater.rb +6 -6
  75. data/manual/security/encryption.rb +0 -2
  76. data/manual/security/permissions.rb +0 -2
  77. data/manual/security/security.rb +0 -3
  78. data/manual/text/alignment.rb +3 -3
  79. data/manual/text/color.rb +0 -1
  80. data/manual/text/column_box.rb +0 -1
  81. data/manual/text/fallback_fonts.rb +2 -2
  82. data/manual/text/formatted_callbacks.rb +3 -2
  83. data/manual/text/paragraph_indentation.rb +2 -3
  84. data/manual/text/registering_families.rb +13 -9
  85. data/manual/text/rotation.rb +0 -1
  86. data/manual/text/text.rb +0 -3
  87. data/manual/text/text_box_overflow.rb +7 -5
  88. data/manual/text/utf8.rb +1 -1
  89. data/manual/text/win_ansi_charset.rb +2 -2
  90. data/prawn.gemspec +4 -4
  91. data/spec/acceptance/png.rb +6 -7
  92. data/spec/annotations_spec.rb +21 -28
  93. data/spec/bounding_box_spec.rb +100 -109
  94. data/spec/column_box_spec.rb +26 -32
  95. data/spec/destinations_spec.rb +2 -4
  96. data/spec/document_spec.rb +145 -151
  97. data/spec/extensions/mocha.rb +0 -1
  98. data/spec/font_metric_cache_spec.rb +7 -7
  99. data/spec/font_spec.rb +103 -102
  100. data/spec/formatted_text_arranger_spec.rb +76 -74
  101. data/spec/formatted_text_box_spec.rb +170 -159
  102. data/spec/formatted_text_fragment_spec.rb +57 -56
  103. data/spec/graphics_spec.rb +158 -175
  104. data/spec/grid_spec.rb +28 -29
  105. data/spec/image_handler_spec.rb +4 -5
  106. data/spec/images_spec.rb +50 -36
  107. data/spec/inline_formatted_text_parser_spec.rb +397 -393
  108. data/spec/jpg_spec.rb +4 -6
  109. data/spec/line_wrap_spec.rb +54 -55
  110. data/spec/measurement_units_spec.rb +12 -15
  111. data/spec/outline_spec.rb +77 -98
  112. data/spec/png_spec.rb +55 -65
  113. data/spec/reference_spec.rb +3 -3
  114. data/spec/repeater_spec.rb +20 -26
  115. data/spec/security_spec.rb +42 -49
  116. data/spec/soft_mask_spec.rb +4 -5
  117. data/spec/span_spec.rb +5 -6
  118. data/spec/spec_helper.rb +2 -4
  119. data/spec/stamp_spec.rb +41 -22
  120. data/spec/stroke_styles_spec.rb +36 -39
  121. data/spec/text_at_spec.rb +28 -29
  122. data/spec/text_box_spec.rb +160 -165
  123. data/spec/text_rendering_mode_spec.rb +9 -9
  124. data/spec/text_spacing_spec.rb +13 -13
  125. data/spec/text_spec.rb +116 -124
  126. data/spec/text_with_inline_formatting_spec.rb +5 -5
  127. data/spec/transparency_spec.rb +20 -20
  128. data/spec/view_spec.rb +0 -1
  129. metadata +7 -7
@@ -10,7 +10,6 @@
10
10
  module Prawn
11
11
  module Text
12
12
  module Formatted #:nodoc:
13
-
14
13
  # @private
15
14
 
16
15
  class Arranger #:nodoc:
@@ -24,7 +23,7 @@ module Prawn
24
23
  attr_reader :fragments
25
24
  attr_reader :current_format_state
26
25
 
27
- def initialize(document, options={})
26
+ def initialize(document, options = {})
28
27
  @document = document
29
28
  @fragments = []
30
29
  @unconsumed = []
@@ -33,7 +32,7 @@ module Prawn
33
32
 
34
33
  def space_count
35
34
  if @unfinalized_line
36
- raise "Lines must be finalized before calling #space_count"
35
+ fail "Lines must be finalized before calling #space_count"
37
36
  end
38
37
  @fragments.inject(0) do |sum, fragment|
39
38
  sum + fragment.space_count
@@ -42,7 +41,7 @@ module Prawn
42
41
 
43
42
  def line_width
44
43
  if @unfinalized_line
45
- raise "Lines must be finalized before calling #line_width"
44
+ fail "Lines must be finalized before calling #line_width"
46
45
  end
47
46
  @fragments.inject(0) do |sum, fragment|
48
47
  sum + fragment.width
@@ -51,7 +50,7 @@ module Prawn
51
50
 
52
51
  def line
53
52
  if @unfinalized_line
54
- raise "Lines must be finalized before calling #line"
53
+ fail "Lines must be finalized before calling #line"
55
54
  end
56
55
  @fragments.collect do |fragment|
57
56
  fragment.text.dup.force_encoding(::Encoding::UTF_8)
@@ -101,7 +100,7 @@ module Prawn
101
100
 
102
101
  def next_string
103
102
  unless @unfinalized_line
104
- raise "Lines must not be finalized when calling #next_string"
103
+ fail "Lines must not be finalized when calling #next_string"
105
104
  end
106
105
  hash = @unconsumed.shift
107
106
  if hash.nil?
@@ -135,7 +134,7 @@ module Prawn
135
134
  end
136
135
  end
137
136
 
138
- def apply_font_settings(fragment=nil, &block)
137
+ def apply_font_settings(fragment = nil, &block)
139
138
  if fragment.nil?
140
139
  font = current_format_state[:font]
141
140
  size = current_format_state[:size]
@@ -153,7 +152,7 @@ module Prawn
153
152
 
154
153
  @document.character_spacing(character_spacing) do
155
154
  if font || font_style != :normal
156
- raise "Bad font family" unless @document.font.family
155
+ fail "Bad font family" unless @document.font.family
157
156
  @document.font(font || @document.font.family, :style => font_style) do
158
157
  apply_font_size(size, styles, &block)
159
158
  end
@@ -163,7 +162,7 @@ module Prawn
163
162
  end
164
163
  end
165
164
 
166
- def update_last_string(printed, unprinted, normalized_soft_hyphen=nil)
165
+ def update_last_string(printed, unprinted, normalized_soft_hyphen = nil)
167
166
  return if printed.nil?
168
167
  if printed.empty?
169
168
  @consumed.pop
@@ -183,7 +182,7 @@ module Prawn
183
182
 
184
183
  def retrieve_fragment
185
184
  if @unfinalized_line
186
- raise "Lines must be finalized before fragments can be retrieved"
185
+ fail "Lines must be finalized before fragments can be retrieved"
187
186
  end
188
187
  @fragments.shift
189
188
  end
@@ -282,9 +281,7 @@ module Prawn
282
281
  @max_descender = [defined?(@max_descender) && @max_descender, fragment.descender].compact.max
283
282
  @max_ascender = [defined?(@max_ascender) && @max_ascender, fragment.ascender].compact.max
284
283
  end
285
-
286
284
  end
287
-
288
285
  end
289
286
  end
290
287
  end
@@ -88,7 +88,7 @@ module Prawn
88
88
  # Raises <tt>Prawn::Errors::CannotFit</tt> if not wide enough to print
89
89
  # any text
90
90
  #
91
- def formatted_text_box(array, options={})
91
+ def formatted_text_box(array, options = {})
92
92
  Text::Formatted::Box.new(array, options.merge(:document => self)).render
93
93
  end
94
94
 
@@ -136,7 +136,7 @@ module Prawn
136
136
 
137
137
  # See Prawn::Text#text_box for valid options
138
138
  #
139
- def initialize(formatted_text, options={})
139
+ def initialize(formatted_text, options = {})
140
140
  @inked = false
141
141
  Prawn.verify_options(valid_options, options)
142
142
  options = options.dup
@@ -187,8 +187,8 @@ module Prawn
187
187
  options[:kerning] = @document.default_kerning?
188
188
  end
189
189
  @options = { :kerning => options[:kerning],
190
- :size => options[:size],
191
- :style => options[:style] }
190
+ :size => options[:size],
191
+ :style => options[:style] }
192
192
 
193
193
  super(formatted_text, options)
194
194
  end
@@ -203,7 +203,7 @@ module Prawn
203
203
  #
204
204
  # Returns any text that did not print under the current settings
205
205
  #
206
- def render(flags={})
206
+ def render(flags = {})
207
207
  unprinted_text = []
208
208
 
209
209
  @document.save_font do
@@ -248,7 +248,7 @@ module Prawn
248
248
 
249
249
  # <tt>fragment</tt> is a Prawn::Text::Formatted::Fragment object
250
250
  #
251
- def draw_fragment(fragment, accumulated_width=0, line_width=0, word_spacing=0) #:nodoc:
251
+ def draw_fragment(fragment, accumulated_width = 0, line_width = 0, word_spacing = 0) #:nodoc:
252
252
  case(@align)
253
253
  when :left
254
254
  x = @at[0]
@@ -279,10 +279,10 @@ module Prawn
279
279
  @document.word_spacing(word_spacing) {
280
280
  if @draw_text_callback
281
281
  @draw_text_callback.call(fragment.text, :at => [x, y],
282
- :kerning => @kerning)
282
+ :kerning => @kerning)
283
283
  else
284
284
  @document.draw_text!(fragment.text, :at => [x, y],
285
- :kerning => @kerning)
285
+ :kerning => @kerning)
286
286
  end
287
287
  }
288
288
 
@@ -329,17 +329,20 @@ module Prawn
329
329
  end
330
330
 
331
331
  def valid_options
332
- PDF::Core::Text::VALID_OPTIONS + [:at, :height, :width,
333
- :align, :valign,
334
- :rotate, :rotate_around,
335
- :overflow, :min_font_size,
336
- :disable_wrap_by_char,
337
- :leading, :character_spacing,
338
- :mode, :single_line,
339
- :document,
340
- :direction,
341
- :fallback_fonts,
342
- :draw_text_callback]
332
+ PDF::Core::Text::VALID_OPTIONS + [
333
+ :at,
334
+ :height, :width,
335
+ :align, :valign,
336
+ :rotate, :rotate_around,
337
+ :overflow, :min_font_size,
338
+ :disable_wrap_by_char,
339
+ :leading, :character_spacing,
340
+ :mode, :single_line,
341
+ :document,
342
+ :direction,
343
+ :fallback_fonts,
344
+ :draw_text_callback
345
+ ]
343
346
  end
344
347
 
345
348
  private
@@ -353,7 +356,7 @@ module Prawn
353
356
  end
354
357
 
355
358
  def original_text
356
- @original_array.collect { |hash| hash.dup }
359
+ @original_array.collect(&:dup)
357
360
  end
358
361
 
359
362
  def original_text=(formatted_text)
@@ -606,9 +609,7 @@ module Prawn
606
609
  @document.stroke_line(fragment.strikethrough_points)
607
610
  end
608
611
  end
609
-
610
612
  end
611
-
612
613
  end
613
614
  end
614
615
  end
@@ -9,14 +9,11 @@
9
9
  module Prawn
10
10
  module Text
11
11
  module Formatted
12
-
13
-
14
12
  # Prawn::Text::Formatted::Fragment is a state store for a formatted text
15
13
  # fragment. It does not render anything.
16
14
  #
17
15
  # @private
18
16
  class Fragment
19
-
20
17
  attr_reader :format_state, :text
21
18
  attr_writer :width
22
19
  attr_accessor :line_height, :descender, :ascender
@@ -257,7 +254,6 @@ module Prawn
257
254
  string
258
255
  end
259
256
  end
260
-
261
257
  end
262
258
  end
263
259
  end
@@ -11,10 +11,8 @@
11
11
  module Prawn
12
12
  module Text
13
13
  module Formatted #:nodoc:
14
-
15
14
  # @private
16
15
  class LineWrap #:nodoc:
17
-
18
16
  # The width of the last wrapped line
19
17
  #
20
18
  def width
@@ -122,11 +120,11 @@ module Prawn
122
120
  # The pattern used to determine chunks of text to place on a given line
123
121
  #
124
122
  def scan_pattern
125
- pattern = "[^#{break_chars}]+#{soft_hyphen}|" +
126
- "[^#{break_chars}]+#{hyphen}+|" +
127
- "[^#{break_chars}]+|" +
128
- "[#{whitespace}]+|" +
129
- "#{hyphen}+[^#{break_chars}]*|" +
123
+ pattern = "[^#{break_chars}]+#{soft_hyphen}|" \
124
+ "[^#{break_chars}]+#{hyphen}+|" \
125
+ "[^#{break_chars}]+|" \
126
+ "[#{whitespace}]+|" \
127
+ "#{hyphen}+[^#{break_chars}]*|" \
130
128
  "#{soft_hyphen}"
131
129
 
132
130
  Regexp.new(pattern)
@@ -152,13 +150,8 @@ module Prawn
152
150
  "-"
153
151
  end
154
152
 
155
- def soft_hyphen
156
- @soft_hyphen
157
- end
158
-
159
- def zero_width_space
160
- @zero_width_space
161
- end
153
+ attr_reader :soft_hyphen
154
+ attr_reader :zero_width_space
162
155
 
163
156
  def line_empty?
164
157
  @line_empty && @accumulated_width == 0
@@ -202,19 +195,15 @@ module Prawn
202
195
  remember_this_fragment_for_backward_looking_ops
203
196
  end
204
197
 
205
- def update_output_based_on_last_fragment(fragment, normalized_soft_hyphen=nil)
198
+ def update_output_based_on_last_fragment(fragment, normalized_soft_hyphen = nil)
206
199
  remaining_text = fragment.slice(@fragment_output.length..fragment.length)
207
- raise Prawn::Errors::CannotFit if line_finished? && line_empty? &&
208
- @fragment_output.empty? && !fragment.strip.empty?
200
+ fail Prawn::Errors::CannotFit if line_finished? && line_empty? && @fragment_output.empty? && !fragment.strip.empty?
209
201
  @arranger.update_last_string(@fragment_output, remaining_text, normalized_soft_hyphen)
210
202
  end
211
203
 
212
204
  def determine_whether_to_pull_preceding_fragment_to_join_this_one(current_fragment)
213
- if @fragment_output.empty? &&
214
- !current_fragment.empty? &&
215
- @line_contains_more_than_one_word
216
- unless previous_fragment_ended_with_breakable? ||
217
- fragment_begins_with_breakable?(current_fragment)
205
+ if @fragment_output.empty? && !current_fragment.empty? && @line_contains_more_than_one_word
206
+ unless previous_fragment_ended_with_breakable? || fragment_begins_with_breakable?(current_fragment)
218
207
  @fragment_output = @previous_fragment_output_without_last_word
219
208
  update_output_based_on_last_fragment(@previous_fragment)
220
209
  end
@@ -255,11 +244,11 @@ module Prawn
255
244
  def wrap_by_char(segment)
256
245
  font = @document.font
257
246
  segment.each_char do |char|
258
- break unless append_char(char,font)
247
+ break unless append_char(char, font)
259
248
  end
260
249
  end
261
250
 
262
- def append_char(char,font)
251
+ def append_char(char, font)
263
252
  # kerning doesn't make sense in the context of a single character
264
253
  char_width = font.compute_width_of(char)
265
254
 
@@ -11,24 +11,23 @@
11
11
  module Prawn
12
12
  module Text
13
13
  module Formatted
14
-
15
14
  class Parser
16
15
  # @group Extension API
17
16
 
18
17
  PARSER_REGEX = begin
19
- regex_string = "\n|" +
20
- "<b>|</b>|" +
21
- "<i>|</i>|" +
22
- "<u>|</u>|" +
23
- "<strikethrough>|</strikethrough>|" +
24
- "<sub>|</sub>|" +
25
- "<sup>|</sup>|" +
26
- "<link[^>]*>|</link>|" +
27
- "<color[^>]*>|</color>|" +
28
- "<font[^>]*>|</font>|" +
29
- "<strong>|</strong>|" +
30
- "<em>|</em>|" +
31
- "<a[^>]*>|</a>|" +
18
+ regex_string = "\n|" \
19
+ "<b>|</b>|" \
20
+ "<i>|</i>|" \
21
+ "<u>|</u>|" \
22
+ "<strikethrough>|</strikethrough>|" \
23
+ "<sub>|</sub>|" \
24
+ "<sup>|</sup>|" \
25
+ "<link[^>]*>|</link>|" \
26
+ "<color[^>]*>|</color>|" \
27
+ "<font[^>]*>|</font>|" \
28
+ "<strong>|</strong>|" \
29
+ "<em>|</em>|" \
30
+ "<a[^>]*>|</a>|" \
32
31
  "[^<\n]+"
33
32
  Regexp.new(regex_string, Regexp::MULTILINE)
34
33
  end
@@ -82,9 +81,9 @@ module Prawn
82
81
 
83
82
  if hash[:color]
84
83
  if hash[:color].kind_of?(Array)
85
- prefix = prefix + "<color c='#{hash[:color][0]}'" +
86
- " m='#{hash[:color][1]}'" +
87
- " y='#{hash[:color][2]}'" +
84
+ prefix = prefix + "<color c='#{hash[:color][0]}'" \
85
+ " m='#{hash[:color][1]}'" \
86
+ " y='#{hash[:color][2]}'" \
88
87
  " k='#{hash[:color][3]}'>"
89
88
  else
90
89
  prefix = prefix + "<color rgb='#{hash[:color]}'>"
@@ -118,8 +117,6 @@ module Prawn
118
117
  paragraphs
119
118
  end
120
119
 
121
- private
122
-
123
120
  def self.array_from_tokens(tokens)
124
121
  array = []
125
122
  styles = []
@@ -217,7 +214,6 @@ module Prawn
217
214
  end
218
215
  array
219
216
  end
220
-
221
217
  end
222
218
  end
223
219
  end
@@ -15,15 +15,13 @@ module Prawn
15
15
  # @private
16
16
 
17
17
  module Wrap #:nodoc:
18
-
19
18
  def initialize(array, options)
20
19
  @line_wrap = Prawn::Text::Formatted::LineWrap.new
21
20
  @arranger = Prawn::Text::Formatted::Arranger.new(@document,
22
- :kerning => options[:kerning])
21
+ :kerning => options[:kerning])
23
22
  @disable_wrap_by_char = options[:disable_wrap_by_char]
24
23
  end
25
24
 
26
-
27
25
  # See the developer documentation for PDF::Core::Text#wrap
28
26
  #
29
27
  # Formatted#wrap should set the following variables:
@@ -103,9 +101,7 @@ module Prawn
103
101
  end
104
102
 
105
103
  def word_spacing_for_this_line
106
- if @align == :justify &&
107
- @line_wrap.space_count > 0 &&
108
- !@line_wrap.paragraph_finished?
104
+ if @align == :justify && @line_wrap.space_count > 0 && !@line_wrap.paragraph_finished?
109
105
  (available_width - @line_wrap.width) / @line_wrap.space_count
110
106
  else
111
107
  0
@@ -153,7 +149,6 @@ module Prawn
153
149
  line_width, word_spacing)
154
150
  end
155
151
  end
156
-
157
152
  end
158
153
  end
159
154
  end
@@ -9,7 +9,6 @@
9
9
  require 'thread'
10
10
 
11
11
  module Prawn
12
-
13
12
  # Throughout the Prawn codebase, repeated calculations which can benefit from caching are made
14
13
  # In some cases, caching and reusing results can not only save CPU cycles but also greatly
15
14
  # reduce memory requirements
@@ -23,10 +22,12 @@ module Prawn
23
22
  @cache = {}
24
23
  @mutex = Mutex.new
25
24
  end
25
+
26
26
  def [](key)
27
27
  @mutex.synchronize { @cache[key] }
28
28
  end
29
- def []=(key,value)
29
+
30
+ def []=(key, value)
30
31
  @mutex.synchronize { @cache[key] = value }
31
32
  end
32
33
  end
@@ -36,10 +37,12 @@ module Prawn
36
37
  def initialize
37
38
  @cache_id = "cache_#{self.object_id}".to_sym
38
39
  end
40
+
39
41
  def [](key)
40
42
  (Thread.current[@cache_id] ||= {})[key]
41
43
  end
42
- def []=(key,value)
44
+
45
+ def []=(key, value)
43
46
  (Thread.current[@cache_id] ||= {})[key] = value
44
47
  end
45
48
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Prawn
4
- VERSION = "2.0.1"
4
+ VERSION = "2.0.2"
5
5
  end