sablon 0.3.0 → 0.3.1

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
  SHA1:
3
- metadata.gz: 3e4309c45c7d9eb7360f7acb59f0ec625d2c0eef
4
- data.tar.gz: 20b6e2f1917f5af629078ec07d507058392ad88e
3
+ metadata.gz: 47a5aeb4ef473eea715114b4a32f0e2a5ab63711
4
+ data.tar.gz: 2335675beefc2ff842609cf7be53c2146c6bb4cb
5
5
  SHA512:
6
- metadata.gz: c37fe0cea7659f36f3498667bb9ea984308112306fb074b6ce9b771674423c52672ac81943628c48673fb80009d6a830c1cb12bbc11e90cd079ca38a9ca816f2
7
- data.tar.gz: a4040805a95867d75573b0b7d2ae705e673b4c9a588793c2eaa05dbd563ff7585006a12a1e81fcf549e3f3939ca3c17e2639a77d7c0836d3e8a43389aa8fd89e
6
+ metadata.gz: a66e1e936397fbc66858216b2259c4665a52d32c754c416ad71705c36d2bf2e6deff152421ee67eebce4d643ee8ecf3d543746f00a921b0533ce44dcfe5bd5ab
7
+ data.tar.gz: '0053920d8f9de09ab35885f68c79cc63f46f72b19874c2970c4e3b0655915c210af7f0c0836d8447c8a556955d937b9535a1abe426de4ed46444e3c3ba75a35b'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sablon (0.3.0)
4
+ sablon (0.3.1)
5
5
  nokogiri (>= 1.6.0)
6
6
  rubyzip (>= 1.1.1)
7
7
 
@@ -10,10 +10,10 @@ GEM
10
10
  specs:
11
11
  mini_portile2 (2.3.0)
12
12
  minitest (5.10.3)
13
- nokogiri (1.8.2)
13
+ nokogiri (1.8.5)
14
14
  mini_portile2 (~> 2.3.0)
15
15
  rake (12.3.0)
16
- rubyzip (1.2.1)
16
+ rubyzip (1.2.2)
17
17
  xml-simple (1.1.5)
18
18
 
19
19
  PLATFORMS
@@ -173,8 +173,9 @@ module Sablon
173
173
  end
174
174
 
175
175
  # Handles reading image data and inserting it into the document
176
- class Image < Struct.new(:name, :data, :local_rid)
176
+ class Image < Struct.new(:name, :data, :properties)
177
177
  attr_reader :rid_by_file
178
+ attr_accessor :local_rid
178
179
 
179
180
  def self.id; :image end
180
181
  def self.wraps?(value) false end
@@ -196,11 +197,23 @@ module Sablon
196
197
  #
197
198
  super name, img_data
198
199
  @attributes = attributes
200
+ @properties = @attributes.fetch("properties", {})
201
+
199
202
  # rId's are separate for each XML file but I want to be able
200
203
  # to reuse the actual image file itself.
201
204
  @rid_by_file = {}
202
205
  end
203
206
 
207
+ def width
208
+ return unless (width_str = @properties[:width])
209
+ convert_to_emu(width_str)
210
+ end
211
+
212
+ def height
213
+ return unless (height_str = @properties[:height])
214
+ convert_to_emu(height_str)
215
+ end
216
+
204
217
  def append_to(paragraph, display_node, env) end
205
218
 
206
219
  private
@@ -223,6 +236,22 @@ module Sablon
223
236
  #
224
237
  [File.basename(name), source.read]
225
238
  end
239
+
240
+ # Convert centimeters or inches to Word specific emu format
241
+ def convert_to_emu(dim_str)
242
+ value, unit = dim_str.match(/(^\.?\d+\.?\d*)(\w+)/).to_a[1..-1]
243
+ value = value.to_f
244
+
245
+ if unit == "cm"
246
+ value = value * 360000
247
+ elsif unit == "in"
248
+ value = value * 914400
249
+ else
250
+ throw ArgumentError, "Unsupported unit '#{unit}', only 'cm' and 'in' are permitted."
251
+ end
252
+
253
+ value.round()
254
+ end
226
255
  end
