spreadsheet 0.6.1.3 → 0.6.1.4

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.
data/GUIDE.txt CHANGED
@@ -50,8 +50,8 @@ To access the values stored in a Row, treat the Row like an Array.
50
50
 
51
51
  row[0]
52
52
 
53
- -> this will return a String, a Float, an Integer, a Formula or a Date or
54
- DateTime object - or nil if the cell is empty.
53
+ -> this will return a String, a Float, an Integer, a Formula, a Link or a Date
54
+ or DateTime object - or nil if the cell is empty.
55
55
 
56
56
  More information about the formatting of a cell can be found in the Format
57
57
  with the equivalent index
data/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ === 0.6.1.4 / 2008-10-23
2
+
3
+ * 1 Bugfix
4
+
5
+ * Biff8#wide now works properly even if $KCODE=='UTF-8'
6
+ (Thanks to Bjørn Hjelle for the Bugreport)
7
+
8
+ * 1 minor enhancement
9
+
10
+ * Read/Write functionality for Links (only URLs can be written as of now)
11
+
1
12
  === 0.6.1.3 / 2008-10-21
2
13
 
3
14
  * 2 Bugfixes
data/Manifest.txt CHANGED
@@ -32,6 +32,7 @@ lib/spreadsheet/excel/writer/worksheet.rb
32
32
  lib/spreadsheet/font.rb
33
33
  lib/spreadsheet/format.rb
34
34
  lib/spreadsheet/formula.rb
35
+ lib/spreadsheet/link.rb
35
36
  lib/spreadsheet/row.rb
36
37
  lib/spreadsheet/workbook.rb
37
38
  lib/spreadsheet/worksheet.rb
data/lib/spreadsheet.rb CHANGED
@@ -42,7 +42,7 @@ module Spreadsheet
42
42
 
43
43
  ##
44
44
  # The version of Spreadsheet you are using.
45
- VERSION = '0.6.1.3'
45
+ VERSION = '0.6.1.4'
46
46
 
47
47
  ##
48
48
  # Default client Encoding. Change this value if your application uses a
@@ -81,5 +81,8 @@ module Spreadsheet
81
81
  write row, col, data, format
82
82
  end
83
83
  end
84
+ def write_url row, col, url, string=url, format=nil
85
+ row(row)[col] = Link.new url, string
86
+ end
84
87
  end
85
88
  end
@@ -211,6 +211,7 @@ module Internals
211
211
  :font => 0x0031, # ●● FONT ➜ 6.43
212
212
  :format => 0x041e, # ○○ FORMAT (Number Format) ➜ 6.45
213
213
  :formula => 0x0006, # FORMULA ➜ 6.46
214
+ :hlink => 0x01b8, # HLINK ➜ 6.52 (BIFF8 only)
214
215
  :label => 0x0204, # LABEL ➜ 6.59 (BIFF2-BIFF7)
215
216
  :labelsst => 0x00fd, # LABELSST ➜ 6.61 (BIFF8 only)
216
217
  :mulblank => 0x00be, # MULBLANK ➜ 6.64 (BIFF5-BIFF8)
@@ -1,6 +1,7 @@
1
1
  require 'spreadsheet/encodings'
2
2
  require 'spreadsheet/font'
3
3
  require 'spreadsheet/formula'
4
+ require 'spreadsheet/link'
4
5
  require 'spreadsheet/excel/error'
5
6
  require 'spreadsheet/excel/internals'
6
7
  require 'spreadsheet/excel/sst_entry'
@@ -384,6 +385,176 @@ class Reader
384
385
  # leave the Formula value blank
385
386
  end
386
387
  end
