summaryrefslogtreecommitdiff
path: root/support/make4ht/mkparams.lua
diff options
context:
space:
mode:
Diffstat (limited to 'support/make4ht/mkparams.lua')
-rw-r--r--support/make4ht/mkparams.lua238
1 files changed, 238 insertions, 0 deletions
diff --git a/support/make4ht/mkparams.lua b/support/make4ht/mkparams.lua
new file mode 100644
index 0000000000..4db967f270
--- /dev/null
+++ b/support/make4ht/mkparams.lua
@@ -0,0 +1,238 @@
+local lapp = require "lapp-mk4"
+local mkutils = require "mkutils"
+local m = {} -- use ugly module system for new lua versions support
+
+-- these two variables will be used in the version number
+-- progname will be set in get_args
+m.progname = "make4ht"
+-- set the version number before call to process_args()
+m.version_number = "v0.1"
+
+m.optiontext = [[
+${progname} - build system for tex4ht
+Usage:
+${progname} [options] filename ["tex4ht.sty op."] ["tex4ht op."] ["t4ht op"] ["latex op"]
+
+Available options:
+ -b,--backend (default tex4ht) Backend used for xml generation.
+ possible values: tex4ht or lua4ht
+ -c,--config (default xhtml) Custom config file
+ -d,--output-dir (default nil) Output directory
+ -e,--build-file (default nil) If build file is different than `filename`.mk4
+ -f,--format (default html5) Output file format
+ -h,-- help Display this message
+ -l,--lua Use lualatex for document compilation
+ -m,--mode (default default) Switch which can be used in the makefile
+ -n,--no-tex4ht Disable dvi file processing with tex4ht command
+ -s,--shell-escape Enables running external programs from LaTeX
+ -u,--utf8 For output documents in utf8 encoding
+ -x,--xetex Use xelatex for document compilation
+ -v,--version Display version number
+]]
+
+-- test if the current command line argument should be passed to tex4ht, t4ht or latex
+local function is_escapedargument(arg)
+ -- we need to ignore make4ht options which can be used without filename, ie --version and --help
+ local ignored_options = {["-h"]=true, ["--help"]=true, ["-v"] = true, ["--version"]=true}
+ if ignored_options[arg] then return false end
+ -- in other cases, match if the argument starts with "-" character
+ return arg:match("^%-")
+end
+local function get_args(parameters, optiontext)
+ local parameters = parameters or {}
+ parameters.progname = parameters.progname or "make4ht"
+ parameters.postparams = parameters.postparams or ""
+ local optiontext = optiontext or m.optiontext
+ parameters.postfile = parameters.postfile or ""
+ optiontext = optiontext .. parameters.postparams ..[[ <filename> (string) Input file name
+
+Positional optional argumens:
+ ["tex4ht.sty op."] Additional parameters for tex4ht.sty
+ ["tex4ht op."] Options for tex4ht command
+ ["t4ht op"] Options for t4ht command
+ ["latex op"] Additional options for LaTeX
+
+Documentation: https://tug.org/applications/tex4ht/mn.html
+Issue tracker for tex4ht bugs: https://puszcza.gnu.org.ua/bugs/?group=tex4ht
+Issue tracker for make4ht bugs: https://github.com/michal-h21/make4ht/issues
+ ]] .. parameters.postfile
+ -- we can pass arguments for tex4ht and t4ht after filename, but it will confuse lapp, thinking that these
+ -- options are for make4ht. this may result in execution error or wrong option parsing
+ -- as fix, add a space before options at the end (we need to stop to add spaces as soon as we find
+ -- nonempty string which doesn't start with - it will be filename or tex4ht.sty options
+ if #arg > 1 then -- do this only if more than one argument is used
+ for i=#arg,1,-1 do
+ local current = arg[i]
+ if is_escapedargument(arg[i]) then
+ arg[i] = " ".. arg[i]
+ -- empty parameter
+ elseif current == "" then
+ else
+ break
+ end
+ end
+ end
+ --print("--------------\n" .. optiontext .."--------------\n")
+ return lapp(optiontext % parameters)
+end
+
+--- get outptut file format and list of extensions from --format option string
+local function get_format_extensions(format_string)
+ local format, rest = format_string:match("^([a-zA-Z0-9]+)(.*)")
+ local extensions = {}
+ -- it is possible to pass only the extensions
+ rest = rest or format_string
+ rest:gsub("([%+%-])([^%+^%-]+)",function(typ, name)
+ table.insert(extensions, {type = typ, name = name})
+ end)
+ return format, extensions
+end
+
+local function process_args(args)
+ local function get_inserter(args,tb)
+ return function(key, value)
+ --local v = args[key] and value or ""
+ local v = ""
+ if args[key] then v = value end
+ table.insert(tb,v)
+ end
+ end
+
+ if args.version ==true then
+ print(string.format("%s version %s", m.progname, m.version_number))
+ os.exit()
+ end
+
+ local outdir = ""
+ local packages = ""
+
+ if args["output-dir"] ~= "nil" then
+ outdir = args["output-dir"] or ""
+ outdir = outdir:gsub('\\','/')
+ outdir = outdir:gsub('/$','')
+ end
+
+ if args.backend == "lua4ht" then
+ args.lua = true
+ args.xetex = nil
+ args.utf8 = true
+ args["no-tex4ht"] = true
+ packages = packages .."\\RequirePackage{lua4ht}"
+ end
+
+
+ local compiler = args.lua and "dvilualatex" or args.xetex and "xelatex --no-pdf" or "latex"
+ local tex_file = args.filename
+ local input = mkutils.remove_extension(args.filename)
+ local latex_params = {}
+ local insert_latex = get_inserter(args,latex_params)
+ insert_latex("shell-escape","-shell-escape")
+ local latex_cli_params = args[4] or ""
+ if not latex_cli_params:match("%-jobname") then
+ -- we must strip out directories from jobname when full path to document is given
+ input = input:match("([^%/^%\\]+)$")
+ -- input also cannot contain spaces, replace them with underscores
+ input = input:gsub("%s", "_")
+ table.insert(latex_params,"-jobname="..input)
+ else
+ -- when user specifies -jobname, we must change name of the input file,
+ -- in order to be able to process correct dvi file with tex4ht and t4ht
+ local newinput
+ local first, rest = latex_cli_params:match("%-jobname=(.)(.*)")
+ if first=='"' then
+ newinput=rest:match('([^"]+)')
+ elseif first=="'" then
+ newinput=rest:match("([^']+)")
+ elseif type(first)== "string" then
+ rest = first.. rest
+ newinput = rest:match("([^ ]+)")
+ end
+ if newinput then
+ input = newinput
+ end
+ end
+ table.insert(latex_params, latex_cli_params)
+ --table.insert(latex_params,args["shell-escape"] and "-shell-escape")
+
+
+ local t4sty = args[1] or ""
+ -- test if first option is custom config file
+ local cfg_tmp = t4sty:match("([^,^ ]+)")
+ if cfg_tmp and cfg_tmp ~= args.config then
+ local fn = cfg_tmp..".cfg"
+ local f = io.open(fn,"r")
+ if f then
+ args.config = cfg_tmp
+ f:close()
+ end
+ end
+ --[[if args[1] and args[1] ~= "" then
+ t4sty = args[1]
+ else
+ --]]
+ -- Different behaviour from htlatex
+ local utf = args.utf8 and ",charset=utf-8" or ""
+ t4sty = args.config .. "," .. t4sty .. utf
+ --end
+
+ local tex4ht = ""
+ local dvi= args.xetex and "xdv" or "dvi"
+ if args[2] and args[2] ~="" then
+ tex4ht = args[2]
+ else
+ tex4ht = args.utf8 and " -cmozhtf -utf8" or ""
+ if args.xetex then tex4ht = tex4ht .. " -.xdv" end
+ -- tex4ht = tex4ht .. xdv
+ end
+
+ local t4ht = args[3] or ""
+
+ local mode = args.mode or "default"
+
+ local build_file = input.. ".mk4"
+
+ if args["build-file"] and args["build-file"] ~= "nil" then
+ build_file = args["build-file"]
+ end
+
+ local outformat, extensions
+ if args["format"] and arg["format"] ~= "nil" then
+ outformat, extensions = get_format_extensions(args["format"])
+ end
+
+ local parameters = {
+ htlatex = compiler
+ ,input=input
+ ,tex_file=tex_file
+ ,packages=packages
+ ,latex_par=table.concat(latex_params," ")
+ --,config=ebookutils.remove_extension(args.config)
+ ,tex4ht_sty_par=t4sty
+ ,tex4ht_par=tex4ht
+ ,t4ht_par=t4ht
+ ,mode = mode
+ ,dvi = dvi
+ ,build_file = build_file
+ ,output_format = outformat
+ ,extensions = extensions
+ --,t4ht_dir_format=t4ht_dir_format
+ }
+ if outdir then parameters.outdir = outdir end
+ print("Output dir: ",outdir)
+ print("Compiler: ", compiler)
+ print("Latex options: ", table.concat(latex_params," "))
+ print("tex4ht.sty :",t4sty)
+ print("tex4ht",tex4ht)
+ print("build_file", build_file)
+ if outformat~="nil" then
+ print("Output format", outformat)
+ for _, ex in ipairs(extensions) do
+ print("Extension", ex.type .. ex.name)
+ end
+ end
+ return parameters
+end
+m.get_args = get_args
+m.get_format_extensions = get_format_extensions
+m.process_args = process_args
+return m