local mkutils = require "mkutils" local log = logging.new("mathjaxnode") -- other possible value is page2svg local mathnodepath = "mjpage" -- options for MathJax command local options = "--output CommonHTML" -- math fonts position -- don't alter fonts if not set local fontdir = nil -- if we copy fonts local fontdest = nil local fontformat = "woff" local cssfilename = "mathjax-chtml.css" local function compile(text) local tmpfile = os.tmpname() log:info("Compile using MathJax") local command = mathnodepath .. " ".. options .. " > " .. tmpfile log:info(command) local commandhandle = io.popen(command,"w") commandhandle:write(text) commandhandle:close() log:info("Result written to: ".. tmpfile) local f = io.open(tmpfile) local content = f:read("*all") f:close() os.remove(tmpfile) return content end -- save the css code from the html page generated by MathJax local function extract_css(contents) local css = "" local filename = cssfilename contents = contents:gsub('', function(style) -- replace only the style for mathjax if style:match "%.mjx%-math" then css = style return '' end end) -- local x = assert(io.open(file, "w")) -- x:write(contents) -- x:close() return filename, contents, css end -- Update the paths to fonts to use the local versions local function use_fonts(css) local family_pattern = "font%-family:%s*(.-);.-%/([^%/]+)%.".. fontformat local family_build = "@font-face {font-family: %s; src: url('%s/%s.%s') format('%s')}" local fontdir = fontdir:gsub("/$","") css = css:gsub("(@font%-face%s*{.-})", function(face) if not face:match("url%(") then return face end -- print(face) local family, filename = face:match(family_pattern) log:info("use font: ",family, filename) local newfile = string.format("%s/%s.%s", fontdir, filename, fontformat) Make:add_file(newfile) return family_build:format(family, fontdir, filename, fontformat, fontformat) -- return face end) return css end local function save_css(filename, css) local f = io.open(filename, "w") f:write(css) f:close() end return function(text, arguments) -- if arguments.prg then mathnodepath = arguments.prg end local extoptions = mkutils.get_filter_settings "mathjaxnode" or {} local arguments = arguments or {} mathnodepath = arguments.prg or extoptions.prg or mathnodepath options = arguments.options or extoptions.options or options fontdir = arguments.fontdir or extoptions.fontdir or fontdir -- the following ne is unused ATM fontdest = arguments.fontdest or extoptions.fontdest or fontdest fontformat = arguments.fontformat or extoptions.fontformat or fontformat cssfilename = arguments.cssfilename or extoptions.cssfilename or cssfilename local newtext = compile(text) local cssfile, newtext, css = extract_css(newtext) -- use local font files if fontdir is present if fontdir then css = use_fonts(css) end save_css(cssfile, css) Make:add_file(cssfile) -- print(css) log:info("CSS file: " .. cssfile) return newtext end