388
+ def read_hlink worksheet, work, pos, len
389
+ # 6.53.1 Common Record Contents
390
+ # Offset Size Contents
391
+ # 0 8 Cell range address of all cells containing this hyperlink
392
+ # (➜ 3.13.1)
393
+ # 8 16 GUID of StdLink:
394
+ # D0 C9 EA 79 F9 BA CE 11 8C 82 00 AA 00 4B A9 0B
395
+ # (79EAC9D0-BAF9-11CE-8C82-00AA004BA90B)
396
+ # 24 4 Unknown value: 0x00000002
397
+ # 28 4 Option flags (see below)
398
+ # Bit Mask Contents
399
+ # 0 0x00000001 0 = No link extant
400
+ # 1 = File link or URL
401
+ # 1 0x00000002 0 = Relative file path
402
+ # 1 = Absolute path or URL
403
+ # 2 and 4 0x00000014 0 = No description
404
+ # 1 (both bits) = Description
405
+ # 3 0x00000008 0 = No text mark
406
+ # 1 = Text mark
407
+ # 7 0x00000080 0 = No target frame
408
+ # 1 = Target frame
409
+ # 8 0x00000100 0 = File link or URL
410
+ # 1 = UNC path (incl. server name)
411
+ #--------------------------------------------------------------------------
412
+ # [32] 4 (optional, see option flags) Character count of description
413
+ # text, including trailing zero word (dl)
414
+ # [36] 2∙dl (optional, see option flags) Character array of description
415
+ # text, no Unicode string header, always 16-bit characters,
416
+ # zero-terminated
417
+ #--------------------------------------------------------------------------
418
+ # [var.] 4 (optional, see option flags) Character count of target
419
+ # frame, including trailing zero word (fl)
420
+ # [var.] 2∙fl (optional, see option flags) Character array of target
421
+ # frame, no Unicode string header, always 16-bit characters,
422
+ # zero-terminated
423
+ #--------------------------------------------------------------------------
424
+ # var. var. Special data (➜ 6.53.2 and following)
425
+ #--------------------------------------------------------------------------
426
+ # [var.] 4 (optional, see option flags) Character count of the text
427
+ # mark, including trailing zero word (tl)
428
+ # [var.] 2∙tl (optional, see option flags) Character array of the text
429
+ # mark without “#” sign, no Unicode string header, always
430
+ # 16-bit characters, zero-terminated
431
+ firstrow, lastrow, firstcol, lastcol, guid, opts = work.unpack 'v4H32x4V'
432
+ has_link = opts & 0x0001
433
+ absolute = opts & 0x0002
434
+ desc = opts & 0x0014
435
+ textmark = opts & 0x0008
436
+ target = opts & 0x0080
437
+ unc = opts & 0x0100
438
+ link = Link.new
439
+ url, description = nil
440
+ pos = 32
441
+ if desc > 0
442
+ description, pos = read_hlink_string work, pos
443
+ link << description
444
+ end
445
+ if target > 0
446
+ link.target_frame, pos = read_hlink_string work, pos
447
+ end
448
+ if unc > 0
449
+ # 6.53.4 Hyperlink to a File with UNC (Universal Naming Convention) Path
450
+ # These data fields are for UNC paths containing a server name (for
451
+ # instance “\\server\path\file.xls”). The lower 9 bits of the option
452
+ # flags field must be 1.x00x.xx112.
453
+ # Offset Size Contents
454
+ # 0 4 Character count of the UNC,
455
+ # including trailing zero word (fl)
456
+ # 4 2∙fl Character array of the UNC, no Unicode string header,
457
+ # always 16-bit characters, zeroterminated.
458
+ link.url, pos = read_hlink_string work, pos
459
+ elsif has_link > 0
460
+ uid, = work.unpack "x#{pos}H32"
461
+ pos += 16
462
+ if uid == "e0c9ea79f9bace118c8200aa004ba90b"
463
+ # 6.53.2 Hyperlink containing a URL (Uniform Resource Locator)
464
+ # These data fields occur for links which are not local files or files
465
+ # in the local network (for instance HTTP and FTP links and e-mail
466
+ # addresses). The lower 9 bits of the option flags field must be
467
+ # 0.x00x.xx112 (x means optional, depending on hyperlink content). The
468
+ # GUID could be used to distinguish a URL from a file link.
469
+ # Offset Size Contents
470
+ # 0 16 GUID of URL Moniker:
471
+ # E0 C9 EA 79 F9 BA CE 11 8C 82 00 AA 00 4B A9 0B
472
+ # (79EAC9E0-BAF9-11CE-8C82-00AA004BA90B)
473
+ # 16 4 Size of character array of the URL, including trailing
474
+ # zero word (us). There are us/2-1 characters in the
475
+ # following string.
476
+ # 20 us Character array of the URL, no Unicode string header,
477
+ # always 16-bit characters, zeroterminated
478
+ size, = work.unpack "x#{pos}V"
479
+ pos += 4
480
+ data = work[pos, size].chomp "\000\000"
481
+ link.url = client data, 'UTF-16LE'
482
+ pos += size
483
+ else
484
+ # 6.53.3 Hyperlink to a Local File
485
+ # These data fields are for links to files on local drives. The path of
486
+ # the file can be complete with drive letter (absolute) or relative to
487
+ # the location of the workbook. The lower 9 bits of the option flags
488
+ # field must be 0.x00x.xxx12. The GUID could be used to distinguish a
489
+ # URL from a file link.
490
+ # Offset Size Contents
491
+ # 0 16 GUID of File Moniker:
492
+ # 03 03 00 00 00 00 00 00 C0 00 00 00 00 00 00 46
493
+ # (00000303-0000-0000-C000-000000000046)
494
+ # 16 2 Directory up-level count. Each leading “..\” in the
495
+ # file link is deleted and increases this counter.
496
+ # 18 4 Character count of the shortened file path and name,
497
+ # including trailing zero byte (sl)
498
+ # 22 sl Character array of the shortened file path and name in
499
+ # 8.3-DOS-format. This field can be filled with a long
500
+ # file name too. No Unicode string header, always 8-bit
501
+ # characters, zeroterminated.
502
+ # 22+sl 24 Unknown byte sequence:
503
+ # FF FF AD DE 00 00 00 00
504
+ # 00 00 00 00 00 00 00 00
505
+ # 00 00 00 00 00 00 00 00
506
+ # 46+sl 4 Size of the following file link field including string
507
+ # length field and additional data field (sz). If sz is
508
+ # zero, nothing will follow (except a text mark).
509
+ # [50+sl] 4 (optional) Size of character array of the extended file
510
+ # path and name (xl). There are xl/2 characters in the
511
+ # following string.
512
+ # [54+sl] 2 (optional) Unknown byte sequence: 03 00
513
+ # [56+sl] xl (optional) Character array of the extended file path
514
+ # and name (xl), no Unicode string header, always 16-bit
515
+ # characters, not zero-terminated
516
+ uplevel, count = work.unpack "x#{pos}vV"
517
+ pos += 6
518
+ # TODO: short file path may have any of the OEM encodings. Find out which
519
+ # and use the #client method to convert the encoding.
520
+ prefix = internal('..\\', 'UTF-8') * uplevel
521
+ link.dos = link.url = prefix << work[pos, count].chomp("\000")
522
+ pos += count + 24
523
+ total, size = work.unpack "x#{pos}V2"
524
+ pos += 10
525
+ if total > 0
526
+ link.url = client work[pos, size], 'UTF-16LE'
527
+ pos += size
528
+ end
529
+ end
530
+ else
531
+ # 6.53.5 Hyperlink to the Current Workbook
532
+ # In this case only the text mark field is present (optional with
533
+ # description).
534
+ # Example: The URL “#Sheet2!B1:C2” refers to the given range in the
535
+ # current workbook.
536
+ # The lower 9 bits of the option flags field must be 0.x00x.1x002.
537
+ end
538
+ if textmark > 0
539
+ link.fragment, _ = read_hlink_string work, pos
540
+ end
541
+ if link.empty?
542
+ link << link.href
543
+ end
544
+ firstrow.upto lastrow do |row|
545
+ firstcol.upto lastcol do |col|
546
+ worksheet.add_link row, col, link
547
+ end
548
+ end
549
+ end
550
+ def read_hlink_string work, pos
551
+ count, = work.unpack "x#{pos}V"
552
+ len = count * 2
553
+ pos += 4
554
+ data = work[pos, len].chomp "\000\000"
555
+ pos += len
556
+ [client(data, 'UTF-16LE'), pos]
557
+ end
387
558
  def read_index worksheet, work, pos, len
