page_print 0.1.1-x86_64-linux
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +247 -0
- data/ext/page_print/extconf.rb +48 -0
- data/ext/page_print/page_print.c +851 -0
- data/lib/page_print/page_print.so +0 -0
- data/lib/page_print/rails_resource_fetcher.rb +138 -0
- data/lib/page_print/railtie.rb +15 -0
- data/lib/page_print/vendor/x86_64-linux/include/plutobook/plutobook.h +1101 -0
- data/lib/page_print/vendor/x86_64-linux/include/plutobook/plutobook.hpp +1361 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libX11.so.6 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libXau.so.6 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libXdmcp.so.6 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libXext.so.6 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libXrender.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libbrotlicommon.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libbrotlidec.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libbsd.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libbz2.so.1.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libcairo.so.2 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libcrypt.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libexpat.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libfontconfig.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libfreetype.so.6 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libglib-2.0.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libgmp.so.10 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libgraphite2.so.3 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libharfbuzz.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libicudata.so.74 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libicui18n.so.74 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libicuuc.so.74 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libmd.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libpcre2-8.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libpixman-1.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so.0.17.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libpng16.so.16 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libruby.so.3.4 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libxcb-render.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libxcb-shm.so.0 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libxcb.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/libz.so.1 +0 -0
- data/lib/page_print/vendor/x86_64-linux/lib/pkgconfig/plutobook.pc +10 -0
- data/lib/page_print/version.rb +3 -0
- data/lib/page_print.rb +28 -0
- metadata +89 -0
|
Binary file
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require 'uri'
|
|
3
|
+
|
|
4
|
+
module PagePrint
|
|
5
|
+
class RailsResourceFetcher
|
|
6
|
+
DEFAULT_ASSET_PREFIX = '/assets'
|
|
7
|
+
|
|
8
|
+
def initialize(rails: nil, asset_prefix: DEFAULT_ASSET_PREFIX)
|
|
9
|
+
@rails = rails || rails_constant
|
|
10
|
+
@asset_prefix = normalize_asset_prefix(asset_prefix)
|
|
11
|
+
|
|
12
|
+
raise ArgumentError, 'Rails is not available' unless @rails
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call(url)
|
|
16
|
+
path = path_from_url(url)
|
|
17
|
+
return unless path&.start_with?("#{@asset_prefix}/")
|
|
18
|
+
|
|
19
|
+
read_public_asset(path) || read_resolved_asset(path)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
attr_reader :rails, :asset_prefix
|
|
25
|
+
|
|
26
|
+
def rails_constant
|
|
27
|
+
Object.const_get(:Rails) if Object.const_defined?(:Rails)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def normalize_asset_prefix(value)
|
|
31
|
+
prefix = value.to_s
|
|
32
|
+
prefix = "/#{prefix}" unless prefix.start_with?('/')
|
|
33
|
+
prefix.delete_suffix('/')
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def path_from_url(url)
|
|
37
|
+
parsed = URI.parse(url.to_s)
|
|
38
|
+
parsed.path.empty? ? url.to_s : parsed.path
|
|
39
|
+
rescue URI::InvalidURIError
|
|
40
|
+
url.to_s
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def read_public_asset(path)
|
|
44
|
+
public_path = rails_public_path
|
|
45
|
+
return unless public_path
|
|
46
|
+
|
|
47
|
+
relative_path = path.delete_prefix('/')
|
|
48
|
+
file_path = public_path.join(relative_path).cleanpath
|
|
49
|
+
return unless inside_path?(file_path, public_path)
|
|
50
|
+
return unless file_path.file?
|
|
51
|
+
|
|
52
|
+
resource(File.binread(file_path), file_path.extname)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def read_resolved_asset(path)
|
|
56
|
+
asset_path = path.delete_prefix("#{asset_prefix}/")
|
|
57
|
+
content = read_from_propshaft(asset_path)
|
|
58
|
+
return resource(content, File.extname(asset_path)) if content
|
|
59
|
+
|
|
60
|
+
logical_path = propshaft_logical_path(asset_path)
|
|
61
|
+
return unless logical_path
|
|
62
|
+
|
|
63
|
+
content = read_from_propshaft(logical_path)
|
|
64
|
+
return unless content
|
|
65
|
+
|
|
66
|
+
resource(content, File.extname(logical_path))
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def read_from_propshaft(path)
|
|
70
|
+
resolver = rails_application&.assets&.resolver
|
|
71
|
+
return unless resolver&.respond_to?(:read)
|
|
72
|
+
|
|
73
|
+
resolver.read(path)
|
|
74
|
+
rescue StandardError
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def propshaft_logical_path(asset_path)
|
|
79
|
+
resolver = rails_application&.assets&.resolver
|
|
80
|
+
return unless resolver&.respond_to?(:load_path)
|
|
81
|
+
return unless resolver.load_path.respond_to?(:find)
|
|
82
|
+
|
|
83
|
+
asset = resolver.load_path.find(asset_path)
|
|
84
|
+
asset&.logical_path&.to_s
|
|
85
|
+
rescue StandardError
|
|
86
|
+
nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def rails_application
|
|
90
|
+
rails.application if rails.respond_to?(:application)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def rails_public_path
|
|
94
|
+
path = rails.public_path if rails.respond_to?(:public_path)
|
|
95
|
+
path ||= rails_application.public_path if rails_application&.respond_to?(:public_path)
|
|
96
|
+
return unless path
|
|
97
|
+
|
|
98
|
+
Pathname.new(path.to_s).cleanpath
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def inside_path?(path, root)
|
|
102
|
+
relative_path = path.relative_path_from(root).to_s
|
|
103
|
+
relative_path != '..' && !relative_path.start_with?('../')
|
|
104
|
+
rescue ArgumentError
|
|
105
|
+
false
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def resource(content, extension)
|
|
109
|
+
{ content: content, mime_type: mime_type_for(extension) }
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def mime_type_for(extension)
|
|
113
|
+
if defined?(Rack::Mime)
|
|
114
|
+
Rack::Mime.mime_type(extension, 'application/octet-stream')
|
|
115
|
+
else
|
|
116
|
+
fallback_mime_type_for(extension)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def fallback_mime_type_for(extension)
|
|
121
|
+
case extension.to_s.downcase
|
|
122
|
+
when '.css' then 'text/css'
|
|
123
|
+
when '.gif' then 'image/gif'
|
|
124
|
+
when '.html', '.htm' then 'text/html'
|
|
125
|
+
when '.jpeg', '.jpg' then 'image/jpeg'
|
|
126
|
+
when '.js', '.mjs' then 'text/javascript'
|
|
127
|
+
when '.otf' then 'font/otf'
|
|
128
|
+
when '.png' then 'image/png'
|
|
129
|
+
when '.svg' then 'image/svg+xml'
|
|
130
|
+
when '.ttf' then 'font/ttf'
|
|
131
|
+
when '.webp' then 'image/webp'
|
|
132
|
+
when '.woff' then 'font/woff'
|
|
133
|
+
when '.woff2' then 'font/woff2'
|
|
134
|
+
else 'application/octet-stream'
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module PagePrint
|
|
2
|
+
class Railtie < ::Rails::Railtie
|
|
3
|
+
initializer 'page_print.configure_resource_fetcher' do
|
|
4
|
+
PagePrint.resource_fetcher ||= PagePrint::RailsResourceFetcher.new
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
initializer 'page_print.set_base_url' do
|
|
8
|
+
ActiveSupport.on_load(:action_controller_base) do
|
|
9
|
+
around_action do |_controller, action|
|
|
10
|
+
PagePrint.with_base_url(request.base_url) { action.call }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|