diff --git a/convert.rb b/convert.rb new file mode 100644 index 0000000..46d0393 --- /dev/null +++ b/convert.rb @@ -0,0 +1,36 @@ +require "open3" +require "nokogiri" +require "net/http" +require "json" + +def render_cached(cache, display, string, render_comment = nil) + cache.fetch(string) do |new| + puts " Rendering #{render_comment || new}" + res = Net::HTTP.post URI("http://localhost:8000/render"), + { :equations => [ { :str => string, :display => display } ] }.to_json, + "Content-Type" => "application/json" + cache[string] = JSON.parse(res.body)[0] + end +end + +def perform_katex_sub(inline_cache, display_cache, content) + rendered = content.gsub /\\\(((?:[^\\]|\\[^\)])*)\\\)/ do |match| + render_cached(inline_cache, false, $~[1]) + end + rendered = rendered.gsub /\$\$((?:[^\$]|$[^\$])*)\$\$/ do |match| + render_cached(display_cache, true, $~[1], "display") + end + return rendered +end + +files = ARGV[0..-1] +inline_cache, display_cache = {}, {} + +files.each do |file| + puts "Rendering file: #{file}" + document = Nokogiri::HTML.parse(File.open(file)) + document.search('//*[not(ancestor-or-self::code)]/text()').each do |t| + t.replace(perform_katex_sub(inline_cache, display_cache, t.content)) + end + File.write(file, document.to_html(encoding: 'UTF-8')) +end diff --git a/default.nix b/default.nix index f09ed55..b50bab6 100644 --- a/default.nix +++ b/default.nix @@ -1,10 +1,27 @@ -{ bundlerEnv, ruby }: +{ bundlerEnv, ruby, stdenv }: -bundlerEnv { - inherit ruby; +let + env = bundlerEnv { + inherit ruby; - name = "render-test"; - gemfile = ./Gemfile; - lockfile = ./Gemfile.lock; - gemset = ./gemset.nix; -} + name = "render-test"; + gemfile = ./Gemfile; + lockfile = ./Gemfile.lock; + gemset = ./gemset.nix; + }; +in + stdenv.mkDerivation { + name = "katex-converter"; + src = ./convert.rb; + buildInputs = [ env ruby ]; + unpackPhase = "echo 'Skipping unpack phase (nothing to unpack)'"; + installPhase = '' + mkdir -p $out/{bin,share/katex-converter} + cp $src $out/share/katex-converter/convert.rb + cat > $out/bin/katex-converter <