227
256
 
228
257
  register Sablon::Content::String
@@ -480,7 +480,7 @@ module Sablon
480
480
  class Run < Node
481
481
  PROPERTIES = %w[b i caps color dstrike emboss imprint highlight outline
482
482
  rStyle shadow shd smallCaps strike sz u vanish
483
- vertAlign].freeze
483
+ vertAlign rFonts].freeze
484
484
 
485
485
  def initialize(_env, node, properties)
486
486
  super
@@ -102,6 +102,17 @@ module Sablon
102
102
  pic_prop.attributes['name'].value = image.name if pic_prop
103
103
  blip = node.at_xpath('.//a:blip', a: 'http://schemas.openxmlformats.org/drawingml/2006/main')
104
104
  blip.attributes['embed'].value = image.local_rid if blip
105
+ drawing_size = node.at_xpath('.//wp:extent')
106
+
107
+ # if image properties are defined, the size of the placeholder image
108
+ # should be replaced with the actual values
109
+ if image.width && image.height
110
+ drawing_size.attributes['cx'].value = image.width.to_s if drawing_size
111
+ drawing_size.attributes['cy'].value = image.height.to_s if drawing_size
112
+ pic_size = node.at_xpath('.//a:xfrm//a:ext', a: 'http://schemas.openxmlformats.org/drawingml/2006/main')
113
+ pic_size.attributes['cx'].value = image.width.to_s if pic_size
114
+ pic_size.attributes['cy'].value = image.height.to_s if pic_size
115
+ end
105
116
  end
106
117
  end
107
118
  #
@@ -1,3 +1,3 @@
1
1
  module Sablon
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -287,4 +287,23 @@ class ContentImageTest < Sablon::TestCase
287
287
  Sablon.content(:image, data)
288
288
  end
289
289
  end
290
+
291
+ def test_width_conversion
292
+ img = Sablon.content(:image, @image_path.to_s, properties: {width: '1.0cm'})
293
+ assert_equal 360000, img.width
294
+ assert_nil img.height
295
+ end
296
+
297
+ def test_height_conversion
298
+ img = Sablon.content(:image, @image_path.to_s, properties: {height: '1.0in'})
299
+ assert_nil img.width
300
+ assert_equal 914400, img.height
301
+ end
302
+
303
+ def test_invalid_unit_conversion
304
+ img = Sablon.content(:image, @image_path.to_s, properties: {width: '100px'})
305
+ assert_raises ArgumentError do
306
+ img.width
307
+ end
308
+ end
290
309
  end
@@ -150,12 +150,12 @@ class SablonImagesTest < Sablon::TestCase
150
150
  template = Sablon.template @template_path
151
151
  #
152
152
  # setup two image contents to allow quick reuse
153
- r2d2 = Sablon.content(:image, @image_fixtures.join('r2d2.jpg').to_s)
153
+ r2d2 = Sablon.content(:image, @image_fixtures.join('r2d2.jpg').to_s, properties: {height: '1cm', width: '1cm'})
154
154
  c3po = Sablon.content(:image, @image_fixtures.join('c3po.jpg'))
155
155
  darth = Sablon.content(:image, @image_fixtures.join('darth_vader.jpg'))
156
156
  #
157
157
  im_data = StringIO.new(IO.binread(@image_fixtures.join('clone.jpg')))
158
- trooper = Sablon.content(:image, im_data, filename: 'clone.jpg')
158
+ trooper = Sablon.content(:image, im_data, filename: 'clone.jpg', properties: {height: '8cm', width: '4cm'})
159
159
  #
160
160
  # with the following context setup all trooper should be reused and
161
161
  # only a single file added to media. R2D2 should get duplicated in the
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sablon
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
  - Yves Senn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-27 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri