prawn-html 0.5.0 → 0.6.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e82e0a464e39fd4c47c399cb043ceefe090524b29ead1c06795a484d4c648388
4
- data.tar.gz: e124a7fb9800a434f42d403b478c6a6cb30b4e7d1e7e540d015028dec6daaa59
3
+ metadata.gz: 3b659b809526c4c961782f613e6946613232dd836ac056ca48d3dabebdbf9a02
4
+ data.tar.gz: 2549b8b8b872b44f3d6f424236249e7795f97afeadf95299bf06836fb979a13a
5
5
  SHA512:
6
- metadata.gz: c08e1252e2c9c8f1591840179549d3e14483d91361b1a9f56d96f23cfa30829b98d8d2ace33808a73a9467e1ff37054d7f462d1c7170db273a4ff83b203d807f
7
- data.tar.gz: '0979bd9a66e463ee8e4ea3c141a2d4e2fcc0e3b1bc82397aeda2e357c10c4518b00b1e1e4fc3f2ec786070c6d229241423cd5933a89fbc9137bdccc211d22a44'
6
+ metadata.gz: b58a21e4424c89db5ff388ab2507ec502ea283ba9e6234d46f3688e477ba21944ee72f813cc9ddb4454426f5e4cc7397531ffa34c74eeb7795a0bbbeaa8d34ed
7
+ data.tar.gz: 0e3cfad427968577135c8c8791f698b3c5d6e95463b9364d0630d9caf87407f378c3fb725bfe11349cad210d1d0c3bba1a90555ebb9219c620e674fff0413ff8
data/README.md CHANGED
@@ -90,6 +90,8 @@ CSS attributes (dimensional units are ignored and considered in pixel):
90
90
  - **top**: see *position (absolute)*
91
91
  - **width**: for *img* tag, support also percentage, ex. `<img src="image.jpg" style="width: 50%; height: 200px"/>`
92
92
 
93
+ The above attributes supports the `initial` value to reset them to their original value.
94
+
93
95
  For colors, the supported formats are:
94
96
  - 3 hex digits, ex. `color: #FB1`;
95
97
  - 6 hex digits, ex. `color: #abcdef`;
@@ -1,10 +1,11 @@
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
11
  block: %i[align bottom leading left margin_left padding_left position right top],
@@ -19,13 +20,13 @@ module PrawnHtml
19
20
  'color' => { key: :color, set: :convert_color },
20
21
  'font-family' => { key: :font, set: :unquote },
21
22
  'font-size' => { key: :size, set: :convert_size },
22
- 'font-style' => { key: :styles, set: :append_styles },
23
- 'font-weight' => { key: :styles, set: :append_styles },
23
+ 'font-style' => { key: :styles, set: :append_styles, values: %i[italic] },
24
+ 'font-weight' => { key: :styles, set: :append_styles, values: %i[bold] },
24
25
  'href' => { key: :link, set: :copy_value },
25
26
  'letter-spacing' => { key: :character_spacing, set: :convert_float },
26
27
  'list-style-type' => { key: :list_style_type, set: :unquote },
27
- 'text-decoration' => { key: :styles, set: :append_text_decoration },
28
- 'vertical-align' => { key: :styles, set: :append_styles },
28
+ 'text-decoration' => { key: :styles, set: :append_styles, values: %i[underline] },
29
+ 'vertical-align' => { key: :styles, set: :append_styles, values: %i[subscript superscript] },
29
30
  'white-space' => { key: :white_space, set: :convert_symbol },
30
31
  # tag opening styles
31
32
  'break-before' => { key: :break_before, set: :convert_symbol },
@@ -44,7 +45,9 @@ module PrawnHtml
44
45
  'position' => { key: :position, set: :convert_symbol },
45
46
  'right' => { key: :right, set: :convert_size, options: :width },
46
47
  'text-align' => { key: :align, set: :convert_symbol },
47
- 'top' => { key: :top, set: :convert_size, options: :height }
48
+ 'top' => { key: :top, set: :convert_size, options: :height },
49
+ # special styles
50
+ 'text-decoration-line-through' => { key: :callback, set: :callback_strike_through }
48
51
  }.freeze
49
52
 
50
53
  STYLES_MERGE = %i[margin_left padding_left].freeze
@@ -53,6 +56,7 @@ module PrawnHtml
53
56
  def initialize(attributes = {})
54
57
  super
55
58
  @styles = {} # result styles
59
+ @initial = Set.new
56
60
  end
57
61
 
58
62
  # Processes the data attributes
@@ -74,6 +78,33 @@ module PrawnHtml
74
78
  process_styles(hash_styles, options: options) unless hash_styles.empty?
75
79
  end
76
80
 
81
+ # Remove an attribute value from the context styles
82
+ #
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])
91
+ end
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
106
+ end
107
+
77
108
  class << self
78
109
  # Merges attributes
79
110
  #
@@ -105,29 +136,30 @@ module PrawnHtml
105
136
  def process_styles(hash_styles, options:)
106
137
  hash_styles.each do |key, value|
107
138
  rule = evaluate_rule(key, value)
139
+ next unless rule
140
+
108
141
  apply_rule!(merged_styles: @styles, rule: rule, value: value, options: options)
109
142
  end
110
143
  @styles
111
144
  end
112
145
 
113
146
  def evaluate_rule(rule_key, attr_value)
114
- rule = STYLES_LIST[rule_key]
115
- if rule && rule[:set] == :append_text_decoration
116
- return { key: :callback, set: :callback_strike_through } if attr_value == 'line-through'
117
-
118
- return { key: :styles, set: :append_styles }
119
- end
120
- rule
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]
121
151
  end
