require "open3" require "nokogiri" def perform_katex_sub(content) rendered = content.gsub /\\\(((?:[^\\]|\\[^\)])*)\\\)/ do |match| puts " Rendering #{$~[1]}" Open3.popen3("katex") do |i, o, e, t| i.write $~[1] i.close o.read.force_encoding(Encoding::UTF_8).strip end end rendered = rendered.gsub /\$\$((?:[^\$]|$[^\$])*)\$\$/ do |match| puts " Rendering display." Open3.popen3("katex -d") do |i, o, e, t| i.write $~[1] i.close o.read.force_encoding(Encoding::UTF_8).strip end end return rendered end files = ARGV[0..-1] files.each do |file| puts "Rendering file: #{file}" document = Nokogiri::HTML.parse(File.open(file)) document.search('//*[not(self::code)]/text()').each do |t| t.replace(perform_katex_sub(t.content)) end File.write(file, document.to_html) end