summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2021-05-09 16:06:56 -0600
committerDan Allen <dan.j.allen@gmail.com>2021-05-09 16:06:56 -0600
commitfb12931013d206559c1fb57366780e7354b30664 (patch)
treeb9e6697c408ceac5b37652e4961596bf21a49f69
parent8ca4f32b1a0b5a6c96459a972cf803af8475fc26 (diff)
backport fix for #1791 honor GS environment variable when looking for Ghostscript's gs command
-rw-r--r--CHANGELOG.adoc4
-rwxr-xr-xbin/asciidoctor-pdf-optimize2
-rw-r--r--lib/asciidoctor/pdf/converter.rb7
-rw-r--r--lib/asciidoctor/pdf/optimizer.rb52
4 files changed, 50 insertions, 15 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index e49126d5..98ef14e4 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -7,6 +7,10 @@ For a detailed view of what has changed, refer to the {uri-repo}/commits/v1.6.x[
== Unreleased
+Enhancements::
+
+* allow path of ghostscript command to be controlled using `GS` env var (#1791)
+
Compliance::
* add support for Ruby 3 and drop support for Ruby < 2.5 and JRuby < 9.2
diff --git a/bin/asciidoctor-pdf-optimize b/bin/asciidoctor-pdf-optimize
index 44376134..d5e86aec 100755
--- a/bin/asciidoctor-pdf-optimize
+++ b/bin/asciidoctor-pdf-optimize
@@ -17,4 +17,4 @@ end
quality = args[0] == '--quality' ? args[1].to_s : ''
-(Asciidoctor::PDF::Optimizer.new quality).generate_file filename
+(Asciidoctor::PDF::Optimizer.new quality).optimize_file filename
diff --git a/lib/asciidoctor/pdf/converter.rb b/lib/asciidoctor/pdf/converter.rb
index c53962e4..7617b008 100644
--- a/lib/asciidoctor/pdf/converter.rb
+++ b/lib/asciidoctor/pdf/converter.rb
@@ -368,7 +368,10 @@ module Asciidoctor
@index = IndexCatalog.new
# NOTE: we have to init Pdfmark class here while we have reference to the doc
@pdfmark = (doc.attr? 'pdfmark') ? (Pdfmark.new doc) : nil
- @optimize = doc.attr 'optimize'
+ # NOTE: defer instantiating optimizer until we know min pdf version
+ if (@optimize = doc.attr 'optimize')
+ @optimize = nil unless (defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil?
+ end
init_scratch_prototype
self
end
@@ -3584,7 +3587,7 @@ module Asciidoctor
pdf_doc.render_file target
# QUESTION restore attributes first?
@pdfmark&.generate_file target
- (Optimizer.new @optimize, pdf_doc.min_version).generate_file target if @optimize && ((defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil?)
+ (Optimizer.new @optimize, pdf_doc.min_version).optimize_file target if @optimize && ((defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil?)
end
# write scratch document if debug is enabled (or perhaps DEBUG_STEPS env)
#get_scratch_document.render_file 'scratch.pdf'
diff --git a/lib/asciidoctor/pdf/optimizer.rb b/lib/asciidoctor/pdf/optimizer.rb
index 00e747b6..744f3d3b 100644
--- a/lib/asciidoctor/pdf/optimizer.rb
+++ b/lib/asciidoctor/pdf/optimizer.rb
@@ -2,11 +2,35 @@
require 'pathname'
require 'rghost'
+require 'rghost/gs_alone'
require 'tmpdir'
+RGhost::GSAlone.prepend (Module.new do
+ WindowsRx = /win|ming/
+
+ def initialize params, debug
+ (@params = params.dup).push(*(@params.pop.split File::PATH_SEPARATOR))
+ @debug = debug
+ end
+
+ def run
+ RGhost::Config.config_platform unless File.exist? RGhost::Config::GS[:path].to_s
+ (cmd = @params.slice 1, @params.length).unshift RGhost::Config::GS[:path].to_s
+ #puts cmd if @debug
+ system(*cmd)
+ end
+end)
+
+RGhost::Engine.prepend (Module.new do
+ def shellescape str
+ str
+ end
+end)
+
module Asciidoctor
module PDF
class Optimizer
+ # see https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN for details
(QUALITY_NAMES = {
'default' => :default,
'screen' => :screen,
@@ -15,27 +39,31 @@ module Asciidoctor
'prepress' => :prepress,
}).default = :default
+ attr_reader :quality
+ attr_reader :compatibility_level
+
def initialize quality = 'default', compatibility_level = '1.4'
@quality = QUALITY_NAMES[quality]
@compatibility_level = compatibility_level
+ if (gs_path = ::ENV['GS'])
+ ::RGhost::Config::GS[:path] = gs_path
+ end
end
- def generate_file target
+ def optimize_file target
::Dir::Tmpname.create ['asciidoctor-pdf-', '.pdf'] do |tmpfile|
- filename = Pathname.new target
- filename_o = Pathname.new tmpfile
- pdfmark = filename.sub_ext '.pdfmark'
- inputs = pdfmark.file? ? [target, pdfmark.to_s] : target
+ filename_o = ::Pathname.new target
+ filename_tmp = ::Pathname.new tmpfile
+ if (pdfmark = filename_o.sub_ext '.pdfmark').file?
+ inputs = [target, pdfmark.to_s].join ::File::PATH_SEPARATOR
+ else
+ inputs = target
+ end
(::RGhost::Convert.new inputs).to :pdf,
- filename: filename_o.to_s,
+ filename: filename_tmp.to_s,
quality: @quality,
d: { Printed: false, CannotEmbedFontPolicy: '/Warning', CompatibilityLevel: @compatibility_level }
- begin
- filename_o.rename target
- rescue ::Errno::EXDEV
- filename.binwrite filename_o.binread
- filename_o.unlink
- end
+ filename_o.binwrite filename_tmp.binread
end
nil
end