summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtx-plain.lua
blob: 72cc48f92ad98d110434ae467bcbfeecb6c98461 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
if not modules then modules = { } end modules ['mtx-plain'] = {
    version   = 1.002,
    comment   = "companion to mtxrun.lua",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

-- future version will use the texmf-cache/generic/formats/<engine> path
-- instead because then we can use some more of the generic context
-- initializers ... in that case we will also use the regular database
-- instead of kpse here, just like with the font database code (as that
-- one also works with kpse runtime)

local format = string.format

local helpinfo = [[
<?xml version="1.0"?>
<application>
 <metadata>
  <entry name="name">mtx-plain</entry>
  <entry name="detail">Plain TeX Runner</entry>
  <entry name="version">1.00</entry>
 </metadata>
 <flags>
  <category name="basic">
   <subcategory>
    <flag name="make"><short>create format file</short></flag>
    <flag name="fonts"><short>create plain font database</short></flag>
    <flag name="run"><short>process file</short></flag>
    <flag name="format" value="string"><short>format name (default: luatex-plain)</short></flag>
    <flag name="engine" value="string"><short>engine to use (default: luatex)</short></flag>
    <flag name="jit"><short>use luajittex</short></flag>
   </subcategory>
  </category>
 </flags>
</application>
]]

local application = logs.application {
    name     = "mtx-plain",
    banner   = "Plain TeX Runner 1.00",
    helpinfo = helpinfo,
}

local report = application.report

scripts       = scripts       or { }
scripts.plain = scripts.plain or { }

local passed_options = table.tohash {
    "utc",
    "synctex",
}

local function execute(...)
    local command = format(...)
    report("running command %a\n",command)
    statistics.starttiming()
    local status = os.execute(command)
    statistics.stoptiming()
    report("runtime %s seconds",statistics.elapsedtime())
    return status
end

local function resultof(...)
    local command = format(...)
    report("running command %a",command)
    local result = os.resultof(command) or ""
    result = string.gsub(result,"[\n\r]+","")
    return result
end

function scripts.plain.make(texengine,texformat)
    report("generating kpse file database")
    execute("mktexlsr") -- better play safe and use this one
    local fmtpathspec = resultof("kpsewhich --var-value=TEXFORMATS --engine=%s",texengine)
    if fmtpathspec ~= "" then
        report("using path specification %a",fmtpathspec)
        fmtpathspec = resultof('kpsewhich --expand-braces="%s"',fmtpathspec)
    end
    if fmtpathspec ~= "" then
        report("using path expansion %a",fmtpathspec)
    else
        report("no valid path reported, trying alternative")
     -- fmtpathspec = resultof("kpsewhich --show-path=fmt --engine=%s",texengine)
        if fmtpathspec ~= "" then
            report("using path expansion %a",fmtpathspec)
        else
            report("no valid path reported, falling back to current path")
            fmtpathspec = "."
        end
    end
    fmtpathspec = string.splitlines(fmtpathspec)[1] or fmtpathspec
    fmtpathspec = file.splitpath(fmtpathspec)
    local fmtpath = nil
    for i=1,#fmtpathspec do
        local path = fmtpathspec[i]
        if path ~= "." then
            dir.makedirs(path)
            if lfs.isdir(path) and file.is_writable(path) then
                fmtpath = path
                break
            end
        end
    end
--  local fmtpath = resultof("kpsewhich --expand-path $safe-out-name=$TEXFORMATS")
    if not fmtpath or fmtpath == "" then
        fmtpath = "."
    else
        lfs.chdir(fmtpath)
    end
    execute('%s --ini %s \\dump',texengine,file.addsuffix(texformat,"tex"))
    report("generating kpse file database")
    execute("mktexlsr")
    report("format %a saved on path %a",texformat,fmtpath)
end

function scripts.plain.run(texengine,texformat,filename)
    local t = { }
    for k, v in next, environment.arguments do
        local m = passed_options[k] and "" or "mtx:"
        if type(v) == "string" and v ~= "" then
            v = format("--%s%s=%s",m,k,v)
        elseif v then
            v = format("--%s%s",m,k)
        end
        t[#t+1] = v
    end
    execute('%s --fmt=%s %s "%s"',texengine,file.removesuffix(texformat),table.concat(t," "),filename)
end

function scripts.plain.fonts()
    execute('mtxrun --script fonts --reload --simple --typeone')
end

local texformat = environment.arguments.texformat or environment.arguments.format
local texengine = environment.arguments.texengine or environment.arguments.engine

if type(texengine) ~= "string" or texengine == "" then
    texengine = (jit or environment.arguments.jit) and "luajittex" or "luatex"
end

if type(texformat) ~= "string" or texformat == "" then
    texformat = "luatex-plain"
end

local filename = environment.files[1]

if environment.arguments.exporthelp then
    application.export(environment.arguments.exporthelp,filename)
elseif environment.arguments.make then
    scripts.plain.make(texengine,texformat)
elseif environment.arguments.fonts then
    scripts.plain.fonts()
elseif filename then
    scripts.plain.run(texengine,texformat,filename)
else
    application.help()
end