From 7d8c399780981359be7896a5fb053a0bd873a3e6 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 31 Dec 2019 23:19:25 +0000 Subject: archive old lua tlpdb attempt git-svn-id: svn://tug.org/texlive/trunk@53284 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/archive/lua/texlive/getopt.tlu | 99 ++++ Master/tlpkg/archive/lua/texlive/tlpdb.tlu | 259 ++++++++++ Master/tlpkg/archive/lua/texlive/utils.tlu | 78 +++ Master/tlpkg/archive/test-tlpdb.tlu | 45 ++ Master/tlpkg/archive/texconf.tlu | 728 ++++++++++++++++++++++++++++ 5 files changed, 1209 insertions(+) create mode 100644 Master/tlpkg/archive/lua/texlive/getopt.tlu create mode 100644 Master/tlpkg/archive/lua/texlive/tlpdb.tlu create mode 100644 Master/tlpkg/archive/lua/texlive/utils.tlu create mode 100755 Master/tlpkg/archive/test-tlpdb.tlu create mode 100755 Master/tlpkg/archive/texconf.tlu (limited to 'Master/tlpkg/archive') diff --git a/Master/tlpkg/archive/lua/texlive/getopt.tlu b/Master/tlpkg/archive/lua/texlive/getopt.tlu new file mode 100644 index 00000000000..7e52ddd357f --- /dev/null +++ b/Master/tlpkg/archive/lua/texlive/getopt.tlu @@ -0,0 +1,99 @@ +#! /usr/bin/env texlua +--*-Lua-*- +-- getopt.tlu +-- +-- (tex)lua library function for argument processing +-- $Id$ +-- +-- Copyright 2008 Norbert Preining +-- +-- This code will presumably be changed in the near future. Don't use +-- it for your own scripts! +-- +-- This file is licensed under the GNU General Public License version 2 +-- or any later version. +-- +-- The file provides a basic getopt function +-- it takes as argument a table with the argument names as keys and the +-- number of argument options as values +-- +-- It returns a tables with the found arguments as keys and +-- . true as value for an option not taking any values +-- . a single value for an option taking one value +-- . an array of values for an option taking more than one value +-- +-- Example: +-- options = getopt( { help = 0, foo = 1, bar = 2 } ) +-- and calling the script with +-- script a --help b --bar c d e --foo f g h +-- will leave a b e g h in the arguments and will return +-- options["help"] = true +-- options["foo"] = "f" +-- options["bar"] = { "c", "d" } +-- +-- Options can start with a single or a double dash, but values may NOT be +-- separated with a =, but need to be seprate arguments! +-- +-- Example code for printing out the options: +-- print ("OPTIONS:") +-- for o,v in pairs(options) do +-- if (type(v) == "boolean") then +-- print ("option "..o) +-- elseif (type(v) == "table") then +-- for a,b in ipairs(v) do +-- print ("option "..o.."["..a.."] = "..b) +-- end +-- else +-- print ("option "..o.." = "..v) +-- end +-- end + +function getopt(spec) + local newarg = {} + local retargs = {} + do + local i, limit = 1, #arg + while (i <= limit) do + local found = false + for k,v in pairs(spec) do + if (arg[i] == "--"..k or arg[i] == "-"..k) then + found = true + if (v == 0) then + -- boolean argument + retargs[k] = true + elseif (v == 1) then + -- one single argument + retargs[k] = arg[i+1] + i = i + 1 + else + local bla = {} + for n=1, v do + bla[n] = arg[i+n] + end + retargs[k] = bla + -- we have to shift the next i!!! + i = i + v + end + -- we have found the arg, so stop processing further spec arguments + break + end + end + if not(found) then + -- non of the spec args did hit, so we push the arg to the newargs + newarg[#newarg+1] = arg[i] + end + i = i + 1 + end + end + -- replace the global arg with the cleaned newarg + arg = newarg + -- return the found arguments + return retargs +end + +-- Local Variables: +-- lua-indent-level: 2 +-- tab-width: 2 +-- indent-tabs-mode: nil +-- End: +-- vim:set tabstop=2 expandtab: # diff --git a/Master/tlpkg/archive/lua/texlive/tlpdb.tlu b/Master/tlpkg/archive/lua/texlive/tlpdb.tlu new file mode 100644 index 00000000000..4977431bd56 --- /dev/null +++ b/Master/tlpkg/archive/lua/texlive/tlpdb.tlu @@ -0,0 +1,259 @@ +#! /usr/bin/env texlua +-- texlive/tlpdb.tlu +-- $Id$ +-- +-- Copyright (C) 2008 Norbert Preining +-- This file is licensed under the GNU General Public License version 2 +-- or any later version. +-- +-- TODO: tag evaluation of docfiles lines ... +-- +-- providing the tlpdb as a lua table +-- +-- format +-- tlpobj = tlpdb[packagename] +-- tlpobj.name string +-- tlpobj.revision string +-- tlpobj.category string +-- tlpobj.shortdesc string +-- tlpobj.longdesc string +-- tlpobj.catalogue string +-- tlpobj.cataloguedata table indexed by various catalogue values +-- tlpobj.containersize string +-- tlpobj.srccontainersize string +-- tlpobj.doccontainersize string +-- tlpobj.containerchecksum string +-- tlpobj.srccontainerchecksum string +-- tlpobj.doccontainerchecksum string +-- tlpobj.binfiles table indexed by archs giving table indexed by numbers +-- tlpobj.binsize table indexed by archs giving strings +-- tlpobj.docfiles = table indexed by numbers +-- tlpobj.docfiledata[docfile][tag] = value +-- tlpobj.docsize string +-- tlpobj.srcfiles = table indexed by numbers +-- tlpobj.srcsize string +-- tlpobj.runfiles = table indexed by numbers +-- tlpobj.runsize string +-- tlpobj.depend = table indexed by numbers +-- tlpobj.execute = table of strings indexed by numbers +-- tlpobj.postaction = table of strings indexed by numbers +-- tlpobj.relocated = boolean +-- +--*-Lua-*- + +function read_tlpdb(root) + local fn = root..'/tlpkg/texlive.tlpdb' + if (lfs.isfile(fn)) then -- tlpdb exists + local lineno = 0 -- current line number + local errline = '' -- current line + local function die(msg) + io.stderr:write(msg..' in '..fn..' at line '..tostring(lineno) + ..'\n>>'..errline..'<<\n') + -- for now, exit, but this is bad behaviour if we want to be used + -- as a library. FIXME. + os.exit(1) + end + local started = false + local lastcmd = "" + local arch + local size + local tlpobj = {} + local name + local tlpdb = {} + for line in io.lines(fn) do + lineno = lineno + 1 + errline = line + if string.match(line, '^%s*$') then + if started then + -- we have encountered an empty line while creating a tlpobj, so + -- stop that tlpobj, add it to the tlpdb, and restart + --tlpdb[name] = tlpobj + tlpdb[name] = tlpobj + tlpobj = {} + --print ("adding "..name.." to tlpdb") + started = false + end + else + if string.match(line, '^ ') then + if lastcmd == 'runfiles' or + lastcmd == 'binfiles' or + lastcmd == 'docfiles' or + lastcmd == 'srcfiles' or + lastcmd == 'execute' or + lastcmd == 'depend' then + line = string.gsub(line, '^ ', lastcmd.."continued ") + else + die('Continuation of '..lastcmd..' not allowed') + end + end + local first + local rest + first, rest = string.match(line,'^(%S+)%s*(.*)%s*$') + --print ("DEBUG: line = "..line) + --print ("DEBUG: first = "..first) + lastcmd = first + if first == "name" then + tlpobj.name = rest + name = rest + started = true + elseif first == "revision" then + tlpobj.revision = rest + elseif first == "category" then + tlpobj.category = rest + elseif first == "shortdesc" then + tlpobj.shortdesc = rest + elseif first == "catalogue" then + tlpobj.catalogue = rest + elseif string.match(first,'^catalogue%-') then + --local data = string.match(first,'^catalogue-(.*)$') + local cdata = string.gsub(first,'^catalogue%-', '') + --print("DEBUG: cdata = "..cdata..", first = "..first) + if not(tlpobj.cataloguedata) then + tlpobj.cataloguedata = {} + end + tlpobj.cataloguedata[cdata] = rest + elseif first == "containersize" then + tlpobj.containersize = rest + elseif first == "srccontainersize" then + tlpobj.srccontainersize = rest + elseif first == "doccontainersize" then + tlpobj.doccontainersize = rest + elseif first == "containerchecksum" then + tlpobj.containerchecksum = rest + elseif first == "srccontainerchecksum" then + tlpobj.srccontainerchecksum = rest + elseif first == "doccontainerchecksum" then + tlpobj.doccontainerchecksum = rest + elseif first == "runfiles" then + local rsize = string.match(rest,'size=([0-9]*)') + if (rsize) then + tlpobj.runsize = rsize + else + if #rest > 0 then + die('Unknown tag') + end + end + elseif first == "docfiles" then + local dsize = string.match(rest,'size=([0-9]*)') + if (dsize) then + tlpobj.docsize = dsize + else + if #rest > 0 then + die('Unknown tag') + end + end + elseif first == "srcfiles" then + local ssize = string.match(rest,'size=([0-9]*)') + if (ssize) then + tlpobj.srcsize = ssize + else + if #rest > 0 then + die('Unknown tag') + end + end + elseif first == "binfiles" then + arch = "" + local barch + local bsize + for aaa in string.gmatch(rest,'%S+') do + if string.match(aaa,'^arch=(%S*)$') then + barch = string.match(aaa,'^arch=(%S*)$') + elseif string.match(aaa,'^size=(%S*)$') then + bsize = string.match(aaa,'^size=(%S*)$') + else + die('Unknown tag') + end + end + if barch and bsize then + if not(tlpobj.binsize) then + tlpobj.binsize = {} + end + tlpobj.binsize[barch] = bsize + arch = barch + else + die('Incomplete binfile tags ') + end + elseif first == "runfilescontinued" then + if not(tlpobj.runfiles) then + tlpobj.runfiles = {} + end + table.insert(tlpobj.runfiles,rest) + lastcmd = "runfiles" + elseif first == "docfilescontinued" then + local dfile,tags = string.match(rest,'^(%S+)%s*(.*)%s*$') + if not(tlpobj.docfiles) then + tlpobj.docfiles = {} + end + table.insert(tlpobj.docfiles,dfile) + for aaa,bbb in string.gmatch(tags,'(%S+)=(%b"")') do + if not(tlpobj.docfiledata) then + tlpobj.docfiledata = {} + end + if aaa == "details" or aaa == "language" then + if not(tlpobj.docfiledata[dfile]) then + tlpobj.docfiledata[dfile] = {} + end + tlpobj.docfiledata[dfile][aaa] = bbb + else + die('Unknown docfile tag') + end + end + lastcmd = "docfiles" + elseif first == "srcfilescontinued" then + if not(tlpobj.srcfiles) then + tlpobj.srcfiles = {} + end + table.insert(tlpobj.srcfiles,rest) + lastcmd = "srcfiles" + elseif first == "binfilescontinued" then + if not(tlpobj.binfiles) then + tlpobj.binfiles = {} + end + if not(tlpobj.binfiles[arch]) then + tlpobj.binfiles[arch] = {} + end + table.insert(tlpobj.binfiles[arch],rest) + lastcmd = "binfiles" + elseif first == "depend" then + if not(tlpobj.depend) then + tlpobj.depend = {} + end + table.insert(tlpobj.depend,rest) + elseif first == "longdesc" then + if tlpobj.longdesc then + tlpobj.longdesc = tlpobj.longdesc.." "..rest + else + tlpobj.longdesc = rest + end + elseif first == "execute" then + if not(tlpobj.execute) then + tlpobj.execute = {} + end + table.insert(tlpobj.execute,rest) + elseif first == 'postaction' then + tlpobj.postaction = tlpobj.postaction or {} + table.insert(tlpobj.postaction, rest) + elseif first == 'relocated' then + -- don't even try to validate the value + tlpobj.relocated = (rest == '1') + else + die('Unknown directive') + end + if not(first) then + die('Missing directive') + end + end + end + return tlpdb + else + print (fn..' not found.') + end +end + + +-- Local Variables: +-- lua-indent-level: 2 +-- tab-width: 2 +-- indent-tabs-mode: nil +-- End: +-- vim:set tabstop=2 shiftwidth=2 expandtab: # diff --git a/Master/tlpkg/archive/lua/texlive/utils.tlu b/Master/tlpkg/archive/lua/texlive/utils.tlu new file mode 100644 index 00000000000..a31475b351c --- /dev/null +++ b/Master/tlpkg/archive/lua/texlive/utils.tlu @@ -0,0 +1,78 @@ +-- texlive/utils.tlu +-- $Id$ +-- +-- Copyright (C) 2008 Reinhard Kotucha, Norbert Preining +-- You may freely use, modify and/or distribute this file. +-- +-- general utilities for TeX Live lua scripts + +function setupperl() + -- For Windows we use the shipped perl interpreter, otherwise we expect + -- a perl to be installed + local perlbin + if os.type == 'windows' then + perlbin=TEXDIR..'/tlpkg/tlperl/bin/perl.exe' + os.setenv('PERL5LIB', TEXDIR..'/tlpkg/tlperl/lib') + else + perlbin = 'perl' + end + return perlbin +end + +function findscript(scriptname) + local script = kpse.find_file(scriptname, 'texmfscripts') + if script then + return script + else + io.stderr:write(filename..': Cannot find script '..scriptname) + return false + end +end + +-- fix arguments for windows +function fixwin(args_unix) + if os.type == 'windows' then + local args_win={} -- new table + args_win[0]=args_unix[1] + for i=1, #args_unix do + args_win[i]='"'..args_unix[i]..'"' + end + return args_win + else + return args_unix + end +end + +function rmtree (path) + if lfs.isdir(path) then + for file in lfs.dir(path) do + if file ~= '.' and file ~= '..' then + local f = path..'/'..file + if lfs.isdir(f) then + rmtree(f) + lfs.rmdir(f) + else + os.remove(f) + end + end + end + lfs.rmdir(path) + end +end + + +function list (t) + local i = 0 + return function () + i = i + 1 + return t[i] + end +end + + +-- Local Variables: +-- lua-indent-level: 2 +-- tab-width: 2 +-- indent-tabs-mode: nil +-- End: +-- vim:set tabstop=2 expandtab: # diff --git a/Master/tlpkg/archive/test-tlpdb.tlu b/Master/tlpkg/archive/test-tlpdb.tlu new file mode 100755 index 00000000000..2004e958fb1 --- /dev/null +++ b/Master/tlpkg/archive/test-tlpdb.tlu @@ -0,0 +1,45 @@ +#! /usr/bin/env texlua +--*- Lua -*- + +-- Copyright (C) 2008 Norbert Preining. +-- You may freely use, modify and/or distribute this file. + +-- test the functionality of tlpdb.tlu + +kpse.set_program_name(arg[-1]) +texmfmain = kpse.var_value('TEXMFMAIN') +package.path = texmfmain.."/scripts/texlive/lua/?.tlu" +require("texlive.tlpdb") +master=kpse.var_value('SELFAUTOPARENT') +io.stderr:write('reading tlpdb ... ') +tlpdb = read_tlpdb(master) +io.stderr:write('done\n') + +--os.exit(0) + +for a,b in pairs(tlpdb) do + print ("package = "..a) + for c,d in pairs(b) do + if (type(d) == "table") then + print (" "..c..":") + for cdata,cvalue in pairs(d) do + if (type(cvalue) == "table") then + print (" "..cdata..":") + for aaa,bbb in pairs(cvalue) do + print (" "..aaa.." = "..bbb) + end + else + print (" "..cdata.." = "..cvalue) + end + end + else + print (" "..c.." = "..tostring(d)) + end + end +end +-- Local Variables: +-- lua-indent-level: 2 +-- tab-width: 2 +-- indent-tabs-mode: nil +-- End: +-- vim:set tabstop=2 shiftwidth=2 expandtab: # diff --git a/Master/tlpkg/archive/texconf.tlu b/Master/tlpkg/archive/texconf.tlu new file mode 100755 index 00000000000..e41500cc447 --- /dev/null +++ b/Master/tlpkg/archive/texconf.tlu @@ -0,0 +1,728 @@ +#! /usr/bin/env texlua +--*- Lua -*- +-- $Id$ + +-- Copyright (C) 2008 Reinhard Kotucha, Norbert Preining. +-- You may freely use, modify and/or distribute this file. + +-- texconf is a subset of Thomas Esser's texconfig shell script. + +if string.find(arg[0], '/') then -- UNIX path + filename=select(1, string.gsub(arg[0], '.*/', '')) +elseif string.find(arg[0], '\\') then -- Windows path + filename=select(1, string.gsub(arg[0], '.*\\', '')) +else -- no path + filename=arg[0] +end + +basename=select(1, string.gsub(filename, '\.tlu$', '')) + +usageprogname = basename + +domktexlsr = false +doformat = false +sys=false +noformatopt = false + +if string.find(basename, '-sys$') then + basename=select(1, string.gsub(basename, '-sys$', '')) + sys=true +end + +-- this script does NOT appear in the patch, so we cannot use its basename +-- for kpse.set_program_name +-- thus we use simply mktexlsr, which always is in the path and which +-- does not have any special settings in texmf.cnf +-- kpse.set_program_name(filename, basename) +kpse.set_program_name( "mktexlsr" ) + +-- set the search path for lua libraries +texmfmain = kpse.var_value('TEXMFMAIN') +texmfdist = kpse.var_value('TEXMFDIST') +package.path = texmfmain.."/scripts/texlive/lua/?.tlu" +require("texlive.getopt") +require("texlive.utils") + +-- do argument processing +options = getopt ( { sys = 0, prog = 1, noformat = 0 } ) +if (options["sys"]) then + sys = true +end +if (options["prog"]) then + usageprogname = options["prog"] +end +if (options["noformat"]) then + noformatopt = true +end + +if (sys) then + texmfconfig=kpse.var_value('TEXMFSYSCONFIG') + os.setenv('TEXMFCONFIG', texmfconfig) + texmfsysvar=kpse.var_value('TEXMFSYSVAR') + os.setenv('TEXMFVAR', texmfsysvar) +else + texmfconfig=kpse.var_value('TEXMFCONFIG') + if string.match(texmfconfig, '^~') then + -- workaround for old texlua, new kpathsea which expands '~' not + -- integrated yet. + if os.type == 'windows' then + home = os.getenv('USERPROFILE') + else + home = os.getenv('HOME') + end + texmfconfig = string.gsub(texmfconfig, '^~', home) + end +end + + +pdftex_papersize={} +pdftex_papersize['letter']={'8.5 true in', '11 true in'} +pdftex_papersize['a4']={'210 true mm', '297 true mm'} + +xdvi_papersize={} +xdvi_papersize['us']='8.5x11' +xdvi_papersize['usr']='11x8.5' +xdvi_papersize['legal']='8.5x14' +xdvi_papersize['foolscap']='13.5x17.0' +xdvi_papersize['a1']='59.4x84.0cm' +xdvi_papersize['a2']='42.0x59.4cm' +xdvi_papersize['a3']='29.7x42.0cm' +xdvi_papersize['a4']='21.0x29.7cm' +xdvi_papersize['a5']='14.85x21.0cm' +xdvi_papersize['a6']='10.5x14.85cm' +xdvi_papersize['a7']='7.42x10.5cm' +xdvi_papersize['a1r']='84.0x59.4cm' +xdvi_papersize['a2r']='59.4x42.0cm' +xdvi_papersize['a3r']='42.0x29.7cm' +xdvi_papersize['a4r']='29.7x21.0cm' +xdvi_papersize['a5r']='21.0x14.85cm' +xdvi_papersize['a6r']='14.85x10.5cm' +xdvi_papersize['a7r']='10.5x7.42cm' +xdvi_papersize['b1']='70.6x100.0cm' +xdvi_papersize['b2']='50.0x70.6cm' +xdvi_papersize['b3']='35.3x50.0cm' +xdvi_papersize['b4']='25.0x35.3cm' +xdvi_papersize['b5']='17.6x25.0cm' +xdvi_papersize['b6']='13.5x17.6cm' +xdvi_papersize['b7']='8.8x13.5cm' +xdvi_papersize['b1r']='100.0x70.6cm' +xdvi_papersize['b2r']='70.6x50.0cm' +xdvi_papersize['b3r']='50.0x35.3cm' +xdvi_papersize['b4r']='35.3x25.0cm' +xdvi_papersize['b5r']='25.0x17.6cm' +xdvi_papersize['b6r']='17.6x13.5cm' +xdvi_papersize['b7r']='13.5x8.8cm' +xdvi_papersize['c1']='64.8x91.6cm' +xdvi_papersize['c2']='45.8x64.8cm' +xdvi_papersize['c3']='32.4x45.8cm' +xdvi_papersize['c4']='22.9x32.4cm' +xdvi_papersize['c5']='16.2x22.9cm' +xdvi_papersize['c6']='11.46x16.2cm' +xdvi_papersize['c7']='8.1x11.46cm' +xdvi_papersize['c1r']='91.6x64.8cm' +xdvi_papersize['c2r']='64.8x45.8cm' +xdvi_papersize['c3r']='45.8x32.4cm' +xdvi_papersize['c4r']='32.4x22.9cm' +xdvi_papersize['c5r']='22.9x16.2cm' +xdvi_papersize['c6r']='16.2x11.46cm' +xdvi_papersize['c7r']='11.46x8.1cm' + +dvipdfm_papersize={'letter', 'legal', 'ledger', 'tabloid', 'a4', 'a3'} + +function mkdirhier(path) + local dirs={} + local dir=path + while string.match(dir, '/') do + dirs[#dirs+1]=dir + dir=select(1, string.gsub(dir, '/[^/]*$', '')) + end + -- reverse the list + local dirlist={} + for i=1, #dirs do + dirlist[#dirlist+1]=dirs[#dirs-i+1] + end + for i=1, #dirlist do + if not lfs.isdir(dirlist[i]) then + lfs.mkdir(dirlist[i]) + end + end +end + +function set_dvips_papersize(papersize) + -- If the argument is 'list' then a list of available paper sizes is + -- returned to stdout. It can be used by dialog(1) or */Tk + -- interfaces in order to build up the menu. The topmost entry is + -- the one which is actually used by dvips. + local i, key, val + local partab={} + local par=1 + local line + local lin=1 + partab[par]={} + -- Read the file. partab{} contains all paragraphs. + kpse.set_program_name('dvips') + local filename=kpse.find_file('config.ps', 'dvips config') + -- print ('< '..filename) + local infile=assert(io.open(filename, 'r')) + while true do + line=infile:read('*line') + if line == nil then break end + if string.find(line, '^\s*$') then + par=par+1 + partab[par]={} + lin=1 + else + partab[par][lin]=line + lin=lin+1 + end + end + -- par_papersize{} is a list which associates papersizes with + -- paragraphs. Paregraphs containing no papersize information are + -- denoted by 'NO_SIZE_PAR'. + local par_papersize={} + for i=1, #partab do + par_papersize[i]='NO_SIZE_PAR' + for k=1, #partab[i] do + if string.find(partab[i][k], '^@%s') then + par_papersize[i]=string.match(partab[i][k], '^@%s+(%w+)%s') + end + end + end + infile:close() + + local index=-1 --the papagraph wich contains the desired size. + if papersize=='--list' then + -- print a list of available sizes to stdout. + -- the topmost item is the one currently used by dvips. + for key, val in ipairs(par_papersize) do + if val ~= 'NO_SIZE_PAR' and val ~= 'unknown' then + io.stdout:write(val..'\n') + end + end + elseif papersize=='help' then + io.stdout:write('Usage: '..usageprogname..' dvips paper PAPER\n\n'.. + 'Valid PAPER settings:\n ') + local buffer='' + for key, val in ipairs(par_papersize) do + if val ~= 'NO_SIZE_PAR' and val ~= 'unknown' then + if #buffer + #val < 77 then + buffer=buffer..' '..val + else + io.stdout:write(buffer..'\n') + buffer=' '..val + end + end + end + io.stdout:write(buffer..'\n') + else --change paper size + for key, val in ipairs(par_papersize) do + if string.find(val, '^'..papersize..'$') then + index=key + end + end + if index == -1 then + io.stderr:write('Error: Paper Size "'..papersize.. + '" undefined. Aborting...\n') + os.exit(1) + end + -- print stuff which doesn't contain paper size information. + local outfile={} + for key, val in ipairs(par_papersize) do + if val == 'NO_SIZE_PAR' then + for i=1, #partab[key] do + outfile[#outfile+1]=partab[key][i]..'\n' + end + outfile[#outfile+1]='\n' + end + end + -- print selected par + for i=1, #partab[index] do + outfile[#outfile+1]=partab[index][i]..'\n' + end + outfile[#outfile+1]='\n' + -- print other pars to outfile table + for key, val in ipairs(par_papersize) do + if val ~= 'NO_SIZE_PAR' then + if key~=index then + for i=1, #partab[key] do + outfile[#outfile+1]=partab[key][i]..'\n' + end + outfile[#outfile+1]='\n' + end + end + end + -- write file + mkdirhier(texmfconfig..'/dvips/config') + local config=assert(io.open(texmfconfig..'/dvips/config/config.ps', 'w')) + for i=1, #outfile do + if not (string.match(outfile[i],'^%s*$') + and string.match(outfile[i-1],'^%s*$')) then + config:write(outfile[i]) + end + end + config:close() + print ('> '..texmfconfig..'/dvips/config/config.ps') + domktexlsr = true + end +end -- set_dvips_papersize + + +function set_xdvi_papersize(papersize) + local current_setting + -- Read the file. + local filename + if os.type == 'windows' then + return + end + + kpse.set_program_name('xdvi') + filename=kpse.find_file('XDvi', 'other text files') + + -- print ('< '..filename) + local infile=assert(io.open(filename, 'r')) + local lines={} + while true do + line=infile:read('*line') + if line == nil then break end + lines[#lines+1]=line + end + infile:close() + + if papersize=='--list' then + current_setting='a4' + for n, line in ipairs(lines) do + if string.find(line, '^\*paper:') then + current_setting=string.match(line, '^\*paper:%s+(%S+)') + for ptype, psize in pairs(xdvi_papersize) do + if current_setting==psize then + current_setting=ptype + end + end + end + end + print (current_setting) + for key, val in pairs(xdvi_papersize) do + if key ~= current_setting then + print(key) + end + end + elseif papersize=='help' then + io.stdout:write('Usage: '..usageprogname..' xdvi paper PAPER\n\n'.. + 'Valid PAPER settings:\n ') + local buffer='' + for ptype, psize in pairs(xdvi_papersize) do + if #buffer + #ptype < 77 then + buffer=buffer..' '..ptype + else + io.stdout:write(buffer..'\n') + buffer=' '..ptype + end + end + io.stdout:write(buffer..'\n') + else --change paper size + mkdirhier(texmfconfig..'/xdvi') + local config=assert(io.open(texmfconfig..'/xdvi/XDvi', 'w')) + for n=1, #lines do + if string.find(lines[n], '^!*\*paper:') then + config:write('*paper: '..papersize..'\n') + else + config:write(lines[n]..'\n') + end + end + config:close() + print ('> '..texmfconfig..'/xdvi/XDvi') + domktexlsr = true + end +end + + +function set_pdftex_papersize(papersize) + local current_setting + --Read the file. + kpse.set_program_name('pdftex') + local filename=kpse.find_file('pdftexconfig.tex', 'tex') + + -- print ('< '..filename) + local infile=assert(io.open(filename, 'r')) + local lines={} + while true do + line=infile:read('*line') + if line == nil then break end + if string.find(line, '^\\pdfpagewidth') then + pagewidth=string.match(line, '^\\pdfpagewidth%s*=?%s*(.+)%s*$') + end + if string.find(line, '^\\pdfpageheight') then + pageheight=string.match(line, '^\\pdfpageheight%s*=?%s*(.+)%s*$') + end + lines[#lines+1]=line + end + infile:close() + + current_setting='a4' + for ptype, sizes in pairs(pdftex_papersize) do + if pagewidth == pdftex_papersize[ptype][1] then + ptype_x=ptype + end + if pageheight == pdftex_papersize[ptype][2] then + ptype_y=ptype + end + end + if ptype_x == ptype_y then + current_setting=ptype_x + end + + if papersize=='--list' then + print(current_setting) + for ptype, sizes in pairs(pdftex_papersize) do + if ptype ~= current_setting then + print(ptype) + end + end + elseif papersize=='help' then + io.stdout:write('Usage: '..usageprogname..' pdftex paper PAPER\n\n'.. + 'Valid PAPER settings:\n ') + local buffer='' + for ptype, sizes in pairs(pdftex_papersize) do + if #buffer + #ptype < 77 then + buffer=buffer..' '..ptype + else + io.stdout:write(buffer..'\n') + buffer=' '..ptype + end + end + io.stdout:write(buffer..'\n') + else --change paper size + mkdirhier(texmfconfig..'/tex/generic/config') + local outfile=texmfconfig..'/tex/generic/config/pdftexconfig.tex' + local config=assert(io.open(outfile, 'w')) + for n=1, #lines do + line=lines[n] + if string.find(line, '^\\pdfpagewidth') then + config:write('\\pdfpagewidth='..pdftex_papersize[papersize][1]..'\n') + elseif string.find(line, '^\\pdfpageheight') then + config:write('\\pdfpageheight='..pdftex_papersize[papersize][2]..'\n') + else + config:write(line..'\n') + end + end + config:close() + print ('> '..outfile) + domktexlsr = true + doformat = true + end +end + + +function set_dvipdfm_papersize(papersize, program) + local current_setting + -- Read the file. + local filename + if program == 'dvipdfm' then + kpse.set_program_name('dvipdfm') + filename=kpse.find_file('config', 'other text files') + elseif program == 'dvipdfmx' then + kpse.set_program_name('dvipdfmx') + filename=kpse.find_file('dvipdfmx.cfg', 'other text files') + end + if not(filename) then + print ("Cannot find config file for "..program..", exiting!") + os.exit(1) + end + -- print ('< '..filename) + local infile=assert(io.open(filename, 'r')) + local lines={} + local current_setting='a4' + while true do + line=infile:read('*line') + if line == nil then break end + if string.find(line, '^p ') then + current_setting=string.match(line, '^p%s+(%S+)') + end + lines[#lines+1]=line + end + infile:close() + + if papersize=='--list' then + print(current_setting) + for i, ptype in ipairs(dvipdfm_papersize) do + if ptype ~= current_setting then + print (ptype) + end + end + elseif papersize=='help' then + io.stdout:write('Usage: '..usageprogname..' '..program..' paper PAPER\n\n'.. + 'Valid PAPER settings:\n ') + local buffer='' + for i, ptype in pairs(dvipdfm_papersize) do + if #buffer + #ptype < 77 then + buffer=buffer..' '..ptype + else + io.stdout:write(buffer..'\n') + buffer=' '..ptype + end + end + io.stdout:write(buffer..'\n') + else --change paper size + local outfile + mkdirhier(texmfconfig..'/dvipdfm/config') + if program == 'dvipdfm' then + outfile=texmfconfig..'/dvipdfm/config/config' + mkdirhier(texmfconfig..'/dvipdfm/config') + else + outfile=texmfconfig..'/dvipdfmx/dvipdfmx.cfg' + mkdirhier(texmfconfig..'/dvipdfmx') + end + print ('> '..outfile) + local config=assert(io.open(outfile, 'w')) + for n=1, #lines do + line=lines[n] + if string.find(line, '^p ') then + config:write('p '..papersize..'\n') + else + config:write(line..'\n') + end + end + config:close() + domktexlsr = true + end +end + + +function set_context_papersize(papersize) + local current_setting + + -- we cannot guarantee that context is installed, so we check for the + -- file we would need for creating the configuration, and if that is + -- missing we just return (with a warning). + if not(lfs.isfile(texmfdist..'/tex/context/user/cont-sys.rme')) then + io.stderr:write('context not installed, skipping paper setting for it\n') + return + end + + -- Read the file. + local filename + + kpse.set_program_name('tex') + filename=kpse.find_file('cont-sys.tex', 'tex') + if not(filename) then + filename=kpse.find_file('cont-sys.rme', 'other text files') + end + if not(filename) then + print ("Cannot find config file for context, exiting!") + os.exit(1) + end + -- print ('< '..filename) + + local infile=assert(io.open(filename, 'r')) + local lines={} + local current_setting='A4' + local papersize_regexp='^%s*\\setuppapersize%s*%[([^%[]*)%]' + while true do + line=infile:read('*line') + if line == nil then break end + if string.find(line, '^%s*\\setuppapersize') then + current_setting=string.match(line, papersize_regexp) + end + lines[#lines+1]=line + end + infile:close() + + -- print ('current setting: '..current_setting) + + if papersize=='--list' then + print(current_setting) + if (string.match (current_setting, '[aA]4')) then + print ('letter') + else + print ('A4') + end + elseif papersize=='help' then + io.stdout:write('Usage: '..usageprogname..' context paper PAPER\n\n'.. + 'Valid PAPER settings:\n\nA4 letter\n') + else --change paper size + -- make sure we have uppercase A4 for paper size + if (string.match (papersize, 'a4')) then + papersize = 'A4' + end + local outfile + mkdirhier(texmfconfig..'/tex/context/user') + outfile=texmfconfig..'/tex/context/user/cont-sys.tex' + print ('> '..outfile) + local config=assert(io.open(outfile, 'w')) + for n=1, #lines do + line=lines[n] + if string.find(line, '\setuppapersize') then + config:write('\\setuppapersize['..papersize..']['..papersize..']\n') + else + config:write(line..'\n') + end + end + config:close() + domktexlsr = true + end +end + + +function set_papersize(papersize) + if papersize == '--list' then + set_pdftex_papersize('--list') + elseif papersize == 'help' then + io.stdout:write('Usage: '..usageprogname..' paper PAPER\n\n'.. + 'Valid PAPER settings:\n a4 letter\n') + end + if papersize ~= 'a4' and papersize ~= 'letter' then + io.stdout:write('Invalid paper size "'..papersize..'".'.. + ' Valid sizes: a4 letter\n') + os.exit(1) + else + set_dvips_papersize(papersize) + set_pdftex_papersize(papersize) + set_xdvi_papersize(papersize) + set_context_papersize(papersize) + set_dvipdfm_papersize(papersize, 'dvipdfm') + set_dvipdfm_papersize(papersize, 'dvipdfmx') + end +end + + +function usage_main() + local usage={ + 'help', + 'xdvi paper PAPER (xdvi paper size)', + 'dvips paper PAPER (dvips paper size)', + 'pdftex paper PAPER (pdftex paper size)', + 'dvipdfm paper PAPER (dvipdfm paper size)', + 'dvipdfmx paper PAPER (dvipdfmx paper size)', + 'paper [a4|letter] (paper size for all programs)', + 'init [FORMAT] ... (rebuild FORMATs, or all formats plus run updmap)', + 'rehash (rebuild ls-R files with mktexlsr)' + } + io.stdout:write('Usage:\n') + for i, msg in ipairs(usage) do + io.stdout:write(' '..usageprogname..' '..msg..'\n') + end + os.exit(0) +end + + +function usage_paper(progname) + io.stdout:write('Usage: '..usageprogname..' '..progname..' paper PAPER\n') + io.stdout:write(' '..usageprogname..' '..progname..' help\n') + os.exit(0) +end + + +function set_prog_papersize(prog,size) + if (prog == 'dvips') then + set_dvips_papersize(size) + elseif (prog == 'xdvi') then + set_xdvi_papersize(size) + elseif (prog == 'pdftex') then + set_pdftex_papersize(size) + elseif (prog == 'dvipdfm') then + set_dvipdfm_papersize(size, "dvipdfm") + elseif (prog == 'dvipdfmx') then + set_dvipdfm_papersize(size, "dvipdfmx") + end +end + + +if arg[1] == 'help' then + usage_main() +elseif arg[1] == 'paper' then + if arg[2] == 'help' or arg[2] == nil then + usage_main() + else + set_papersize(arg[2]) + end +elseif arg[1] == 'rehash' then + command = { "mktexlsr" } + command = fixwin(command) + os.exec(command) + -- does not return +elseif arg[1] == 'init' then + if arg[2] == nil then + -- we have set TEXMFCONFIG and TEXMFVAR to the SYS variants above, + -- so we can run the normal fmtutil/updmap program + os.execute('fmtutil --all') + os.execute('updmap') + else + for i=2, #arg do + os.execute('fmtutil --byfmt "'..arg[i]..'"') + end + end +elseif arg[1] == 'paper' then + set_papersize(arg[2]) +elseif arg[1] == 'dvips' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper('dvips') + elseif arg[2]=='paper' then + set_dvips_papersize(arg[3]) + end +elseif arg[1] == 'xdvi' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper('xdvi') + elseif arg[2]=='paper' then + set_xdvi_papersize(arg[3]) + end +elseif arg[1] == 'pdftex' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper(pdftex) + elseif arg[2]=='paper' then + set_pdftex_papersize(arg[3]) + end +elseif arg[1] == 'dvipdfm' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper('dvipdfm') + elseif arg[2]=='paper' then + set_dvipdfm_papersize(arg[3], 'dvipdfm') + end +elseif arg[1] == 'dvipdfmx' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper('dvipdfmx') + elseif arg[2]=='paper' then + set_dvipdfm_papersize(arg[3], 'dvipdfmx') + end +elseif arg[1] == 'context' then + if arg[2] == 'help' or arg[3]==nil then + usage_paper('context') + elseif arg[2]=='paper' then + set_context_papersize(arg[3]) + end +else + usage_main() +end + + +if sys and domktexlsr then + command = { "mktexlsr", texmfconfig } + command = fixwin(command) + os.spawn(command) +end + +if noformatopt then + doformat = false +end + +if doformat then + -- we have to update the formats + -- I don't know how to select only those formats for which pdftexconfig.tex + -- is necessary, so we call fmtutil-sys --refresh + -- that will recreate a lot, sorry + -- + -- on win32 texlua's os.spawn does not find fmtutil-sys.texlua as executable + -- even if I give it the full path. So we have to work around that + if sys then + command = 'fmtutil-sys --refresh' + else + command = 'fmtutil --refresh' + end + os.execute(command) +end + +-- Local Variables: +-- lua-indent-level: 2 +-- tab-width: 2 +-- indent-tabs-mode: nil +-- End: +-- vim:set tabstop=2 expandtab: # -- cgit v1.2.3