write_xlsx 1.01.0 → 1.02.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +8 -0
  3. data/README.md +1 -1
  4. data/lib/write_xlsx/drawing.rb +68 -32
  5. data/lib/write_xlsx/package/relationships.rb +2 -2
  6. data/lib/write_xlsx/utility.rb +19 -0
  7. data/lib/write_xlsx/version.rb +1 -1
  8. data/lib/write_xlsx/workbook.rb +13 -6
  9. data/lib/write_xlsx/worksheet.rb +58 -5
  10. data/lib/write_xlsx/worksheet/hyperlink.rb +16 -37
  11. data/test/drawing/test_drawing_chart_01.rb +1 -1
  12. data/test/drawing/test_drawing_image_01.rb +1 -1
  13. data/test/regression/test_hyperlink32.rb +27 -0
  14. data/test/regression/test_hyperlink33.rb +28 -0
  15. data/test/regression/test_hyperlink34.rb +33 -0
  16. data/test/regression/test_hyperlink35.rb +39 -0
  17. data/test/regression/test_hyperlink36.rb +34 -0
  18. data/test/regression/test_hyperlink37.rb +33 -0
  19. data/test/regression/test_hyperlink38.rb +27 -0
  20. data/test/regression/test_hyperlink39.rb +27 -0
  21. data/test/regression/test_hyperlink40.rb +27 -0
  22. data/test/regression/test_hyperlink41.rb +27 -0
  23. data/test/regression/test_hyperlink42.rb +27 -0
  24. data/test/regression/test_hyperlink43.rb +27 -0
  25. data/test/regression/test_hyperlink44.rb +27 -0
  26. data/test/regression/test_hyperlink45.rb +27 -0
  27. data/test/regression/test_hyperlink47.rb +27 -0
  28. data/test/regression/test_image06.rb +5 -5
  29. data/test/regression/xlsx_files/hyperlink32.xlsx +0 -0
  30. data/test/regression/xlsx_files/hyperlink33.xlsx +0 -0
  31. data/test/regression/xlsx_files/hyperlink34.xlsx +0 -0
  32. data/test/regression/xlsx_files/hyperlink35.xlsx +0 -0
  33. data/test/regression/xlsx_files/hyperlink36.xlsx +0 -0
  34. data/test/regression/xlsx_files/hyperlink37.xlsx +0 -0
  35. data/test/regression/xlsx_files/hyperlink38.xlsx +0 -0
  36. data/test/regression/xlsx_files/hyperlink39.xlsx +0 -0
  37. data/test/regression/xlsx_files/hyperlink40.xlsx +0 -0
  38. data/test/regression/xlsx_files/hyperlink41.xlsx +0 -0
  39. data/test/regression/xlsx_files/hyperlink42.xlsx +0 -0
  40. data/test/regression/xlsx_files/hyperlink43.xlsx +0 -0
  41. data/test/regression/xlsx_files/hyperlink44.xlsx +0 -0
  42. data/test/regression/xlsx_files/hyperlink45.xlsx +0 -0
  43. data/test/regression/xlsx_files/hyperlink47.xlsx +0 -0
  44. data/test/regression/xlsx_files/hyperlink48.xlsx +0 -0
  45. data/test/regression/xlsx_files/hyperlink49.xlsx +0 -0
  46. data/test/regression/xlsx_files/image06.xlsx +0 -0
  47. metadata +70 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7488f5d7a2fb2d8d2538dfad0e469015596350f36b8c92fb6ad92c30413fc76a
4
- data.tar.gz: 42633fda58820d75b54c6248796c7dec91e2acfc3016ac7dfbea0331c8531353
3
+ metadata.gz: cd25c9e7242d84cbaa3f58304d292275f56e89353b61f151e9beb2bf9e740e46
4
+ data.tar.gz: 6ac71db1cf2089932e2381cb6c20d2b1fa0a82493bc00bafc307d4efbd2da048
5
5
  SHA512:
6
- metadata.gz: ea3fa967b302439de1ddced9c20011f14eeafd8025b424bf7edd33f34215428fd6f9155264336e36a771ee345f13a4ad764abef8bc4c39a88e2d8aa9d8c769b1
7
- data.tar.gz: fd4f6e52efcb4e2163d0346e5b13ec21312c73ad1fb2b1d79ab4f81d51411e15eb9308ec0249e52b1082e97c696f94b3651e6ce1676eb011f7420623eda7530c
6
+ metadata.gz: aada5fa6d8a1034743af39bcc352b2e15120493c47c4f048006f6db3869c3f1eb8652e437ffb4bdf441b0280596f314bc06d436178c4bd82ea39e8e9dafcc5b8
7
+ data.tar.gz: db54ce603031240fe4e5081603042f804a9dd4566e6bd4e5d1b7124fd9f064748654552bb7297881cfc72915e959f26c7459777fd4cceddaee27aeb726aec798
data/Changes CHANGED
@@ -1,5 +1,13 @@
1
1
  Change history of write_xlsx rubygem.
2
2
 
3
+ 2021-02-12 v1.02.0
4
+
5
+ Added support for hyperlinks in worksheet images.
6
+
7
+ Increased allowable url length from 255 to 2079 characters, as allowed in
8
+ more recent versions of Excel.
9
+
10
+
3
11
  2021-02-08 v1.01.0
4
12
 
5
13
  Added support for stacked and East Asian vertical chart fonts.
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  gem to create a new file in the Excel 2007+ XLSX format, and you can use the
7
7
  same interface as writeexcel gem. write_xlsx is converted from Perl's module
8
- [Excel::Writer::XLSX-0.99](https://github.com/jmcnamara/excel-writer-xlsx) .
8
+ [Excel::Writer::XLSX-1.02](https://github.com/jmcnamara/excel-writer-xlsx/tree/CPAN_1.02)
9
9
 
10
10
  ## Description
11
11
 
@@ -4,11 +4,12 @@
4
4
 
5
5
  module Writexlsx
6
6
  class Drawing
7
- attr_accessor :type, :dimensions, :width, :height, :name, :shape, :anchor
7
+ attr_accessor :type, :dimensions, :width, :height, :description, :shape, :anchor, :rel_index, :url_rel_index
8
+ attr_reader :tip
8
9
 
9
- def initialize(type, dimensions, width, height, name, shape, anchor)
10
- @type, @dimensions, @width, @height, @name, @shape, @anchor =
11
- type, dimensions, width, height, name, shape, anchor
10
+ def initialize(type, dimensions, width, height, description, shape, anchor, rel_index = nil, url_rel_index = nil, tip = nil)
11
+ @type, @dimensions, @width, @height, @description, @shape, @anchor, @rel_index, @url_rel_index, @tip =
12
+ type, dimensions, width, height, description, shape, anchor, rel_index, url_rel_index, tip
12
13
  end
13
14
  end
14
15
 
@@ -82,12 +83,16 @@ def write_drawing_workspace
82
83
  def write_two_cell_anchor(*args)
83
84
  index, drawing = args
84
85
 
85
- type = drawing.type
86
- width = drawing.width
87
- height = drawing.height
88
- description = drawing.name
89
- shape = drawing.shape
90
- anchor = drawing.anchor
86
+ type = drawing.type
87
+ width = drawing.width
88
+ height = drawing.height
89
+ description = drawing.description
90
+ shape = drawing.shape
91
+ anchor = drawing.anchor
92
+ rel_index = drawing.rel_index
93
+ url_rel_index = drawing.url_rel_index
94
+ tip = drawing.tip
95
+
91
96
  col_from, row_from, col_from_offset, row_from_offset,
92
97
  col_to, row_to, col_to_offset, row_to_offset, col_absolute, row_absolute = drawing.dimensions
93
98
 
@@ -113,10 +118,14 @@ def write_two_cell_anchor(*args)
113
118
  # Graphic frame.
114
119
 
115
120
  # Write the xdr:graphicFrame element for charts.
116
- write_graphic_frame(index, description)
121
+ write_graphic_frame(index, rel_index, description)
117
122
  elsif type == 2
118
123
  # Write the xdr:pic element.
119
- write_pic(index, col_absolute, row_absolute, width, height, description)
124
+ write_pic(
125
+ index, rel_index, col_absolute,
126
+ row_absolute, width, height,
127
+ description, url_rel_index , tip
128
+ )
120
129
  else
121
130
  # Write the xdr:sp element for shapes.
122
131
  write_sp(index, col_absolute, row_absolute, width, height, shape)
@@ -149,7 +158,7 @@ def write_absolute_anchor(index)
149
158
  end
150
159
 
151
160
  # Write the xdr:graphicFrame element.
152
- write_graphic_frame(index)
161
+ write_graphic_frame(index, index)
153
162
 
154
163
  # Write the xdr:clientData element.
155
164
  write_client_data
@@ -223,9 +232,9 @@ def write_row_off(data)
223
232
  #
224
233
  def write_pos(x, y)
225
234
  attributes = [
226
- ['x', x],
227
- ['y', y]
228
- ]
235
+ ['x', x],
236
+ ['y', y]
237
+ ]
229
238
 
230
239
  @writer.empty_tag('xdr:pos', attributes)
231
240
  end
@@ -235,9 +244,9 @@ def write_pos(x, y)
235
244
  #
236
245
  def write_ext(cx, cy)
237
246
  attributes = [
238
- ['cx', cx],
239
- ['cy', cy]
240
- ]
247
+ ['cx', cx],
248
+ ['cy', cy]
249
+ ]
241
250
 
242
251
  @writer.empty_tag('xdr:ext', attributes)
243
252
  end
@@ -245,7 +254,7 @@ def write_ext(cx, cy)
245
254
  #
246
255
  # Write the <xdr:graphicFrame> element.
247
256
  #
248
- def write_graphic_frame(index, name = nil)
257
+ def write_graphic_frame(index, rel_index, name = nil)
249
258
  macro = ''
250
259
 
251
260
  attributes = [ ['macro', macro] ]
@@ -256,7 +265,7 @@ def write_graphic_frame(index, name = nil)
256
265
  # Write the xdr:xfrm element.
257
266
  write_xfrm
258
267
  # Write the a:graphic element.
259
- write_atag_graphic(index)
268
+ write_atag_graphic(rel_index)
260
269
  end
261
270
  end
262
271
 
@@ -277,18 +286,42 @@ def write_nv_graphic_frame_pr(index, name = nil)
277
286
  #
278
287
  # Write the <xdr:cNvPr> element.
279
288
  #
