rbpdf 1.21.0 → 1.21.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5ff3f6272253912bfd08cadee35bda912f4deae8c663fbadd6187f46e5e5710
4
- data.tar.gz: 4339767a774386b3c18358965c101fcbcb2ba78ae67c05228292843b61a1a504
3
+ metadata.gz: e57cd5cc362ca474924c7d157b971f55db76e542dcbacb9531c4b9711b00cd1b
4
+ data.tar.gz: 34b28f5a6f395e0868538a76f37cfbb25220c077c535f26fc710dee7c6941f08
5
5
  SHA512:
6
- metadata.gz: 45293dc5fac4368ed11ce0d9cb71b0326ce0823d84bde3d0f1a811cd9de000a73c4b147266b9ab0130c62a329c76aa4e10ba5428d007d6d88f6a1eb62abadd9b
7
- data.tar.gz: 06a6c03c0f2a8bc45615c14a5c163dc2e5c88a2c76b970098dc7505c424aec7bfe15745ec6894443840d45d209a63e76a718ce13ab35f9ee8be79512362d8034
6
+ metadata.gz: 5a2b92f0f7443b93073df995eee67dd7d6706bd2a3dd70962803dad473424af856d1dca5c92605fbd24b3c98fbaf224b963e85138cc8552980f9122773ef13c6
7
+ data.tar.gz: 354efa417b9b90a1c4b30a18f3853db23b54314ae5b7fb5337aad4bb93e23849ee7160d450a1b2f39c939088f3d30f706c377f8b40869b0182dfd02f68b2e2aa
data/CHANGELOG CHANGED
@@ -1,16 +1,30 @@
1
+ 1.21.2 2023-06-27
2
+ - Resolving infinite loops when rtl == true. (#89)
3
+ - Ruby 2.4 is not compatible with loofah 2.21 or higher (#87)
4
+ - Order bookmarks by page and y for addTOC() and addHTMLTOC(). (#86)
5
+ - Order bookmarks by page and y (#85) (by skalimer0)
6
+
7
+ 1.21.1 2023-03-20
8
+ - Changed version description of PDF PRODUCER. (#83)
9
+ - fix isValidCSSSelectorForTag method. (#82)
10
+ - Improved compatibility with ImageMagick 7.1.1-0 and later when using mini_magick. (#81)
11
+ - Fixed parsepng method to support transparent GIF and PNG tRNS transparency. (#80)
12
+ - ImageMagick7 support in RMagick 5.2.0. (#79)
13
+ - Add support WebP image. (#77)
14
+
1
15
  1.21.0 2023-02-13
2
- - Support for Ruby 3.0.0, 3.1.0, 3.2.0. (Drop support for Ruby 2.2 and earlier.) #66
3
- - Support Rails 6 and Rails 7. (Drop support for Rails 3.x, 4.x) #66, #72
4
- - Fix RMagick 5.0 compatible. #66
5
- - Infinite loop has been resolved. #68, #74
6
- - Fixed a bug that caused the x position to shift when an <img> tag was behind a <li> tag in HTML. #74
7
- - fix: Incorrect characters when copying out of a generated PDF with Unicode fonts. #71
8
- - Suppresses output for Circle(), Ellipse(), PieSector(), and PieSectorXY() when the radius is 0. #67
9
- - Don't change an object while iterating over it #59 (by thegcat)
10
- - fix : bidi bug #56 (by ahorek)
11
- - Avoid rdoc stack level too deep (SystemStackError) in gem install. #76
12
- - PDF example output option OUTPUT=true added #70
13
- - Make the image file path acquisition process extensible #58 (by yui-har)
16
+ - Support for Ruby 3.0.0, 3.1.0, 3.2.0. (Drop support for Ruby 2.2 and earlier.) (#66)
17
+ - Support Rails 6 and Rails 7. (Drop support for Rails 3.x, 4.x) (#66, #72)
18
+ - Fix RMagick 5.0 compatible. (#66)
19
+ - Infinite loop has been resolved. (#68, #74)
20
+ - Fixed a bug that caused the x position to shift when an <img> tag was behind a <li> tag in HTML. (#74)
21
+ - fix: Incorrect characters when copying out of a generated PDF with Unicode fonts. (#71)
22
+ - Suppresses output for Circle(), Ellipse(), PieSector(), and PieSectorXY() when the radius is 0. (#67)
23
+ - Don't change an object while iterating over it (#59) (by thegcat)
24
+ - fix : bidi bug (#56) (by ahorek)
25
+ - Avoid rdoc stack level too deep (SystemStackError) in gem install. (#76)
26
+ - PDF example output option OUTPUT=true added (#70)
27
+ - Make the image file path acquisition process extensible (#58) (by yui-har)
14
28
 
15
29
  1.20.1 2019-08-21
16
30
  - fix license warning. (by pavel)
data/README.md CHANGED
@@ -16,7 +16,7 @@ A template plugin allowing the inclusion of ERB-enabled RBPDF template files.
16
16
  * CSS minimum support.
17
17
  * Image
18
18
  - 8bit PNG image support without MiniMagick/RMagick library.
19
- - PNG(with alpha channel)/JPEG/GIF image support. (use MiniMagick or RMagick library)
19
+ - PNG(with alpha channel)/JPEG/GIF/WebP image support. (use MiniMagick or RMagick library)
20
20
 
21
21
 
22
22
  ##
@@ -1,3 +1,4 @@
1
+ # coding: ASCII-8BIT
1
2
  # The MIT License
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -55,6 +56,7 @@ module Rbpdf
55
56
  width = image.width
56
57
  height = image.height
57
58
 
59
+ out['mime'] = image.mime_type
58
60
  out[0] = width
59
61
  out[1] = height
60
62
 
@@ -67,17 +69,19 @@ module Rbpdf
67
69
  out[2] = "JPEG"
68
70
  when "image/png"
69
71
  out[2] = "PNG"
70
- when " image/vnd.wap.wbmp"
72
+ when "image/webp", "image/x-webp"
73
+ out[2] = "WEBP"
74
+ out['mime'] = "image/webp"
75
+ when "image/vnd.wap.wbmp"
71
76
  out[2] = "WBMP"
72
77
  when "image/x-xpixmap"
73
78
  out[2] = "XPM"
74
79
  end
75
80
  out[3] = "height=\"#{height}\" width=\"#{width}\""
76
- out['mime'] = image.mime_type
77
81
 
78
82
  # This needs work to cover more situations
79
83
  # I can't see how to just list the number of channels with ImageMagick / mini_magick
80
- case image["%[channels]"].downcase
84
+ case image["%[channels]"].downcase.split.first
81
85
  when 'cmyk'
82
86
  out['channels'] = 4
83
87
  when 'rgb', 'rgba', 'srgb', 'srgba' # Mac OS X : sRGB
data/lib/core/rmagick.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # coding: ASCII-8BIT
1
2
  # The MIT License
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -55,6 +56,7 @@ module Rbpdf
55
56
 
56
57
  width = image.columns
57
58
  height = image.rows
59
+ out['mime'] = image.mime_type
58
60
  out[0] = width
59
61
  out[1] = height
60
62
 
@@ -67,13 +69,15 @@ module Rbpdf
67
69
  out[2] = "JPEG"
68
70
  when "image/png"
69
71
  out[2] = "PNG"
70
- when " image/vnd.wap.wbmp"
72
+ when "image/webp", "image/x-webp"
73
+ out[2] = "WEBP"
74
+ out['mime'] = "image/webp"
75
+ when "image/vnd.wap.wbmp"
71
76
  out[2] = "WBMP"
72
77
  when "image/x-xpixmap"
73
78
  out[2] = "XPM"
74
79
  end
75
80
  out[3] = "height=\"#{height}\" width=\"#{width}\""
76
- out['mime'] = image.mime_type
77
81
 
78
82
  # This needs work to cover more situations
79
83
  # I can't see how to just list the number of channels with ImageMagick / rmagick
data/lib/rbpdf/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # http://www.opensource.org/licenses/MIT
4
4
 
5
5
  module Rbpdf
6
- VERSION = "1.21.0"
6
+ VERSION = "1.21.2"
7
7
  end
data/lib/rbpdf.rb CHANGED
@@ -89,7 +89,7 @@ require 'net/http'
89
89
  #
90
90
 
91
91
 
92
- PDF_PRODUCER = 'RBPDF 5.2.000'
92
+ PDF_PRODUCER = "RBPDF #{Rbpdf::VERSION}"
93
93
 
94
94
  # == This is a Ruby class for generating PDF files on-the-fly without requiring external extensions.
95
95
  # * This class is a Ruby port of the TCPDF class by Nicola Asuni (http://www.tcpdf.org).
@@ -4790,7 +4790,7 @@ class RBPDF
4790
4790
  # * explicit width and height (expressed in user unit)
4791
4791
  # * one explicit dimension, the other being calculated automatically in order to keep the original proportions
4792
4792
  # * no explicit dimension, in which case the image is put at 72 dpi
4793
- # Supported formats are PNG images whitout RMagick/MiniMagick library and JPEG and GIF images supported by RMagick/MiniMagick.
4793
+ # Supported formats are PNG images whitout RMagick/MiniMagick library and JPEG and GIF and WebP images supported by RMagick/MiniMagick.
4794
4794
  # For JPEG, all flavors are allowed:
4795
4795
  # * gray scales
4796
4796
  # * true colors (24 bits)
@@ -4808,7 +4808,7 @@ class RBPDF
4808
4808
  # [@param float :y] Ordinate of the upper-left corner.
4809
4809
  # [@param float :w] Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
4810
4810
  # [@param float :h] Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
4811
- # [@param string :type] Image format. Possible values are (case insensitive): JPG, JPEG, PNG. If not specified, the type is inferred from the file extension.
4811
+ # [@param string :type] Image format. Possible values are (case insensitive): JPG, JPEG, PNG, GIF, WebP. If not specified, the type is inferred from the file extension.
4812
4812
  # [@param mixed :link] URL or identifier returned by AddLink().
4813
4813
  # [@param string :align]
4814
4814
  # Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
@@ -4974,12 +4974,19 @@ class RBPDF
4974
4974
 
4975
4975
  info = false
4976
4976
  if !resize
4977
- if (type == 'jpeg')
4977
+ case type
4978
+ when 'jpeg'
4978
4979
  info=parsejpeg(file)
4979
- elsif (type == 'png')
4980
- info=parsepng(file);
4981
- elsif (type == 'gif')
4982
- tmpFile = imageToPNG(file)
4980
+ when 'png'
4981
+ info=parsepng(file)
4982
+ when 'webp'
4983
+ tmpFile = imageToPNG(file, false)
4984
+ if tmpFile != false
4985
+ info=parsepng(tmpFile.path)
4986
+ tmpFile.close(true)
4987
+ end
4988
+ when 'gif'
4989
+ tmpFile = imageToPNG(file, false)
4983
4990
  if tmpFile != false
4984
4991
  info=parsepng(tmpFile.path)
4985
4992
  tmpFile.close(true)
@@ -4992,6 +4999,7 @@ class RBPDF
4992
4999
  end
4993
5000
  info=send(mtd, file);
4994
5001
  end
5002
+
4995
5003
  if info == 'pngalpha' and ismask == false and (Object.const_defined?(:MiniMagick) or Object.const_defined?(:Magick))
4996
5004
  info = ImagePngAlpha(file, x, y, w, h, 'PNG', link, align, resize, dpi, palign)
4997
5005
  if false != info
@@ -5156,29 +5164,38 @@ class RBPDF
5156
5164
  end
5157
5165
  protected :parsejpeg
5158
5166
 
5159
- def imageToPNG(file)
5167
+ def imageToPNG(file, delete_alpha=true)
5160
5168
  if Object.const_defined?(:MiniMagick)
5161
5169
  # MiniMagick library
5162
5170
 
5163
5171
  img = MiniMagick::Image.open(file)
5164
- img.format 'png' # convert to PNG from gif
5165
- if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase)
5166
- img.combine_options do |mogrify|
5167
- mogrify.alpha 'off'
5168
- end
5169
- if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase)
5170
- return false
5172
+ img.format 'png'
5173
+ if delete_alpha
5174
+ if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase.split.first)
5175
+ img.combine_options do |mogrify|
5176
+ mogrify.alpha 'off'
5177
+ end
5178
+ if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase.split.first)
5179
+ return false
5180
+ end
5171
5181
  end
5172
5182
  end
5173
5183
  elsif Object.const_defined?(:Magick)
5174
5184
  # RMagick library
5175
5185
 
5176
5186
  img = Magick::ImageList.new(file)
5177
- img.format = 'PNG' # convert to PNG from gif
5178
- if img.alpha?
5179
- img.alpha Magick::DeactivateAlphaChannel # PNG alpha channel delete
5187
+ img.format = 'png'
5188
+ if delete_alpha
5180
5189
  if img.alpha?
5181
- return false
5190
+ # PNG alpha channel delete
5191
+ if Magick.const_defined?(:OffAlphaChannel) # RMagick 5.2.0 and later
5192
+ img.alpha Magick::OffAlphaChannel
5193
+ else # RMagick 5.1.0 and before for ImageMagick 6.x
5194
+ img.alpha Magick::DeactivateAlphaChannel
5195
+ end
5196
+ if img.alpha?
5197
+ return false
5198
+ end
5182
5199
  end
5183
5200
  end
5184
5201
  else
@@ -5199,45 +5216,45 @@ class RBPDF
5199
5216
  # [@access protected]
5200
5217
  #
5201
5218
  def parsepng(file)
5202
- f=open(file,'rb');
5203
- #Check signature
5204
- if (f.read(8)!=137.chr + 'PNG' + 13.chr + 10.chr + 26.chr + 10.chr)
5205
- Error('Not a PNG file: ' + file);
5206
- end
5207
- #Read header chunk
5208
- f.read(4);
5209
- if (f.read(4)!='IHDR')
5210
- Error('Incorrect PNG file: ' + file);
5211
- end
5212
- w=freadint(f);
5213
- h=freadint(f);
5214
- bpc=f.read(1).unpack('C')[0]
5215
-
5216
- ct=f.read(1).unpack('C')[0]
5217
- if (ct==0)
5218
- colspace='DeviceGray';
5219
- elsif (ct==2)
5220
- colspace='DeviceRGB';
5221
- elsif (ct==3)
5222
- colspace='Indexed';
5219
+ f = open(file,'rb')
5220
+ # Check signature
5221
+ if f.read(8) != 137.chr + 'PNG' + 13.chr + 10.chr + 26.chr + 10.chr
5222
+ Error('Not a PNG file: ' + file)
5223
+ end
5224
+ # Read header chunk
5225
+ f.read(4)
5226
+ if f.read(4) != 'IHDR'
5227
+ Error('Incorrect PNG file: ' + file)
5228
+ end
5229
+ w = freadint(f)
5230
+ h = freadint(f)
5231
+ bpc = f.read(1).unpack('C')[0]
5232
+ ct = f.read(1).unpack('C')[0]
5233
+ case ct
5234
+ when 0
5235
+ colspace = 'DeviceGray'
5236
+ when 2
5237
+ colspace = 'DeviceRGB'
5238
+ when 3
5239
+ colspace = 'Indexed'
5223
5240
  else
5224
5241
  if Object.const_defined?(:MiniMagick) or Object.const_defined?(:Magick)
5225
5242
  # alpha channel
5226
5243
  return 'pngalpha'
5227
5244
  else
5228
- Error('No RMagick/MiniMagick : Alpha channel not supported: ' + file);
5245
+ Error('No RMagick/MiniMagick : Alpha channel not supported: ' + file)
5229
5246
  end
5230
5247
  end
5231
- if (f.read(1).unpack('C')[0] != 0)
5248
+ if f.read(1).unpack('C')[0] != 0
5232
5249
  # Error('Unknown compression method: ' + file)
5233
5250
  return false
5234
5251
  end
5235
- if (f.read(1).unpack('C')[0]!=0)
5252
+ if f.read(1).unpack('C')[0] != 0
5236
5253
  # Error('Unknown filter method: ' + file)
5237
5254
  return false
5238
5255
  end
5239
5256
 
5240
- if (bpc>8)
5257
+ if bpc > 8
5241
5258
  if Object.const_defined?(:MiniMagick) or Object.const_defined?(:Magick)
5242
5259
  return false
5243
5260
  else
@@ -5245,48 +5262,50 @@ class RBPDF
5245
5262
  end
5246
5263
  end
5247
5264
 
5248
- if (f.read(1).unpack('C')[0]!=0)
5265
+ if f.read(1).unpack('C')[0] != 0
5249
5266
  # Error('Interlacing not supported: ' + file)
5250
5267
  return false
5251
5268
  end
5252
- f.read(4);
5253
- parms='/DecodeParms <</Predictor 15 /Colors ' + (ct==2 ? 3 : 1).to_s + ' /BitsPerComponent ' + bpc.to_s + ' /Columns ' + w.to_s + '>>';
5254
- #Scan chunks looking for palette, transparency and image data
5255
- pal='';
5256
- trns='';
5257
- data='';
5269
+ f.read(4)
5270
+ parms='/DecodeParms <</Predictor 15 /Colors ' + (ct == 2 ? 3 : 1).to_s + ' /BitsPerComponent ' + bpc.to_s + ' /Columns ' + w.to_s + '>>'
5271
+ # Scan chunks looking for palette, transparency and image data
5272
+ pal = ''
5273
+ trns = ''
5274
+ data = ''
5258
5275
  begin
5259
- n=freadint(f);
5260
- type=f.read(4);
5261
- if (type=='PLTE')
5262
- #Read palette
5263
- pal=f.read( n);
5264
- f.read(4);
5265
- elsif (type=='tRNS')
5266
- #Read transparency info
5267
- t=f.read( n);
5268
- if (ct==0)
5269
- trns = t[1].unpack('C')[0]
5270
- elsif (ct==2)
5271
- trns = t[[1].unpack('C')[0], t[3].unpack('C')[0], t[5].unpack('C')[0]]
5272
- else
5273
- pos=t.include?(0.chr);
5274
- if (pos!=false)
5275
- trns = ['1']
5276
- end
5277
- end
5278
- f.read(4);
5279
- elsif (type=='IDAT')
5280
- #Read image data block
5281
- data<<f.read( n);
5282
- f.read(4);
5283
- elsif (type=='IEND')
5284
- break;
5276
+ n = freadint(f)
5277
+ type = f.read(4)
5278
+ case type
5279
+ when 'PLTE'
5280
+ # Read palette
5281
+ pal = f.read(n)
5282
+ f.read(4)
5283
+ when 'tRNS'
5284
+ # Read transparency info
5285
+ t = f.read(n)
5286
+ case ct
5287
+ when 0 # DeviceGray
5288
+ trns = [t[1].unpack('C')[0]]
5289
+ when 2 # DeviceRGB
5290
+ trns = [t[1].unpack('C')[0], t[3].unpack('C')[0], t[5].unpack('C')[0]]
5291
+ else # Indexed
5292
+ trns = []
5293
+ n.times do |i|
5294
+ trns << t[i].unpack('C')[0]
5295
+ end
5296
+ end
5297
+ f.read(4)
5298
+ when 'IDAT'
5299
+ # Read image data block
5300
+ data << f.read(n)
5301
+ f.read(4)
5302
+ when 'IEND'
5303
+ break
5285
5304
  else
5286
- f.read( n+4);
5305
+ f.read(n + 4)
5287
5306
  end
5288
5307
  end while(n)
5289
- if (colspace=='Indexed' and pal.empty?)
5308
+ if (colspace == 'Indexed' and pal.empty?)
5290
5309
  # Error('Missing palette in ' + file)
5291
5310
  return false
5292
5311
  end
@@ -5302,7 +5321,7 @@ class RBPDF
5302
5321
 
5303
5322
  img = MiniMagick::Image.open(file)
5304
5323
  img.format('png')
5305
- if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase)
5324
+ if ['rgba', 'srgba', 'graya'].include?(img["%[channels]"].downcase.split.first)
5306
5325
  img.combine_options do |mogrify|
5307
5326
  mogrify.channel 'matte'
5308
5327
  mogrify.separate '+matte'
@@ -5314,6 +5333,7 @@ class RBPDF
5314
5333
  # RMagick library
5315
5334
 
5316
5335
  img = Magick::ImageList.new(file)
5336
+ img.format = 'png'
5317
5337
  if img.alpha?
5318
5338
  img.alpha Magick::ExtractAlphaChannel # PNG alpha channel Mask
5319
5339
  else
@@ -5333,13 +5353,13 @@ class RBPDF
5333
5353
  protected :image_alpha_mask
5334
5354
 
5335
5355
  #
5336
- # Extract info from a PNG image with alpha channel using the GD library.
5356
+ # Extract info from a PNG image with alpha channel using the RMagick/MiniMagick library.
5337
5357
  # [@param string :file] Name of the file containing the image.
5338
5358
  # [@param float :x] Abscissa of the upper-left corner.
5339
5359
  # [@param float :y] Ordinate of the upper-left corner.
5340
5360
  # [@param float :w] Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
5341
5361
  # [@param float :h] Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
5342
- # [@param string :type] Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension.
5362
+ # [@param string :type] Possible values are (case insensitive): JPEG and PNG (without RMagick/MiniMagick library) and PNG(with alpha channel) and JPEG and GIF and WebP supported by RMagick/MiniMagick. If not specified, the type is inferred from the file extension.
5343
5363
  # [@param mixed :link] URL or identifier returned by AddLink().
5344
5364
  # [@param string :align]
5345
5365
  # Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
@@ -5347,7 +5367,7 @@ class RBPDF
5347
5367
  # * M: middle-right for LTR or middle-left for RTL
5348
5368
  # * B: bottom-right for LTR or bottom-left for RTL
5349
5369
  # * N: next line
5350
- # [@param boolean :resize] If true resize (reduce) the image to fit :w and :h (requires GD library).
5370
+ # [@param boolean :resize] If true resize (reduce) the image to fit :w and :h (requires RMagick/MiniMagick library).
5351
5371
  # [@param int :dpi] dot-per-inch resolution used on resize
5352
5372
  # [@param string :palign]
5353
5373
  # Allows to center or align the image on the current line. Possible values are:
@@ -7446,7 +7466,7 @@ protected
7446
7466
  trns='';
7447
7467
  count_info = info['trns'].length
7448
7468
  count_info.times do |i|
7449
- trns << info['trns'][i] + ' ' + info['trns'][i] + ' ';
7469
+ trns << info['trns'][i].to_s + ' ' + info['trns'][i].to_s + ' '
7450
7470
  end
7451
7471
  out << ' /Mask [' + trns + ']'
7452
7472
  end
@@ -10297,7 +10317,7 @@ public
10297
10317
  return
10298
10318
  end
10299
10319
  # sort outlines by page and original position
10300
- @outlines = @outlines.sort_by {|x| x[:p]}
10320
+ @outlines = @outlines.sort_by {|x| [x[:p], x[:y]] }
10301
10321
  lru = []
10302
10322
  level = 0
10303
10323
  @outlines.each_with_index do |o, i|
@@ -11102,7 +11122,7 @@ protected
11102
11122
  operator = ''
11103
11123
  lasttag = ''
11104
11124
  attrib = ''
11105
- while selector_offset = selector.index(/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\~\s]*)/mi, selector_offset)
11125
+ while selector_offset = selector.index(/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\s]*)/mi, selector_offset)
11106
11126
  offset = selector_offset
11107
11127
  selector_offset += $&.length
11108
11128
  operator = $1
@@ -11122,18 +11142,19 @@ protected
11122
11142
  when '[' # attribute
11123
11143
  attrmatch = attrib.scan(/\[([a-zA-Z0-9]*)[\s]*([\~\^\$\*\|\=]*)[\s]*["]?([^"\]]*)["]?\]/i)
11124
11144
  if !attrmatch.empty?
11125
- att = attrmatch[0].downcase
11126
- val = attrmatch[2]
11145
+ att = attrmatch[0][0].downcase
11146
+ val = attrmatch[0][2]
11147
+
11127
11148
  if dom[key]['attribute'][att]
11128
- case attrmatch[1]
11149
+ case attrmatch[0][1]
11129
11150
  when '='
11130
11151
  valid = true if dom[key]['attribute'][att] == val
11131
11152
  when '~='
11132
11153
  valid = true if dom[key]['attribute'][att].split(' ').include?(val)
11133
11154
  when '^='
11134
- valid = true if val == substr(dom[key]['attribute'][att], 0, val.length)
11155
+ valid = true if val == dom[key]['attribute'][att][0, val.length]
11135
11156
  when '$='
11136
- valid = true if val == substr(dom[key]['attribute'][att], -val.length)
11157
+ valid = true if val == dom[key]['attribute'][att][-val.length..-1]
11137
11158
  when '*='
11138
11159
  valid = true if dom[key]['attribute'][att].index(val) != nil
11139
11160
  when '|='
@@ -12939,7 +12960,7 @@ public
12939
12960
  if !@premode
12940
12961
  prelen = dom[key]['value'].length
12941
12962
  if isRTLTextDir()
12942
- dom[key]['value'] = dom[key]['value'].rstrip + 0.chr
12963
+ dom[key]['value'] = dom[key]['value'].rstrip
12943
12964
  else
12944
12965
  dom[key]['value'] = dom[key]['value'].lstrip
12945
12966
  end
@@ -14844,6 +14865,8 @@ public
14844
14865
  else
14845
14866
  gap = ''
14846
14867
  end
14868
+ # sort outlines by page and original position
14869
+ @outlines = @outlines.sort_by {|x| [x[:p], x[:y]] }
14847
14870
  @outlines.each_with_index do |outline, key|
14848
14871
  if @rtl
14849
14872
  aligntext = 'R'
@@ -14983,6 +15006,8 @@ public
14983
15006
  @html_link_color_array = []
14984
15007
  @html_link_font_style = ''
14985
15008
  page_first = getPage()
15009
+ # sort outlines by page and original position
15010
+ @outlines = @outlines.sort_by {|x| [x[:p], x[:y]] }
14986
15011
  @outlines.each_with_index do |outline, key|
14987
15012
  if empty_string(page)
14988
15013
  pagenum = outline[:p].to_s
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbpdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.0
4
+ version: 1.21.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - NAITOH Jun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-13 00:00:00.000000000 Z
11
+ date: 2023-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities