prawn-html 0.3.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -2
- data/lib/prawn-html.rb +3 -2
- data/lib/prawn_html/attributes.rb +71 -29
- data/lib/prawn_html/callbacks/{highlight.rb → background.rb} +3 -3
- data/lib/prawn_html/context.rb +24 -17
- data/lib/prawn_html/document_renderer.rb +55 -35
- data/lib/prawn_html/html_parser.rb +35 -10
- data/lib/prawn_html/pdf_wrapper.rb +51 -4
- data/lib/prawn_html/tag.rb +24 -30
- data/lib/prawn_html/tags/a.rb +8 -1
- data/lib/prawn_html/tags/b.rb +1 -3
- data/lib/prawn_html/tags/blockquote.rb +25 -0
- data/lib/prawn_html/tags/body.rb +4 -0
- data/lib/prawn_html/tags/br.rb +2 -2
- data/lib/prawn_html/tags/code.rb +13 -0
- data/lib/prawn_html/tags/del.rb +1 -3
- data/lib/prawn_html/tags/h.rb +21 -21
- data/lib/prawn_html/tags/hr.rb +4 -4
- data/lib/prawn_html/tags/i.rb +1 -3
- data/lib/prawn_html/tags/img.rb +5 -4
- data/lib/prawn_html/tags/li.rb +20 -7
- data/lib/prawn_html/tags/mark.rb +1 -3
- data/lib/prawn_html/tags/ol.rb +20 -5
- data/lib/prawn_html/tags/p.rb +6 -6
- data/lib/prawn_html/tags/pre.rb +25 -0
- data/lib/prawn_html/tags/small.rb +4 -4
- data/lib/prawn_html/tags/sub.rb +13 -0
- data/lib/prawn_html/tags/sup.rb +13 -0
- data/lib/prawn_html/tags/u.rb +1 -3
- data/lib/prawn_html/tags/ul.rb +23 -4
- data/lib/prawn_html/utils.rb +47 -10
- data/lib/prawn_html/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b659b809526c4c961782f613e6946613232dd836ac056ca48d3dabebdbf9a02
|
4
|
+
data.tar.gz: 2549b8b8b872b44f3d6f424236249e7795f97afeadf95299bf06836fb979a13a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b58a21e4424c89db5ff388ab2507ec502ea283ba9e6234d46f3688e477ba21944ee72f813cc9ddb4454426f5e4cc7397531ffa34c74eeb7795a0bbbeaa8d34ed
|
7
|
+
data.tar.gz: 0e3cfad427968577135c8c8791f698b3c5d6e95463b9364d0630d9caf87407f378c3fb725bfe11349cad210d1d0c3bba1a90555ebb9219c620e674fff0413ff8
|
data/README.md
CHANGED
@@ -39,7 +39,9 @@ HTML tags:
|
|
39
39
|
|
40
40
|
- **a**: link
|
41
41
|
- **b**: bold
|
42
|
+
- **blockquote**: block quotation element
|
42
43
|
- **br**: new line
|
44
|
+
- **code**: inline code element
|
43
45
|
- **del**: strike-through
|
44
46
|
- **div**: block element
|
45
47
|
- **em**: italic
|
@@ -52,10 +54,13 @@ HTML tags:
|
|
52
54
|
- **mark**: highlight
|
53
55
|
- **ol**: ordered list
|
54
56
|
- **p**: block element
|
57
|
+
- **pre**: preformatted text element
|
55
58
|
- **s**: strike-through
|
56
59
|
- **small**: smaller text
|
57
60
|
- **span**: inline element
|
58
61
|
- **strong**: bold
|
62
|
+
- **sub**: subscript element
|
63
|
+
- **sup**: superscript element
|
59
64
|
- **u**: underline
|
60
65
|
- **ul**: unordered list
|
61
66
|
|
@@ -85,6 +90,8 @@ CSS attributes (dimensional units are ignored and considered in pixel):
|
|
85
90
|
- **top**: see *position (absolute)*
|
86
91
|
- **width**: for *img* tag, support also percentage, ex. `<img src="image.jpg" style="width: 50%; height: 200px"/>`
|
87
92
|
|
93
|
+
The above attributes supports the `initial` value to reset them to their original value.
|
94
|
+
|
88
95
|
For colors, the supported formats are:
|
89
96
|
- 3 hex digits, ex. `color: #FB1`;
|
90
97
|
- 6 hex digits, ex. `color: #abcdef`;
|
@@ -100,8 +107,7 @@ Some custom data attributes are used to pass options:
|
|
100
107
|
|
101
108
|
## Document styles
|
102
109
|
|
103
|
-
|
104
|
-
Only single CSS selectors and basic ones are supported. Example:
|
110
|
+
You can define document CSS rules inside an _head_ tag. Example:
|
105
111
|
|
106
112
|
```html
|
107
113
|
<!DOCTYPE html>
|
data/lib/prawn-html.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PrawnHtml
|
4
|
-
PX = 0.
|
4
|
+
PX = 0.6 # conversion constant for pixel sixes
|
5
5
|
|
6
6
|
COLORS = {
|
7
7
|
'aliceblue' => 'f0f8ff',
|
@@ -168,9 +168,10 @@ require 'prawn'
|
|
168
168
|
|
169
169
|
require 'prawn_html/utils'
|
170
170
|
|
171
|
+
Dir["#{__dir__}/prawn_html/callbacks/*.rb"].sort.each { |f| require f }
|
172
|
+
|
171
173
|
require 'prawn_html/tag'
|
172
174
|
Dir["#{__dir__}/prawn_html/tags/*.rb"].sort.each { |f| require f }
|
173
|
-
Dir["#{__dir__}/prawn_html/callbacks/*.rb"].sort.each { |f| require f }
|
174
175
|
|
175
176
|
require 'prawn_html/attributes'
|
176
177
|
require 'prawn_html/context'
|
@@ -1,31 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'ostruct'
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
module PrawnHtml
|
6
7
|
class Attributes < OpenStruct
|
7
|
-
attr_reader :styles
|
8
|
+
attr_reader :initial, :styles
|
8
9
|
|
9
10
|
STYLES_APPLY = {
|
10
|
-
block: %i[align leading left margin_left padding_left position top],
|
11
|
+
block: %i[align bottom leading left margin_left padding_left position right top],
|
11
12
|
tag_close: %i[margin_bottom padding_bottom break_after],
|
12
13
|
tag_open: %i[margin_top padding_top break_before],
|
13
|
-
text_node: %i[
|
14
|
+
text_node: %i[callback character_spacing color font link list_style_type size styles white_space]
|
14
15
|
}.freeze
|
15
16
|
|
16
17
|
STYLES_LIST = {
|
17
18
|
# text node styles
|
18
|
-
'background' => { key: :
|
19
|
-
'callback' => { key: :callback, set: :copy_value },
|
19
|
+
'background' => { key: :callback, set: :callback_background },
|
20
20
|
'color' => { key: :color, set: :convert_color },
|
21
21
|
'font-family' => { key: :font, set: :unquote },
|
22
22
|
'font-size' => { key: :size, set: :convert_size },
|
23
|
-
'font-style' => { key: :styles, set: :
|
24
|
-
'font-weight' => { key: :styles, set: :
|
23
|
+
'font-style' => { key: :styles, set: :append_styles, values: %i[italic] },
|
24
|
+
'font-weight' => { key: :styles, set: :append_styles, values: %i[bold] },
|
25
25
|
'href' => { key: :link, set: :copy_value },
|
26
26
|
'letter-spacing' => { key: :character_spacing, set: :convert_float },
|
27
27
|
'list-style-type' => { key: :list_style_type, set: :unquote },
|
28
|
-
'text-decoration' => { key: :styles, set: :
|
28
|
+
'text-decoration' => { key: :styles, set: :append_styles, values: %i[underline] },
|
29
|
+
'vertical-align' => { key: :styles, set: :append_styles, values: %i[subscript superscript] },
|
30
|
+
'white-space' => { key: :white_space, set: :convert_symbol },
|
29
31
|
# tag opening styles
|
30
32
|
'break-before' => { key: :break_before, set: :convert_symbol },
|
31
33
|
'margin-top' => { key: :margin_top, set: :convert_size },
|
@@ -35,13 +37,17 @@ module PrawnHtml
|
|
35
37
|
'margin-bottom' => { key: :margin_bottom, set: :convert_size },
|
36
38
|
'padding-bottom' => { key: :padding_bottom, set: :convert_size },
|
37
39
|
# block styles
|
38
|
-
'
|
40
|
+
'bottom' => { key: :bottom, set: :convert_size, options: :height },
|
41
|
+
'left' => { key: :left, set: :convert_size, options: :width },
|
39
42
|
'line-height' => { key: :leading, set: :convert_size },
|
40
43
|
'margin-left' => { key: :margin_left, set: :convert_size },
|
41
44
|
'padding-left' => { key: :padding_left, set: :convert_size },
|
42
45
|
'position' => { key: :position, set: :convert_symbol },
|
46
|
+
'right' => { key: :right, set: :convert_size, options: :width },
|
43
47
|
'text-align' => { key: :align, set: :convert_symbol },
|
44
|
-
'top' => { key: :top, set: :convert_size }
|
48
|
+
'top' => { key: :top, set: :convert_size, options: :height },
|
49
|
+
# special styles
|
50
|
+
'text-decoration-line-through' => { key: :callback, set: :callback_strike_through }
|
45
51
|
}.freeze
|
46
52
|
|
47
53
|
STYLES_MERGE = %i[margin_left padding_left].freeze
|
@@ -50,10 +56,7 @@ module PrawnHtml
|
|
50
56
|
def initialize(attributes = {})
|
51
57
|
super
|
52
58
|
@styles = {} # result styles
|
53
|
-
|
54
|
-
|
55
|
-
styles_hash = Attributes.parse_styles(style)
|
56
|
-
process_styles(styles_hash)
|
59
|
+
@initial = Set.new
|
57
60
|
end
|
58
61
|
|
59
62
|
# Processes the data attributes
|
@@ -66,21 +69,40 @@ module PrawnHtml
|
|
66
69
|
end
|
67
70
|
end
|
68
71
|
|
69
|
-
# Merge
|
72
|
+
# Merge text styles
|
70
73
|
#
|
71
|
-
# @param
|
72
|
-
|
73
|
-
|
74
|
+
# @param text_styles [String] styles to parse and process
|
75
|
+
# @param options [Hash] options (container width/height/etc.)
|
76
|
+
def merge_text_styles!(text_styles, options: {})
|
77
|
+
hash_styles = Attributes.parse_styles(text_styles)
|
78
|
+
process_styles(hash_styles, options: options) unless hash_styles.empty?
|
74
79
|
end
|
75
80
|
|
76
|
-
#
|
81
|
+
# Remove an attribute value from the context styles
|
77
82
|
#
|
78
|
-
# @param
|
79
|
-
|
80
|
-
|
81
|
-
|
83
|
+
# @param context_styles [Hash] hash of the context styles that will be updated
|
84
|
+
# @param rule [Hash] rule from the STYLES_LIST to lookup in the context style for value removal
|
85
|
+
def remove_value(context_styles, rule)
|
86
|
+
if rule[:set] == :append_styles
|
87
|
+
context_styles[rule[:key]] -= rule[:values] if context_styles[:styles]
|
88
|
+
else
|
89
|
+
default = Context::DEFAULT_STYLES[rule[:key]]
|
90
|
+
default ? (context_styles[rule[:key]] = default) : context_styles.delete(rule[:key])
|
82
91
|
end
|
83
|
-
|
92
|
+
end
|
93
|
+
|
94
|
+
# Update context styles applying the initial rules (if set)
|
95
|
+
#
|
96
|
+
# @param context_styles [Hash] hash of the context styles that will be updated
|
97
|
+
#
|
98
|
+
# @return [Hash] the update context styles
|
99
|
+
def update_styles(context_styles)
|
100
|
+
initial.each do |rule|
|
101
|
+
next unless rule
|
102
|
+
|
103
|
+
remove_value(context_styles, rule)
|
104
|
+
end
|
105
|
+
context_styles
|
84
106
|
end
|
85
107
|
|
86
108
|
class << self
|
@@ -111,13 +133,33 @@ module PrawnHtml
|
|
111
133
|
|
112
134
|
private
|
113
135
|
|
114
|
-
def
|
115
|
-
|
136
|
+
def process_styles(hash_styles, options:)
|
137
|
+
hash_styles.each do |key, value|
|
138
|
+
rule = evaluate_rule(key, value)
|
139
|
+
next unless rule
|
140
|
+
|
141
|
+
apply_rule!(merged_styles: @styles, rule: rule, value: value, options: options)
|
142
|
+
end
|
143
|
+
@styles
|
144
|
+
end
|
145
|
+
|
146
|
+
def evaluate_rule(rule_key, attr_value)
|
147
|
+
key = nil
|
148
|
+
key = 'text-decoration-line-through' if rule_key == 'text-decoration' && attr_value == 'line-through'
|
149
|
+
key ||= rule_key
|
150
|
+
STYLES_LIST[key]
|
151
|
+
end
|
152
|
+
|
153
|
+
def apply_rule!(merged_styles:, rule:, value:, options:)
|
154
|
+
return (@initial << rule) if value == 'initial'
|
116
155
|
|
117
|
-
if rule[:set] == :
|
118
|
-
|
156
|
+
if rule[:set] == :append_styles
|
157
|
+
val = Utils.normalize_style(value)
|
158
|
+
(merged_styles[rule[:key]] ||= []) << val if val
|
119
159
|
else
|
120
|
-
|
160
|
+
opts = rule[:options] ? options[rule[:options]] : nil
|
161
|
+
val = Utils.send(rule[:set], value, options: opts)
|
162
|
+
merged_styles[rule[:key]] = val if val
|
121
163
|
end
|
122
164
|
end
|
123
165
|
end
|
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
module PrawnHtml
|
4
4
|
module Callbacks
|
5
|
-
class
|
5
|
+
class Background
|
6
6
|
DEF_HIGHLIGHT = 'ffff00'
|
7
7
|
|
8
|
-
def initialize(pdf,
|
8
|
+
def initialize(pdf, color = nil)
|
9
9
|
@pdf = pdf
|
10
|
-
@color =
|
10
|
+
@color = color || DEF_HIGHLIGHT
|
11
11
|
end
|
12
12
|
|
13
13
|
def render_behind(fragment)
|
data/lib/prawn_html/context.rb
CHANGED
@@ -2,15 +2,19 @@
|
|
2
2
|
|
3
3
|
module PrawnHtml
|
4
4
|
class Context < Array
|
5
|
-
|
5
|
+
DEFAULT_STYLES = {
|
6
|
+
size: 16 * PX
|
7
|
+
}.freeze
|
6
8
|
|
7
|
-
|
9
|
+
attr_reader :previous_tag
|
10
|
+
attr_accessor :last_text_node
|
8
11
|
|
9
12
|
# Init the Context
|
10
13
|
def initialize(*_args)
|
11
14
|
super
|
12
|
-
@last_margin = 0
|
13
15
|
@last_text_node = false
|
16
|
+
@merged_styles = nil
|
17
|
+
@previous_tag = nil
|
14
18
|
end
|
15
19
|
|
16
20
|
# Add an element to the context
|
@@ -25,6 +29,7 @@ module PrawnHtml
|
|
25
29
|
element.parent = last
|
26
30
|
push(element)
|
27
31
|
element.on_context_add(self) if element.respond_to?(:on_context_add)
|
32
|
+
@merged_styles = nil
|
28
33
|
self
|
29
34
|
end
|
30
35
|
|
@@ -32,9 +37,7 @@ module PrawnHtml
|
|
32
37
|
#
|
33
38
|
# @return [String] before content string
|
34
39
|
def before_content
|
35
|
-
|
36
|
-
|
37
|
-
last.tag_styles[:before_content].to_s
|
40
|
+
(last.respond_to?(:before_content) && last.before_content) || ''
|
38
41
|
end
|
39
42
|
|
40
43
|
# Merges the context block styles
|
@@ -51,21 +54,25 @@ module PrawnHtml
|
|
51
54
|
# Merge the context styles for text nodes
|
52
55
|
#
|
53
56
|
# @return [Hash] the hash of merged styles
|
54
|
-
def
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
def merged_styles
|
58
|
+
@merged_styles ||=
|
59
|
+
each_with_object(DEFAULT_STYLES.dup) do |element, res|
|
60
|
+
evaluate_element_styles(element, res)
|
61
|
+
element.update_styles(res)
|
62
|
+
end
|
59
63
|
end
|
60
64
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
# Remove the last element from the context
|
66
|
+
def remove_last
|
67
|
+
last.on_context_remove(self) if last.respond_to?(:on_context_remove)
|
68
|
+
@merged_styles = nil
|
69
|
+
@last_text_node = false
|
70
|
+
@previous_tag = last.tag
|
71
|
+
pop
|
67
72
|
end
|
68
73
|
|
74
|
+
private
|
75
|
+
|
69
76
|
def evaluate_element_styles(element, res)
|
70
77
|
styles = element.styles.slice(*Attributes::STYLES_APPLY[:text_node])
|
71
78
|
styles.each do |key, val|
|
@@ -11,43 +11,33 @@ module PrawnHtml
|
|
11
11
|
def initialize(pdf)
|
12
12
|
@buffer = []
|
13
13
|
@context = Context.new
|
14
|
-
@
|
14
|
+
@last_margin = 0
|
15
15
|
@pdf = pdf
|
16
16
|
end
|
17
17
|
|
18
|
-
# Evaluate the document styles and store the internally
|
19
|
-
#
|
20
|
-
# @param styles [Hash] styles hash with CSS selectors as keys and rules as values
|
21
|
-
def assign_document_styles(styles)
|
22
|
-
@document_styles.merge!(
|
23
|
-
styles.transform_values do |style_rules|
|
24
|
-
Attributes.new(style: style_rules).styles
|
25
|
-
end
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
18
|
# On tag close callback
|
30
19
|
#
|
31
20
|
# @param element [Tag] closing element wrapper
|
32
21
|
def on_tag_close(element)
|
33
22
|
render_if_needed(element)
|
34
23
|
apply_tag_close_styles(element)
|
35
|
-
context.
|
36
|
-
context.pop
|
24
|
+
context.remove_last
|
37
25
|
end
|
38
26
|
|
39
27
|
# On tag open callback
|
40
28
|
#
|
41
29
|
# @param tag_name [String] the tag name of the opening element
|
42
30
|
# @param attributes [Hash] an hash of the element attributes
|
31
|
+
# @param element_styles [String] document styles to apply to the element
|
43
32
|
#
|
44
33
|
# @return [Tag] the opening element wrapper
|
45
|
-
def on_tag_open(tag_name, attributes)
|
34
|
+
def on_tag_open(tag_name, attributes:, element_styles: '')
|
46
35
|
tag_class = Tag.class_for(tag_name)
|
47
36
|
return unless tag_class
|
48
37
|
|
49
|
-
|
50
|
-
|
38
|
+
options = { width: pdf.page_width, height: pdf.page_height }
|
39
|
+
tag_class.new(tag_name, attributes: attributes, options: options).tap do |element|
|
40
|
+
setup_element(element, element_styles: element_styles)
|
51
41
|
end
|
52
42
|
end
|
53
43
|
|
@@ -59,9 +49,7 @@ module PrawnHtml
|
|
59
49
|
def on_text_node(content)
|
60
50
|
return if content.match?(/\A\s*\Z/)
|
61
51
|
|
62
|
-
|
63
|
-
text += content.gsub(/\A\s*\n\s*|\s*\n\s*\Z/, '').delete("\n").squeeze(' ')
|
64
|
-
buffer << context.text_node_styles.merge(text: text)
|
52
|
+
buffer << context.merged_styles.merge(text: prepare_text(content))
|
65
53
|
context.last_text_node = true
|
66
54
|
nil
|
67
55
|
end
|
@@ -72,19 +60,20 @@ module PrawnHtml
|
|
72
60
|
|
73
61
|
output_content(buffer.dup, context.block_styles)
|
74
62
|
buffer.clear
|
75
|
-
|
63
|
+
@last_margin = 0
|
76
64
|
end
|
77
65
|
|
78
66
|
alias_method :flush, :render
|
79
67
|
|
80
68
|
private
|
81
69
|
|
82
|
-
attr_reader :buffer, :context, :
|
70
|
+
attr_reader :buffer, :context, :last_margin, :pdf
|
83
71
|
|
84
|
-
def setup_element(element)
|
72
|
+
def setup_element(element, element_styles:)
|
85
73
|
add_space_if_needed unless render_if_needed(element)
|
86
|
-
apply_tag_open_styles(element)
|
87
74
|
context.add(element)
|
75
|
+
element.process_styles(element_styles: element_styles)
|
76
|
+
apply_tag_open_styles(element)
|
88
77
|
element.custom_render(pdf, context) if element.respond_to?(:custom_render)
|
89
78
|
end
|
90
79
|
|
@@ -102,32 +91,63 @@ module PrawnHtml
|
|
102
91
|
|
103
92
|
def apply_tag_close_styles(element)
|
104
93
|
tag_styles = element.tag_close_styles
|
105
|
-
|
106
|
-
pdf.advance_cursor(
|
94
|
+
@last_margin = tag_styles[:margin_bottom].to_f
|
95
|
+
pdf.advance_cursor(last_margin + tag_styles[:padding_bottom].to_f)
|
107
96
|
pdf.start_new_page if tag_styles[:break_after]
|
108
97
|
end
|
109
98
|
|
110
99
|
def apply_tag_open_styles(element)
|
111
100
|
tag_styles = element.tag_open_styles
|
112
|
-
move_down = (tag_styles[:margin_top].to_f -
|
101
|
+
move_down = (tag_styles[:margin_top].to_f - last_margin) + tag_styles[:padding_top].to_f
|
113
102
|
pdf.advance_cursor(move_down) if move_down > 0
|
114
103
|
pdf.start_new_page if tag_styles[:break_before]
|
115
104
|
end
|
116
105
|
|
106
|
+
def prepare_text(content)
|
107
|
+
white_space_pre = context.last && context.last.styles[:white_space] == :pre
|
108
|
+
text = ::Oga::HTML::Entities.decode(context.before_content)
|
109
|
+
text += white_space_pre ? content : content.gsub(/\A\s*\n\s*|\s*\n\s*\Z/, '').delete("\n").squeeze(' ')
|
110
|
+
text
|
111
|
+
end
|
112
|
+
|
117
113
|
def output_content(buffer, block_styles)
|
118
|
-
buffer
|
114
|
+
apply_callbacks(buffer)
|
119
115
|
left_indent = block_styles[:margin_left].to_f + block_styles[:padding_left].to_f
|
120
|
-
options = block_styles.slice(:align, :leading, :mode, :padding_left)
|
121
|
-
options[:
|
122
|
-
pdf.puts(buffer, options, bounding_box: bounds(block_styles))
|
116
|
+
options = block_styles.slice(:align, :indent_paragraphs, :leading, :mode, :padding_left)
|
117
|
+
options[:leading] = adjust_leading(buffer, options[:leading])
|
118
|
+
pdf.puts(buffer, options, bounding_box: bounds(buffer, options, block_styles), left_indent: left_indent)
|
119
|
+
end
|
120
|
+
|
121
|
+
def apply_callbacks(buffer)
|
122
|
+
buffer.select { |item| item[:callback] }.each do |item|
|
123
|
+
callback, arg = item[:callback]
|
124
|
+
callback_class = Tag::CALLBACKS[callback]
|
125
|
+
item[:callback] = callback_class.new(pdf, arg)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def adjust_leading(buffer, leading)
|
130
|
+
return leading if leading
|
131
|
+
|
132
|
+
(buffer.map { |item| item[:size] || Context::DEFAULT_STYLES[:size] }.max * 0.055).round(4)
|
123
133
|
end
|
124
134
|
|
125
|
-
def bounds(block_styles)
|
135
|
+
def bounds(buffer, options, block_styles)
|
126
136
|
return unless block_styles[:position] == :absolute
|
127
137
|
|
128
|
-
|
129
|
-
|
130
|
-
|
138
|
+
x = if block_styles.include?(:right)
|
139
|
+
x1 = pdf.calc_buffer_width(buffer) + block_styles[:right]
|
140
|
+
x1 < pdf.page_width ? (pdf.page_width - x1) : 0
|
141
|
+
else
|
142
|
+
block_styles[:left] || 0
|
143
|
+
end
|
144
|
+
y = if block_styles.include?(:bottom)
|
145
|
+
pdf.calc_buffer_height(buffer, options) + block_styles[:bottom]
|
146
|
+
else
|
147
|
+
pdf.page_height - (block_styles[:top] || 0)
|
148
|
+
end
|
149
|
+
|
150
|
+
[[x, y], { width: pdf.page_width - x }]
|
131
151
|
end
|
132
152
|
end
|
133
153
|
end
|