388
559
  # Offset Size Contents
389
560
  # 0 4 Not used
@@ -615,6 +786,8 @@ class Reader
615
786
  when :row # ○○ Row Blocks ➜ 5.7
616
787
  # ● ROW ➜ 6.83
617
788
  set_row_address worksheet, work, pos, len
789
+ when :hlink
790
+ read_hlink worksheet, work, pos, len
618
791
  end
619
792
  previous = op
620
793
  end
@@ -150,7 +150,9 @@ module Biff8
150
150
  ##
151
151
  # Insert null-characters into a compressed UTF-16 string
152
152
  def wide string
153
- string.split('').zip(Array.new(string.size, 0.chr)).join
153
+ data = ''
154
+ string.each_byte do |byte| data << byte.chr << 0.chr end
155
+ data
154
156
  end
155
157
  private
156
158
  ##
@@ -53,7 +53,9 @@ class Row < Spreadsheet::Row
53
53
  end
54
54
  def enriched_data idx, data # :nodoc:
55
55
  res = nil
56
- if fmt = format(idx)
56
+ if link = @worksheet.links[[@idx, idx]]
57
+ res = link
58
+ elsif fmt = format(idx)
57
59
  res = if fmt.datetime? || fmt.time?
58
60
  _datetime data
59
61
  elsif fmt.date?
