thinreports 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/thinreports/layout/legacy_schema.rb +53 -30
- data/lib/thinreports/version.rb +1 -1
- data/test/unit/layout/test_legacy_schema.rb +26 -39
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c93b3357d3d5cf6c1b61a01e9426482712d918da
|
4
|
+
data.tar.gz: d6947e5e59242e15735d7bb3022dda152ed03d5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c05756da8074b034b0747ee7d469086c11348ec9366e2311874230961aa36d82c105453ad0d9079eb6ca0c63b3a05ded8135d8bfb3b17fa41aff330f7c2e2804
|
7
|
+
data.tar.gz: 10805e8930c437ecc4c2c48fb370c93a450d155af49d783405e0ec2289e1f263b3bd8a29111e6675eac8bf67d426df237ecc5f4831e02dbe477e1696bafac73e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.9.1
|
2
|
+
|
3
|
+
* Fixed bug that line-height of text-block is always set to 0 #68
|
4
|
+
* Fixed a referenced text-block not rendered #68
|
5
|
+
* Fixed #66 an error occurred when render list #68
|
6
|
+
|
1
7
|
## 0.9.0
|
2
8
|
|
3
9
|
* Drop support for layout file saved with Editor v0.7 or lower #62
|
@@ -6,8 +6,14 @@ require 'rexml/document'
|
|
6
6
|
module Thinreports
|
7
7
|
module Layout
|
8
8
|
class LegacySchema
|
9
|
+
include Utils
|
10
|
+
|
9
11
|
def initialize(legacy_schema)
|
10
12
|
@legacy_schema = legacy_schema
|
13
|
+
@legacy_svg = legacy_schema['svg'].dup
|
14
|
+
@legacy_item_schemas = extract_legacy_item_schemas(legacy_svg)
|
15
|
+
|
16
|
+
normalize_svg!(@legacy_svg)
|
11
17
|
end
|
12
18
|
|
13
19
|
def upgrade
|
@@ -24,20 +30,23 @@ module Thinreports
|
|
24
30
|
'orientation' => page_config['orientation'],
|
25
31
|
'margin' => page_config.values_at('margin-top', 'margin-right', 'margin-bottom', 'margin-left').map(&:to_f)
|
26
32
|
},
|
27
|
-
'items' =>
|
33
|
+
'items' => item_schemas
|
28
34
|
}
|
29
35
|
end
|
30
36
|
|
31
|
-
attr_reader :legacy_schema
|
37
|
+
attr_reader :legacy_schema, :legacy_svg, :legacy_item_schemas
|
38
|
+
|
39
|
+
def item_schemas
|
40
|
+
svg = REXML::Document.new(legacy_svg)
|
41
|
+
build_item_schemas_from_svg(svg.elements['/svg/g'])
|
42
|
+
end
|
32
43
|
|
33
|
-
def build_item_schemas_from_svg(
|
34
|
-
|
44
|
+
def build_item_schemas_from_svg(svg_elements)
|
45
|
+
return [] unless svg_elements
|
35
46
|
|
36
|
-
svg_doc = REXML::Document.new(normalize_svg(svg, level))
|
37
47
|
items = []
|
38
48
|
|
39
|
-
|
40
|
-
item_schema = item_schemas[item_element.attributes['x-id']] || {}
|
49
|
+
svg_elements.each do |item_element|
|
41
50
|
item_attributes = item_element.attributes
|
42
51
|
|
43
52
|
items <<
|
@@ -50,7 +59,7 @@ module Thinreports
|
|
50
59
|
when 's-tblock' then text_block_item_schema(item_attributes)
|
51
60
|
when 's-iblock' then image_block_item_schema(item_attributes)
|
52
61
|
when 's-pageno' then page_number_item_schema(item_attributes)
|
53
|
-
when 's-list' then list_item_schema(
|
62
|
+
when 's-list' then list_item_schema(item_element)
|
54
63
|
else raise 'Unknown item type'
|
55
64
|
end
|
56
65
|
end
|
@@ -224,6 +233,7 @@ module Thinreports
|
|
224
233
|
'value' => attributes['x-value'],
|
225
234
|
'multiple-line' => attributes['x-multiple'] == 'true',
|
226
235
|
'format' => text_format,
|
236
|
+
'reference-id' => attributes['x-ref-id'],
|
227
237
|
'style' => {
|
228
238
|
'font-family' => [ attributes['font-family'] ],
|
229
239
|
'font-size' => attributes['font-size'].to_f,
|
@@ -234,29 +244,47 @@ module Thinreports
|
|
234
244
|
'line-height' => line_height(attributes['x-line-height']),
|
235
245
|
'letter-spacing' => letter_spacing(attributes['kerning']),
|
236
246
|
'overflow' => attributes['x-overflow'],
|
237
|
-
'word-wrap' => attributes['x-word-wrap']
|
247
|
+
'word-wrap' => attributes['x-word-wrap'] || ''
|
238
248
|
}
|
239
249
|
}
|
240
250
|
end
|
241
251
|
|
242
|
-
def list_item_schema(
|
243
|
-
|
252
|
+
def list_item_schema(legacy_element)
|
253
|
+
legacy_schema = legacy_item_schemas[legacy_element.attributes['x-id']]
|
254
|
+
|
255
|
+
header = list_section_schema('header', legacy_element, legacy_schema)
|
256
|
+
detail = list_section_schema('detail', legacy_element, legacy_schema)
|
257
|
+
page_footer = list_section_schema('page-footer', legacy_element, legacy_schema)
|
258
|
+
footer = list_section_schema('footer', legacy_element, legacy_schema)
|
259
|
+
|
260
|
+
schema = {
|
244
261
|
'id' => legacy_schema['id'],
|
245
262
|
'type' => Core::Shape::List::TYPE_NAME,
|
246
263
|
'content-height' => legacy_schema['content-height'].to_f,
|
247
264
|
'auto-page-break' => legacy_schema['page-break'] == 'true',
|
248
265
|
'display' => display(legacy_schema['display']),
|
249
|
-
'header' =>
|
250
|
-
'detail' =>
|
251
|
-
'page-footer' =>
|
252
|
-
'footer' =>
|
266
|
+
'header' => header,
|
267
|
+
'detail' => detail,
|
268
|
+
'page-footer' => page_footer,
|
269
|
+
'footer' => footer
|
253
270
|
}
|
271
|
+
|
272
|
+
if page_footer['enabled']
|
273
|
+
page_footer['translate']['y'] += detail['height']
|
274
|
+
end
|
275
|
+
|
276
|
+
if footer['enabled']
|
277
|
+
footer['translate']['y'] += detail['height']
|
278
|
+
footer['translate']['y'] += page_footer['height'] if page_footer['enabled']
|
279
|
+
end
|
280
|
+
schema
|
254
281
|
end
|
255
282
|
|
256
|
-
def list_section_schema(section_name, legacy_list_schema)
|
283
|
+
def list_section_schema(section_name, legacy_list_element, legacy_list_schema)
|
257
284
|
legacy_section_schema = legacy_list_schema[section_name]
|
285
|
+
return {} if legacy_section_schema.empty?
|
258
286
|
|
259
|
-
|
287
|
+
section_item_elements = legacy_list_element.elements["g[@class='s-list-#{section_name}']"]
|
260
288
|
|
261
289
|
section_schema = {
|
262
290
|
'height' => legacy_section_schema['height'].to_f,
|
@@ -264,7 +292,7 @@ module Thinreports
|
|
264
292
|
'x' => legacy_section_schema['translate']['x'].to_f,
|
265
293
|
'y' => legacy_section_schema['translate']['y'].to_f
|
266
294
|
},
|
267
|
-
'items' => build_item_schemas_from_svg(
|
295
|
+
'items' => build_item_schemas_from_svg(section_item_elements)
|
268
296
|
}
|
269
297
|
|
270
298
|
unless section_name == 'detail'
|
@@ -310,7 +338,7 @@ module Thinreports
|
|
310
338
|
end
|
311
339
|
|
312
340
|
def vertical_align(legacy_vertical_align)
|
313
|
-
return
|
341
|
+
return '' unless legacy_vertical_align
|
314
342
|
|
315
343
|
case legacy_vertical_align
|
316
344
|
when 'top' then 'top'
|
@@ -321,7 +349,7 @@ module Thinreports
|
|
321
349
|
end
|
322
350
|
|
323
351
|
def line_height(legacy_line_height)
|
324
|
-
legacy_line_height
|
352
|
+
blank_value?(legacy_line_height) ? '' : legacy_line_height.to_f
|
325
353
|
end
|
326
354
|
|
327
355
|
def letter_spacing(legacy_letter_spacing)
|
@@ -331,23 +359,18 @@ module Thinreports
|
|
331
359
|
end
|
332
360
|
end
|
333
361
|
|
334
|
-
def
|
362
|
+
def extract_legacy_item_schemas(svg)
|
335
363
|
items = {}
|
336
|
-
svg.scan(
|
364
|
+
svg.scan(/<!--SHAPE(.*?)SHAPE-->/) do |(item_schema_json)|
|
337
365
|
item_schema = JSON.parse(item_schema_json)
|
338
366
|
items[item_schema['id']] = item_schema
|
339
367
|
end
|
340
368
|
items
|
341
369
|
end
|
342
370
|
|
343
|
-
def normalize_svg(svg
|
344
|
-
svg.gsub!(
|
345
|
-
svg.gsub!(
|
346
|
-
svg
|
347
|
-
end
|
348
|
-
|
349
|
-
def level_symbol(level)
|
350
|
-
'-' * (level - 1)
|
371
|
+
def normalize_svg!(svg)
|
372
|
+
svg.gsub!(/<!--SHAPE.*?SHAPE-->/, '')
|
373
|
+
svg.gsub!(/<!--LAYOUT(.*?)LAYOUT-->/) { $1 }
|
351
374
|
end
|
352
375
|
end
|
353
376
|
end
|
data/lib/thinreports/version.rb
CHANGED
@@ -312,7 +312,8 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
312
312
|
'x-overflow' => 'expand',
|
313
313
|
'x-word-wrap' => 'break-word',
|
314
314
|
'x-format-base' => '$ {value}',
|
315
|
-
'x-format-type' => ''
|
315
|
+
'x-format-type' => '',
|
316
|
+
'x-ref-id' => 'other_text_block_id'
|
316
317
|
}
|
317
318
|
assert_equal(
|
318
319
|
{
|
@@ -325,6 +326,7 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
325
326
|
'display' => true,
|
326
327
|
'value' => 'default value',
|
327
328
|
'multiple-line' => true,
|
329
|
+
'reference-id' => 'other_text_block_id',
|
328
330
|
'format' => {
|
329
331
|
'base' => '$ {value}',
|
330
332
|
'type' => ''
|
@@ -398,17 +400,15 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
398
400
|
end
|
399
401
|
|
400
402
|
def test_list_item_schema
|
401
|
-
rect_item_svg = '<rect stroke="#000000" stroke-width="1" fill="#FFFFFF" class="s-rect" x-display="true" x-stroke-type="solid" stroke-dasharray="none" x-id="" rx="0" width="102.6" height="42" x="40" y="20"/>'
|
402
|
-
|
403
403
|
legacy_schema = {
|
404
404
|
'id' => 'default',
|
405
405
|
'type' => 's-list',
|
406
406
|
'content-height' => '300',
|
407
407
|
'page-break' => 'true',
|
408
408
|
'display' => 'false',
|
409
|
-
'header-enabled' => '
|
409
|
+
'header-enabled' => 'false',
|
410
410
|
'page-footer-enabled' => 'true',
|
411
|
-
'footer-enabled' => '
|
411
|
+
'footer-enabled' => 'true',
|
412
412
|
'header' => {
|
413
413
|
'height' => '100.1',
|
414
414
|
'translate' => {
|
@@ -423,9 +423,7 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
423
423
|
'x' => '300',
|
424
424
|
'y' => '400'
|
425
425
|
},
|
426
|
-
'svg' => {
|
427
|
-
'content' => rect_item_svg
|
428
|
-
}
|
426
|
+
'svg' => { 'content' => '' }
|
429
427
|
},
|
430
428
|
'page-footer' => {
|
431
429
|
'height' => '300.1',
|
@@ -444,6 +442,13 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
444
442
|
'svg' => { 'content' => '' }
|
445
443
|
}
|
446
444
|
}
|
445
|
+
|
446
|
+
layout_legacy_schema.stubs(:legacy_item_schemas).returns({ 'default' => legacy_schema })
|
447
|
+
|
448
|
+
legacy_element = mock()
|
449
|
+
legacy_element.stubs(:attributes).returns({ 'x-id' => 'default' })
|
450
|
+
legacy_element.stubs(:elements).returns({})
|
451
|
+
|
447
452
|
assert_equal(
|
448
453
|
{
|
449
454
|
'id' => 'default',
|
@@ -458,7 +463,7 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
458
463
|
'y' => 200.0
|
459
464
|
},
|
460
465
|
'items' => [],
|
461
|
-
'enabled' =>
|
466
|
+
'enabled' => false
|
462
467
|
},
|
463
468
|
'detail' => {
|
464
469
|
'height' => 200.1,
|
@@ -466,27 +471,13 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
466
471
|
'x' => 300.0,
|
467
472
|
'y' => 400.0
|
468
473
|
},
|
469
|
-
'items' => [
|
470
|
-
'id' => '',
|
471
|
-
'type' => 'rect',
|
472
|
-
'x' => 40.0,
|
473
|
-
'y' => 20.0,
|
474
|
-
'width' => 102.6,
|
475
|
-
'height' => 42.0,
|
476
|
-
'display' => true,
|
477
|
-
'style' => {
|
478
|
-
'border-width' => 1.0,
|
479
|
-
'border-color' => '#000000',
|
480
|
-
'border-style' => 'solid',
|
481
|
-
'fill-color' => '#FFFFFF'
|
482
|
-
}
|
483
|
-
}]
|
474
|
+
'items' => []
|
484
475
|
},
|
485
476
|
'page-footer' => {
|
486
477
|
'height' => 300.1,
|
487
478
|
'translate' => {
|
488
479
|
'x' => 500.0,
|
489
|
-
'y' =>
|
480
|
+
'y' => 800.1
|
490
481
|
},
|
491
482
|
'items' => [],
|
492
483
|
'enabled' => true
|
@@ -495,13 +486,13 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
495
486
|
'height' => 400.1,
|
496
487
|
'translate' => {
|
497
488
|
'x' => 700.0,
|
498
|
-
'y' =>
|
489
|
+
'y' => 1300.2
|
499
490
|
},
|
500
491
|
'items' => [],
|
501
|
-
'enabled' =>
|
492
|
+
'enabled' => true
|
502
493
|
}
|
503
494
|
},
|
504
|
-
layout_legacy_schema.list_item_schema(
|
495
|
+
layout_legacy_schema.list_item_schema(legacy_element)
|
505
496
|
)
|
506
497
|
end
|
507
498
|
|
@@ -537,7 +528,7 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
537
528
|
end
|
538
529
|
|
539
530
|
def test_vertical_align
|
540
|
-
assert_equal
|
531
|
+
assert_equal '', layout_legacy_schema.vertical_align(nil)
|
541
532
|
assert_equal 'top', layout_legacy_schema.vertical_align('top')
|
542
533
|
assert_equal 'middle', layout_legacy_schema.vertical_align('center')
|
543
534
|
assert_equal 'bottom', layout_legacy_schema.vertical_align('bottom')
|
@@ -546,6 +537,7 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
546
537
|
|
547
538
|
def test_line_height
|
548
539
|
assert_equal '', layout_legacy_schema.line_height('')
|
540
|
+
assert_equal '', layout_legacy_schema.line_height(nil)
|
549
541
|
assert_equal 20.1, layout_legacy_schema.line_height('20.1')
|
550
542
|
end
|
551
543
|
|
@@ -555,11 +547,6 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
555
547
|
assert_equal 2.5, layout_legacy_schema.letter_spacing('2.5')
|
556
548
|
end
|
557
549
|
|
558
|
-
def test_level_symbol
|
559
|
-
assert_equal '', layout_legacy_schema.level_symbol(1)
|
560
|
-
assert_equal '-', layout_legacy_schema.level_symbol(2)
|
561
|
-
end
|
562
|
-
|
563
550
|
def test_extract_item_schemas
|
564
551
|
svg = <<-SVG
|
565
552
|
<!--SHAPE{"id":"item1"}SHAPE-->
|
@@ -568,20 +555,20 @@ class Thinreports::Layout::TestLegacySchema < Minitest::Test
|
|
568
555
|
SVG
|
569
556
|
assert_equal(
|
570
557
|
{ 'item1' => { 'id' => 'item1' }, 'item3' => { 'id' => 'item3' } },
|
571
|
-
layout_legacy_schema.
|
558
|
+
layout_legacy_schema.extract_legacy_item_schemas(svg)
|
572
559
|
)
|
573
560
|
end
|
574
561
|
|
575
562
|
def test_normalize_svg
|
576
|
-
svg = '
|
577
|
-
normalized_svg = '<rect id="item2"/><!--SHAPE{"id":"item2"}SHAPE-->'
|
563
|
+
svg = '<!--SHAPE{"id":"item1"}SHAPE--><!--LAYOUT<rect id="item2"/>LAYOUT--><!--SHAPE{"id":"item2"}SHAPE-->'
|
578
564
|
|
579
|
-
|
565
|
+
layout_legacy_schema.normalize_svg!(svg)
|
566
|
+
assert_equal '<rect id="item2"/>', svg
|
580
567
|
end
|
581
568
|
|
582
569
|
private
|
583
570
|
|
584
571
|
def layout_legacy_schema
|
585
|
-
@layout_legacy_schema ||= Layout::LegacySchema.new({})
|
572
|
+
@layout_legacy_schema ||= Layout::LegacySchema.new({ 'svg' => '' })
|
586
573
|
end
|
587
574
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thinreports
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matsukei Co.,Ltd.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|