writeexcel 0.3.5 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitattributes +1 -0
- data/README.rdoc +12 -6
- data/VERSION +1 -1
- data/charts/chartex.rb +316 -315
- data/charts/demo1.rb +1 -0
- data/charts/demo2.rb +1 -0
- data/charts/demo3.rb +117 -116
- data/charts/demo4.rb +119 -118
- data/charts/demo5.rb +48 -47
- data/examples/a_simple.rb +1 -0
- data/examples/autofilter.rb +1 -0
- data/examples/bigfile.rb +30 -29
- data/examples/chart_area.rb +121 -120
- data/examples/chart_bar.rb +120 -119
- data/examples/chart_column.rb +120 -119
- data/examples/chart_line.rb +120 -119
- data/examples/chart_pie.rb +108 -107
- data/examples/chart_scatter.rb +121 -120
- data/examples/chart_stock.rb +148 -147
- data/examples/chess.rb +1 -0
- data/examples/colors.rb +1 -0
- data/examples/comments1.rb +1 -0
- data/examples/comments2.rb +3 -2
- data/examples/copyformat.rb +1 -0
- data/examples/data_validate.rb +1 -0
- data/examples/date_time.rb +1 -0
- data/examples/defined_name.rb +1 -0
- data/examples/demo.rb +1 -0
- data/examples/diag_border.rb +1 -0
- data/examples/formats.rb +1 -0
- data/examples/formula_result.rb +1 -0
- data/examples/header.rb +1 -0
- data/examples/hide_sheet.rb +1 -0
- data/examples/hyperlink.rb +1 -0
- data/examples/images.rb +1 -0
- data/examples/indent.rb +1 -0
- data/examples/merge1.rb +1 -0
- data/examples/merge2.rb +1 -0
- data/examples/merge3.rb +1 -0
- data/examples/merge4.rb +1 -0
- data/examples/merge5.rb +1 -0
- data/examples/merge6.rb +67 -66
- data/examples/outline.rb +1 -0
- data/examples/outline_collapsed.rb +1 -0
- data/examples/panes.rb +1 -0
- data/examples/properties.rb +1 -0
- data/examples/properties_jp.rb +1 -0
- data/examples/protection.rb +1 -0
- data/examples/regions.rb +1 -0
- data/examples/repeat.rb +1 -0
- data/examples/right_to_left.rb +1 -0
- data/examples/row_wrap.rb +1 -0
- data/examples/stats.rb +1 -0
- data/examples/stocks.rb +1 -0
- data/examples/tab_colors.rb +1 -0
- data/examples/write_arrays.rb +1 -0
- data/lib/writeexcel.rb +6 -1
- data/lib/writeexcel/biffwriter.rb +21 -20
- data/lib/writeexcel/chart.rb +25 -12
- data/lib/writeexcel/charts/area.rb +153 -152
- data/lib/writeexcel/charts/bar.rb +178 -177
- data/lib/writeexcel/charts/column.rb +157 -156
- data/lib/writeexcel/charts/external.rb +62 -61
- data/lib/writeexcel/charts/line.rb +153 -152
- data/lib/writeexcel/charts/pie.rb +170 -169
- data/lib/writeexcel/charts/scatter.rb +4 -3
- data/lib/writeexcel/charts/stock.rb +212 -211
- data/lib/writeexcel/compatibility.rb +320 -0
- data/lib/writeexcel/excelformulaparser.rb +587 -586
- data/lib/writeexcel/format.rb +12 -13
- data/lib/writeexcel/formula.rb +30 -28
- data/lib/writeexcel/helper.rb +23 -0
- data/lib/writeexcel/olewriter.rb +5 -16
- data/lib/writeexcel/properties.rb +43 -54
- data/lib/writeexcel/storage_lite.rb +981 -968
- data/lib/writeexcel/workbook.rb +94 -73
- data/lib/writeexcel/worksheet.rb +230 -210
- data/test/helper.rb +19 -0
- data/test/test_00_IEEE_double.rb +1 -0
- data/test/test_01_add_worksheet.rb +1 -0
- data/test/test_02_merge_formats.rb +3 -5
- data/test/test_04_dimensions.rb +3 -5
- data/test/test_05_rows.rb +6 -6
- data/test/test_06_extsst.rb +8 -8
- data/test/test_11_date_time.rb +3 -5
- data/test/test_12_date_only.rb +3 -5
- data/test/test_13_date_seconds.rb +4 -6
- data/test/test_21_escher.rb +3 -5
- data/test/test_22_mso_drawing_group.rb +20 -22
- data/test/test_23_note.rb +5 -7
- data/test/test_24_txo.rb +3 -5
- data/test/test_25_position_object.rb +84 -79
- data/test/test_26_autofilter.rb +3 -13
- data/test/test_27_autofilter.rb +3 -13
- data/test/test_28_autofilter.rb +3 -13
- data/test/test_29_process_jpg.rb +5 -0
- data/test/test_30_validation_dval.rb +3 -5
- data/test/test_31_validation_dv_strings.rb +3 -5
- data/test/test_32_validation_dv_formula.rb +3 -5
- data/test/test_40_property_types.rb +10 -9
- data/test/test_41_properties.rb +1 -0
- data/test/test_42_set_properties.rb +14 -15
- data/test/test_50_name_stored.rb +299 -302
- data/test/test_51_name_print_area.rb +357 -360
- data/test/test_52_name_print_titles.rb +454 -457
- data/test/test_53_autofilter.rb +203 -206
- data/test/test_60_chart_generic.rb +5 -0
- data/test/test_61_chart_subclasses.rb +95 -94
- data/test/test_62_chart_formats.rb +272 -267
- data/test/test_63_chart_area_formats.rb +649 -644
- data/test/test_biff.rb +12 -38
- data/test/test_compatibility.rb +627 -0
- data/test/test_example_match.rb +3 -18
- data/test/test_format.rb +46 -105
- data/test/test_formula.rb +1 -0
- data/test/test_ole.rb +3 -4
- data/test/test_storage_lite.rb +125 -146
- data/test/test_workbook.rb +2 -23
- data/test/test_worksheet.rb +4 -5
- data/utils/add_magic_comment.rb +80 -0
- data/writeexcel.gemspec +8 -2
- metadata +10 -4
data/lib/writeexcel/format.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
##############################################################################
|
2
3
|
#
|
3
4
|
# Format - A class for defining Excel formatting.
|
@@ -10,7 +11,6 @@
|
|
10
11
|
# original written in Perl by John McNamara
|
11
12
|
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
12
13
|
#
|
13
|
-
require 'nkf'
|
14
14
|
|
15
15
|
#
|
16
16
|
# Format - A class for defining Excel formatting.
|
@@ -40,7 +40,6 @@ class Format
|
|
40
40
|
'white' => 0x09,
|
41
41
|
'yellow' => 0x0D,
|
42
42
|
} # :nodoc:
|
43
|
-
NonAscii = /[^!"#\$%&'\(\)\*\+,\-\.\/\:\;<=>\?@0-9A-Za-z_\[\\\]^` ~\0\n]/ # :nodoc:
|
44
43
|
|
45
44
|
###############################################################################
|
46
45
|
#
|
@@ -196,7 +195,7 @@ def copy(other)
|
|
196
195
|
@diag_border = other.diag_border
|
197
196
|
|
198
197
|
@font_only = other.font_only
|
199
|
-
end
|
198
|
+
end
|
200
199
|
|
201
200
|
###############################################################################
|
202
201
|
#
|
@@ -351,7 +350,7 @@ def get_xf # :nodoc:
|
|
351
350
|
data = [ifnt, ifmt, style, align, indent,
|
352
351
|
border1, border2, border3, icv].pack("vvvvvvvVv")
|
353
352
|
|
354
|
-
|
353
|
+
header + data
|
355
354
|
end
|
356
355
|
|
357
356
|
###############################################################################
|
@@ -389,13 +388,15 @@ def get_font # :nodoc:
|
|
389
388
|
rgch = @font
|
390
389
|
encoding = @font_encoding
|
391
390
|
|
391
|
+
rgch = convert_to_ascii_if_ascii(rgch)
|
392
|
+
|
392
393
|
# Handle utf8 strings
|
393
|
-
if rgch
|
394
|
-
rgch =
|
394
|
+
if rgch.encoding == Encoding::UTF_8
|
395
|
+
rgch = rgch.encode('UTF-16BE')
|
395
396
|
encoding = 1
|
396
397
|
end
|
397
398
|
|
398
|
-
cch = rgch.
|
399
|
+
cch = rgch.bytesize
|
399
400
|
#
|
400
401
|
# Handle Unicode font names.
|
401
402
|
if (encoding == 1)
|
@@ -405,7 +406,7 @@ def get_font # :nodoc:
|
|
405
406
|
end
|
406
407
|
|
407
408
|
record = 0x31
|
408
|
-
length = 0x10 + rgch.
|
409
|
+
length = 0x10 + rgch.bytesize
|
409
410
|
reserved = 0x00
|
410
411
|
|
411
412
|
grbit = 0x00
|
@@ -420,7 +421,7 @@ def get_font # :nodoc:
|
|
420
421
|
sss, uls, bFamily,
|
421
422
|
bCharSet, reserved, cch, encoding].pack('vvvvvCCCCCC')
|
422
423
|
|
423
|
-
|
424
|
+
header + data + rgch
|
424
425
|
end
|
425
426
|
|
426
427
|
###############################################################################
|
@@ -436,9 +437,7 @@ def get_font_key # :nodoc:
|
|
436
437
|
|
437
438
|
key = "#{@font}#{@size}#{@font_script}#{@underline}#{@font_strikeout}#{@bold}#{@font_outline}"
|
438
439
|
key += "#{@font_family}#{@font_charset}#{@font_shadow}#{@color}#{@italic}#{@font_encoding}"
|
439
|
-
|
440
|
-
|
441
|
-
return result
|
440
|
+
key.gsub(' ', '_') # Convert the key to a single word
|
442
441
|
end
|
443
442
|
|
444
443
|
###############################################################################
|
@@ -448,7 +447,7 @@ def get_font_key # :nodoc:
|
|
448
447
|
# Returns the used by Worksheet->_XF()
|
449
448
|
#
|
450
449
|
def xf_index # :nodoc:
|
451
|
-
|
450
|
+
@xf_index
|
452
451
|
end
|
453
452
|
|
454
453
|
def used_merge # :nodoc:
|
data/lib/writeexcel/formula.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
###############################################################################
|
2
3
|
#
|
3
4
|
# Formula - A class for generating Excel formulas.
|
@@ -10,13 +11,12 @@
|
|
10
11
|
# original written in Perl by John McNamara
|
11
12
|
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
12
13
|
#
|
13
|
-
require 'nkf'
|
14
14
|
require 'strscan'
|
15
15
|
require 'writeexcel/excelformulaparser'
|
16
16
|
|
17
17
|
class Formula < ExcelFormulaParser #:nodoc:
|
18
|
-
|
19
|
-
|
18
|
+
require 'writeexcel/helper'
|
19
|
+
private :convert_to_ascii_if_ascii
|
20
20
|
|
21
21
|
attr_accessor :byte_order, :workbook, :ext_sheets, :ext_refs, :ext_ref_count
|
22
22
|
|
@@ -151,7 +151,7 @@ def parse_tokens(tokens)
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
|
-
|
154
|
+
parse_str
|
155
155
|
end
|
156
156
|
|
157
157
|
def scan(formula)
|
@@ -239,7 +239,7 @@ def reverse(expression)
|
|
239
239
|
def check_volatile(tokens)
|
240
240
|
volatile = 0
|
241
241
|
|
242
|
-
(0..tokens.size-1).each do |i|
|
242
|
+
(0..tokens.size - 1).each do |i|
|
243
243
|
# If the next token is a function check if it is volatile.
|
244
244
|
if tokens[i] == '_func' and @functions[tokens[i+1]][3] != 0
|
245
245
|
volatile = 1
|
@@ -247,7 +247,7 @@ def check_volatile(tokens)
|
|
247
247
|
end
|
248
248
|
end
|
249
249
|
|
250
|
-
|
250
|
+
volatile
|
251
251
|
end
|
252
252
|
|
253
253
|
###############################################################################
|
@@ -269,7 +269,7 @@ def convert_volatile
|
|
269
269
|
# Convert a boolean token to ptgBool
|
270
270
|
#
|
271
271
|
def convert_bool(bool)
|
272
|
-
|
272
|
+
[@ptg['ptgBool'], bool.to_i].pack("CC")
|
273
273
|
end
|
274
274
|
|
275
275
|
|
@@ -297,23 +297,25 @@ def convert_number(num)
|
|
297
297
|
# Convert a string to a ptg Str.
|
298
298
|
#
|
299
299
|
def convert_string(str)
|
300
|
+
str = convert_to_ascii_if_ascii(str)
|
301
|
+
|
300
302
|
encoding = 0
|
301
303
|
|
302
304
|
str.sub!(/^"/,'') # Remove leading "
|
303
305
|
str.sub!(/"$/,'') # Remove trailing "
|
304
306
|
str.gsub!(/""/,'"') # Substitute Excel's escaped double quote "" for "
|
305
307
|
|
306
|
-
length = str.
|
308
|
+
length = str.bytesize
|
307
309
|
|
308
310
|
# Handle utf8 strings
|
309
|
-
if str
|
310
|
-
str =
|
311
|
+
if str.encoding == Encoding::UTF_8
|
312
|
+
str = str.encode('UTF-16LE')
|
311
313
|
encoding = 1
|
312
314
|
end
|
313
315
|
|
314
316
|
exit "String in formula has more than 255 chars\n" if length > 255
|
315
317
|
|
316
|
-
|
318
|
+
[@ptg['ptgStr'], length, encoding].pack("CCC") + str.encode('BINARY')
|
317
319
|
end
|
318
320
|
|
319
321
|
###############################################################################
|
@@ -337,7 +339,7 @@ def convert_ref2d(cell, _class)
|
|
337
339
|
exit "Unknown function class in formula\n"
|
338
340
|
end
|
339
341
|
|
340
|
-
|
342
|
+
ptgref + row + col
|
341
343
|
end
|
342
344
|
|
343
345
|
###############################################################################
|
@@ -368,7 +370,7 @@ def convert_ref3d(token, _class)
|
|
368
370
|
exit "Unknown function class in formula\n"
|
369
371
|
end
|
370
372
|
|
371
|
-
|
373
|
+
ptgref + ext_ref + row + col
|
372
374
|
end
|
373
375
|
|
374
376
|
###############################################################################
|
@@ -382,8 +384,8 @@ def convert_range2d(range, _class)
|
|
382
384
|
cell1, cell2 = range.split(':')
|
383
385
|
|
384
386
|
# A range such as A:D is equivalent to A1:D65536, so add rows as required
|
385
|
-
cell1
|
386
|
-
cell2
|
387
|
+
cell1 += '1' unless cell1 =~ /\d/
|
388
|
+
cell2 += '65536' unless cell2 =~ /\d/
|
387
389
|
|
388
390
|
# Convert the cell references
|
389
391
|
row1, col1 = cell_to_packed_rowcol(cell1)
|
@@ -400,7 +402,7 @@ def convert_range2d(range, _class)
|
|
400
402
|
exit "Unknown function class in formula\n"
|
401
403
|
end
|
402
404
|
|
403
|
-
|
405
|
+
ptgarea + row1 + row2 + col1 + col2
|
404
406
|
end
|
405
407
|
|
406
408
|
###############################################################################
|
@@ -421,8 +423,8 @@ def convert_range3d(token, _class)
|
|
421
423
|
cell1, cell2 = range.split(':')
|
422
424
|
|
423
425
|
# A range such as A:D is equivalent to A1:D65536, so add rows as required
|
424
|
-
cell1
|
425
|
-
cell2
|
426
|
+
cell1 += '1' unless cell1 =~ /\d/
|
427
|
+
cell2 += '65536' unless cell2 =~ /\d/
|
426
428
|
|
427
429
|
# Convert the cell references
|
428
430
|
row1, col1 = cell_to_packed_rowcol(cell1)
|
@@ -439,7 +441,7 @@ def convert_range3d(token, _class)
|
|
439
441
|
exit "Unknown function class in formula\n"
|
440
442
|
end
|
441
443
|
|
442
|
-
|
444
|
+
ptgarea + ext_ref + row1 + row2 + col1+ col2
|
443
445
|
end
|
444
446
|
|
445
447
|
###############################################################################
|
@@ -482,7 +484,7 @@ def pack_ext_ref(ext_ref)
|
|
482
484
|
index = @ext_refs[key]
|
483
485
|
end
|
484
486
|
|
485
|
-
|
487
|
+
[index].pack("v")
|
486
488
|
end
|
487
489
|
|
488
490
|
###############################################################################
|
@@ -493,9 +495,11 @@ def pack_ext_ref(ext_ref)
|
|
493
495
|
# sheet names is updated by the add_worksheet() method of the Workbook class.
|
494
496
|
#
|
495
497
|
def get_sheet_index(sheet_name)
|
498
|
+
sheet_name = convert_to_ascii_if_ascii(sheet_name)
|
499
|
+
|
496
500
|
# Handle utf8 sheetnames
|
497
|
-
if sheet_name
|
498
|
-
sheet_name =
|
501
|
+
if sheet_name.encoding == Encoding::UTF_8
|
502
|
+
sheet_name = sheet_name.encode('UTF-16BE')
|
499
503
|
end
|
500
504
|
|
501
505
|
if @ext_sheets[sheet_name].nil?
|
@@ -540,7 +544,7 @@ def get_ext_sheets
|
|
540
544
|
# updated by the add_worksheet() method of the Workbook class.
|
541
545
|
#
|
542
546
|
def get_ext_ref_count
|
543
|
-
|
547
|
+
@ext_ref_count
|
544
548
|
end
|
545
549
|
|
546
550
|
###############################################################################
|
@@ -645,14 +649,14 @@ def cell_to_rowcol(cell)
|
|
645
649
|
|
646
650
|
while (!chars.empty?)
|
647
651
|
char = chars.pop # LS char first
|
648
|
-
col
|
652
|
+
col += (char.ord - "A".ord + 1) * (26 ** expn)
|
649
653
|
expn += 1
|
650
654
|
end
|
651
655
|
# Convert 1-index to zero-index
|
652
656
|
row -= 1
|
653
657
|
col -= 1
|
654
658
|
|
655
|
-
|
659
|
+
[row, col, row_rel, col_rel]
|
656
660
|
end
|
657
661
|
|
658
662
|
###############################################################################
|
@@ -674,7 +678,7 @@ def cell_to_packed_rowcol(cell)
|
|
674
678
|
row = [row].pack('v')
|
675
679
|
col = [col].pack('v')
|
676
680
|
|
677
|
-
|
681
|
+
[row, col]
|
678
682
|
end
|
679
683
|
|
680
684
|
###############################################################################
|
@@ -1025,8 +1029,6 @@ def initialize_hashes
|
|
1025
1029
|
}
|
1026
1030
|
|
1027
1031
|
end
|
1028
|
-
|
1029
|
-
|
1030
1032
|
end
|
1031
1033
|
|
1032
1034
|
if $0 ==__FILE__
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# helper.rb
|
4
|
+
#
|
5
|
+
# Convert to US_ASCII encoding if ascii characters only.
|
6
|
+
def convert_to_ascii_if_ascii(str)
|
7
|
+
return nil if str.nil?
|
8
|
+
ruby_18 do
|
9
|
+
enc = str.encoding
|
10
|
+
begin
|
11
|
+
str = str.encode('ASCII')
|
12
|
+
rescue
|
13
|
+
str.force_encoding(enc)
|
14
|
+
end
|
15
|
+
end ||
|
16
|
+
ruby_19 do
|
17
|
+
if !str.nil? && str.ascii_only?
|
18
|
+
str = [str].pack('a*')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
str
|
22
|
+
end
|
23
|
+
private :convert_to_ascii_if_ascii
|
data/lib/writeexcel/olewriter.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
###############################################################################
|
2
3
|
#
|
3
4
|
# BIFFwriter - An abstract base class for Excel workbooks and worksheets.
|
@@ -31,7 +32,7 @@ def initialize(arg)
|
|
31
32
|
else
|
32
33
|
@io = arg
|
33
34
|
end
|
34
|
-
@io.binmode
|
35
|
+
@io.binmode if @io.respond_to?(:binmode)
|
35
36
|
|
36
37
|
@filehandle = ""
|
37
38
|
@fileclosed = false
|
@@ -92,13 +93,8 @@ def self.open(arg)
|
|
92
93
|
# Write BIFF data to OLE file.
|
93
94
|
#
|
94
95
|
def write(data)
|
95
|
-
#print "ole write\n"
|
96
|
-
#print data.unpack('C*').map! {|c| sprintf("%02X", c) }.join(' ') + "\n\n"
|
97
96
|
@io.write(data)
|
98
97
|
end
|
99
|
-
# def print(data)
|
100
|
-
# @io.print(data)
|
101
|
-
# end
|
102
98
|
|
103
99
|
###############################################################################
|
104
100
|
#
|
@@ -148,11 +144,8 @@ def calculate_sizes
|
|
148
144
|
#
|
149
145
|
def close
|
150
146
|
if @size_allowed == true
|
151
|
-
#print "write_padding"
|
152
147
|
write_padding if @biff_only == 0
|
153
|
-
#print "write_property_storage"
|
154
148
|
write_property_storage if @biff_only == 0
|
155
|
-
#print "write_big_block_depot"
|
156
149
|
write_big_block_depot if @biff_only == 0
|
157
150
|
end
|
158
151
|
@io.close
|
@@ -262,7 +255,7 @@ def write_pps(name, type, dir, start, size)
|
|
262
255
|
unless name.empty?
|
263
256
|
name = name + "\0"
|
264
257
|
ord_name = name.unpack("c*")
|
265
|
-
length = name.
|
258
|
+
length = name.bytesize * 2
|
266
259
|
end
|
267
260
|
|
268
261
|
rawname = ord_name.pack("v*")
|
@@ -284,17 +277,13 @@ def write_pps(name, type, dir, start, size)
|
|
284
277
|
pps_size = [size].pack("V") #0x78
|
285
278
|
|
286
279
|
write(rawname)
|
287
|
-
|
288
|
-
write(zero)
|
289
|
-
end
|
280
|
+
write(zero * (64 - length)) if 64 - length >= 1
|
290
281
|
write(pps_sizeofname)
|
291
282
|
write(pps_type)
|
292
283
|
write(pps_prev)
|
293
284
|
write(pps_next)
|
294
285
|
write(pps_dir)
|
295
|
-
|
296
|
-
write(unknown)
|
297
|
-
end
|
286
|
+
write(unknown * 5)
|
298
287
|
write(pps_ts1s)
|
299
288
|
write(pps_ts1d)
|
300
289
|
write(pps_ts2s)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
###############################################################################
|
2
3
|
#
|
3
4
|
# Properties - A module for creating Excel property sets.
|
@@ -36,25 +37,25 @@ def create_summary_property_set(properties) #:nodoc:
|
|
36
37
|
property_data, offsets = pack_property_data(properties)
|
37
38
|
|
38
39
|
# Create the property type and offsets based on the previous calculation.
|
39
|
-
0.upto(properties.size-1) do |i|
|
40
|
-
property_offsets
|
40
|
+
0.upto(properties.size - 1) do |i|
|
41
|
+
property_offsets += [properties[i][0], offsets[i]].pack('VV')
|
41
42
|
end
|
42
43
|
|
43
44
|
# Size of size (4 bytes) + num_property (4 bytes) + the data structures.
|
44
|
-
size = 8 + (property_offsets).
|
45
|
+
size = 8 + (property_offsets).bytesize + property_data.bytesize
|
45
46
|
size = [size].pack('V')
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
48
|
+
byte_order +
|
49
|
+
version +
|
50
|
+
system_id +
|
51
|
+
class_id +
|
52
|
+
num_property_sets +
|
53
|
+
format_id +
|
54
|
+
offset +
|
55
|
+
size +
|
56
|
+
num_property +
|
57
|
+
property_offsets +
|
58
|
+
property_data
|
58
59
|
end
|
59
60
|
|
60
61
|
|
@@ -84,11 +85,11 @@ def create_doc_summary_property_set(properties) #:nodoc:
|
|
84
85
|
|
85
86
|
# Create the property type and offsets based on the previous calculation.
|
86
87
|
0.upto(properties.size-1) do |i|
|
87
|
-
property_offsets_0
|
88
|
+
property_offsets_0 += [properties[i][0], offsets[i]].pack('VV')
|
88
89
|
end
|
89
90
|
|
90
91
|
# Size of size (4 bytes) + num_property (4 bytes) + the data structures.
|
91
|
-
data_len = 8 + (property_offsets_0).
|
92
|
+
data_len = 8 + (property_offsets_0).bytesize + property_data_0.bytesize
|
92
93
|
size_0 = [data_len].pack('V')
|
93
94
|
|
94
95
|
# The second property set offset is at the end of the first property set.
|
@@ -108,22 +109,20 @@ def create_doc_summary_property_set(properties) #:nodoc:
|
|
108
109
|
7D 00 00 00 00 00 00 00 2D 00 39 00 30 00 33 00
|
109
110
|
).join('')].pack('H*')
|
110
111
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
property_data_1
|
112
|
+
byte_order +
|
113
|
+
version +
|
114
|
+
system_id +
|
115
|
+
class_id +
|
116
|
+
num_property_sets +
|
117
|
+
format_id_0 +
|
118
|
+
offset_0 +
|
119
|
+
format_id_1 +
|
120
|
+
offset_1 +
|
121
|
+
size_0 +
|
122
|
+
num_property_0 +
|
123
|
+
property_offsets_0 +
|
124
|
+
property_data_0 +
|
125
|
+
property_data_1
|
127
126
|
end
|
128
127
|
|
129
128
|
|
@@ -164,11 +163,11 @@ def pack_property_data(properties, offset = 0) #:nodoc:
|
|
164
163
|
raise "Unknown property type: '#{property_type}'\n"
|
165
164
|
end
|
166
165
|
|
167
|
-
offset += packed_property.
|
168
|
-
data
|
166
|
+
offset += packed_property.bytesize
|
167
|
+
data += packed_property
|
169
168
|
end
|
170
169
|
|
171
|
-
|
170
|
+
[data, offsets]
|
172
171
|
end
|
173
172
|
|
174
173
|
###############################################################################
|
@@ -191,37 +190,27 @@ def pack_VT_I2(value) #:nodoc:
|
|
191
190
|
#
|
192
191
|
def pack_VT_LPSTR(str, codepage) #:nodoc:
|
193
192
|
type = 0x001E
|
194
|
-
string = str + "\0"
|
193
|
+
string = str.force_encoding('BINARY') + "\0".encode('BINARY')
|
195
194
|
|
196
195
|
if codepage == 0x04E4
|
197
196
|
# Latin1
|
198
|
-
|
199
|
-
length = byte_string.length
|
197
|
+
length = string.bytesize
|
200
198
|
elsif codepage == 0xFDE9
|
201
|
-
#
|
202
|
-
|
203
|
-
if string =~ nonAscii
|
204
|
-
# $KCODE = 'u'
|
205
|
-
require 'jcode'
|
206
|
-
byte_string = string
|
207
|
-
length = byte_string.jlength
|
208
|
-
else
|
209
|
-
byte_string = string
|
210
|
-
length = byte_string.length
|
211
|
-
end
|
199
|
+
# utf8
|
200
|
+
length = string.bytesize
|
212
201
|
else
|
213
|
-
raise "Unknown codepage: codepage\n"
|
202
|
+
raise "Unknown codepage: #{codepage}\n"
|
214
203
|
end
|
215
204
|
|
216
205
|
# Pack the data.
|
217
|
-
data
|
218
|
-
data
|
206
|
+
data = [type, length].pack('VV')
|
207
|
+
data += string
|
219
208
|
|
220
209
|
# The packed data has to null padded to a 4 byte boundary.
|
221
210
|
if (extra = length % 4) != 0
|
222
|
-
data
|
211
|
+
data += "\0" * (4 - extra)
|
223
212
|
end
|
224
|
-
|
213
|
+
data
|
225
214
|
end
|
226
215
|
|
227
216
|
###############################################################################
|