280
- def write_c_nv_pr(id, name, descr = nil)
289
+ def write_c_nv_pr(index, name, description = nil, url_rel_index = nil, tip = nil)
281
290
  attributes = [
282
- ['id', id],
283
- ['name', name]
291
+ ['id', index],
292
+ ['name', name]
284
293
  ]
285
294
 
286
295
  # Add description attribute for images.
287
- attributes << ['descr', descr] if descr
296
+ attributes << ['descr', description] if description
288
297
 
289
- @writer.empty_tag('xdr:cNvPr', attributes)
298
+ if ptrue?(url_rel_index)
299
+ @writer.tag_elements('xdr:cNvPr', attributes) do
300
+ # Write the a:hlinkClick element.
301
+ write_a_hlink_click(url_rel_index, tip)
302
+ end
303
+ else
304
+ @writer.empty_tag('xdr:cNvPr', attributes)
305
+ end
290
306
  end
291
307
 
308
+ #
309
+ # Write the <a:hlinkClick> element.
310
+ #
311
+ def write_a_hlink_click(index, tip)
312
+ schema = 'http://schemas.openxmlformats.org/officeDocument/'
313
+ xmlns_r = "#{schema}2006/relationships"
314
+ r_id = "rId#{index}"
315
+
316
+ attributes = [
317
+ ['xmlns:r', xmlns_r],
318
+ ['r:id', r_id]
319
+ ]
320
+
321
+ attributes << ['tooltip', tip] if tip
322
+
323
+ @writer.empty_tag('a:hlinkClick', attributes)
324
+ end
292
325
 
293
326
  #
294
327
  # Write the <xdr:cNvGraphicFramePr> element.
@@ -371,7 +404,7 @@ def write_atag_graphic(index)
371
404
  # Write the <a:graphicData> element.
372
405
  #
373
406
  def write_atag_graphic_data(index)
374
- uri = 'http://schemas.openxmlformats.org/drawingml/2006/chart'
407
+ uri = 'http://schemas.openxmlformats.org/drawingml/2006/chart'
375
408
 
376
409
  attributes = [ ['uri', uri] ]
377
410
 
@@ -494,12 +527,12 @@ def write_nv_sp_pr(index, shape)
494
527
  #
495
528
  # Write the <xdr:pic> element.
496
529
  #
497
- def write_pic(index, col_absolute, row_absolute, width, height, description)
530
+ def write_pic(index, rel_index, col_absolute, row_absolute, width, height, description, url_rel_index, tip)
498
531
  @writer.tag_elements('xdr:pic') do
499
532
  # Write the xdr:nvPicPr element.
500
- write_nv_pic_pr(index, description)
533
+ write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
501
534
  # Write the xdr:blipFill element.
502
- write_blip_fill(index)
535
+ write_blip_fill(rel_index)
503
536
 
504
537
  # Pictures are rectangle shapes by default.
505
538
  shape = Shape.new
@@ -513,10 +546,13 @@ def write_pic(index, col_absolute, row_absolute, width, height, description)
513
546
  #
514
547
  # Write the <xdr:nvPicPr> element.
515
548
  #
516
- def write_nv_pic_pr(index, description)
549
+ def write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
517
550
  @writer.tag_elements('xdr:nvPicPr') do
518
551
  # Write the xdr:cNvPr element.
519
- write_c_nv_pr( index + 1, "Picture #{index}", description )
552
+ write_c_nv_pr(
553
+ index + 1, "Picture #{index}", description,
554
+ url_rel_index, tip
555
+ )
520
556
  # Write the xdr:cNvPicPr element.
521
557
  write_c_nv_pic_pr
522
558
  end
@@ -31,8 +31,8 @@ def assemble_xml_file
31
31
  #
32
32
  # Add container relationship to XLSX .rels xml files.
33
33
  #
34
- def add_document_relationship(type, target)
35
- @rels.push([Document_schema + type, target])
34
+ def add_document_relationship(type, target, target_mode = nil)
35
+ @rels.push([Document_schema + type, target, target_mode])
36
36
  end
37
37
 
38
38
  #
@@ -218,6 +218,25 @@ def convert_date_time(date_time_string) #:nodoc:
218
218
  end
219
219
  end
220
220
 