122
152
 
123
153
  def apply_rule!(merged_styles:, rule:, value:, options:)
124
- return unless rule
154
+ return (@initial << rule) if value == 'initial'
125
155
 
126
156
  if rule[:set] == :append_styles
127
- (merged_styles[rule[:key]] ||= []) << Utils.normalize_style(value)
157
+ val = Utils.normalize_style(value)
158
+ (merged_styles[rule[:key]] ||= []) << val if val
128
159
  else
129
160
  opts = rule[:options] ? options[rule[:options]] : nil
130
- merged_styles[rule[:key]] = Utils.send(rule[:set], value, options: opts)
161
+ val = Utils.send(rule[:set], value, options: opts)
162
+ merged_styles[rule[:key]] = val if val
131
163
  end
132
164
  end
133
165
  end
@@ -2,7 +2,9 @@
2
2
 
3
3
  module PrawnHtml
4
4
  class Context < Array
5
- DEF_FONT_SIZE = 16 * PX
5
+ DEFAULT_STYLES = {
6
+ size: 16 * PX
7
+ }.freeze
6
8
 
7
9
  attr_reader :previous_tag
8
10
  attr_accessor :last_text_node
@@ -54,9 +56,9 @@ module PrawnHtml
54
56
  # @return [Hash] the hash of merged styles
55
57
  def merged_styles
56
58
  @merged_styles ||=
57
- each_with_object(base_styles) do |element, res|
59
+ each_with_object(DEFAULT_STYLES.dup) do |element, res|
58
60
  evaluate_element_styles(element, res)
59
- element.update_styles(res) if element.respond_to?(:update_styles)
61
+ element.update_styles(res)
60
62
  end
61
63
  end
62
64
 
@@ -71,12 +73,6 @@ module PrawnHtml
71
73
 
72
74
  private
73
75
 
74
- def base_styles
75
- {
76
- size: DEF_FONT_SIZE
77
- }
78
- end
79
-
80
76
  def evaluate_element_styles(element, res)
81
77
  styles = element.styles.slice(*Attributes::STYLES_APPLY[:text_node])
82
78
  styles.each do |key, val|
@@ -129,7 +129,7 @@ module PrawnHtml
129
129
  def adjust_leading(buffer, leading)
130
130
  return leading if leading
131
131
 
132
- (buffer.map { |item| item[:size] || Context::DEF_FONT_SIZE }.max * 0.055).round(4)
132
+ (buffer.map { |item| item[:size] || Context::DEFAULT_STYLES[:size] }.max * 0.055).round(4)
133
133
  end
134
134
 
135
135
  def bounds(buffer, options, block_styles)
@@ -2,12 +2,17 @@
2
2
 
3
3
  module PrawnHtml
4
4
  class Tag
5
+ extend Forwardable
6
+
5
7
  CALLBACKS = {
6
8
  'Background' => Callbacks::Background,
7
9
  'StrikeThrough' => Callbacks::StrikeThrough
8
10
  }.freeze
11
+
9
12
  TAG_CLASSES = %w[A B Blockquote Body Br Code Del Div H Hr I Img Li Mark Ol P Pre Small Span Sub Sup U Ul].freeze
10
13
 
14
+ def_delegators :@attrs, :styles, :update_styles
15
+
11
16
  attr_accessor :parent
12
17
  attr_reader :attrs, :tag
13
18
 
@@ -45,6 +50,7 @@ module PrawnHtml
45
50
  attrs.merge_text_styles!(tag_styles, options: options) if respond_to?(:tag_styles)
46
51
  attrs.merge_text_styles!(element_styles, options: options) if element_styles
47
52
  attrs.merge_text_styles!(attrs.style, options: options)
53
+ attrs.merge_text_styles!(extra_styles, options: options) if respond_to?(:extra_styles)
48
54
  end
49
55
 
50
56
  # Styles to apply on tag closing
@@ -54,13 +60,6 @@ module PrawnHtml
54
60
  styles.slice(*Attributes::STYLES_APPLY[:tag_close])
55
61
  end
56
62
 
57
- # Styles hash
58
- #
59
- # @return [Hash] hash of styles
60
- def styles
61
- attrs.styles
62
- end
63
-
64
63
  # Styles to apply on tag opening
65
64
  #
66
65
  # @return [Hash] hash of styles to apply
@@ -5,12 +5,13 @@ module PrawnHtml
5
5
  class A < Tag
6
6
  ELEMENTS = [:a].freeze
7
7
 
8
- def tag_styles
9
- return unless attrs.href
8
+ def extra_styles
9
+ attrs.href ? "href: #{attrs.href}" : nil
10
+ end
10
11
 
12
+ def tag_styles
11
13
  <<~STYLES
12
14
  color: #00E;
13
- href: #{attrs.href};
14
15
  text-decoration: underline;
15
16
  STYLES
16
17
  end
@@ -5,10 +5,10 @@ module PrawnHtml
5
5
  class Small < Tag
6
6
  ELEMENTS = [:small].freeze
7
7
 
8
- def update_styles(styles)
9
- size = (styles[:size] || Context::DEF_FONT_SIZE) * 0.85
10
- styles[:size] = size
11
- styles
8
+ def update_styles(context_styles)
9
+ size = (context_styles[:size] || Context::DEFAULT_STYLES[:size]) * 0.85
10
+ context_styles[:size] = size
11
+ super(context_styles)
12
12
  end
13
13
  end
14
14
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PrawnHtml # :nodoc:
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prawn-html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattia Roccoberton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-09 00:00:00.000000000 Z
11
+ date: 2021-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oga