@@ -11,11 +11,15 @@ module Spreadsheet
11
11
  class Worksheet < Spreadsheet::Worksheet
12
12
  include Spreadsheet::Excel::Offset
13
13
  offset :dimensions
14
- attr_reader :offset, :ole
14
+ attr_reader :offset, :ole, :links
15
15
  def initialize opts = {}
16
16
  super
17
17
  @offset, @ole, @reader = opts[:offset], opts[:ole], opts[:reader]
18
18
  @dimensions = nil
19
+ @links = {}
20
+ end
21
+ def add_link row, column, link
22
+ @links.store [row, column], link
19
23
  end
20
24
  def column idx
21
25
  ensure_rows_read
@@ -413,6 +413,7 @@ class Worksheet
413
413
  # ○ PHONETIC ➜ 6.73
414
414
  # ○ Conditional Formatting Table ➜ 5.12
415
415
  # ○ Hyperlink Table ➜ 5.13
416
+ write_hyperlink_table
416
417
  # ○ Data Validity Table ➜ 5.14
417
418
  # ○ SHEETLAYOUT ➜ 6.91 (BIFF8X only)
418
419
  # ○ SHEETPROTECTION Additional protection, ➜ 6.92 (BIFF8X only)
@@ -420,6 +421,85 @@ class Worksheet
420
421
  # ● EOF ➜ 6.36
421
422
  write_eof
422
423
  end
