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.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +247 -0
  4. data/ext/page_print/extconf.rb +48 -0
  5. data/ext/page_print/page_print.c +851 -0
  6. data/lib/page_print/page_print.so +0 -0
  7. data/lib/page_print/rails_resource_fetcher.rb +138 -0
  8. data/lib/page_print/railtie.rb +15 -0
  9. data/lib/page_print/vendor/x86_64-linux/include/plutobook/plutobook.h +1101 -0
  10. data/lib/page_print/vendor/x86_64-linux/include/plutobook/plutobook.hpp +1361 -0
  11. data/lib/page_print/vendor/x86_64-linux/lib/libX11.so.6 +0 -0
  12. data/lib/page_print/vendor/x86_64-linux/lib/libXau.so.6 +0 -0
  13. data/lib/page_print/vendor/x86_64-linux/lib/libXdmcp.so.6 +0 -0
  14. data/lib/page_print/vendor/x86_64-linux/lib/libXext.so.6 +0 -0
  15. data/lib/page_print/vendor/x86_64-linux/lib/libXrender.so.1 +0 -0
  16. data/lib/page_print/vendor/x86_64-linux/lib/libbrotlicommon.so.1 +0 -0
  17. data/lib/page_print/vendor/x86_64-linux/lib/libbrotlidec.so.1 +0 -0
  18. data/lib/page_print/vendor/x86_64-linux/lib/libbsd.so.0 +0 -0
  19. data/lib/page_print/vendor/x86_64-linux/lib/libbz2.so.1.0 +0 -0
  20. data/lib/page_print/vendor/x86_64-linux/lib/libcairo.so.2 +0 -0
  21. data/lib/page_print/vendor/x86_64-linux/lib/libcrypt.so.1 +0 -0
  22. data/lib/page_print/vendor/x86_64-linux/lib/libexpat.so.1 +0 -0
  23. data/lib/page_print/vendor/x86_64-linux/lib/libfontconfig.so.1 +0 -0
  24. data/lib/page_print/vendor/x86_64-linux/lib/libfreetype.so.6 +0 -0
  25. data/lib/page_print/vendor/x86_64-linux/lib/libglib-2.0.so.0 +0 -0
  26. data/lib/page_print/vendor/x86_64-linux/lib/libgmp.so.10 +0 -0
  27. data/lib/page_print/vendor/x86_64-linux/lib/libgraphite2.so.3 +0 -0
  28. data/lib/page_print/vendor/x86_64-linux/lib/libharfbuzz.so.0 +0 -0
  29. data/lib/page_print/vendor/x86_64-linux/lib/libicudata.so.74 +0 -0
  30. data/lib/page_print/vendor/x86_64-linux/lib/libicui18n.so.74 +0 -0
  31. data/lib/page_print/vendor/x86_64-linux/lib/libicuuc.so.74 +0 -0
  32. data/lib/page_print/vendor/x86_64-linux/lib/libmd.so.0 +0 -0
  33. data/lib/page_print/vendor/x86_64-linux/lib/libpcre2-8.so.0 +0 -0
  34. data/lib/page_print/vendor/x86_64-linux/lib/libpixman-1.so.0 +0 -0
  35. data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so +0 -0
  36. data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so.0 +0 -0
  37. data/lib/page_print/vendor/x86_64-linux/lib/libplutobook.so.0.17.0 +0 -0
  38. data/lib/page_print/vendor/x86_64-linux/lib/libpng16.so.16 +0 -0
  39. data/lib/page_print/vendor/x86_64-linux/lib/libruby.so.3.4 +0 -0
  40. data/lib/page_print/vendor/x86_64-linux/lib/libxcb-render.so.0 +0 -0
  41. data/lib/page_print/vendor/x86_64-linux/lib/libxcb-shm.so.0 +0 -0
  42. data/lib/page_print/vendor/x86_64-linux/lib/libxcb.so.1 +0 -0
  43. data/lib/page_print/vendor/x86_64-linux/lib/libz.so.1 +0 -0
  44. data/lib/page_print/vendor/x86_64-linux/lib/pkgconfig/plutobook.pc +10 -0
  45. data/lib/page_print/version.rb +3 -0
  46. data/lib/page_print.rb +28 -0
  47. 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