module Nokogiri module XML # Patch to add class? class Node def class?(*classes) present = false if self.attribute('class') present = true classes.each do |klass| present &&= self['class'].include? klass end end present end end end end # https://stackoverflow.com/a/42533209/368328 def command?(name) [name, *ENV['PATH'].split(File::PATH_SEPARATOR) .map { |p| File.join(p, name) }] .find { |f| File.executable?(f) } end def commands?(commands) commands.map { |c| command? c } end def format_match(format) [:all, format].include? format end def gen_epub(name, _format) if command?('pandoc') && format_match(:epub) # Convert it to epub `pandoc -S -o books/#{name}.epub --epub-metadata=metadata/#{name}.xml --epub-cover-image=covers/#{name}.jpg books/#{name}.html` puts '[epub] Generated EPUB file' else puts "[error] Can't generate EPUB without pandoc" end end def gen_mobi(name, _format) if command?('ebook-convert') && format_match(:mobi) # Convert epub to a mobi `ebook-convert books/#{name}.epub books/#{name}.mobi` puts '[mobi] Generated MOBI file' else puts "[error] Can't generate MOBI without ebook-convert" end end def gen_pdf(name, _format) if commands?(%w[pandoc convert wkhtmltopdf pdftk]) && format_match(:pdf) # Generate PDF as well # First, lets make a better css version of the html `pandoc books/#{name}.html -s -c ../style.css -o books/#{name}_pdf.html` puts '[pdf] Generated html for pdf' # Print the pdf_html file to pdf `wkhtmltopdf books/#{name}_pdf.html books/#{name}-nocover.pdf` puts '[pdf] Generated PDF without cover' # Join the cover and pdf together `pdftk covers/#{name}.pdf books/#{name}-nocover.pdf cat output books/#{name}.pdf` puts '[pdf] Generated PDF file' else puts '[error] Please check README for PDF dependencies' end end def generate(name, _format = :all) gen_epub(name, _format) gen_mobi(name, _format) gen_pdf(name, _format) end