prawn-html 0.6.2 → 0.7.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 +4 -4
- data/README.md +19 -0
- data/lib/prawn-html.rb +2 -4
- data/lib/prawn_html/context.rb +6 -0
- data/lib/prawn_html/document_renderer.rb +5 -1
- data/lib/prawn_html/html_parser.rb +13 -4
- data/lib/prawn_html/instance.rb +18 -0
- data/lib/prawn_html/tags/li.rb +3 -1
- data/lib/prawn_html/utils.rb +1 -1
- data/lib/prawn_html/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d7b30ab7d50313d9b5f16fd37bba84207725c8368ba3370a2ef037bdf871f27
|
4
|
+
data.tar.gz: 730c56224e0961d707db073b550f605e4dd4f39d6a902cbb2af5e9f4533e4785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 790833d6338e59019751025c38a1b37ffa44ff583dd3f23771bc1015754cc1f047a6da9aa2d28c975191de8451ecc164d7dda412c2df15ca779c27b5aa1bc27a
|
7
|
+
data.tar.gz: 3ad2faf9178136a477fa4c0952410593219f85e6cacfbc88d1d504fbbe70388184ee62d3a4e84844eb0a8f225ba04845214d41beff68aa665bed12b03f563547
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Prawn HTML
|
2
2
|
[](https://rubygems.org/gems/prawn-html)
|
3
|
+
[](https://rubygems.org/gems/prawn-html)
|
4
|
+
[](https://codeclimate.com/github/blocknotes/prawn-html/maintainability)
|
3
5
|
[](https://github.com/blocknotes/prawn-html/actions/workflows/linters.yml)
|
4
6
|
[](https://github.com/blocknotes/prawn-html/actions/workflows/specs.yml)
|
5
7
|
|
@@ -33,6 +35,23 @@ pdf.render_file('test.pdf')
|
|
33
35
|
|
34
36
|
To check some examples with the PDF output see [examples](examples/) folder.
|
35
37
|
|
38
|
+
Alternative form using _PrawnHtml::Instance_ to preserve the context:
|
39
|
+
|
40
|
+
```rb
|
41
|
+
require 'prawn-html'
|
42
|
+
pdf = Prawn::Document.new(page_size: 'A4')
|
43
|
+
phtml = PrawnHtml::Instance.new(pdf)
|
44
|
+
css = <<~CSS
|
45
|
+
h1 { color: green }
|
46
|
+
i { color: red }
|
47
|
+
CSS
|
48
|
+
phtml.append(css: css)
|
49
|
+
phtml.append(html: '<h1>Some <i>HTML</i> before</h1>')
|
50
|
+
pdf.text 'Some Prawn text'
|
51
|
+
phtml.append(html: '<h1>Some <i>HTML</i> after</h1>')
|
52
|
+
pdf.render_file('test.pdf')
|
53
|
+
```
|
54
|
+
|
36
55
|
## Supported tags & attributes
|
37
56
|
|
38
57
|
HTML tags (using MDN definitions):
|
data/lib/prawn-html.rb
CHANGED
@@ -156,10 +156,7 @@ module PrawnHtml
|
|
156
156
|
}.freeze
|
157
157
|
|
158
158
|
def append_html(pdf, html)
|
159
|
-
|
160
|
-
renderer = DocumentRenderer.new(pdf_wrapper)
|
161
|
-
html_parser = PrawnHtml::HtmlParser.new(renderer)
|
162
|
-
html_parser.process(html)
|
159
|
+
PrawnHtml::Instance.new(pdf).append(html: html)
|
163
160
|
end
|
164
161
|
|
165
162
|
module_function :append_html
|
@@ -179,3 +176,4 @@ require 'prawn_html/context'
|
|
179
176
|
require 'prawn_html/pdf_wrapper'
|
180
177
|
require 'prawn_html/document_renderer'
|
181
178
|
require 'prawn_html/html_parser'
|
179
|
+
require 'prawn_html/instance'
|
data/lib/prawn_html/context.rb
CHANGED
@@ -62,6 +62,12 @@ module PrawnHtml
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
# :nocov:
|
66
|
+
def inspect
|
67
|
+
map(&:class).map(&:to_s).join(', ')
|
68
|
+
end
|
69
|
+
# :nocov:
|
70
|
+
|
65
71
|
# Remove the last element from the context
|
66
72
|
def remove_last
|
67
73
|
last.on_context_remove(self) if last.respond_to?(:on_context_remove)
|
@@ -9,6 +9,7 @@ module PrawnHtml
|
|
9
9
|
#
|
10
10
|
# @param pdf [PdfWrapper] target PDF wrapper
|
11
11
|
def initialize(pdf)
|
12
|
+
@before_content = []
|
12
13
|
@buffer = []
|
13
14
|
@context = Context.new
|
14
15
|
@last_margin = 0
|
@@ -42,6 +43,7 @@ module PrawnHtml
|
|
42
43
|
options = { width: pdf.page_width, height: pdf.page_height }
|
43
44
|
tag_class.new(tag_name, attributes: attributes, options: options).tap do |element|
|
44
45
|
setup_element(element, element_styles: element_styles)
|
46
|
+
@before_content.push(element.before_content) if element.respond_to?(:before_content)
|
45
47
|
@last_tag_open = true
|
46
48
|
end
|
47
49
|
end
|
@@ -106,7 +108,9 @@ module PrawnHtml
|
|
106
108
|
end
|
107
109
|
|
108
110
|
def prepare_text(content)
|
109
|
-
text =
|
111
|
+
text = @before_content.any? ? ::Oga::HTML::Entities.decode(@before_content.join) : ''
|
112
|
+
@before_content.clear
|
113
|
+
|
110
114
|
return (@last_text = text + content) if context.white_space_pre?
|
111
115
|
|
112
116
|
content = content.lstrip if @last_text[-1] == ' ' || @last_tag_open
|
@@ -15,19 +15,28 @@ module PrawnHtml
|
|
15
15
|
@ignore = false
|
16
16
|
@ignore_content_tags = ignore_content_tags
|
17
17
|
@renderer = renderer
|
18
|
-
@
|
18
|
+
@raw_styles = {}
|
19
19
|
end
|
20
20
|
|
21
21
|
# Processes HTML and renders it
|
22
22
|
#
|
23
23
|
# @param html [String] The HTML content to process
|
24
24
|
def process(html)
|
25
|
+
@styles = {}
|
25
26
|
@processing = !html.include?('<body')
|
26
27
|
@document = Oga.parse_html(html)
|
28
|
+
process_styles # apply previously loaded styles
|
27
29
|
traverse_nodes(document.children)
|
28
30
|
renderer.flush
|
29
31
|
end
|
30
32
|
|
33
|
+
# Parses CSS styles
|
34
|
+
#
|
35
|
+
# @param text_styles [String] The CSS styles to evaluate
|
36
|
+
def parse_styles(text_styles)
|
37
|
+
@raw_styles = text_styles.scan(REGEXP_STYLES).to_h
|
38
|
+
end
|
39
|
+
|
31
40
|
private
|
32
41
|
|
33
42
|
attr_reader :document, :ignore, :processing, :renderer, :styles
|
@@ -59,9 +68,9 @@ module PrawnHtml
|
|
59
68
|
end
|
60
69
|
end
|
61
70
|
|
62
|
-
def process_styles(text_styles)
|
63
|
-
|
64
|
-
|
71
|
+
def process_styles(text_styles = nil)
|
72
|
+
parse_styles(text_styles) if text_styles
|
73
|
+
@raw_styles.each do |selector, rule|
|
65
74
|
document.css(selector).each do |node|
|
66
75
|
styles[node] = rule
|
67
76
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PrawnHtml
|
4
|
+
class Instance
|
5
|
+
attr_reader :html_parser, :pdf_wrapper, :renderer
|
6
|
+
|
7
|
+
def initialize(pdf)
|
8
|
+
@pdf_wrapper = PrawnHtml::PdfWrapper.new(pdf)
|
9
|
+
@renderer = PrawnHtml::DocumentRenderer.new(@pdf_wrapper)
|
10
|
+
@html_parser = PrawnHtml::HtmlParser.new(@renderer)
|
11
|
+
end
|
12
|
+
|
13
|
+
def append(css: nil, html: nil)
|
14
|
+
html_parser.parse_styles(css) if css
|
15
|
+
html_parser.process(html) if html
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/prawn_html/tags/li.rb
CHANGED
data/lib/prawn_html/utils.rb
CHANGED
@@ -45,7 +45,7 @@ module PrawnHtml
|
|
45
45
|
|
46
46
|
if val.match /\A#([a-f0-9]{3})\Z/ # rubocop:disable Performance/RedundantMatch
|
47
47
|
r, g, b = Regexp.last_match[1].chars
|
48
|
-
return r * 2 + g * 2 + b * 2
|
48
|
+
return (r * 2) + (g * 2) + (b * 2)
|
49
49
|
end
|
50
50
|
if val.match /\Argb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\Z/ # rubocop:disable Performance/RedundantMatch
|
51
51
|
r, g, b = Regexp.last_match[1..3].map { |v| v.to_i.to_s(16) }
|
data/lib/prawn_html/version.rb
CHANGED
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.
|
4
|
+
version: 0.7.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:
|
11
|
+
date: 2022-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oga
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/prawn_html/context.rb
|
54
54
|
- lib/prawn_html/document_renderer.rb
|
55
55
|
- lib/prawn_html/html_parser.rb
|
56
|
+
- lib/prawn_html/instance.rb
|
56
57
|
- lib/prawn_html/pdf_wrapper.rb
|
57
58
|
- lib/prawn_html/tag.rb
|
58
59
|
- lib/prawn_html/tags/a.rb
|
@@ -83,7 +84,10 @@ files:
|
|
83
84
|
homepage: https://github.com/blocknotes/prawn-html
|
84
85
|
licenses:
|
85
86
|
- MIT
|
86
|
-
metadata:
|
87
|
+
metadata:
|
88
|
+
homepage_uri: https://github.com/blocknotes/prawn-html
|
89
|
+
source_code_uri: https://github.com/blocknotes/prawn-html
|
90
|
+
rubygems_mfa_required: 'true'
|
87
91
|
post_install_message:
|
88
92
|
rdoc_options: []
|
89
93
|
require_paths:
|
@@ -99,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
103
|
- !ruby/object:Gem::Version
|
100
104
|
version: '0'
|
101
105
|
requirements: []
|
102
|
-
rubygems_version: 3.1.
|
106
|
+
rubygems_version: 3.1.6
|
103
107
|
signing_key:
|
104
108
|
specification_version: 4
|
105
109
|
summary: Prawn PDF - HTML renderer
|