thinreports 0.9.0 → 0.9.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 +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
|