thinreports 0.6.0.pre3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +37 -32
- data/doc/yardoc_templates/default/layout/html/footer.erb +1 -1
- data/lib/thinreports.rb +2 -1
- data/lib/thinreports/config.rb +21 -0
- data/lib/thinreports/core/errors.rb +14 -1
- data/lib/thinreports/core/format/builder.rb +6 -1
- data/lib/thinreports/core/page.rb +6 -6
- data/lib/thinreports/core/shape.rb +8 -9
- data/lib/thinreports/core/shape/base/internal.rb +6 -12
- data/lib/thinreports/core/shape/basic.rb +3 -0
- data/lib/thinreports/core/shape/basic/block_format.rb +12 -0
- data/lib/thinreports/core/shape/basic/block_interface.rb +25 -0
- data/lib/thinreports/core/shape/basic/block_internal.rb +33 -0
- data/lib/thinreports/core/shape/basic/interface.rb +37 -11
- data/lib/thinreports/core/shape/basic/internal.rb +3 -12
- data/lib/thinreports/core/shape/image_block.rb +15 -0
- data/lib/thinreports/core/shape/image_block/format.rb +13 -0
- data/lib/thinreports/core/shape/image_block/interface.rb +19 -0
- data/lib/thinreports/core/shape/image_block/internal.rb +16 -0
- data/lib/thinreports/core/shape/list/events.rb +19 -2
- data/lib/thinreports/core/shape/list/manager.rb +17 -4
- data/lib/thinreports/core/shape/list/page.rb +2 -2
- data/lib/thinreports/core/shape/list/page_state.rb +4 -0
- data/lib/thinreports/core/shape/list/section_internal.rb +4 -0
- data/lib/thinreports/core/shape/manager/format.rb +1 -1
- data/lib/thinreports/core/shape/manager/internal.rb +24 -11
- data/lib/thinreports/core/shape/manager/target.rb +2 -2
- data/lib/thinreports/core/shape/style.rb +15 -0
- data/lib/thinreports/core/shape/style/base.rb +149 -0
- data/lib/thinreports/core/shape/style/basic.rb +17 -0
- data/lib/thinreports/core/shape/style/graphic.rb +60 -0
- data/lib/thinreports/core/shape/style/text.rb +138 -0
- data/lib/thinreports/core/shape/text/internal.rb +4 -0
- data/lib/thinreports/core/shape/text_block.rb +16 -0
- data/lib/thinreports/core/shape/{tblock → text_block}/format.rb +3 -3
- data/lib/thinreports/core/shape/{tblock → text_block}/formatter.rb +7 -7
- data/lib/thinreports/core/shape/{tblock → text_block}/formatter/basic.rb +1 -1
- data/lib/thinreports/core/shape/{tblock → text_block}/formatter/datetime.rb +1 -1
- data/lib/thinreports/core/shape/{tblock → text_block}/formatter/number.rb +1 -1
- data/lib/thinreports/core/shape/{tblock → text_block}/formatter/padding.rb +10 -8
- data/lib/thinreports/core/shape/{tblock → text_block}/interface.rb +2 -21
- data/lib/thinreports/core/shape/{tblock → text_block}/internal.rb +16 -10
- data/lib/thinreports/core/utils.rb +0 -8
- data/lib/thinreports/generator.rb +2 -2
- data/lib/thinreports/generator/configuration.rb +30 -0
- data/lib/thinreports/generator/pdf.rb +13 -10
- data/lib/thinreports/generator/pdf/configuration.rb +28 -0
- data/lib/thinreports/generator/pdf/document.rb +16 -56
- data/lib/thinreports/generator/pdf/document/draw_shape.rb +35 -17
- data/lib/thinreports/generator/pdf/document/font.rb +25 -9
- data/lib/thinreports/generator/pdf/document/graphics.rb +1 -1
- data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +18 -4
- data/lib/thinreports/generator/pdf/document/graphics/basic.rb +1 -1
- data/lib/thinreports/generator/pdf/document/graphics/image.rb +18 -1
- data/lib/thinreports/generator/pdf/document/graphics/text.rb +29 -6
- data/lib/thinreports/generator/pdf/document/page.rb +70 -0
- data/lib/thinreports/generator/pdf/document/parse_color.rb +1 -1
- data/lib/thinreports/generator/pdf/document/parse_svg.rb +1 -1
- data/lib/thinreports/generator/pdf/drawer.rb +1 -1
- data/lib/thinreports/generator/pdf/drawer/base.rb +5 -7
- data/lib/thinreports/generator/pdf/drawer/list.rb +4 -4
- data/lib/thinreports/generator/pdf/drawer/list_section.rb +8 -3
- data/lib/thinreports/generator/pdf/drawer/page.rb +10 -3
- data/lib/thinreports/generator/pdf/prawn_ext.rb +16 -21
- data/lib/thinreports/layout/format.rb +2 -2
- data/lib/thinreports/layout/version.rb +2 -2
- data/lib/thinreports/report/base.rb +68 -31
- data/tasks/test.rake +48 -4
- data/test/benchmark/basic_estimate.tlf +1 -0
- data/test/benchmark/bench_basic_estimate.rb +95 -0
- data/test/case/character_spacing/character_spacing.rb +7 -0
- data/test/case/character_spacing/character_spacing.tlf +1 -0
- data/test/case/dynamic_image/dynamic_image.rb +41 -0
- data/test/case/dynamic_image/dynamic_image.tlf +1 -0
- data/test/case/dynamic_image/img200x100.png +0 -0
- data/test/case/dynamic_image/img50x50.png +0 -0
- data/test/case/dynamic_style/dynamic_style.rb +154 -0
- data/test/case/dynamic_style/dynamic_style.tlf +1 -0
- data/test/case/dynamic_style/dynamic_style_in_list.tlf +1 -0
- data/test/case/dynamic_style/image.png +0 -0
- data/test/case/eudc/eudc.rb +20 -0
- data/test/case/eudc/eudc.tlf +1 -0
- data/test/case/eudc/eudc.ttf +0 -0
- data/test/case/helper.rb +27 -0
- data/test/case/hidden_shapes/hidden_shapes.rb +13 -0
- data/test/case/hidden_shapes/hidden_shapes.tlf +1 -0
- data/test/case/list_events/list_events.rb +32 -0
- data/test/case/list_events/list_events.tlf +1 -0
- data/test/case/list_header_inheriting/list_header_inheriting.rb +19 -0
- data/test/case/list_header_inheriting/list_header_inheriting.tlf +1 -0
- data/test/case/list_manual_generation/list_manual_generation.rb +24 -0
- data/test/case/list_manual_generation/list_manual_generation.tlf +1 -0
- data/test/case/single_line_tblock/single_line_tblock.rb +15 -0
- data/test/case/single_line_tblock/single_line_tblock.tlf +1 -0
- data/test/case/tblock_styles/tblock_styles.rb +27 -0
- data/test/case/tblock_styles/tblock_styles.tlf +1 -0
- data/test/case/text_align/text_align.rb +9 -0
- data/test/case/text_align/text_align.tlf +1 -0
- data/test/unit/core/shape/base/test_internal.rb +65 -85
- data/test/unit/core/shape/basic/test_basic_format.rb +30 -0
- data/test/unit/core/shape/basic/test_basic_interface.rb +27 -0
- data/test/unit/core/shape/basic/test_basic_internal.rb +55 -0
- data/test/unit/core/shape/basic/test_interface.rb +84 -36
- data/test/unit/core/shape/basic/test_internal.rb +32 -24
- data/test/unit/core/shape/image_block/test_format.rb +58 -0
- data/test/unit/core/shape/image_block/test_interface.rb +23 -0
- data/test/unit/core/shape/image_block/test_internal.rb +28 -0
- data/test/unit/core/shape/list/test_events.rb +19 -11
- data/test/unit/core/shape/list/test_manager.rb +112 -0
- data/test/unit/core/shape/list/test_page.rb +57 -0
- data/test/unit/core/shape/list/test_section_format.rb +1 -1
- data/test/unit/core/shape/list/test_section_interface.rb +37 -30
- data/test/unit/core/shape/list/test_section_internal.rb +39 -14
- data/test/unit/core/shape/manager/test_format.rb +12 -18
- data/test/unit/core/shape/manager/test_internal.rb +127 -93
- data/test/unit/core/shape/manager/test_target.rb +63 -56
- data/test/unit/core/shape/styles/test_base.rb +219 -0
- data/test/unit/core/shape/styles/test_basic.rb +24 -0
- data/test/unit/core/shape/styles/test_graphic.rb +69 -0
- data/test/unit/core/shape/styles/test_text.rb +318 -0
- data/test/unit/core/shape/{tblock → text_block}/formatter/test_basic.rb +2 -2
- data/test/unit/core/shape/{tblock → text_block}/formatter/test_datetime.rb +2 -2
- data/test/unit/core/shape/{tblock → text_block}/formatter/test_number.rb +2 -2
- data/test/unit/core/shape/{tblock → text_block}/formatter/test_padding.rb +11 -6
- data/test/unit/core/shape/text_block/test_format.rb +160 -0
- data/test/unit/core/shape/{tblock → text_block}/test_formatter.rb +2 -2
- data/test/unit/core/shape/text_block/test_interface.rb +46 -0
- data/test/unit/core/shape/text_block/test_internal.rb +128 -0
- data/test/unit/core/test_shape.rb +31 -6
- data/test/unit/data/basic_layout1.tlf +1 -0
- data/test/unit/data/basic_layout2.tlf +1 -0
- data/test/unit/data/basic_list_layout.tlf +1 -0
- data/test/unit/generator/pdf/document/graphics/test_attributes.rb +81 -52
- data/test/unit/generator/pdf/document/graphics/test_text.rb +159 -0
- data/test/unit/generator/pdf/document/test_font.rb +21 -6
- data/test/unit/generator/pdf/document/test_graphics.rb +2 -2
- data/test/unit/generator/pdf/document/test_page.rb +95 -0
- data/test/unit/generator/pdf/document/test_parse_color.rb +2 -2
- data/test/unit/generator/pdf/test_configuration.rb +24 -0
- data/test/unit/generator/pdf/test_document.rb +28 -0
- data/test/unit/generator/test_configuration.rb +25 -0
- data/test/unit/generator/test_pdf.rb +19 -0
- data/test/unit/helper.rb +18 -0
- data/test/unit/layout/test_format.rb +24 -7
- data/test/unit/layout/test_version.rb +61 -27
- data/test/unit/report/test_base.rb +185 -89
- data/test/unit/test_config.rb +22 -0
- data/test/unit/test_report.rb +4 -4
- metadata +94 -43
- data/lib/thinreports/core/shape/tblock.rb +0 -16
- data/lib/thinreports/generator/pxd.rb +0 -75
- data/lib/thinreports/generator/pxd/helper.rb +0 -33
- data/lib/thinreports/generator/pxd/list_renderer.rb +0 -58
- data/lib/thinreports/generator/pxd/page_renderer.rb +0 -75
- data/tasks/clean.rake +0 -6
- data/test/unit/core/shape/tblock/test_format.rb +0 -125
- data/test/unit/core/shape/tblock/test_interface.rb +0 -40
- data/test/unit/core/shape/tblock/test_internal.rb +0 -139
@@ -6,7 +6,7 @@ require 'base64'
|
|
6
6
|
module ThinReports
|
7
7
|
module Generator
|
8
8
|
|
9
|
-
module
|
9
|
+
module PDF::Graphics
|
10
10
|
# @param [String] filename
|
11
11
|
# @param [Numeric, Strng] x
|
12
12
|
# @param [Numeric, Strng] y
|
@@ -24,6 +24,23 @@ module ThinReports
|
|
24
24
|
image(image.path, x, y, w, h)
|
25
25
|
end
|
26
26
|
|
27
|
+
# @param file (see Prawn#image)
|
28
|
+
# @param [Numeric, Strng] x
|
29
|
+
# @param [Numeric, Strng] y
|
30
|
+
# @param [Numeric, Strng] w
|
31
|
+
# @param [Numeric, Strng] h
|
32
|
+
# @param [Hash] options
|
33
|
+
# @option options [:left, :center, :right] :position_x (:left)
|
34
|
+
# @option options [:top, :center, :bottom] :position_y (:top)
|
35
|
+
def image_box(file, x, y, w, h, options = {})
|
36
|
+
w, h = s2f(w, h)
|
37
|
+
pdf.bounding_box(pos(x, y), :width => w, :height => h) do
|
38
|
+
pdf.image(file, :position => options[:position_x] || :left,
|
39
|
+
:vposition => options[:position_y] || :top,
|
40
|
+
:auto_fit => [w, h])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
27
44
|
private
|
28
45
|
|
29
46
|
def clean_temp_images
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module ThinReports
|
4
4
|
module Generator
|
5
5
|
|
6
|
-
module
|
6
|
+
module PDF::Graphics
|
7
7
|
# @param [String] content
|
8
8
|
# @param [Numeric, String] x
|
9
9
|
# @param [Numeric, String] y
|
@@ -19,15 +19,22 @@ module ThinReports
|
|
19
19
|
# @option attrs [:top, :center, :bottom] :valign (:top)
|
20
20
|
# @option attrs [Numeric, String] :line_height The total height of an text line.
|
21
21
|
# @option attrs [Numeric, String] :letter_spacing
|
22
|
+
# @option attrs [Boolean] :single (false)
|
22
23
|
def text_box(content, x, y, w, h, attrs = {})
|
23
24
|
w, h = s2f(w, h)
|
25
|
+
box_attrs = text_box_attrs(x, y, w, h, attrs.delete(:single))
|
26
|
+
|
24
27
|
with_text_styles(attrs) do |built_attrs, font_styles|
|
25
28
|
pdf.formatted_text_box([{:text => text_without_line_wrap(content),
|
26
29
|
:styles => font_styles}],
|
27
|
-
built_attrs.merge(
|
28
|
-
:width => w,
|
29
|
-
:height => h))
|
30
|
+
built_attrs.merge(box_attrs))
|
30
31
|
end
|
32
|
+
rescue Prawn::Errors::CannotFit => e
|
33
|
+
# Nothing to do.
|
34
|
+
#
|
35
|
+
# When the area is too small compared
|
36
|
+
# with the content and the style of the text.
|
37
|
+
# (See prawn/core/text/formatted/line_wrap.rb#L185)
|
31
38
|
end
|
32
39
|
|
33
40
|
# @see #text_box
|
@@ -38,6 +45,22 @@ module ThinReports
|
|
38
45
|
|
39
46
|
private
|
40
47
|
|
48
|
+
# @param x (see #text_box)
|
49
|
+
# @param y (see #text_box)
|
50
|
+
# @param w (see #text_box)
|
51
|
+
# @param h (see #text_box)
|
52
|
+
# @param [Boolean, nil] single
|
53
|
+
# @return [Hash]
|
54
|
+
def text_box_attrs(x, y, w, h, single = nil)
|
55
|
+
attrs = {:at => pos(x, y),
|
56
|
+
:width => s2f(w)}
|
57
|
+
if single
|
58
|
+
attrs.merge(:single_line => true)
|
59
|
+
else
|
60
|
+
attrs.merge(:height => s2f(h))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
41
64
|
# @param attrs (see #text)
|
42
65
|
# @yield [built_attrs, font_styles]
|
43
66
|
# @yieldparam [Hash] built_attrs The finalized attributes.
|
@@ -104,7 +127,7 @@ module ThinReports
|
|
104
127
|
end
|
105
128
|
|
106
129
|
# Emulate bold style.
|
107
|
-
if manual.include?(:bold)
|
130
|
+
if manual && manual.include?(:bold)
|
108
131
|
pdf.stroke_color(font[:color])
|
109
132
|
pdf.line_width(font[:size] * 0.025)
|
110
133
|
|
@@ -113,7 +136,7 @@ module ThinReports
|
|
113
136
|
end
|
114
137
|
|
115
138
|
# Emulate italic style.
|
116
|
-
if manual.include?(:italic)
|
139
|
+
if manual && manual.include?(:italic)
|
117
140
|
# FIXME
|
118
141
|
# pdf.transformation_matrix(1, 0, 0.26, 1, 0, 0)
|
119
142
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ThinReports
|
4
|
+
module Generator
|
5
|
+
|
6
|
+
# @private
|
7
|
+
module PDF::Page
|
8
|
+
|
9
|
+
# @param [ThinReports::Layout::Format] format
|
10
|
+
def start_new_page(format)
|
11
|
+
format_id = if change_page_format?(format)
|
12
|
+
pdf.start_new_page(new_basic_page_options(format))
|
13
|
+
@current_page_format = format
|
14
|
+
|
15
|
+
unless format_stamp_registry.include?(format.identifier)
|
16
|
+
create_format_stamp(format)
|
17
|
+
end
|
18
|
+
format.identifier
|
19
|
+
else
|
20
|
+
pdf.start_new_page(new_basic_page_options(current_page_format))
|
21
|
+
current_page_format.identifier
|
22
|
+
end
|
23
|
+
|
24
|
+
stamp(format_id.to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_blank_page
|
28
|
+
pdf.start_new_page(pdf.page_count.zero? ? {:size => 'A4'} : {})
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# @return [ThinReports::Layout::Format]
|
34
|
+
attr_reader :current_page_format
|
35
|
+
|
36
|
+
# @param [ThinReports::Layout::Format] new_format
|
37
|
+
# @return [Boolean]
|
38
|
+
def change_page_format?(new_format)
|
39
|
+
!current_page_format ||
|
40
|
+
current_page_format.identifier != new_format.identifier
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [ThinReports::Layout::Format] format
|
44
|
+
def create_format_stamp(format)
|
45
|
+
create_stamp(format.identifier.to_s) do
|
46
|
+
parse_svg(format.layout, '/svg/g')
|
47
|
+
end
|
48
|
+
format_stamp_registry << format.identifier
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Array]
|
52
|
+
def format_stamp_registry
|
53
|
+
@format_stamp_registry ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param [ThinReports::Layout::Format] format
|
57
|
+
# @return [Hash]
|
58
|
+
def new_basic_page_options(format)
|
59
|
+
options = {:layout => format.page_orientation.to_sym}
|
60
|
+
options[:size] = if format.user_paper_type?
|
61
|
+
[format.page_width.to_f, format.page_height.to_f]
|
62
|
+
else
|
63
|
+
format.page_paper_type
|
64
|
+
end
|
65
|
+
options
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -5,8 +5,8 @@ module ThinReports
|
|
5
5
|
|
6
6
|
# @abstract
|
7
7
|
# @private
|
8
|
-
class
|
9
|
-
# @param [ThinReports::Generator::
|
8
|
+
class PDF::Drawer::Base
|
9
|
+
# @param [ThinReports::Generator::PDF::Document] pdf
|
10
10
|
# @param [ThinReports::Core::Shape::Manager::Format] format
|
11
11
|
def initialize(pdf, format)
|
12
12
|
@pdf = pdf
|
@@ -30,13 +30,11 @@ module ThinReports
|
|
30
30
|
|
31
31
|
# @see #pdf_stamp_id
|
32
32
|
def shape_stamp_id(shape)
|
33
|
-
|
34
|
-
id << shape.attrs.values_at('fill', 'stroke').join unless shape.attrs.empty?
|
35
|
-
id.gsub(/#/, '')
|
33
|
+
"#{shape.id}#{shape.style.identifier}"
|
36
34
|
end
|
37
35
|
|
38
|
-
# @overload pdf_stamp(
|
39
|
-
# @param [String]
|
36
|
+
# @overload pdf_stamp(shape_id)
|
37
|
+
# @param [String] shape_id
|
40
38
|
# @overload pdf_stamp(shape)
|
41
39
|
# @param [ThinReports::Core::Shape::Base::Internal] shape
|
42
40
|
def pdf_stamp(shape)
|
@@ -4,8 +4,8 @@ module ThinReports
|
|
4
4
|
module Generator
|
5
5
|
|
6
6
|
# @private
|
7
|
-
class
|
8
|
-
# @param (see
|
7
|
+
class PDF::Drawer::List < PDF::Drawer::Base
|
8
|
+
# @param (see PDF::Drawer::Base#initialize)
|
9
9
|
def initialize(pdf, format)
|
10
10
|
super
|
11
11
|
@sections = {}
|
@@ -28,10 +28,10 @@ module ThinReports
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# @param [ThinReports::Core::Shape::List::SectionInternal] section
|
31
|
-
# @return [ThinReports::Generator::
|
31
|
+
# @return [ThinReports::Generator::PDF::Drawer::ListSection]
|
32
32
|
def drawer(section)
|
33
33
|
@sections[section.section_name] ||=
|
34
|
-
|
34
|
+
PDF::Drawer::ListSection.new(@pdf, section)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -4,8 +4,8 @@ module ThinReports
|
|
4
4
|
module Generator
|
5
5
|
|
6
6
|
# @private
|
7
|
-
class
|
8
|
-
# @param pdf (see
|
7
|
+
class PDF::Drawer::ListSection < PDF::Drawer::Page
|
8
|
+
# @param pdf (see PDF::Drawer::Page#initialize)
|
9
9
|
# @param section [ThinReports::Core::Shape::List::SectionInternal] section
|
10
10
|
def initialize(pdf, section)
|
11
11
|
super(pdf, section.format)
|
@@ -36,10 +36,15 @@ module ThinReports
|
|
36
36
|
pdf_stamp(id)
|
37
37
|
end
|
38
38
|
|
39
|
-
# @see ThinReports::Generator::
|
39
|
+
# @see ThinReports::Generator::PDF::Drawer::Page#draw_tblock_shape
|
40
40
|
def draw_tblock_shape(shape)
|
41
41
|
@pdf.translate(*@draw_at) { super }
|
42
42
|
end
|
43
|
+
|
44
|
+
# @see ThinReports::Generator::PDF::Drawer::Page#draw_iblock_shape
|
45
|
+
def draw_iblock_shape(shape)
|
46
|
+
@pdf.translate(*@draw_at) { super }
|
47
|
+
end
|
43
48
|
end
|
44
49
|
|
45
50
|
end
|
@@ -4,8 +4,8 @@ module ThinReports
|
|
4
4
|
module Generator
|
5
5
|
|
6
6
|
# @private
|
7
|
-
class
|
8
|
-
# @param see
|
7
|
+
class PDF::Drawer::Page < PDF::Drawer::Base
|
8
|
+
# @param see PDF::Drawer::Base#initialize)
|
9
9
|
def initialize(pdf, format)
|
10
10
|
super
|
11
11
|
@lists = {}
|
@@ -29,6 +29,8 @@ module ThinReports
|
|
29
29
|
draw_tblock_shape(shape)
|
30
30
|
when shape.type_of?(:list)
|
31
31
|
draw_list_shape(shape)
|
32
|
+
when shape.type_of?(:iblock)
|
33
|
+
draw_iblock_shape(shape)
|
32
34
|
else
|
33
35
|
id = shape_stamp_id(shape)
|
34
36
|
unless @stamps.include?(id)
|
@@ -41,7 +43,7 @@ module ThinReports
|
|
41
43
|
|
42
44
|
# @see #draw_shape
|
43
45
|
def draw_list_shape(shape)
|
44
|
-
drawer = @lists[shape.id] ||=
|
46
|
+
drawer = @lists[shape.id] ||= PDF::Drawer::List.new(@pdf, shape.format)
|
45
47
|
drawer.draw(shape)
|
46
48
|
end
|
47
49
|
|
@@ -50,6 +52,11 @@ module ThinReports
|
|
50
52
|
@pdf.draw_shape_tblock(shape)
|
51
53
|
end
|
52
54
|
|
55
|
+
# @see #draw_shape
|
56
|
+
def draw_iblock_shape(shape)
|
57
|
+
@pdf.draw_shape_iblock(shape)
|
58
|
+
end
|
59
|
+
|
53
60
|
# @param [ThinReports::Core::Shape::Base::Internal] shape
|
54
61
|
def create_basic_shape_stamp(shape)
|
55
62
|
case
|
@@ -2,35 +2,30 @@
|
|
2
2
|
|
3
3
|
# @private
|
4
4
|
module Prawn
|
5
|
-
# Patch for issue {https://github.com/sandal/prawn/issues/245 #245}.
|
6
|
-
# @private
|
7
|
-
class Font::TTF
|
8
|
-
def character_width_by_code(code)
|
9
|
-
return 0 unless cmap[code]
|
10
|
-
return 0.0 if code == 10
|
11
|
-
@char_widths[code] ||= Integer(hmtx.widths[cmap[code]] * scale_factor)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
# @private
|
16
6
|
class Document
|
17
7
|
# Create around alias.
|
18
8
|
alias_method :original_width_of, :width_of
|
19
9
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
str_length = in_utf8 { string.split(//).size }
|
24
|
-
font.compute_width_of(string, options) + character_spacing * (str_length - 1)
|
25
|
-
end
|
10
|
+
def width_of(string, options={})
|
11
|
+
font.compute_width_of(string, options) +
|
12
|
+
(character_spacing * (font.character_count(string) - 1))
|
26
13
|
end
|
27
14
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
15
|
+
private
|
16
|
+
# Create around alias.
|
17
|
+
alias_method :original_calc_image_dimensions, :calc_image_dimensions
|
18
|
+
|
19
|
+
def calc_image_dimensions(info, options)
|
20
|
+
if options[:auto_fit]
|
21
|
+
w, h = info.width, info.height
|
22
|
+
sw, sh = options.delete(:auto_fit)
|
23
|
+
|
24
|
+
if w > sw || h > sh
|
25
|
+
options[:fit] = [sw, sh]
|
26
|
+
end
|
32
27
|
end
|
28
|
+
original_calc_image_dimensions(info, options)
|
33
29
|
end
|
34
30
|
end
|
35
|
-
|
36
31
|
end
|
@@ -8,7 +8,7 @@ module ThinReports
|
|
8
8
|
# @private
|
9
9
|
class Format < Core::Shape::Manager::Format
|
10
10
|
config_reader :last_version => %w( version )
|
11
|
-
config_reader :report_title => %w( title )
|
11
|
+
config_reader :report_title => %w( config title )
|
12
12
|
config_reader :page_paper_type => %w( config page paper-type ),
|
13
13
|
:page_width => %w( config page width ),
|
14
14
|
:page_height => %w( config page height ),
|
@@ -35,7 +35,7 @@ module ThinReports
|
|
35
35
|
# Check the compatibility of specified layout file.
|
36
36
|
unless ThinReports::Layout::Version.compatible?(raw_format['version'])
|
37
37
|
info = [filename, raw_format['version'],
|
38
|
-
ThinReports::Layout::Version.
|
38
|
+
ThinReports::Layout::Version.inspect_required_rules]
|
39
39
|
raise ThinReports::Errors::IncompatibleLayoutFormat.new(*info)
|
40
40
|
end
|
41
41
|
|
@@ -5,7 +5,7 @@ module ThinReports
|
|
5
5
|
|
6
6
|
# @private
|
7
7
|
module Version
|
8
|
-
REQUIRED_RULES = [
|
8
|
+
REQUIRED_RULES = ['>= 0.6.0.pre3', '< 0.8.0']
|
9
9
|
|
10
10
|
# @param [String] version
|
11
11
|
# @return [Boolean]
|
@@ -24,7 +24,7 @@ module ThinReports
|
|
24
24
|
end
|
25
25
|
|
26
26
|
# @return [String]
|
27
|
-
def self.
|
27
|
+
def self.inspect_required_rules
|
28
28
|
'(' + REQUIRED_RULES.join(' and ') + ')'
|
29
29
|
end
|
30
30
|
|
@@ -10,6 +10,7 @@ module ThinReports
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
# @param options (see #initialize)
|
13
|
+
# @option options (see #initialize)
|
13
14
|
# @yield [report]
|
14
15
|
# @yieldparam [ThinReports::Report::Base] report
|
15
16
|
# @return [ThinReports::Report::Base]
|
@@ -24,39 +25,61 @@ module ThinReports
|
|
24
25
|
report
|
25
26
|
end
|
26
27
|
|
27
|
-
# @
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
28
|
+
# @overload generate(type, options = {}, &block)
|
29
|
+
# @param [Symbol] type
|
30
|
+
# @param [Hash] options
|
31
|
+
# @option options [Hash] :report ({}) Options for Report.
|
32
|
+
# @option options [Hash] :generator ({}) Options for Generator.
|
33
|
+
# @overload generate(options = {}, &block)
|
34
|
+
# @param [Hash] options
|
35
|
+
# @option options [Hash] :report ({}) Options for Report.
|
36
|
+
# @option options [Hash] :generator ({}) Options for Generator.
|
37
|
+
# @yield (see .create)
|
38
|
+
# @yieldparam (see .create)
|
32
39
|
# @return [String]
|
33
|
-
def generate(
|
34
|
-
|
40
|
+
def generate(*args, &block)
|
41
|
+
raise ArgumentError, '#generate requires a block' unless block_given?
|
35
42
|
|
36
|
-
|
43
|
+
report_opts, generator_opts = extract_options!(args)
|
44
|
+
|
45
|
+
report = create(report_opts, &block)
|
46
|
+
report.generate(*args.push(generator_opts))
|
37
47
|
end
|
38
48
|
|
39
|
-
# @
|
40
|
-
# @
|
41
|
-
# @param
|
42
|
-
# @yield (see
|
43
|
-
|
44
|
-
|
49
|
+
# @overload generate_file(type, filename, options = {}, &block)
|
50
|
+
# @overload generate_file(filename, options = {}, &block)
|
51
|
+
# @param filename (see #generate_file)
|
52
|
+
# @yield (see .create)
|
53
|
+
# @yieldparam (see .create)
|
54
|
+
# @see .generate
|
55
|
+
# @return [void]
|
56
|
+
def generate_file(*args, &block)
|
57
|
+
raise ArgumentError, '#generate_file requires a block' unless block_given?
|
58
|
+
|
59
|
+
report_opts, generator_opts = extract_options!(args)
|
45
60
|
|
46
|
-
create(
|
47
|
-
|
61
|
+
report = create(report_opts, &block)
|
62
|
+
report.generate_file(*args.push(generator_opts))
|
48
63
|
end
|
49
64
|
|
50
65
|
private
|
51
66
|
|
52
|
-
# @param
|
53
|
-
# @
|
54
|
-
def
|
55
|
-
|
56
|
-
|
67
|
+
# @param [Array] args
|
68
|
+
# @return [Array<Hash>]
|
69
|
+
def extract_options!(args)
|
70
|
+
if args.last.is_a?(::Hash)
|
71
|
+
options = args.pop
|
72
|
+
|
73
|
+
generator = options.delete(:generator) || {}
|
74
|
+
report = options.delete(:report) || {}
|
75
|
+
|
76
|
+
if options.key?(:layout)
|
77
|
+
report[:layout] = options.delete(:layout)
|
78
|
+
end
|
79
|
+
[report, generator.merge(options)]
|
80
|
+
else
|
81
|
+
[{}, {}]
|
57
82
|
end
|
58
|
-
options[:report] ||= {}
|
59
|
-
options[:generator] ||= {}
|
60
83
|
end
|
61
84
|
end
|
62
85
|
|
@@ -66,19 +89,20 @@ module ThinReports
|
|
66
89
|
@internal = Report::Internal.new(self, options)
|
67
90
|
end
|
68
91
|
|
69
|
-
# @param [String] path
|
92
|
+
# @param [String] layout path to layout-file.
|
70
93
|
# @param [Hash] options
|
71
94
|
# @option options [Boolean] :default (true)
|
72
95
|
# @option options [Symbol] :id (nil)
|
73
|
-
# @yield [config
|
96
|
+
# @yield [config]
|
74
97
|
# @yieldparam [ThinReports::Layout::Configuration] config
|
98
|
+
# @return [void]
|
75
99
|
def use_layout(layout, options = {}, &block)
|
76
100
|
internal.register_layout(layout, options, &block)
|
77
101
|
end
|
78
102
|
|
79
103
|
# @param [Hash] options
|
80
104
|
# @option options [String, Symbol] :layout (nil)
|
81
|
-
# @yield [page
|
105
|
+
# @yield [page]
|
82
106
|
# @yieldparam [ThinReports::Core::Page] page
|
83
107
|
# @return [ThinReports::Core::Page]
|
84
108
|
def start_new_page(options = {}, &block)
|
@@ -115,17 +139,29 @@ module ThinReports
|
|
115
139
|
internal.default_layout
|
116
140
|
end
|
117
141
|
|
118
|
-
# @
|
119
|
-
#
|
142
|
+
# @overload generate(type, options = {})
|
143
|
+
# Specify the generator type.
|
144
|
+
# @param [Symbol] type
|
145
|
+
# @overload generate(options = {})
|
146
|
+
# Using the default generator type.
|
147
|
+
# @param [Hash] options ({})
|
120
148
|
# @return [String]
|
121
|
-
def generate(
|
149
|
+
def generate(*args)
|
150
|
+
options = args.last.is_a?(::Hash) ? args.pop : {}
|
151
|
+
type = args.first || ThinReports.config.generator.default
|
122
152
|
ThinReports::Generator.new(type, self, options).generate
|
123
153
|
end
|
124
154
|
|
125
|
-
# @
|
155
|
+
# @overload generate_file(type, filename, options = {})
|
156
|
+
# @param type (#generate)
|
157
|
+
# @overload generate_file(filename, options = {})
|
126
158
|
# @param [String] filename
|
127
159
|
# @param options (see #generate)
|
128
|
-
|
160
|
+
# @return [void]
|
161
|
+
def generate_file(*args)
|
162
|
+
options = args.last.is_a?(::Hash) ? args.pop : {}
|
163
|
+
args.unshift(ThinReports.config.generator.default) if args.size == 1
|
164
|
+
type, filename = args
|
129
165
|
ThinReports::Generator.new(type, self, options).generate_file(filename)
|
130
166
|
end
|
131
167
|
|
@@ -144,6 +180,7 @@ module ThinReports
|
|
144
180
|
internal.page_count
|
145
181
|
end
|
146
182
|
|
183
|
+
# @return [void]
|
147
184
|
# @private
|
148
185
|
def finalize
|
149
186
|
internal.finalize
|