Module: JekyllMermaidPrebuild::Hooks
- Defined in:
- lib/jekyll-mermaid-prebuild/hooks.rb
Overview
Jekyll hook integration
Class Method Summary collapse
-
.copy_generated_svgs(site) ⇒ Object
Copy SVGs into _site after write (:post_write).
-
.copy_svgs_to_site(site, config, svgs) ⇒ Object
Copy generated SVGs to _site directory.
-
.format_elapsed(seconds) ⇒ String
Format a duration for Jekyll log suffixes.
-
.initialize_system(site) ⇒ Object
Initialize plugin state after site data is loaded (:post_read).
-
.log_puppeteer_error ⇒ Object
Log helpful error message for Puppeteer issues.
-
.process_site(site) ⇒ Object
Process documents/pages before rendering (:pre_render).
Class Method Details
.copy_generated_svgs(site) ⇒ Object
Copy SVGs into _site after write (:post_write)
140 141 142 143 144 145 146 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 140 def self.copy_generated_svgs(site) return unless site.data["mermaid_prebuild_enabled"] config = site.data["mermaid_prebuild_config"] svgs = site.data["mermaid_prebuild_svgs"] copy_svgs_to_site(site, config, svgs) end |
.copy_svgs_to_site(site, config, svgs) ⇒ Object
Copy generated SVGs to _site directory
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 25 def self.copy_svgs_to_site(site, config, svgs) return if svgs.nil? || svgs.empty? dest_dir = File.join(site.dest, config.output_dir) FileUtils.mkdir_p(dest_dir) started = Process.clock_gettime(Process::CLOCK_MONOTONIC) copied_count = 0 svgs.each do |cache_key, cached_path| unless cached_path && File.exist?(cached_path) Jekyll.logger.warn "MermaidPrebuild:", "Missing cached SVG for #{cache_key} (expected: #{cached_path})" next end dest_path = File.join(dest_dir, "#{cache_key}.svg") FileUtils.cp(cached_path, dest_path) copied_count += 1 end elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started Jekyll.logger.info "MermaidPrebuild:", "Copied #{copied_count} SVG(s) to #{config.output_dir}/ #{format_elapsed(elapsed)}" end |
.format_elapsed(seconds) ⇒ String
Format a duration for Jekyll log suffixes.
12 13 14 15 16 17 18 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 12 def self.format_elapsed(seconds) total = seconds.round return "in #{total}s" if total < 60 minutes, remainder = total.divmod(60) "in #{minutes} m #{remainder} s" end |
.initialize_system(site) ⇒ Object
Initialize plugin state after site data is loaded (:post_read)
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 58 def self.initialize_system(site) config = Configuration.new(site) site.data["mermaid_prebuild_config"] = config unless config.enabled? Jekyll.logger.info "MermaidPrebuild:", "Disabled in configuration" site.data["mermaid_prebuild_enabled"] = false return end status = MmdcWrapper.check_status case status when :ok Jekyll.logger.info "MermaidPrebuild:", "Initialized (mmdc #{MmdcWrapper.version || "unknown version"})" Jekyll.logger.info "MermaidPrebuild:", "Output directory: #{config.output_dir}" site.data["mermaid_prebuild_enabled"] = true generator = Generator.new(config) site.data["mermaid_prebuild_generator"] = generator site.data["mermaid_prebuild_processor"] = Processor.new(config, generator) site.data["mermaid_prebuild_svgs"] = {} when :not_found Jekyll.logger.warn "MermaidPrebuild:", "mmdc not found - mermaid diagrams will not be converted" Jekyll.logger.warn "MermaidPrebuild:", "Install with: npm install -g @mermaid-js/mermaid-cli" site.data["mermaid_prebuild_enabled"] = false when :puppeteer_error log_puppeteer_error site.data["mermaid_prebuild_enabled"] = false else Jekyll.logger.warn "MermaidPrebuild:", "mmdc check failed with unknown error" site.data["mermaid_prebuild_enabled"] = false end end |
.log_puppeteer_error ⇒ Object
Log helpful error message for Puppeteer issues
50 51 52 53 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 50 def self.log_puppeteer_error Jekyll.logger.error "MermaidPrebuild:", "mmdc failed: Puppeteer cannot launch headless Chrome" Jekyll.logger.error "MermaidPrebuild:", "Install system libraries (see https://pptr.dev/troubleshooting)" end |
.process_site(site) ⇒ Object
Process documents/pages before rendering (:pre_render)
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/jekyll-mermaid-prebuild/hooks.rb', line 95 def self.process_site(site) return unless site.data["mermaid_prebuild_enabled"] processor = site.data["mermaid_prebuild_processor"] total_count = 0 started = Process.clock_gettime(Process::CLOCK_MONOTONIC) site.documents.each do |document| next unless document.content processed, count, svgs = processor.process_content(document.content, site) if count.positive? document.content = processed site.data["mermaid_prebuild_svgs"].merge!(svgs) Jekyll.logger.info "MermaidPrebuild:", "Converted #{count} diagram(s) in #{document.relative_path}" total_count += count end rescue StandardError => e Jekyll.logger.error "MermaidPrebuild:", "Error processing #{document.relative_path}: #{e.}" end site.pages.each do |page| next unless page.content processed, count, svgs = processor.process_content(page.content, site) if count.positive? page.content = processed site.data["mermaid_prebuild_svgs"].merge!(svgs) Jekyll.logger.info "MermaidPrebuild:", "Converted #{count} diagram(s) in #{page.relative_path}" total_count += count end rescue StandardError => e Jekyll.logger.error "MermaidPrebuild:", "Error processing #{page.relative_path}: #{e.}" end return unless total_count.positive? elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started Jekyll.logger.info "MermaidPrebuild:", "Total: #{total_count} diagram(s) converted #{format_elapsed(elapsed)}" end |