# # Copyright (c) 2023 Kenshi Muto # # This program is free software. # You can distribute/modify this program under the terms of # the GNU LGPL, Lesser General Public License version 2.1. # require 'review/loggable' module ReVIEW class ImgGraph include Loggable def initialize(config, target_name, path_name: '_review_graph') @config = config @target_name = target_name @logger = ReVIEW.logger @graph_dir = File.join(@config['imagedir'], target_name, path_name) @graph_maps = {} end attr_reader :graph_maps def cleanup_graphimg FileUtils.rm_rf(@graph_dir) end def graph_ext if %w[html markdown rst].include?(@target_name) 'svg' else 'pdf' end end def defer_mermaid_image(str, key) @graph_maps[key] = { type: 'mermaid', content: str } File.join('.', @config['imagedir'], @target_name, "#{key}.#{graph_ext}") end def mermaid_html(content) <<-EOB
#{content}
EOB end def make_mermaid_images mermaid_graph_maps = @graph_maps.select { |_k, v| v[:type] == 'mermaid' } return if mermaid_graph_maps.empty? FileUtils.mkdir_p(File.join(@graph_dir, 'mermaid')) mermaid_graph_maps.each_pair do |key, val| File.write(File.join(@graph_dir, 'mermaid', "#{key}.html"), mermaid_html(val[:content])) end @logger.info 'calling Playwright' begin require 'playwrightrunner' PlaywrightRunner.mermaids_to_images( { playwright_path: @config['playwright_options']['playwright_path'], selfcrop: @config['playwright_options']['selfcrop'], pdfcrop_path: @config['playwright_options']['pdfcrop_path'], pdftocairo_path: @config['playwright_options']['pdftocairo_path'] }, src: File.join(@graph_dir, 'mermaid'), dest: File.join(@config['imagedir'], @target_name), type: graph_ext ) rescue SystemCallError => e raise ApplicationError, "converting mermaid failed: #{e}" rescue LoadError raise ApplicationError, 'could not handle Mermaid of //graph in this builder.' end FileUtils.rm_rf(File.join(@graph_dir, 'mermaid')) end end end