diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/make4ht/mathnode.lua |
Initial commit
Diffstat (limited to 'support/make4ht/mathnode.lua')
-rw-r--r-- | support/make4ht/mathnode.lua | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/support/make4ht/mathnode.lua b/support/make4ht/mathnode.lua new file mode 100644 index 0000000000..6d054ad7b8 --- /dev/null +++ b/support/make4ht/mathnode.lua @@ -0,0 +1,87 @@ +-- local mathnodepath = os.getenv "mathjaxnodepath" +-- +-- print("mathnode", mathnodepath) +local mkutils = require "mkutils" +-- other possible value is page2svg +local mathnodepath = "page2html" +-- options for MathJax command +local options = "--format MathML" +-- math fonts position +-- don't alter fonts if not set +local fontdir = nil +-- if we copy fonts +local fontdest = nil +local fontformat = "otf" + +local function compile(src) + local tmpfile = os.tmpname() + local filename = src + print("Compile using MathJax") + local command = mathnodepath .. " ".. options .. " < " .. filename .. " > " .. tmpfile + print(command) + local status = os.execute(command) + print("Result written to: ".. tmpfile) + mkutils.cp(tmpfile, src) + os.remove(tmpfile) +end + +local function extract_css(file) + local f = io.open(file, "r") + local contents = f:read("*all") + f:close() + local css = "" + local filename = "" + contents = contents:gsub('<style id="(MathJax.-)">(.+)</style>', function(name, style) + css = style + filename = (name or "") .. ".css" + return '<link rel="stylesheet" type="text/css" href="'..filename ..'" />' + end) + local x = assert(io.open(file, "w")) + x:write(contents) + x:close() + return filename, css +end + +-- +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 + if not face:match("url%(") then return "" end + -- print(face) + local family, filename = face:match(family_pattern) + print(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 + mathnodepath = arguments.prg or mathnodepath + options = arguments.options or options + fontdir = arguments.fontdir or fontdir + fontdest = arguments.fontdest or fontdest + fontformat = arguments.fontformat or fontformat + compile(text) + filename, css = extract_css(text) + if fontdir then + css = use_fonts(css) + end + save_css(filename, css) + Make:add_file(filename) + -- print(css) + print(filename) +end |