424
+ def write_hlink row, col, link
425
+ # FIXME: only Hyperlinks are supported at present.
426
+ cell_range = [
427
+ row, row, # Cell range address of all cells containing this hyperlink
428
+ col, col, # (➜ 3.13.1)
429
+ ].pack 'v4'
430
+ guid = [
431
+ # GUID of StdLink:
432
+ # D0 C9 EA 79 F9 BA CE 11 8C 82 00 AA 00 4B A9 0B
433
+ # (79EAC9D0-BAF9-11CE-8C82-00AA004BA90B)
434
+ "d0c9ea79f9bace118c8200aa004ba90b",
435
+ ].pack 'H32'
436
+ opts = 0x01
437
+ opts |= 0x02
438
+ opts |= 0x14 unless link == link.url
439
+ opts |= 0x08 if link.fragment
440
+ opts |= 0x80 if link.target_frame
441
+ # TODO: UNC support
442
+ options = [
443
+ 2, # Unknown value: 0x00000002
444
+ opts, # Option flags
445
+ # Bit Mask Contents
446
+ # 0 0x00000001 0 = No link extant
447
+ # 1 = File link or URL
448
+ # 1 0x00000002 0 = Relative file path
449
+ # 1 = Absolute path or URL
450
+ # 2 and 4 0x00000014 0 = No description
451
+ # 1 (both bits) = Description
452
+ # 3 0x00000008 0 = No text mark
453
+ # 1 = Text mark
454
+ # 7 0x00000080 0 = No target frame
455
+ # 1 = Target frame
456
+ # 8 0x00000100 0 = File link or URL
457
+ # 1 = UNC path (incl. server name)
458
+
459
+ ].pack('V2')
460
+ tail = []
461
+ unless link == link.url
462
+ desc = internal(link).dup << "\000\000"
463
+ tail.push [desc.size / 2].pack('V'), desc
464
+ end
465
+ if link.target_frame
466
+ frme = internal(link.target_frame).dup << "\000\000"
467
+ tail.push [frme.size / 2].pack('V'), frme
468
+ end
469
+ url = internal(link.url).dup << "\000\000"
470
+ tail.push [
471
+ # 6.53.2 Hyperlink containing a URL (Uniform Resource Locator)
472
+ # These data fields occur for links which are not local files or files
473
+ # in the local network (for instance HTTP and FTP links and e-mail
474
+ # addresses). The lower 9 bits of the option flags field must be
475
+ # 0.x00x.xx112 (x means optional, depending on hyperlink content). The
476
+ # GUID could be used to distinguish a URL from a file link.
477
+ # GUID of URL Moniker:
478
+ # E0 C9 EA 79 F9 BA CE 11 8C 82 00 AA 00 4B A9 0B
479
+ # (79EAC9E0-BAF9-11CE-8C82-00AA004BA90B)
480
+ 'e0c9ea79f9bace118c8200aa004ba90b',
481
+ url.size # Size of character array of the URL, including trailing zero
482
+ # word (us). There are us/2-1 characters in the following
483
+ # string.
484
+ ].pack('H32V'), url
485
+ if link.fragment
486
+ frag = internal(link.fragment).dup << "\000\000"
487
+ tail.push [frag.size / 2].pack('V'), frag
488
+ end
489
+ write_op opcode(:hlink), cell_range, guid, options, *tail
490
+ end
491
+ def write_hyperlink_table
492
+ # TODO: theoretically it's possible to write fewer records by combining
493
+ # identical neighboring links in cell-ranges
494
+ links = []
495
+ @worksheet.each do |row|
496
+ row.each_with_index do |cell, idx|
497
+ if cell.is_a? Link
498
+ write_hlink row.idx, idx, cell
499
+ end
500
+ end
501
+ end
502
+ end
423
503
  def write_iteration
424
504
  its = 0 # 0 = Iterations off; 1 = Iterations on
425
505
  write_op 0x0011, [its].pack('v')
@@ -0,0 +1,40 @@
1
+ require 'uri'
2
+
3
+ module Spreadsheet
4
+ ##
5
+ # The Link class. Is a Subclass of String, which lets you treat a Cell that
6
+ # contains a Link just as if it was a String (containing the link's description
7
+ # if there is one or the url with fragment otherwise), but gives you access
8
+ # to the url, fragment and target_frame if you need it.
9
+ #
10
+ #
11
+ # Interesting Attributes
12
+ # #url :: The Uniform Resource Location this Link points to.
13
+ # #fragment :: Also called text mark: http://example.com/page.html#fragment
14
+ # #target_frame :: Which frame a Link should be opened in, should also support
15
+ # the special frames _blank, _parent, _self and _top.
16
+ # #dos :: Excel may store a DOS-Filename together with the long
17
+ # Filename introduced in VFAT. You probably will not need this,
18
+ # but if you do, here is where you can find it.
19
+ class Link < String
20
+ attr_accessor :target_frame, :url, :dos, :fragment
21
+ def initialize url='', description=url
22
+ super description
23
+ @url = url
24
+ end
25
+ ##
26
+ # The Url with the fragment appended if present.
27
+ def href
28
+ href = (@url || @dos).to_s.dup
29
+ if @fragment
30
+ href << '#' << @fragment
31
+ end
32
+ href
33
+ end
34
+ ##
35
+ # Attempts to parse the output of href. May raise a URI::InvalidURIError
36
+ def to_uri
37
+ URI.parse href
38
+ end
39
+ end
40
+ end
@@ -30,6 +30,7 @@ module Spreadsheet
30
30
  @workbook = opts[:workbook]
31
31
  @rows = []
32
32
  @columns = []
33
+ @links = {}
33
34
  end
34
35
  ##
35
36
  # Add a Format to the Workbook. If you use Row#set_format, you should not
@@ -139,6 +140,14 @@ module Spreadsheet
139
140
  sprintf "#<%s:0x%014x %s @rows[%i]>", self.class, object_id,
140
141
  variables, row_count
141
142
  end
143
+ ## The last Row containing any data
144
+ def last_row
145
+ row(last_row_index)
146
+ end
147
+ ## The index of the last Row containing any data
148
+ def last_row_index
149
+ [dimensions[1] - 1, 0].max
150
+ end
142
151
  ##
143
152
  # Replace the Row at _idx_ with the following arguments. Like #update_row,
144
153
  # but truncates the Row if there are fewer arguments than Cells in the Row.
Binary file
data/test/integration.rb CHANGED
@@ -44,8 +44,8 @@ module Spreadsheet
44
44
  enc = Encoding.find enc
45
45
  end
46
46
  assert_equal enc, book.encoding
47
- assert_equal 23, book.formats.size
48
- assert_equal 4, book.fonts.size
47
+ assert_equal 24, book.formats.size
48
+ assert_equal 5, book.fonts.size
49
49
  str1 = book.shared_string 0
50
50
  assert_equal @@iconv.iconv('Shared String'), str1
51
51
  str2 = book.shared_string 1
@@ -76,7 +76,7 @@ module Spreadsheet
76
76
  assert_equal 10, sheet.row_count
77
77
  assert_equal 11, sheet.column_count
78
78
  useds = [0,0,0,0,0,0,0,1,0,0]
79
- unuseds = [2,2,1,1,1,2,1,11,1,1]
79
+ unuseds = [2,2,1,1,1,2,1,11,1,2]
80
80
  sheet.each do |row|
81
81
  assert_equal useds.shift, row.first_used
82
82
  assert_equal unuseds.shift, row.first_unused
@@ -147,8 +147,8 @@ module Spreadsheet
147
147
  enc = Encoding.find enc
148
148
  end
149
149
  assert_equal enc, book.encoding
150
- assert_equal 23, book.formats.size
151
- assert_equal 4, book.fonts.size
150
+ assert_equal 24, book.formats.size
151
+ assert_equal 5, book.fonts.size
152
152
  str1 = book.shared_string 0
153
153
  assert_equal 'Shared String', str1
154
154
  str2 = book.shared_string 1
@@ -179,7 +179,7 @@ module Spreadsheet
179
179
  assert_equal 10, sheet.row_count
180
180
  assert_equal 11, sheet.column_count
181
181
  useds = [0,0,0,0,0,0,0,1,0,0]
182
- unuseds = [2,2,1,1,1,2,1,11,1,1]
182
+ unuseds = [2,2,1,1,1,2,1,11,1,2]
183
183
  sheet.each do |row|
184
184
  assert_equal useds.shift, row.first_used
185
185
  assert_equal unuseds.shift, row.first_unused
@@ -238,6 +238,11 @@ module Spreadsheet
238
238
  assert_equal 0.0001, row[0]
239
239
  row = sheet.row 9
240
240
  assert_equal 0.00009, row[0]
241
+ link = row[1]
242
+ assert_instance_of Link, link
243
+ assert_equal 'Link-Text', link
244
+ assert_equal 'http://scm.ywesee.com/spreadsheet', link.url
245
+ assert_equal 'http://scm.ywesee.com/spreadsheet', link.href
241
246
  end
242
247
  def test_version_excel95__ooffice__utf16
243
248
  Spreadsheet.client_encoding = 'UTF-16LE'
@@ -542,7 +547,7 @@ module Spreadsheet
542
547
  assert_equal 10, sheet.row_count
543
548
  assert_equal 11, sheet.column_count
544
549
  useds = [0,0,0,0,0,0,0,1,0,0]
545
- unuseds = [2,2,1,1,1,2,1,11,1,1]
550
+ unuseds = [2,2,1,1,1,2,1,11,1,2]
546
551
  sheet.each do |row|
547
552
  assert_equal useds.shift, row.first_used
548
553
  assert_equal unuseds.shift, row.first_unused
@@ -651,7 +656,7 @@ module Spreadsheet
651
656
  assert_equal 10, sheet.row_count
652
657
  assert_equal 11, sheet.column_count
653
658
  useds = [0,0,0,0,0,0,0,1,0,0]
654
- unuseds = [2,2,1,1,1,2,1,11,1,1]
659
+ unuseds = [2,2,1,1,1,2,1,11,1,2]
655
660
  sheet.each do |row|
656
661
  assert_equal useds.shift, row.first_used
657
662
  assert_equal unuseds.shift, row.first_unused
@@ -737,6 +742,9 @@ module Spreadsheet
737
742
  fmt = Format.new :color => 'aqua'
738
743
  sheet1[5,0] = 0.75
739
744
  sheet1.row(5).set_format 0, fmt
745
+ link = Link.new 'http://scm.ywesee.com/?p=spreadsheet;a=summary',
746
+ 'The Spreadsheet GitWeb'
747
+ sheet1[5,1] = link
740
748
  sheet1[6,0] = 1
741
749
  fmt = Format.new :color => 'green'
742
750
  sheet1.row(6).set_format 0, fmt
@@ -850,6 +858,11 @@ module Spreadsheet
850
858
  assert_equal 0.75, row[0]
851
859
  assert_equal 0.75, sheet[5,0]
852
860
  assert_equal 0.75, sheet.cell(5,0)
861
+ link = row[1]
862
+ assert_instance_of Link, link
863
+ url = @@iconv.iconv 'http://scm.ywesee.com/?p=spreadsheet;a=summary'
864
+ assert_equal @@iconv.iconv('The Spreadsheet GitWeb'), link
865
+ assert_equal url, link.url
853
866
  row = sheet.row 6
854
867
  assert_equal :green, row.format(0).font.color
855
868
  assert_equal 1, row[0]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spreadsheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1.3
4
+ version: 0.6.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannes Wyss
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-21 00:00:00 +02:00
12
+ date: 2008-10-23 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -80,6 +80,7 @@ files:
80
80
  - lib/spreadsheet/font.rb
81
81
  - lib/spreadsheet/format.rb
82
82
  - lib/spreadsheet/formula.rb
83
+ - lib/spreadsheet/link.rb
83
84
  - lib/spreadsheet/row.rb
84
85
  - lib/spreadsheet/workbook.rb
85
86
  - lib/spreadsheet/worksheet.rb