xlsxtream 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f6d507fcaf88af59b20094f992ba4e921ca610b
4
- data.tar.gz: 81f6f7d9a0312be08a7e394ef2e27be1f5f51a09
3
+ metadata.gz: 3059ae91a1d37f8af53f001f209956b099020ffe
4
+ data.tar.gz: 14cdbda940cfd0f71cb426c1c646b4434dddff7a
5
5
  SHA512:
6
- metadata.gz: 2890495ed08670099470e514836ee399481bdd261e12207a3df454be1e4e7ef6a8489e2b2b662f7cb3286dc5cb82af7c5fa5354b4e801847a95b0307812e008e
7
- data.tar.gz: 19f3812cdb16465b87e86c1aa2ff78605092729cd1fdbd767ae64abe3ba4cbea57d1ad63e5b1760c4a2bf5015a1629a5cb3834c9cafee6c33836a058f004a803
6
+ metadata.gz: 5894ce04ab5f8720e2da65e09de45a5d20b8c4df0f260e94cf2db1ec025b05832e69e8dce6edf1d6a9a938ea089408063dacf026f9185992a24c8e69a73847a5
7
+ data.tar.gz: 762faa3c9c0b2c29aacf150ed1610ae6af0badd373f770d33f348ac3bbd9dceaa98cbf98ff6ee35b6422fc554cbce4eb7729deb3887a392989c38b73be6bc10f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.1 (2017-10-22)
4
+
5
+ - Escape invalid XML 1.0 characters (#11)
6
+
3
7
  ## 0.3.0 (2017-07-12)
4
8
 
5
9
  - Add support for auto-formatting
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Xlsxtream
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/xlsxtream.svg)](https://rubygems.org/gems/xlsxtream)
4
+ [![Build Status](https://travis-ci.org/felixbuenemann/xlsxtream.svg)](https://travis-ci.org/felixbuenemann/xlsxtream)
5
+
3
6
  Xlsxtream is a streaming writer for XLSX spreadsheets. It supports multiple worksheets and optional string
4
7
  deduplication via a shared string table (SST). Its purpose is to replace CSV for large exports, because using
5
8
  CSV in Excel is very buggy and error prone. It's very efficient and can quickly write millions of rows with
@@ -0,0 +1,46 @@
1
+ module Xlsxtream
2
+ module IO
3
+ class Hash
4
+ def initialize(stream)
5
+ @stream = stream
6
+ @hash = {}
7
+ @path = nil
8
+ end
9
+
10
+ def <<(data)
11
+ @stream << data
12
+ end
13
+
14
+ def add_file(path)
15
+ close
16
+ @path = path
17
+ @hash[@path] = [@stream.tell]
18
+ end
19
+
20
+ def close
21
+ @hash[@path] << @stream.tell if @path
22
+ end
23
+
24
+ def fetch(path)
25
+ old = @stream.tell
26
+ from, to = @hash.fetch(path)
27
+ size = to - from
28
+ @stream.seek(from)
29
+ data = @stream.read(size)
30
+ @stream.seek(old)
31
+ data
32
+ end
33
+
34
+ def [](path)
35
+ fetch(path)
36
+ rescue KeyError
37
+ nil
38
+ end
39
+
40
+ def to_h
41
+ @hash.keys.map {|path| [path, fetch(path)] }.to_h
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -1,3 +1,3 @@
1
1
  module Xlsxtream
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
data/lib/xlsxtream/xml.rb CHANGED
@@ -14,6 +14,13 @@ module Xlsxtream
14
14
  UNSAFE_ATTR_CHARS = /[&"<>]/.freeze
15
15
  UNSAFE_VALUE_CHARS = /[&<>]/.freeze
16
16
 
17
+ # http://www.w3.org/TR/REC-xml/#NT-Char:
18
+ # Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
19
+ INVALID_XML10_CHARS = /[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]/.freeze
20
+
21
+ # ST_Xstring escaping
22
+ ESCAPE_CHAR = lambda { |c| '_x%04X_'.freeze % c.ord }.freeze
23
+
17
24
  class << self
18
25
 
19
26
  def header
@@ -29,7 +36,7 @@ module Xlsxtream
29
36
  end
30
37
 
31
38
  def escape_value(string)
32
- string.gsub(UNSAFE_VALUE_CHARS, XML_ESCAPES)
39
+ string.gsub(UNSAFE_VALUE_CHARS, XML_ESCAPES).gsub(INVALID_XML10_CHARS, &ESCAPE_CHAR)
33
40
  end
34
41
 
35
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlsxtream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Bünemann
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-14 00:00:00.000000000 Z
11
+ date: 2017-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -99,6 +99,7 @@ files:
99
99
  - bin/setup
100
100
  - lib/xlsxtream.rb
101
101
  - lib/xlsxtream/io/directory.rb
102
+ - lib/xlsxtream/io/hash.rb
102
103
  - lib/xlsxtream/io/rubyzip.rb
103
104
  - lib/xlsxtream/io/stream.rb
104
105
  - lib/xlsxtream/row.rb