221
+ def escape_url(url)
222
+ unless url =~ /%[0-9a-fA-F]{2}/
223
+ # Escape the URL escape symbol.
224
+ url = url.gsub(/%/, "%25")
225
+
226
+ # Escape whitespae in URL.
227
+ url = url.gsub(/[\s\x00]/, '%20')
228
+
229
+ # Escape other special characters in URL.
230
+ re = /(["<>\[\]`^{}])/
231
+ while re =~ url
232
+ match = $~[1]
233
+ url = url.sub(re, sprintf("%%%x", match.ord))
234
+ end
235
+ end
236
+
237
+ url
238
+ end
239
+
221
240
  def absolute_char(absolute)
222
241
  absolute ? '$' : ''
223
242
  end
@@ -1 +1 @@
1
- WriteXLSX_VERSION = "1.01.0"
1
+ WriteXLSX_VERSION = "1.02.0"
@@ -49,6 +49,7 @@ class Workbook
49
49
  attr_reader :shared_strings # :nodoc:
50
50
  attr_reader :vba_project # :nodoc:
51
51
  attr_reader :excel2003_style # :nodoc:
52
+ attr_reader :max_url_length # :nodoc:
52
53
  attr_reader :strings_to_urls # :nodoc:
53
54
  attr_reader :default_url_format # :nodoc:
54
55
 
@@ -130,6 +131,12 @@ def initialize(file, *option_params)
130
131
  @images = []
131
132
  @strings_to_urls = (options[:strings_to_urls].nil? || options[:strings_to_urls]) ? true : false
132
133
 
134
+ @max_url_length = 2079
135
+ if options[:max_url_length]
136
+ @max_url_length = options[:max_url_length]
137
+
138
+ @max_url_length = 2079 if @max_url_length < 250
139
+ end
133
140
  # Structures for the shared strings data.
134
141
  @shared_strings = Package::SharedStrings.new
135
142
 
@@ -1935,12 +1942,6 @@ def prepare_drawings #:nodoc:
1935
1942
  has_drawings = true
1936
1943
  end
1937
1944
 
1938
- # Prepare the worksheet charts.
1939
- sheet.charts.each_with_index do |chart, index|
1940
- chart_ref_id += 1
1941
- sheet.prepare_chart(index, chart_ref_id, drawing_id)
1942
- end
1943
-
1944
1945
  # Prepare the worksheet images.
1945
1946
  sheet.images.each_with_index do |image, index|
1946
1947
  type, width, height, name, x_dpi, y_dpi = get_image_properties(image[2])
@@ -1948,6 +1949,12 @@ def prepare_drawings #:nodoc:
1948
1949
  sheet.prepare_image(index, image_ref_id, drawing_id, width, height, name, type, x_dpi, y_dpi)
1949
1950
  end
1950
1951
 
1952
+ # Prepare the worksheet charts.
1953
+ sheet.charts.each_with_index do |chart, index|
1954
+ chart_ref_id += 1
1955
+ sheet.prepare_chart(index, chart_ref_id, drawing_id)
1956
+ end
1957
+
1951
1958
  # Prepare the worksheet shapes.
1952
1959
  sheet.shapes.each_with_index do |shape, index|
1953
1960
  sheet.prepare_shape(index, drawing_id)
@@ -309,6 +309,7 @@ def initialize(workbook, index, name) #:nodoc:
309
309
  @excel_version = 2007
310
310
  @palette = workbook.palette
311
311
  @default_url_format = workbook.default_url_format
312
+ @max_url_length = workbook.max_url_length
312
313
 
313
314
  @page_setup = PageSetup.new
314
315
 
@@ -356,6 +357,8 @@ def initialize(workbook, index, name) #:nodoc:
356
357
  @sparklines = []
357
358
  @shapes = []
358
359
  @shape_hash = {}
360
+ @drawing_rels = {}
361
+ @drawing_rels_id = 0
359
362
  @header_images = []
360
363
  @footer_images = []
361
364
 
@@ -3047,6 +3050,8 @@ def insert_image(*args)
3047
3050
  x_scale = params[:x_scale]
3048
3051
  y_scale = params[:y_scale]
3049
3052
  anchor = params[:object_position]
3053
+ url = params[:url]
3054
+ tip = params[:tip]
3050
3055
  else
3051
3056
  x_offset, y_offset, x_scale, y_scale, anchor = options
3052
3057
  end
@@ -3056,7 +3061,10 @@ def insert_image(*args)
3056
3061
  y_scale ||= 1
3057
3062
  anchor ||= 2
3058
3063
 
3059
- @images << [row, col, image, x_offset, y_offset, x_scale, y_scale, anchor]
3064
+ @images << [
3065
+ row, col, image, x_offset, y_offset,
3066
+ x_scale, y_scale, url, tip, anchor
3067
+ ]
3060
3068
  end
3061
3069
 
3062
3070
  #
@@ -5728,7 +5736,7 @@ def prepare_chart(index, chart_id, drawing_id) # :nodoc:
5728
5736
  name = chart.name
5729
5737
 
5730
5738
  # Create a Drawing object to use with worksheet unless one already exists.
5731
- drawing = Drawing.new(drawing_type, dimensions, 0, 0, name, nil, anchor)
5739
+ drawing = Drawing.new(drawing_type, dimensions, 0, 0, name, nil, anchor, drawing_rel_index, 0, nil)
5732
5740
  if !drawings?
5733
5741
  @drawings = Drawings.new
5734
5742
  @drawings.add_drawing_object(drawing)
@@ -6077,6 +6085,21 @@ def write_sparkline_groups
6077
6085
 
6078
6086
  private
6079
6087
 
6088
+ #
6089
+ # Get the index used to address a drawing rel link.
6090
+ #
6091
+ def drawing_rel_index(target = nil)
6092
+ if !target
6093
+ # Undefined values for drawings like charts will always be unique.
6094
+ @drawing_rels_id += 1
6095
+ elsif ptrue?(@drawing_rels[target])
6096
+ @drawing_rels[target]
6097
+ else
6098
+ @drawing_rels_id += 1
6099
+ @drawing_rels[target] = @drawing_rels_id
6100
+ end
6101
+ end
6102
+
6080
6103
  def hyperlinks_count
6081
6104
  @hyperlinks.keys.inject(0) { |s, n| s += @hyperlinks[n].keys.size }
6082
6105
  end
@@ -6429,7 +6452,8 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
6429
6452
  y_dpi ||= 96
6430
6453
  drawing_type = 2
6431
6454
 
6432
- row, col, image, x_offset, y_offset, x_scale, y_scale, anchor = @images[index]
6455
+ row, col, image, x_offset, y_offset,
6456
+ x_scale, y_scale, url, tip, anchor = @images[index]
6433
6457
 
6434
6458
  width *= x_scale
6435
6459
  height *= y_scale
@@ -6444,7 +6468,7 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
6444
6468
  height = (0.5 + (height * 9_525)).to_i
6445
6469
 
6446
6470
  # Create a Drawing object to use with worksheet unless one already exists.
6447
- drawing = Drawing.new(drawing_type, dimensions, width, height, name, nil, anchor)
6471
+ drawing = Drawing.new(drawing_type, dimensions, width, height, name, nil, anchor, 0, 0, tip)
6448
6472
  if !drawings?
6449
6473
  drawings = Drawings.new
6450
6474
  drawings.embedded = 1
@@ -6457,6 +6481,35 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
6457
6481
  end
6458
6482
  drawings.add_drawing_object(drawing)
6459
6483
 
6484
+ if url
6485
+ rel_type = '/hyperlink'
6486
+ target_mode = 'External'
6487
+ if url =~ %r!^[fh]tt?ps?://! || url =~ /^mailto:/
6488
+ target = escape_url(url)
6489
+ end
6490
+ if url =~ /^external:/
6491
+ target = escape_url(url.sub(/^external:/, 'file:///'))
6492
+ # Additional escape not required in worksheet hyperlinks
6493
+ target = target.gsub(/#/, '%23')
6494
+ end
6495
+ if url =~ /^internal:/
6496
+ target = url.sub(/^internal:/, '#')
6497
+ target_mode = nil
6498
+ end
6499
+
6500
+ if target.length > 255
6501
+ raise <<"EOS"
6502
+ Ignoring URL #{target} where link or anchor > 255 characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the WriteXLSX documentation.
6503
+ EOS
6504
+ end
6505
+
6506
+ if target
6507
+ @drawing_links << [rel_type, target, target_mode]
6508
+ end
6509
+ drawing.url_rel_index = drawing_rel_index
6510
+ end
6511
+
6512
+ drawing.rel_index = drawing_rel_index
6460
6513
  @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
6461
6514
  end
6462
6515
  public :prepare_image
@@ -6575,7 +6628,7 @@ def prepare_shape(index, drawing_id)
6575
6628
  shape.calc_position_emus(self)
6576
6629
 
6577
6630
  drawing_type = 3
6578
- drawing = Drawing.new(drawing_type, shape.dimensions, shape.width_emu, shape.height_emu, shape.name, shape, shape.anchor)
6631
+ drawing = Drawing.new(drawing_type, shape.dimensions, shape.width_emu, shape.height_emu, shape.name, shape, shape.anchor, drawing_rel_index, 0, nil)
6579
6632
  drawings.add_drawing_object(drawing)
6580
6633
  end
6581
6634
  public :prepare_shape
@@ -7,19 +7,19 @@ class Hyperlink # :nodoc:
7
7
 
8
8
  attr_reader :str, :tip
9
9
 
10
- MAXIMUM_URLS_SIZE = 255
10
+ MAXIMUM_URLS_SIZE = 2079
11
11
 
12
- def self.factory(url, str = nil, tip = nil)
12
+ def self.factory(url, str = nil, tip = nil, max_url_length = MAXIMUM_URLS_SIZE)
13
13
  if url =~ /^internal:(.+)/
14
- InternalHyperlink.new($~[1], str, tip)
14
+ InternalHyperlink.new($~[1], str, tip, max_url_length)
15
15
  elsif url =~ /^external:(.+)/
16
- ExternalHyperlink.new($~[1], str, tip)
16
+ ExternalHyperlink.new($~[1], str, tip, max_url_length)
17
17
  else
18
- new(url, str, tip)
18
+ new(url, str, tip, max_url_length)
19
19
  end
20
20
  end
21
21
 
22
- def initialize(url, str, tip)
22
+ def initialize(url, str, tip, max_url_length)
23
23
  # The displayed string defaults to the url string.
24
24
  str ||= url.dup
25
25
 
@@ -33,8 +33,8 @@ def initialize(url, str, tip)
33
33
  url = escape_url(url)
34
34
 
35
35
  # Excel limits the escaped URL and location/anchor to 255 characters.
36
- if url.bytesize > 255 || (!@url_str.nil? && @url_str.bytesize > 255)
37
- raise "Ignoring URL '#{url}' where link or anchor > 255 characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
36
+ if url.bytesize > max_url_length || (!@url_str.nil? && @url_str.bytesize > max_url_length)
37
+ raise "Ignoring URL '#{url}' where link or anchor > #{max_url_length} characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
38
38
  end
39
39
 
40
40
  @url = url
@@ -61,33 +61,12 @@ def external_hyper_link
61
61
  def display_on
62
62
  @display = @url_str
63
63
  end
64
-
65
- private
66
-
67
- def escape_url(url)
68
- unless url =~ /%[0-9a-fA-F]{2}/
69
- # Escape the URL escape symbol.
70
- url = url.gsub(/%/, "%25")
71
-
72
- # Escape whitespae in URL.
73
- url = url.gsub(/[\s\x00]/, '%20')
74
-
75
- # Escape other special characters in URL.
76
- re = /(["<>\[\]`^{}])/
77
- while re =~ url
78
- match = $~[1]
79
- url = url.sub(re, sprintf("%%%x", match.ord))
80
- end
81
- end
82
-
83
- url
84
- end
85
64
  end
86
65
 
87
66
  class InternalHyperlink < Hyperlink
88
67
  undef external_hyper_link
89
68
 
90
- def initialize(url, str, tip)
69
+ def initialize(url, str, tip, max_url_length)
91
70
  @url = url
92
71
  # The displayed string defaults to the url string.
93
72
  str ||= @url.dup
@@ -98,9 +77,9 @@ def initialize(url, str, tip)
98
77
  # Copy string for use in hyperlink elements.
99
78
  @url_str = @str.dup
100
79
 
101
- # Excel limits escaped URL to 255 characters.
102
- if @url.bytesize > MAXIMUM_URLS_SIZE
103
- raise "URL '#{@url}' > #{MAXIMUM_URLS_SIZE} characters, it exceeds Excel's limit for URLS."
80
+ # Excel limits escaped URL to #{max_url_length} characters.
81
+ if @url.bytesize > max_url_length
82
+ raise "URL '#{@url}' > #{max_url_length} characters, it exceeds Excel's limit for URLS."
104
83
  end
105
84
 
106
85
  @tip = tip
@@ -118,7 +97,7 @@ def attributes(row, col, dummy = nil)
118
97
  end
119
98
 
120
99
  class ExternalHyperlink < Hyperlink
121
- def initialize(url, str, tip)
100
+ def initialize(url, str, tip, max_url_length)
122
101
  # The displayed string defaults to the url string.
123
102
  str ||= url.dup
124
103
 
@@ -145,9 +124,9 @@ def initialize(url, str, tip)
145
124
  url = url.sub(%r!^.\\!, '')
146
125
  @url_str = url_str
147
126
 
148
- # Excel limits the escaped URL and location/anchor to 255 characters.
149
- if url.bytesize > 255 || (!@url_str.nil? && @url_str.bytesize > 255)
150
- raise "Ignoring URL '#{url}' where link or anchor > 255 characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
127
+ # Excel limits the escaped URL and location/anchor to max_url_length characters.
128
+ if url.bytesize > max_url_length || (!@url_str.nil? && @url_str.bytesize > max_url_length)
129
+ raise "Ignoring URL '#{url}' where link or anchor > #{max_url_length} characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
151
130
  end
152
131
 
153
132
  @url = url
@@ -7,7 +7,7 @@ def test_drawing_chart_01
7
7
  @obj = Writexlsx::Drawings.new
8
8
  dimensions = [4, 8, 457200, 104775, 12, 22, 152400, 180975]
9
9
  drawing = Writexlsx::Drawing.new(
10
- 1, dimensions, nil, nil, nil, nil, 1
10
+ 1, dimensions, nil, nil, nil, nil, 1, 1
11
11
  )
12
12
  @obj.add_drawing_object(drawing)
13
13
  @obj.embedded = true
@@ -9,7 +9,7 @@ def test_drawing_image_01
9
9
  2, 1, 0, 0, 3, 6, 533257, 190357, 1219200, 190500
10
10
  ]
11
11
  drawing = Writexlsx::Drawing.new(
12
- 2, dimensions, 1142857, 1142857, 'republic.png', nil, 2
12
+ 2, dimensions, 1142857, 1142857, 'republic.png', nil, 2, 1
13
13
  )
14
14
  @obj.add_drawing_object(drawing)
15
15
  # @obj.add_drawing_object(
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink32 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink32
14
+ @xlsx = 'hyperlink32.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'https://github.com/jmcnamara'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink33 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink33
14
+ @xlsx = 'hyperlink33.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'https://github.com/jmcnamara',
21
+ :tip => 'GitHub'
22
+ )
23
+
24
+ workbook.close
25
+
26
+ compare_for_regression
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink34 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink34
14
+ @xlsx = 'hyperlink34.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image('A1', 'test/regression/images/blue.png')
19
+ worksheet.insert_image(
20
+ 'B3', 'test/regression/images/red.jpg',
21
+ :url => 'https://github.com/jmcnamara'
22
+ )
23
+ worksheet.insert_image('D5', 'test/regression/images/yellow.jpg')
24
+ worksheet.insert_image(
25
+ 'F9', 'test/regression/images/grey.png',
26
+ :url => 'https://github.com'
27
+ )
28
+
29
+ workbook.close
30
+
31
+ compare_for_regression
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink35 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink35
14
+ @xlsx = 'hyperlink35.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'A1', 'test/regression/images/blue.png',
20
+ :url => 'https://github.com/foo'
21
+ )
22
+ worksheet.insert_image(
23
+ 'B3', 'test/regression/images/red.jpg',
24
+ :url => 'https://github.com/bar'
25
+ )
26
+ worksheet.insert_image(
27
+ 'D5', 'test/regression/images/yellow.jpg',
28
+ :url => 'https://github.com/baz'
29
+ )
30
+ worksheet.insert_image(
31
+ 'F9', 'test/regression/images/grey.png',
32
+ :url => 'https://github.com/boo'
33
+ )
34
+
35
+ workbook.close
36
+
37
+ compare_for_regression
38
+ end
39
+ end
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink36 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink36
14
+ @xlsx = 'hyperlink36.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+ chart = workbook.add_chart(:type => 'pie', :embedded => 1)
18
+
19
+ worksheet.write('A1', 1)
20
+ worksheet.write('A2', 2)
21
+
22
+ worksheet.insert_image(
23
+ 'E9', 'test/regression/images/red.png',
24
+ :url => 'https://github.com/jmcnamara'
25
+ )
26
+
27
+ chart.add_series(:values => '=Sheet1!$A$1:$A$2')
28
+ worksheet.insert_chart('E12', chart)
29
+
30
+ workbook.close
31
+
32
+ compare_for_regression
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink37 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink37
14
+ @xlsx = 'hyperlink37.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ textbox = workbook.add_shape
19
+
20
+ worksheet.insert_image(
21
+ 'E9', 'test/regression/images/red.png',
22
+ :url => 'https://github.com/jmcnamara'
23
+ )
24
+
25
+ worksheet.insert_shape('E12', textbox)
26
+
27
+ workbook.close
28
+
29
+ compare_for_regression(
30
+ ['xl/drawings/drawing1.xml'], {}
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink38 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink38
14
+ @xlsx = 'hyperlink38.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'internal:Sheet1!A1'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink39 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink39
14
+ @xlsx = 'hyperlink39.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'external:c:\temp\foo.xlsx'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink40 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink40
14
+ @xlsx = 'hyperlink40.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'https://github.com/jmcnamara#foo'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink41 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink41
14
+ @xlsx = 'hyperlink41.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'https://github.com/jmcnamara<foo>'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink42 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink42
14
+ @xlsx = 'hyperlink42.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'mailto:jmcnamara@cpan.org'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink43 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink43
14
+ @xlsx = 'hyperlink43.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => 'external:c:\te mp\foo.xlsx'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink44 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink44
14
+ @xlsx = 'hyperlink44.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet('Sheet 1')
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => "internal:'Sheet 1'!A1"
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink45 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink45
14
+ @xlsx = 'hyperlink45.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.insert_image(
19
+ 'E9', 'test/regression/images/red.png',
20
+ :url => %q(external:\\\\Vboxsvr\share\foo bar.xlsx#'Some Sheet'!A1)
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRegressionHyperlink47 < Minitest::Test
5
+ def setup
6
+ setup_dir_var
7
+ end
8
+
9
+ def teardown
10
+ @tempfile.close(true) if @tempfile
11
+ end
12
+
13
+ def test_hyperlink47
14
+ @xlsx = 'hyperlink47.xlsx'
15
+ workbook = WriteXLSX.new(@io)
16
+ worksheet = workbook.add_worksheet
17
+
18
+ worksheet.write_url(
19
+ 'A1',
20
+ 'http://foo.com/this_is_a_long_hyperlink_that_exceeds_a_limit_of_255_characters_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
21
+ )
22
+
23
+ workbook.close
24
+
25
+ compare_for_regression
26
+ end
27
+ end
@@ -17,13 +17,13 @@ def test_image06
17
17
  chart = workbook.add_chart(:type => 'bar', :embedded => 1)
18
18
 
19
19
  # For testig, copy the randomly generated axis ids in the target xlsx file.
20
- chart.instance_variable_set(:@axis_ids, [46335488, 46364544])
20
+ chart.instance_variable_set(:@axis_ids, [87089152, 87093632])
21
21
 
22
22
  data = [
23
- [1, 2, 3, 4, 5],
24
- [2, 4, 6, 8, 10],
25
- [3, 6, 9, 12, 15]
26
- ]
23
+ [1, 2, 3, 4, 5],
24
+ [2, 4, 6, 8, 10],
25
+ [3, 6, 9, 12, 15]
26
+ ]
27
27
 
28
28
  worksheet.write('A1', data)
29
29
  chart.add_series(:values => '=Sheet1!$A$1:$A$5')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: write_xlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.01.0
4
+ version: 1.02.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hideo NAKAMURA
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-08 00:00:00.000000000 Z
11
+ date: 2021-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -900,6 +900,21 @@ files:
900
900
  - test/regression/test_hyperlink28.rb
901
901
  - test/regression/test_hyperlink29.rb
902
902
  - test/regression/test_hyperlink30.rb
903
+ - test/regression/test_hyperlink32.rb
904
+ - test/regression/test_hyperlink33.rb
905
+ - test/regression/test_hyperlink34.rb
906
+ - test/regression/test_hyperlink35.rb
907
+ - test/regression/test_hyperlink36.rb
908
+ - test/regression/test_hyperlink37.rb
909
+ - test/regression/test_hyperlink38.rb
910
+ - test/regression/test_hyperlink39.rb
911
+ - test/regression/test_hyperlink40.rb
912
+ - test/regression/test_hyperlink41.rb
913
+ - test/regression/test_hyperlink42.rb
914
+ - test/regression/test_hyperlink43.rb
915
+ - test/regression/test_hyperlink44.rb
916
+ - test/regression/test_hyperlink45.rb
917
+ - test/regression/test_hyperlink47.rb
903
918
  - test/regression/test_image01.rb
904
919
  - test/regression/test_image02.rb
905
920
  - test/regression/test_image03.rb
@@ -1585,6 +1600,23 @@ files:
1585
1600
  - test/regression/xlsx_files/hyperlink29.xlsx
1586
1601
  - test/regression/xlsx_files/hyperlink30.xlsx
1587
1602
  - test/regression/xlsx_files/hyperlink31.xlsx
1603
+ - test/regression/xlsx_files/hyperlink32.xlsx
1604
+ - test/regression/xlsx_files/hyperlink33.xlsx
1605
+ - test/regression/xlsx_files/hyperlink34.xlsx
1606
+ - test/regression/xlsx_files/hyperlink35.xlsx
1607
+ - test/regression/xlsx_files/hyperlink36.xlsx
1608
+ - test/regression/xlsx_files/hyperlink37.xlsx
1609
+ - test/regression/xlsx_files/hyperlink38.xlsx
1610
+ - test/regression/xlsx_files/hyperlink39.xlsx
1611
+ - test/regression/xlsx_files/hyperlink40.xlsx
1612
+ - test/regression/xlsx_files/hyperlink41.xlsx
1613
+ - test/regression/xlsx_files/hyperlink42.xlsx
1614
+ - test/regression/xlsx_files/hyperlink43.xlsx
1615
+ - test/regression/xlsx_files/hyperlink44.xlsx
1616
+ - test/regression/xlsx_files/hyperlink45.xlsx
1617
+ - test/regression/xlsx_files/hyperlink47.xlsx
1618
+ - test/regression/xlsx_files/hyperlink48.xlsx
1619
+ - test/regression/xlsx_files/hyperlink49.xlsx
1588
1620
  - test/regression/xlsx_files/image01.xlsx
1589
1621
  - test/regression/xlsx_files/image02.xlsx
1590
1622
  - test/regression/xlsx_files/image03.xlsx
@@ -1925,7 +1957,7 @@ homepage: https://github.com/cxn03651/write_xlsx#readme
1925
1957
  licenses:
1926
1958
  - MIT
1927
1959
  metadata: {}
1928
- post_install_message:
1960
+ post_install_message:
1929
1961
  rdoc_options: []
1930
1962
  require_paths:
1931
1963
  - lib
@@ -1940,8 +1972,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1940
1972
  - !ruby/object:Gem::Version
1941
1973
  version: '0'
1942
1974
  requirements: []
1943
- rubygems_version: 3.0.3
1944
- signing_key:
1975
+ rubygems_version: 3.1.4
1976
+ signing_key:
1945
1977
  specification_version: 4
1946
1978
  summary: write_xlsx is a gem to create a new file in the Excel 2007+ XLSX format.
1947
1979
  test_files:
@@ -2638,6 +2670,21 @@ test_files:
2638
2670
  - test/regression/test_hyperlink28.rb
2639
2671
  - test/regression/test_hyperlink29.rb
2640
2672
  - test/regression/test_hyperlink30.rb
2673
+ - test/regression/test_hyperlink32.rb
2674
+ - test/regression/test_hyperlink33.rb
2675
+ - test/regression/test_hyperlink34.rb
2676
+ - test/regression/test_hyperlink35.rb
2677
+ - test/regression/test_hyperlink36.rb
2678
+ - test/regression/test_hyperlink37.rb
2679
+ - test/regression/test_hyperlink38.rb
2680
+ - test/regression/test_hyperlink39.rb
2681
+ - test/regression/test_hyperlink40.rb
2682
+ - test/regression/test_hyperlink41.rb
2683
+ - test/regression/test_hyperlink42.rb
2684
+ - test/regression/test_hyperlink43.rb
2685
+ - test/regression/test_hyperlink44.rb
2686
+ - test/regression/test_hyperlink45.rb
2687
+ - test/regression/test_hyperlink47.rb
2641
2688
  - test/regression/test_image01.rb
2642
2689
  - test/regression/test_image02.rb
2643
2690
  - test/regression/test_image03.rb
@@ -3323,6 +3370,23 @@ test_files:
3323
3370
  - test/regression/xlsx_files/hyperlink29.xlsx
3324
3371
  - test/regression/xlsx_files/hyperlink30.xlsx
3325
3372
  - test/regression/xlsx_files/hyperlink31.xlsx
3373
+ - test/regression/xlsx_files/hyperlink32.xlsx
3374
+ - test/regression/xlsx_files/hyperlink33.xlsx
3375
+ - test/regression/xlsx_files/hyperlink34.xlsx
3376
+ - test/regression/xlsx_files/hyperlink35.xlsx
3377
+ - test/regression/xlsx_files/hyperlink36.xlsx
3378
+ - test/regression/xlsx_files/hyperlink37.xlsx
3379
+ - test/regression/xlsx_files/hyperlink38.xlsx
3380
+ - test/regression/xlsx_files/hyperlink39.xlsx
3381
+ - test/regression/xlsx_files/hyperlink40.xlsx
3382
+ - test/regression/xlsx_files/hyperlink41.xlsx
3383
+ - test/regression/xlsx_files/hyperlink42.xlsx
3384
+ - test/regression/xlsx_files/hyperlink43.xlsx
3385
+ - test/regression/xlsx_files/hyperlink44.xlsx
3386
+ - test/regression/xlsx_files/hyperlink45.xlsx
3387
+ - test/regression/xlsx_files/hyperlink47.xlsx
3388
+ - test/regression/xlsx_files/hyperlink48.xlsx
3389
+ - test/regression/xlsx_files/hyperlink49.xlsx
3326
3390
  - test/regression/xlsx_files/image01.xlsx
3327
3391
  - test/regression/xlsx_files/image02.xlsx
3328
3392
  - test/regression/xlsx_files/image03.xlsx