Path: blob/main/_plugins/jekyll-figurify.rb
1677 views
# frozen_string_literal: true12require 'jekyll'34module Jekyll5module Generators6# Our modifications to the markdown renderer to process images with figure captions7# TODO: probably could be a hook post_read.8class Figurify < Jekyll::Generator9safe true1011def initialize(config)12super13@config = config['figurify'] ||= {}14end1516def generate(site)17site.pages18.reject { |page| skip_layout? page.data['layout'] }19.each { |page| figurify page, site }20site.posts.docs21.reject { |post| skip_layout? post.data['layout'] }22.each { |post| figurify post, site }23end2425private2627def insert_image(url, alt, style, dimensions, actual_path)28# If it's a *local* SVG (we don't want to do this with remote SVGs, doesn't work right)29if url =~ (/svg$/) && !actual_path.nil?30fallback = ''31if actual_path.nil?32# External image, no fallback possible33fallback = ''34elsif File.exist?(actual_path.gsub(/svg$/, 'png'))35fallback = "<img src=\"#{url.gsub(/svg$/, 'png')}\" alt=\"#{alt}\">"36elsif File.exist?(actual_path.gsub(/svg$/, 'jpg'))37fallback = "<img src=\"#{url.gsub(/svg$/, 'jpg')}\" alt=\"#{alt}\">"38elsif File.exist?(actual_path.gsub(/svg$/, 'jpeg'))39fallback = "<img src=\"#{url.gsub(/svg$/, 'jpeg')}\" alt=\"#{alt}\">"40end4142%(43<div style="overflow-x: auto">44<object data="#{url}" #{style} type="image/svg+xml" alt="#{alt}">45#{fallback}46#{alt}47</object>48</div>49)50else51%(52<img src="#{url}" alt="#{alt}" #{style} #{dimensions} loading="lazy">53)54end55end5657def figurify(page, site)58num_figure = 059return if page.content.nil?6061tuto_dir = File.dirname(page.path)62page.content = page.content.gsub(/!\[([^\]]*)\]\((.+?)\s*(?:"(.*)")\)({:(.*)})?/) do63alt = ::Regexp.last_match(1)64url = ::Regexp.last_match(2)65title = ::Regexp.last_match(3)66style = ::Regexp.last_match(5)6768if skip_titles?(title) || (title.to_s.empty? && skip_empty?)69Regexp.last_match70else71num_figure += 17273alt.gsub!(/"/, '"')74if alt.strip.length.positive? && !(alt.end_with?('.') || alt.end_with?('!') || alt.end_with?('?'))75alt = "#{alt}. "76end7778dimensions, actual_path = Gtn::Images.html_image_dimensions(tuto_dir, url)79prefix = figcaption_prefix(page, site)80image = insert_image(url, alt, style, dimensions, actual_path)8182%(83<figure id="figure-#{num_figure}" style="max-width: 90%;">84#{image}85<a target="_blank" href="#{url}" rel="noopener noreferrer"><small>Open image in new tab</small></a><br/><br/>86<figcaption>87<span class="figcaption-prefix"><strong>#{prefix}#{num_figure}</strong>:</span> #{title}88</figcaption>89</figure>90).split("\n").map(&:strip).join91end92end9394page.content = page.content.gsub(/!\[([^\]]*)\]\((.+?)?\)({:(.*)})?/) do95alt = ::Regexp.last_match(1)96url = ::Regexp.last_match(2)97style = ::Regexp.last_match(4)9899dimensions, _actual_path = Gtn::Images.html_image_dimensions(tuto_dir, url)100101alt.gsub!(/"/, '"')102if alt.strip.length.positive? && !(alt.end_with?('.') || alt.end_with?('!') || alt.end_with?('?'))103alt = "#{alt}. "104end105106%(107<a href="#{url}" rel="noopener noreferrer">108<img src="#{url}" alt="#{alt}" #{style} #{dimensions} loading="lazy">109</a>110).split("\n").map(&:strip).join111end112end113114def figcaption_prefix(page, site)115fig = 'Figure'116if page['lang']117lang = page['lang']118fig = site.data['lang'][lang]['figure']119end120@config['prefix'] || "#{fig} "121end122123def skip_empty?124@config['skip_empty'] || false125end126127def skip_layout?(layout)128to_skip = @config['skip_layouts'] || []129130true if to_skip.empty?131132to_skip.include?(layout)133end134135def skip_titles?(title)136to_skip = @config['skip_titles'] || []137to_skip.include?(title)138end139end140end141end142143144