thinreports 0.6.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -0
- data/README.rdoc +100 -0
- data/Rakefile +10 -0
- data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
- data/lib/thinreports.rb +11 -0
- data/lib/thinreports/core.rb +20 -0
- data/lib/thinreports/core/errors.rb +58 -0
- data/lib/thinreports/core/events.rb +71 -0
- data/lib/thinreports/core/ext.rb +5 -0
- data/lib/thinreports/core/ext/array.rb +19 -0
- data/lib/thinreports/core/ext/hash.rb +19 -0
- data/lib/thinreports/core/ext/object.rb +25 -0
- data/lib/thinreports/core/format.rb +14 -0
- data/lib/thinreports/core/format/base.rb +93 -0
- data/lib/thinreports/core/format/builder.rb +65 -0
- data/lib/thinreports/core/ordered_hash.rb +39 -0
- data/lib/thinreports/core/page.rb +91 -0
- data/lib/thinreports/core/shape.rb +53 -0
- data/lib/thinreports/core/shape/base.rb +16 -0
- data/lib/thinreports/core/shape/base/interface.rb +38 -0
- data/lib/thinreports/core/shape/base/internal.rb +60 -0
- data/lib/thinreports/core/shape/basic.rb +15 -0
- data/lib/thinreports/core/shape/basic/format.rb +26 -0
- data/lib/thinreports/core/shape/basic/interface.rb +57 -0
- data/lib/thinreports/core/shape/basic/internal.rb +29 -0
- data/lib/thinreports/core/shape/list.rb +25 -0
- data/lib/thinreports/core/shape/list/configuration.rb +33 -0
- data/lib/thinreports/core/shape/list/events.rb +30 -0
- data/lib/thinreports/core/shape/list/format.rb +72 -0
- data/lib/thinreports/core/shape/list/manager.rb +209 -0
- data/lib/thinreports/core/shape/list/page.rb +118 -0
- data/lib/thinreports/core/shape/list/page_state.rb +40 -0
- data/lib/thinreports/core/shape/list/section_format.rb +32 -0
- data/lib/thinreports/core/shape/list/section_interface.rb +48 -0
- data/lib/thinreports/core/shape/list/section_internal.rb +29 -0
- data/lib/thinreports/core/shape/list/store.rb +34 -0
- data/lib/thinreports/core/shape/manager.rb +14 -0
- data/lib/thinreports/core/shape/manager/format.rb +28 -0
- data/lib/thinreports/core/shape/manager/internal.rb +87 -0
- data/lib/thinreports/core/shape/manager/target.rb +85 -0
- data/lib/thinreports/core/shape/tblock.rb +16 -0
- data/lib/thinreports/core/shape/tblock/format.rb +36 -0
- data/lib/thinreports/core/shape/tblock/formatter.rb +32 -0
- data/lib/thinreports/core/shape/tblock/formatter/basic.rb +38 -0
- data/lib/thinreports/core/shape/tblock/formatter/datetime.rb +21 -0
- data/lib/thinreports/core/shape/tblock/formatter/number.rb +49 -0
- data/lib/thinreports/core/shape/tblock/formatter/padding.rb +43 -0
- data/lib/thinreports/core/shape/tblock/interface.rb +52 -0
- data/lib/thinreports/core/shape/tblock/internal.rb +70 -0
- data/lib/thinreports/core/shape/text.rb +15 -0
- data/lib/thinreports/core/shape/text/format.rb +25 -0
- data/lib/thinreports/core/shape/text/interface.rb +16 -0
- data/lib/thinreports/core/shape/text/internal.rb +17 -0
- data/lib/thinreports/core/utils.rb +48 -0
- data/lib/thinreports/generator.rb +30 -0
- data/lib/thinreports/generator/base.rb +49 -0
- data/lib/thinreports/generator/pdf.rb +63 -0
- data/lib/thinreports/generator/pdf/document.rb +171 -0
- data/lib/thinreports/generator/pdf/document/draw_shape.rb +74 -0
- data/lib/thinreports/generator/pdf/document/font.rb +59 -0
- data/lib/thinreports/generator/pdf/document/graphics.rb +42 -0
- data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +92 -0
- data/lib/thinreports/generator/pdf/document/graphics/basic.rb +132 -0
- data/lib/thinreports/generator/pdf/document/graphics/image.rb +51 -0
- data/lib/thinreports/generator/pdf/document/graphics/text.rb +130 -0
- data/lib/thinreports/generator/pdf/document/parse_color.rb +51 -0
- data/lib/thinreports/generator/pdf/document/parse_svg.rb +102 -0
- data/lib/thinreports/generator/pdf/drawer.rb +16 -0
- data/lib/thinreports/generator/pdf/drawer/base.rb +56 -0
- data/lib/thinreports/generator/pdf/drawer/list.rb +39 -0
- data/lib/thinreports/generator/pdf/drawer/list_section.rb +46 -0
- data/lib/thinreports/generator/pdf/drawer/page.rb +101 -0
- data/lib/thinreports/generator/pdf/prawn_ext.rb +36 -0
- data/lib/thinreports/generator/pxd.rb +75 -0
- data/lib/thinreports/generator/pxd/helper.rb +33 -0
- data/lib/thinreports/generator/pxd/list_renderer.rb +58 -0
- data/lib/thinreports/generator/pxd/page_renderer.rb +75 -0
- data/lib/thinreports/layout.rb +17 -0
- data/lib/thinreports/layout/base.rb +78 -0
- data/lib/thinreports/layout/configuration.rb +27 -0
- data/lib/thinreports/layout/format.rb +77 -0
- data/lib/thinreports/layout/version.rb +43 -0
- data/lib/thinreports/report.rb +31 -0
- data/lib/thinreports/report/base.rb +160 -0
- data/lib/thinreports/report/events.rb +32 -0
- data/lib/thinreports/report/internal.rb +131 -0
- data/resources/fonts/IPA_Font_License_Agreement_v1.0.txt +117 -0
- data/resources/fonts/ipag.ttf +0 -0
- data/resources/fonts/ipagp.ttf +0 -0
- data/resources/fonts/ipam.ttf +0 -0
- data/resources/fonts/ipamp.ttf +0 -0
- data/tasks/clean.rake +6 -0
- data/tasks/doc.rake +13 -0
- data/tasks/test.rake +18 -0
- data/test/unit/core/ext/array_spec.rb +29 -0
- data/test/unit/core/ext/hash_spec.rb +29 -0
- data/test/unit/core/ext/object_spec.rb +30 -0
- data/test/unit/core/format/test_base.rb +148 -0
- data/test/unit/core/format/test_builder.rb +114 -0
- data/test/unit/core/ordered_hash_spec.rb +51 -0
- data/test/unit/core/shape/base/test_interface.rb +52 -0
- data/test/unit/core/shape/base/test_internal.rb +109 -0
- data/test/unit/core/shape/basic/test_format.rb +59 -0
- data/test/unit/core/shape/basic/test_interface.rb +70 -0
- data/test/unit/core/shape/basic/test_internal.rb +42 -0
- data/test/unit/core/shape/list/test_configuration.rb +52 -0
- data/test/unit/core/shape/list/test_events.rb +28 -0
- data/test/unit/core/shape/list/test_format.rb +71 -0
- data/test/unit/core/shape/list/test_page.rb +10 -0
- data/test/unit/core/shape/list/test_page_state.rb +31 -0
- data/test/unit/core/shape/list/test_section_format.rb +46 -0
- data/test/unit/core/shape/list/test_section_interface.rb +52 -0
- data/test/unit/core/shape/list/test_section_internal.rb +30 -0
- data/test/unit/core/shape/list/test_store.rb +41 -0
- data/test/unit/core/shape/manager/test_format.rb +40 -0
- data/test/unit/core/shape/manager/test_internal.rb +137 -0
- data/test/unit/core/shape/manager/test_target.rb +109 -0
- data/test/unit/core/shape/tblock/formatter/test_basic.rb +24 -0
- data/test/unit/core/shape/tblock/formatter/test_datetime.rb +47 -0
- data/test/unit/core/shape/tblock/formatter/test_number.rb +76 -0
- data/test/unit/core/shape/tblock/formatter/test_padding.rb +72 -0
- data/test/unit/core/shape/tblock/test_format.rb +125 -0
- data/test/unit/core/shape/tblock/test_formatter.rb +28 -0
- data/test/unit/core/shape/tblock/test_interface.rb +40 -0
- data/test/unit/core/shape/tblock/test_internal.rb +139 -0
- data/test/unit/core/shape/text/test_format.rb +73 -0
- data/test/unit/core/shape/text/test_internal.rb +21 -0
- data/test/unit/core/test_events.rb +91 -0
- data/test/unit/core/test_shape.rb +35 -0
- data/test/unit/core/utils_spec.rb +56 -0
- data/test/unit/generator/pdf/document/graphics/test_attributes.rb +103 -0
- data/test/unit/generator/pdf/document/test_font.rb +54 -0
- data/test/unit/generator/pdf/document/test_graphics.rb +43 -0
- data/test/unit/generator/pdf/document/test_parse_color.rb +30 -0
- data/test/unit/generator/test_base.rb +51 -0
- data/test/unit/helper.rb +37 -0
- data/test/unit/layout/test_base.rb +92 -0
- data/test/unit/layout/test_configuration.rb +46 -0
- data/test/unit/layout/test_format.rb +104 -0
- data/test/unit/layout/test_version.rb +62 -0
- data/test/unit/report/test_base.rb +187 -0
- data/test/unit/report/test_events.rb +22 -0
- data/test/unit/report/test_internal.rb +234 -0
- data/test/unit/test_layout.rb +12 -0
- data/test/unit/test_report.rb +30 -0
- metadata +218 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ThinReports
|
4
|
+
|
5
|
+
module Generator
|
6
|
+
# @param [Symbol] type
|
7
|
+
# @param report (see ThinReports::Generator::Base#initialize)
|
8
|
+
# @param options (see ThinReports::Generator::Base#initialize)
|
9
|
+
def self.new(type, report, options = {})
|
10
|
+
unless generator = registry[type]
|
11
|
+
raise ThinReports::Errors::UnknownGeneratorType
|
12
|
+
end
|
13
|
+
generator.new(report, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @private
|
17
|
+
def self.register(type, generator)
|
18
|
+
registry[type] = generator
|
19
|
+
end
|
20
|
+
|
21
|
+
# @private
|
22
|
+
def self.registry
|
23
|
+
@generators ||= {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'thinreports/generator/base'
|
29
|
+
require 'thinreports/generator/pxd'
|
30
|
+
require 'thinreports/generator/pdf'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ThinReports
|
4
|
+
module Generator
|
5
|
+
|
6
|
+
# @abstract
|
7
|
+
class Base
|
8
|
+
# @return [ThinReports::Report::Base]
|
9
|
+
# @private
|
10
|
+
attr_reader :report
|
11
|
+
|
12
|
+
# @return [Hash]
|
13
|
+
# @private
|
14
|
+
attr_reader :options
|
15
|
+
|
16
|
+
# @private
|
17
|
+
def self.inherited(g)
|
18
|
+
Generator.register(g.name.split('::').last.downcase.to_sym, g);
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [ThinReports::Report::Base] report
|
22
|
+
# @param [Hash] options
|
23
|
+
def initialize(report, options = {})
|
24
|
+
report.finalize
|
25
|
+
|
26
|
+
@report = report.internal
|
27
|
+
@options = options || {}
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [String]
|
31
|
+
# @abstract
|
32
|
+
def generate
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [String] filename
|
37
|
+
# @abstract
|
38
|
+
def generate_file(filename)
|
39
|
+
raise NotImplementedError
|
40
|
+
end
|
41
|
+
|
42
|
+
# @private
|
43
|
+
def default_layout
|
44
|
+
report.default_layout
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'prawn'
|
4
|
+
|
5
|
+
module ThinReports
|
6
|
+
module Generator
|
7
|
+
|
8
|
+
class Pdf < Base
|
9
|
+
# @param report (see ThinReports::Generator::Base#initialize)
|
10
|
+
# @param [Hash] options
|
11
|
+
# @option options [Hash] :security (nil)
|
12
|
+
# See Prawn::Document#encrypt_document
|
13
|
+
def initialize(report, options)
|
14
|
+
super
|
15
|
+
@pdf = Document.new(options)
|
16
|
+
@drawers = {}
|
17
|
+
@current_format = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# @see ThinReports::Generator::Base#generate
|
21
|
+
def generate
|
22
|
+
draw_report
|
23
|
+
@pdf.render
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see ThinReports::Generator::Base#generate_file
|
27
|
+
def generate_file(filename)
|
28
|
+
draw_report
|
29
|
+
@pdf.render_file(filename)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def draw_report
|
35
|
+
report.pages.each do |page|
|
36
|
+
draw_page(page)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def draw_page(page)
|
41
|
+
return @pdf.add_blank_page if page.blank?
|
42
|
+
|
43
|
+
format = page.layout.format
|
44
|
+
# On format change.
|
45
|
+
unless @current_format == format.identifier
|
46
|
+
@pdf.start_new_page(format)
|
47
|
+
else
|
48
|
+
@pdf.start_new_page
|
49
|
+
end
|
50
|
+
drawer(format).draw(page.manager)
|
51
|
+
end
|
52
|
+
|
53
|
+
def drawer(format)
|
54
|
+
@drawers[format.identifier] ||= Drawer::Page.new(@pdf, format)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
require 'thinreports/generator/pdf/prawn_ext'
|
62
|
+
require 'thinreports/generator/pdf/document'
|
63
|
+
require 'thinreports/generator/pdf/drawer'
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'thinreports/generator/pdf/document/font'
|
4
|
+
require 'thinreports/generator/pdf/document/parse_color'
|
5
|
+
require 'thinreports/generator/pdf/document/graphics'
|
6
|
+
require 'thinreports/generator/pdf/document/draw_shape'
|
7
|
+
require 'thinreports/generator/pdf/document/parse_svg'
|
8
|
+
|
9
|
+
module ThinReports
|
10
|
+
module Generator
|
11
|
+
|
12
|
+
# @private
|
13
|
+
class Pdf::Document
|
14
|
+
include Pdf::Font
|
15
|
+
include Pdf::ParseColor
|
16
|
+
include Pdf::Graphics
|
17
|
+
include Pdf::DrawShape
|
18
|
+
include Pdf::ParseSVG
|
19
|
+
|
20
|
+
# @param options (see ThinReports::Generator::Pdf#initialize)
|
21
|
+
def initialize(options = {})
|
22
|
+
@pdf = Prawn::Document.new(
|
23
|
+
:skip_page_creation => true,
|
24
|
+
:margin => [0, 0],
|
25
|
+
:info => {:Creator => 'ThinReports Generator for Ruby ' +
|
26
|
+
ThinReports::VERSION}
|
27
|
+
)
|
28
|
+
@format_stamp_registry = []
|
29
|
+
|
30
|
+
# Setup to Prawn::Document.
|
31
|
+
setup_fonts
|
32
|
+
setup_custom_graphic_states
|
33
|
+
|
34
|
+
# Encrypts the document.
|
35
|
+
if options[:security]
|
36
|
+
@pdf.encrypt_document(options[:security])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [ThinReports::Layout::Format] format (nil)
|
41
|
+
def start_new_page(format = nil)
|
42
|
+
options = {}
|
43
|
+
format_id = format.identifier
|
44
|
+
|
45
|
+
if format
|
46
|
+
options[:layout] = format.page_orientation.to_sym
|
47
|
+
options[:size] = if format.user_paper_type?
|
48
|
+
[format.page_width.to_f, format.page_height.to_f]
|
49
|
+
else
|
50
|
+
format.page_paper_type
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
pdf.start_new_page(options)
|
55
|
+
|
56
|
+
# @note
|
57
|
+
# The best way is to create a template for each layout.
|
58
|
+
# However, in the latest Prawn library, because of problems handling
|
59
|
+
# the template that you want supported by future releases.
|
60
|
+
# @see https://github.com/sandal/prawn/issues/199
|
61
|
+
unless format_stamp_registry.include?(format_id)
|
62
|
+
create_format_stamp(format)
|
63
|
+
end
|
64
|
+
# Apply the static shapes of current format.
|
65
|
+
stamp(format_id.to_s)
|
66
|
+
end
|
67
|
+
|
68
|
+
def add_blank_page
|
69
|
+
pdf.start_new_page(pdf.page_count.zero? ? {:size => 'A4'} : {})
|
70
|
+
end
|
71
|
+
|
72
|
+
# Delegate to Prawn::Document#render
|
73
|
+
# @see Prawn::Document#render
|
74
|
+
def render
|
75
|
+
result = pdf.render
|
76
|
+
finalize
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
# Delegate to Prawn::Document#render_file
|
81
|
+
# @see Prawn::Document#render_file
|
82
|
+
def render_file(*args)
|
83
|
+
finalize
|
84
|
+
pdf.render_file(*args)
|
85
|
+
end
|
86
|
+
|
87
|
+
# @param [Numeric, String] x
|
88
|
+
# @param [Numeric, String] y
|
89
|
+
def translate(x, y, &block)
|
90
|
+
x, y = rpos(x, y)
|
91
|
+
pdf.translate(x, y, &block)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @param [String] stamp_id
|
95
|
+
# @param [Array<Numeric>] at (nil)
|
96
|
+
def stamp(stamp_id, at = nil)
|
97
|
+
unless at.nil?
|
98
|
+
pdf.stamp_at(stamp_id, rpos(*at))
|
99
|
+
else
|
100
|
+
pdf.stamp(stamp_id)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Delegate to Prawn::Document#create_stamp
|
105
|
+
# @param [String] id
|
106
|
+
# @see Prawn::Document#create_stamp
|
107
|
+
def create_stamp(id, &block)
|
108
|
+
pdf.create_stamp(id, &block)
|
109
|
+
end
|
110
|
+
|
111
|
+
# @private
|
112
|
+
# @see #pdf
|
113
|
+
def internal
|
114
|
+
@pdf
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
# @return [Prawn::Document]
|
120
|
+
attr_reader :pdf
|
121
|
+
|
122
|
+
# @return [Array<Symbol>]
|
123
|
+
attr_reader :format_stamp_registry
|
124
|
+
|
125
|
+
def finalize
|
126
|
+
clean_temp_images
|
127
|
+
end
|
128
|
+
|
129
|
+
# @param [ThinReports::Layout::Format] format
|
130
|
+
def create_format_stamp(format)
|
131
|
+
create_stamp(format.identifier.to_s) do
|
132
|
+
parse_svg(format.layout, '/svg/g')
|
133
|
+
end
|
134
|
+
format_stamp_registry << format.identifier
|
135
|
+
end
|
136
|
+
|
137
|
+
# @param [Array<String, Numeric>] values
|
138
|
+
# @return [Numeric, Array<Numeric>, nil]
|
139
|
+
def s2f(*values)
|
140
|
+
return nil if values.empty?
|
141
|
+
|
142
|
+
if values.size == 1
|
143
|
+
if value = values.first
|
144
|
+
value.is_a?(::Numeric) ? value : value.to_f
|
145
|
+
end
|
146
|
+
else
|
147
|
+
values.map {|v| s2f(v) }
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# @param [Numeric, String] x
|
152
|
+
# @param [Numeric, String] y
|
153
|
+
# @return [Array<Float>]
|
154
|
+
def map_to_upper_left_relative_position(x, y)
|
155
|
+
x, y = s2f(x, y)
|
156
|
+
[x, -y]
|
157
|
+
end
|
158
|
+
alias_method :rpos, :map_to_upper_left_relative_position
|
159
|
+
|
160
|
+
# @param [Numeric, String] x
|
161
|
+
# @param [Numeric, String] y
|
162
|
+
# @return [Array<Float>]
|
163
|
+
def map_to_upper_left_position(x, y)
|
164
|
+
x, y = s2f(x, y)
|
165
|
+
[x, pdf.bounds.height - y]
|
166
|
+
end
|
167
|
+
alias_method :pos, :map_to_upper_left_position
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ThinReports
|
4
|
+
module Generator
|
5
|
+
|
6
|
+
# @private
|
7
|
+
module Pdf::DrawShape
|
8
|
+
# @param [ThinReports::Core::Shape::Tblock::Internal] shape
|
9
|
+
def draw_shape_tblock(shape)
|
10
|
+
x, y, w, h = shape.box.values_at('x', 'y', 'width', 'height')
|
11
|
+
|
12
|
+
content = shape.real_value.to_s
|
13
|
+
unless shape.multiple?
|
14
|
+
content = content.gsub(/\n/, ' ')
|
15
|
+
end
|
16
|
+
text_box(content, x, y, w, h, common_text_attrs(shape.attributes))
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [ThinReports::Core::Shape::Basic::Internal] shape
|
20
|
+
def draw_shape_image(shape)
|
21
|
+
x, y, w, h = shape.svg_attrs.values_at('x', 'y', 'width', 'height')
|
22
|
+
base64image(extract_base64_string(shape.svg_attrs['xlink:href']),
|
23
|
+
x, y, w, h)
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param [ThinReports::Core::Shape::Text::Internal] shape
|
27
|
+
def draw_shape_text(shape)
|
28
|
+
x, y, w, h = shape.box.values_at('x', 'y', 'width', 'height')
|
29
|
+
text(shape.text.join("\n"), x, y, w, h,
|
30
|
+
shape_text_attrs(shape))
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param [ThinReports::Core::Shape::Basic::Internal] shape
|
34
|
+
def draw_shape_ellipse(shape)
|
35
|
+
args = shape.svg_attrs.values_at('cx', 'cy', 'rx', 'ry')
|
36
|
+
args << common_graphic_attrs(shape.attributes)
|
37
|
+
ellipse(*args)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [ThinReports::Core::Shape::Basic::Internal] shape
|
41
|
+
def draw_shape_line(shape)
|
42
|
+
args = shape.svg_attrs.values_at('x1', 'y1', 'x2', 'y2')
|
43
|
+
args << common_graphic_attrs(shape.attributes)
|
44
|
+
line(*args)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param [ThinReports::Core::Shape::Basic::Internal] shape
|
48
|
+
def draw_shape_rect(shape)
|
49
|
+
args = shape.svg_attrs.values_at('x', 'y', 'width', 'height')
|
50
|
+
args << common_graphic_attrs(shape.attributes) do |attrs|
|
51
|
+
attrs[:radius] = shape.svg_attrs['rx']
|
52
|
+
end
|
53
|
+
rect(*args)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# @param [ThinReports::Core::Shape::Text::Internal]
|
59
|
+
# @return [Hash]
|
60
|
+
def shape_text_attrs(shape)
|
61
|
+
format = shape.format
|
62
|
+
|
63
|
+
common_text_attrs(shape.attributes) do |attrs|
|
64
|
+
# Set the :line_height option.
|
65
|
+
attrs[:line_height] = format.line_height unless format.line_height.blank?
|
66
|
+
# Set the :valign option.
|
67
|
+
attrs[:valign] = text_valign(format.valign)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ThinReports
|
4
|
+
module Generator
|
5
|
+
|
6
|
+
# @private
|
7
|
+
module Pdf::Font
|
8
|
+
FONT_STORE = File.join(ThinReports::ROOTDIR, 'resources', 'fonts')
|
9
|
+
|
10
|
+
BUILTIN_FONTS = {
|
11
|
+
'IPAMincho' => {:normal => File.join(FONT_STORE, 'ipam.ttf')},
|
12
|
+
'IPAPMincho' => {:normal => File.join(FONT_STORE, 'ipamp.ttf')},
|
13
|
+
'IPAGothic' => {:normal => File.join(FONT_STORE, 'ipag.ttf')},
|
14
|
+
'IPAPGothic' => {:normal => File.join(FONT_STORE, 'ipagp.ttf')}
|
15
|
+
}
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def setup_fonts
|
20
|
+
# Install built-in fonts.
|
21
|
+
pdf.font_families.update(BUILTIN_FONTS)
|
22
|
+
|
23
|
+
# Install fall-back font that IPAMincho.
|
24
|
+
fallback_font = BUILTIN_FONTS['IPAMincho'][:normal]
|
25
|
+
pdf.font_families['FallbackFont'] = {:normal => fallback_font,
|
26
|
+
:bold => fallback_font,
|
27
|
+
:italic => fallback_font,
|
28
|
+
:bold_italic => fallback_font}
|
29
|
+
# Setup fallback font.
|
30
|
+
pdf.fallback_fonts(['FallbackFont'])
|
31
|
+
|
32
|
+
# Create aliases from the font list provided by Prawn.
|
33
|
+
pdf.font_families.update(
|
34
|
+
'Courier New' => pdf.font_families['Courier'],
|
35
|
+
'Times New Roman' => pdf.font_families['Times-Roman']
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String]
|
40
|
+
def default_family
|
41
|
+
'Helvetica'
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [String] family
|
45
|
+
# @return [String]
|
46
|
+
def default_family_if_missing(family)
|
47
|
+
pdf.font_families.key?(family) ? family : default_family
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param [String] font
|
51
|
+
# @param [Symbol] style
|
52
|
+
# @return [Boolean]
|
53
|
+
def font_has_style?(font, style)
|
54
|
+
(f = pdf.font_families[font]) && f.key?(style)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|