summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua')
-rw-r--r--Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua674
1 files changed, 674 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua b/Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua
new file mode 100644
index 00000000000..f633b89ab4c
--- /dev/null
+++ b/Master/texmf-dist/scripts/fontscripts/fntbuild-build.lua
@@ -0,0 +1,674 @@
+-- $Id: fntbuild-build.lua 10818 2025-02-19 05:44:13Z cfrees $
+-------------------------------------------------
+-- fntbuild-build
+-------------------------------------------------
+-------------------------------------------------
+-- buildinit_hook
+---@return 0
+---@usage public
+local function buildinit_hook () return 0 end
+-------------------------------------------------
+-- buildinit {{{
+-- hack copy of checkinit()
+---@return 0 on success, error level otherwise
+---@see
+---@usage public
+local function buildinit ()
+ cleandir(fnt.fntdir)
+ -- l3build never cleans this by default?
+ cleandir(localdir)
+ fnt.dep_install (fnt.builddeps)
+ -- is this a appropriate? better not?
+ for i,j in ipairs(filelist(localdir)) do
+ cp(j,localdir,fnt.fntdir)
+ end
+ print("Unpacking ...\n")
+ -- direct usage is legitimate ...
+ -- https://chat.stackexchange.com/transcript/message/66617079#66617079
+ assert(unpack(),"Unpacking failed in buildinit()!")
+ for i,j in ipairs(fnt.buildfiles) do
+ cp(j,unpackdir,fnt.fntdir)
+ end
+ if #fnt.buildsuppfiles_sys ~= 0 then
+ for _,j in ipairs(fnt.buildsuppfiles_sys) do
+ if fileexists(j) then
+ cp(basename(j),dirname(j),fnt.fntdir)
+ else
+ local jpath = kpse.find_file(j)
+ if jpath == nil then
+ jpath = kpse.lookup(j)
+ end
+ if jpath == nil then
+ fnt.gwall("Locating ",j,1)
+ end
+ local jdir = dirname(jpath)
+ cp(j,jdir,fnt.fntdir)
+ end
+ end
+ end
+ if fnt.needs_fontinst then
+ local path = kpse.var_value("TEXMFDIST") .. "/tex/fontinst"
+ local t = fnt.lsrdir(path)
+ for _,i in ipairs(t) do
+ local s = i
+ if string.match(i,"^fontscripts%-") then
+ s = (string.gsub(i,"^fontscripts%-",""))
+ end
+ local file = kpse.find_file(i)
+ if not fileexists(fnt.fntdir .. "/" .. i) then
+ cp(basename(file),dirname(file),fnt.fntdir)
+ if i ~= s and not fileexists(fnt.fntdir .. "/" .. s) then
+ ren(fnt.fntdir,i,s)
+ table.insert(fnt.buildsuppfiles_sys,s)
+ else
+ table.insert(fnt.buildsuppfiles_sys,i)
+ end
+ end
+ end
+ print("Copied fontinst files to " .. fnt.fntdir)
+ end
+ -- if not fnt.buildsearch then
+ -- -- we aren't typesetting, so we really don't need a map file
+ -- -- not sure this is really needed - do any tools use this anyway?
+ -- -- https://rosettacode.org/wiki/Create_a_file
+ -- io.open(fnt.fntdir .. "/pdftex.map", "w"):close()
+ -- end
+ print("Initialised build.")
+ return fnt.buildinit_hook()
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- build_tidy {{{
+---@usage public
+---@return 0 on success, errorlevel otherwise
+local function build_tidy ()
+ print("Tidying up build directory ...\n")
+ for _,i in ipairs(fnt.buildsuppfiles_sys) do
+ local errorlevel = rm(fnt.fntdir,i)
+ fnt.gwall("Removal of ",fnt.fntdir .. "/" .. i,errorlevel)
+ end
+ return 0
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- build_fnt {{{
+---@param file string
+---@param cmd string
+---@param file string
+---@return 0 on success, error level otherwise
+---@see
+---@usage public
+local function build_fnt (dir,cmd,file)
+ file = file or ""
+ cmd = cmd or ""
+ dir = dir or fnt.fntdir
+ local build_fnt_env = fnt.build_fnt_env or {}
+ local build_fnt_envset = ""
+ if #build_fnt_env ~= 0 then
+ for _,i in ipairs(build_fnt_env) do
+ build_fnt_envset = build_fnt_envset .. os_concat .. os_setenv .. " " .. i
+ end
+ end
+ -- steal from l3build-check.lua
+ local preamble =
+ -- would it be simpler to copy the typesetting sandbox here?
+ -- paths in the logs don't matter and copying localdir complicates things a bit
+ -- No use of localdir here as the files get copied to testdir:
+ -- avoids any paths in the logs
+ os_setenv .. " TEXINPUTS=." .. fnt.localtexmf()
+ .. (fnt.buildsearch and os_pathsep or "")
+ .. os_concat ..
+ -- no need for LUAINPUTS here
+ -- but we need to set more variables ...?!
+ (fnt.buildsearch and "" or
+ (os_setenv .. " TEXMFAUXTREES={}"
+ .. os_concat .. os_setenv .. " TEXMFHOME={}"
+ .. os_concat .. os_setenv .. " TEXMFLOCAL={}"
+ .. os_concat .. os_setenv .. " TEXMFCONFIG=."
+ .. os_concat .. os_setenv .. " TEXMFVAR=."
+ .. os_concat .. os_setenv .. " VFFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " TFMFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " TEXFONTMAPS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " T1FONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " AFMFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " TTFFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " OPENTYPEFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " LIGFONTS=${TEXINPUTS}"
+ .. os_concat .. os_setenv .. " ENCFONTS=${TEXINPUTS}")
+ )
+ .. build_fnt_envset
+ .. os_concat
+ local errorlevel = runcmd(
+ preamble .." " .. cmd .. " " .. file, dir
+ )
+ fnt.gwall(cmd,file,errorlevel)
+ return errorlevel
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- fntkeeper {{{
+---@param dir string
+---@return 0 on success, error level otherwise
+---@see
+---@usage public
+local function fntkeeper (dir)
+ dir = dir or fnt.fntdir
+ if fileexists(dir .. "/pdftex.map") then
+ local errorlevel = rm(dir,"pdftex.map")
+ fnt.gwall("Removing ","pdftex.map",errorlevel)
+ end
+ local rtn = direxists(fnt.keepdir)
+ if not rtn then
+ local errorlevel = mkdir(fnt.keepdir)
+ if errorlevel ~= 0 then
+ print("DO NOT BUILD STANDARD TARGETS WITHOUT RESOLVING!!\n")
+ fnt.gwall("Attempt to create directory ", fnt.keepdir, errorlevel)
+ end
+ else
+ local errorlevel = cleandir(fnt.keepdir)
+ if errorlevel ~= 0 then
+ print("KEEP CONTAMINATED!\n")
+ fnt.gwall("Attempt to clean directory ",fnt.keepdir,errorlevel)
+ end
+ end
+ local keepdir = abspath(fnt.keepdir) -- abspath requires existence
+ if fnt.keepfiles ~= {} then
+ for i,j in ipairs(fnt.keepfiles) do
+ local rtn = cp(j, dir, keepdir)
+ if rtn ~= 0 then
+ fnt.gwall("Copy ", j, errorlevel)
+ print("DO NOT BUILD STANDARD TARGETS WITHOUT RESOLVING!\n")
+ end
+ end
+ else
+ print("ARE YOU SURE YOU DON'T WANT TO KEEP THE FONTS??!!\n")
+ end
+ if fnt.keeptempfiles ~= {} then
+ rtn = direxists(fnt.keeptempdir)
+ if not rtn then
+ local errorlevel = mkdir(fnt.keeptempdir)
+ if errorlevel ~= 0 then
+ fnt.gwall("Attempt to create directory ", fnt.keeptempdir, errorlevel)
+ end
+ else
+ local errorlevel = cleandir(fnt.keeptempdir)
+ if errorlevel ~= 0 then
+ print("keeptemp contaminated!\n")
+ fnt.gwall("Attempt to clean directory ",fnt.keeptempdir,errorlevel)
+ end
+ end
+ for i,j in ipairs(fnt.keeptempfiles) do
+ local errorlevel = cp(j,dir,fnt.keeptempdir)
+ if errorlevel ~= 0 then
+ fnt.gwall("Copy ", j, errorlevel)
+ end
+ end
+ end
+ return fnt.nifergwall
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- fnt_subset {{{
+---@params fd, family, fnt.subset
+---@usage private
+local function fnt_subset (fd,fam,subset)
+ local defn = string.gsub(fnt.subsettemplate,"%$FONTFAMILY",fam)
+ defn = string.gsub(defn,"%$SUBSET",subset)
+ local f = assert(io.open(fnt.fntdir .. "/" .. fd, "rb"))
+ local content = f:read("*all")
+ f:close()
+ local patt
+ if string.match(content, "\\endinput") then
+ patt = "(\\endinput)"
+ else
+ patt = "()$"
+ end
+ f = assert(io.open(fnt.fntdir .. "/" .. fd, "w"))
+ f:write("%% Encoding subset declaration added by fontscripts\n",
+ (string.gsub(content,patt,"\n\n" .. defn .. "\n\n%1"))
+ )
+ f:close()
+ return 0 -- how to make this return an error level?
+end
+-- }}}
+-------------------------------------------------
+-- fntsubsetter {{{
+---@param
+---@description add encoding fnt.subset definitions for TS1 if applicable and requested
+---@return 0 on success, error level or 1 otherwise
+---@see
+---@usage public
+local function fntsubsetter ()
+ local tcsubset = tcsubset or "9"
+ if fnt.subset == nil or fnt.subset == false then return 0 end
+ local subsetfiles = fnt.subsetfiles or {}
+ if type(subsetfiles) == "string" and subsetfiles ~= "auto" then
+ local s = subsetfiles
+ subsetfiles = { s }
+ end
+ if #subsetfiles == 0 then
+ for i in lfs.dir(fnt.fntdir) do
+ -- we avoid using filelist() here because it doesn't support char sets
+ if string.match(i, "^[Tt][Ss]1.*%.fd$") then
+ table.insert(subsetfiles,i)
+ end
+ end
+ end
+ if #subsetfiles == 0 then return 0 end
+ for _, i in ipairs(subsetfiles) do
+ local fam = string.gsub(i, "^[Tt][Ss]1(.+)%.fd$", "%1")
+ local s = fnt.subsetdefns[fam] or tcsubset
+ local errorlevel = fnt_subset(i,fam,s)
+ fnt.gwall("Inserting TS1 subset definition ",i,errorlevel)
+ end
+ return fnt.nifergwall
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- uniquify {{{
+-- oherwydd fy mod i bron ag anfon pob un ac mae'n amlwg fy mod i wedi anfon
+-- bacedi heb ei wneud hwn yn y gorffennol, well i mi wneud rhywbeth (scriptiau
+-- gwneud-cyhoeddus a make-public yn argraffu rhybudd os encs yn y cymysg
+-- (cymraeg yn ofnadwy hefyd)
+---@param tag string
+---@return 0 on success, error level or 1 otherwise
+---@see
+---@usage public
+local function uniquify (tag)
+ local dir = ""
+ tag = tag or fnt.encodingtag or ""
+ local pkgbase = fnt.pkgbase or ""
+ local pkglist = {}
+ if fnt.standalone then
+ dir = fnt.keepdir
+ else
+ dir = fnt.fntdir
+ end
+ -- if fileexists(dir .. "/pdftex.map") then
+ -- print("\nRemoving temporary pdftex.map from ", dir, "...\n")
+ -- local errorlevel = rm(dir,"pdftex.map")
+ -- fnt.gwall("Removing ","pdftex.map",errorlevel)
+ -- end
+ if pkgbase == "" then
+ print("pkgbase unspecified. Trying to guess ... ")
+ if not fnt.standalone then
+ pkglist = filelist(dir,"*.sty")
+ if #pkglist == 0 then
+ pkglist = filelist(unpackdir,"*.sty")
+ end
+ if #pkglist ~= 0 then
+ pkgbase = string.gsub(pkglist[1], "%.sty", "")
+ print("Guessing ", pkgbase)
+ end
+ end
+ end
+ if pkgbase == "" then
+ if ctanpkg ~= module and module ~= "" and module ~= nil then
+ print("Guessing ", module)
+ pkgbase = module
+ else
+ pkgbase = string.gsub(ctanpkg, "adf$", "")
+ if pkgbase ~= "" then
+ print("Guessing ", pkgbase)
+ end
+ end
+ end
+ if pkgbase == "" then
+ pkgbase = "NotAMatchAtAll"
+ fnt.gwall("Guessing pkgbase ","",1)
+ end
+ local encs = encs or filelist(dir,"*.enc")
+ local maps = maps or filelist(dir,"*.map")
+ print("Uniquifying encodings ... ")
+ for _,i in ipairs(encs) do print(" ", i) end
+ print("\nUniquifying maps ... ")
+ for _,i in ipairs(maps) do print(" ", i) end
+ print(" ...\n")
+ if #encs == 0 then
+ return 0
+ elseif tag == "" then
+ if #maps ~= 0 then
+ if #maps == 1 then
+ tag = string.gsub(maps[1],"%.map$","")
+ else
+ local t = ""
+ local tt = ""
+ for i,j in ipairs(maps) do
+ if tt == t then
+ tt = string.gsub(j,"%w%.map$","")
+ elseif t == "" then
+ t = string.gsub(j,"%w%.map$","")
+ end
+ end
+ if t == tt then
+ tag = tt
+ else
+ fnt.gwall("Attempt to find tag ","",1)
+ end
+ end
+ end
+ if tag ~= "" then
+ for i, j in ipairs(encs) do
+ if string.match(j,"-" .. tag .. "%.enc$")
+ or string.match(j, module)
+ or string.match(j,ctanpkg)
+ or string.match(j,pkgbase)
+ or string.match(j, string.gsub(module, "adf", "")) then
+ print(j, "... OK\n")
+ else
+ local targenc = (string.gsub(j,"%.enc$","-" .. tag .. ".enc"))
+ print("Target encoding is", targenc, "\n")
+ if fileexists(dir .. "/" .. targenc) then
+ fnt.gwall("Target encoding exists !! ", targenc, 1)
+ return 1
+ else
+ local f = assert(io.open(dir .. "/" .. j,"rb"))
+ local content = f:read("*all")
+ f:close()
+ local new_content = (string.gsub(content,
+ "(\n%%%%BeginResource: encoding fontinst%-autoenc[^\n ]*)( *\n/fontinst%-autoenc[^ %[]*)( %[)",
+ "\n%% Encoding renamed by fontscripts\n\n%1-"
+ .. tag .. "%2-" .. tag .. "%3"
+ ))
+ if new_content ~= content then
+ print("Writing unique encoding to ", targenc)
+ f = assert(io.open(dir .. "/" .. targenc,"w"))
+ -- remove the second value returned by string.gsub
+ f:write((string.gsub(new_content,"\n",fnt.os_newline_cp)))
+ f:close()
+ if fileexists(dir .. "/" .. targenc) then
+ local errorlevel = rm(dir,j)
+ if errorlevel ~= 0 then
+ fnt.gwall("Attempt to rm old encoding ",j,errorlevel)
+ end
+ if #maps ~= 0 then
+ local jpatt = string.gsub(j,"%-","%%-")
+ jpatt = string.gsub(jpatt,"%.","%%.")
+ for k,m in ipairs(maps) do
+ f = assert(io.open(dir .. "/" .. m,"rb"))
+ local mcontent = f:read("*all")
+ f:close()
+ local new_mcontent = (string.gsub(mcontent,
+ "(%<%[?)" .. jpatt ..
+ "( %<%w+%.pfb \" fontinst%-autoenc[%w%-_]*)( ReEncodeFont)",
+ "%1" .. targenc .. "%2-" .. tag .. "%3"
+ ))
+ if new_mcontent ~= mcontent then
+ print("Writing adjusted map lines to ", m)
+ f = assert(io.open(dir .. "/" .. m,"w"))
+ -- remove the second value returned by string.gsub
+ f:write("%% Encodings renamed by fontscripts\n",
+ (string.gsub(new_mcontent,"\n",fnt.os_newline_cp)))
+ f:close()
+ else
+ print("Nothing to do for ", m, ".\n")
+ end
+ end
+ else
+ print("FOUND NO MAPS??\n")
+ end
+ else
+ fnt.gwall("Attempt to write ",targenc,1)
+ end
+ else
+ fnt.gwall("Attempt to uniquify " .. j .. " as ",targenc,1)
+ end
+ end
+ end
+ end
+ end
+ return fnt.nifergwall
+ end
+ print("Something weird happened.\n")
+ return 1
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- fontinst
+-------------------------------------------------
+-- finst {{{
+---@param patt string
+---@param dir string
+---@param mode string
+---@return
+---@see
+---@usage public
+local function finst (patt,dir,mode)
+ dir = dir or "."
+ mode = mode or "nonstopmode"
+ local cmd = "pdftex --interaction=" .. mode
+ -- https://lunarmodules.github.io/luafilesystem/examples.html (expl)
+ -- l3build-file-functions.lua (filelist fn)
+ local targs = filelist(dir,patt)
+ for i,j in ipairs(targs) do
+ -- local errorlevel = tex(j,dir,cmd)
+ local errorlevel = build_fnt(dir,cmd,j)
+ fnt.gwall("Compilation of ", j, errorlevel)
+ end
+end
+-- }}}
+-------------------------------------------------
+-- fontinst {{{
+---@param dir string
+---@param mode string
+---@return 0 on success, error level otherwise
+---@see
+---@usage public
+local function fontinst (dir,mode)
+ -- dir = dir or unpackdir
+ dir = dir or fnt.fntdir
+ mode = mode or "errorstopmode --halt-on-error"
+ fnt.standalone = false
+ fnt.encodingtag = fnt.encodingtag or ""
+ local errorlevel = 0
+ buildinit ()
+ local tfmfiles = filelist(dir,"*.tfm")
+ for i,j in ipairs(tfmfiles) do
+ local plname = string.gsub(j, "%.tfm$", ".pl")
+ if fileexists(dir .. "/" .. plname) then
+ print(plname, "already exists!")
+ return 1
+ else
+ local cmd = "tftopl " .. j .. " " .. plname
+ -- safe or not?
+ errorlevel = runcmd(cmd,dir)
+ -- necessary or not?
+ -- local errorlevel = build_fnt(cmd,dir)
+ fnt.gwall("Conversion to pl from tfm ",j,errorlevel)
+ -- remove tfm to reduce pollution of package later
+ rm(dir,j)
+ fnt.gwall("Deletion of tfm ", j, errorlevel)
+ end
+ end
+ print("Creating families ...\n")
+ for i,j in ipairs(fnt.familymakers) do
+ errorlevel = finst(j,dir,mode)
+ fnt.gwall("Compilation of driver ", j, errorlevel)
+ end
+ if fnt.nifergwall ~= 0 then return fnt.nifergwall end
+ for i,j in ipairs(fnt.mapmakers) do
+ errorlevel = finst (j,dir,mode)
+ fnt.gwall("Compilation of map ", j, errorlevel)
+ end
+ if fnt.nifergwall ~= 0 then return fnt.nifergwall end
+ errorlevel = build_tidy ()
+ fnt.gwall("Tidying ",fnt.fntdir,errorlevel)
+ -- print("Tidying up build directory ...\n")
+ -- for _,i in ipairs(fnt.buildsuppfiles_sys) do
+ -- local errorlevel = rm(dir,i)
+ -- fnt.gwall("Removal of ",dir .. "/" .. i,errorlevel)
+ -- end
+ for i,j in ipairs(fnt.binmakers) do
+ local targs = filelist(dir,j)
+ -- https://www.lua.org/pil/21.1.html
+ for k,m in ipairs(targs) do
+ targ = dir .. "/" .. m
+ -- is this really the right way to do this?
+ -- surely it is not at all safe?
+ -- though presumably no worse than executing the script directly
+ for line in io.lines(targ) do
+ if string.match(line,"^pltotf [a-zA-Z0-9%-]+%.pl [a-zA-Z0-9%-]+%.tfm$") then
+ -- local errorlevel = runcmd(line,dir)
+ errorlevel = build_fnt(dir,line)
+ fnt.gwall("Creation of TFM using " .. line .. " from ", j, errorlevel)
+ else
+ print("Ignoring unexpected line \"" .. line .. "\" in", j .. ".\n")
+ fnt.nifergwall = fnt.nifergwall + 1
+ end
+ end
+ end
+ end
+ if fnt.nifergwall ~= 0 then return fnt.nifergwall end
+ local targs = filelist(dir,"*.vpl")
+ for i,j in ipairs(targs) do
+ -- local cmd = "vptovf " .. j
+ -- local errorlevel = runcmd(cmd,dir)
+ local cmd = "vptovf"
+ errorlevel = build_fnt(dir,cmd,j)
+ fnt.gwall("Creation of virtual font from ", j, errorlevel)
+ end
+ -- edit the .fd files if a scale factor is declared because fontinst
+ -- doesn't allow us to do this and the last message to the mailing list
+ -- is from 2022 with no response from the maintainer
+ local fdfiles = filelist(dir, "*.fd")
+ for i,j in ipairs(fdfiles) do
+ local f = assert(io.open(dir .. "/" .. j,"rb"))
+ local content = f:read("*all")
+ f:close()
+ local new_content = content
+ local csscaleaux = string.match(content, "%<%-%> *\\([%a%d][%a%d]*@@scale)")
+ if csscaleaux ~= nil then
+ local csscale = string.gsub(csscaleaux, "@(@)", "%1")
+ if csscale ~= nil then
+ new_content = string.gsub(content, "(\\DeclareFontFamily{)",
+ "%% addaswyd o t1phv.fd (dyddiad y ffeil fd: 2020-03-25)\n\\expandafter\\ifx\\csname "
+ .. csscale .. "\\endcsname\\relax\n \\let\\" .. csscaleaux
+ .. "\\@empty\n\\else\n \\edef\\" .. csscaleaux
+ .. "{s*[\\csname " .. csscale .. "\\endcsname]}%%\n\\fi\n\n%1")
+ end
+ end
+ csscaleaux = string.match(content,
+ "\\DeclareFontFamily{[^}]*}{[^}]*}{[^}]*\\hyphenchar *\\font *=[^}\n]*}")
+ if csscaleaux ~= nil then
+ content = new_content
+ new_content = string.gsub(content,
+ "(\\DeclareFontFamily{[^}]*}{[^}]*}{\\hyphenchar) *(\\font) *(=[^ }\n]*) *([^ }\n]* *})",
+ "%1%2%3%4")
+ end
+ if new_content ~= content then
+ local f = assert(io.open(dir .. "/" .. j,"w"))
+ -- this somehow removes the second value returned by string.gsub??
+ f:write("%% Scaling added by fontscripts\n",(string.gsub(new_content,
+ "\n",fnt.os_newline_cp)))
+ f:close()
+ end
+ end
+ errorlevel = uniquify(fnt.encodingtag)
+ if errorlevel ~= 0 then
+ fnt.gwall("Encodings not uniquified! Do not submit to CTAN! uniquify("
+ .. fnt.encodingtag .. ")","",errorlevel)
+ end
+ errorlevel = fntsubsetter()
+ if errorlevel ~= 0 then
+ fnt.gwall("Encoding fnt.subset definitions not inserted! fntsubsetter() ","",errorlevel)
+ end
+ errorlevel = fntkeeper()
+ if errorlevel ~= 0 then
+ fnt.gwall(
+ "FONT KEEPER FAILED! DO NOT MAKE STANDARD TARGETS WITHOUT RESOLVING!! fntkeeper() ",
+ dir, errorlevel)
+ end
+ return fnt.nifergwall
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- afm2tfm (simple symbol fonts only)
+-------------------------------------------------
+-- afm2tfm (dir) {{{
+---@param dir string
+---@return 0 on success, number of errors otherwise
+---@see
+---@usage public
+local function afm2tfm (dir)
+ dir = dir or fnt.fntdir
+ local fntbasename = fntbasename or module
+ local map = mapfile or fntbasename .. ".map"
+ local fntencs = fnt.encs or {}
+ fnt.standalone = false
+ fnt.encodingtag = fnt.encodingtag or ""
+ buildinit ()
+ print("Running afm2tfm. Please be patient ...\n")
+ local afms = filelist(dir,"*.afm")
+ local content = ""
+ for i,k in ipairs(afms) do
+ j = string.gsub(k,"%.afm","")
+ if fntencs[j] == nil then
+ local rtn = fileexists(dir .. "/" .. j .. ".enc")
+ if not rtn then
+ errorlevel = build_fnt(dir,"afm2tfm " .. k " >> " .. dir
+ .. "/" .. map .. ".tmp")
+ else
+ errorlevel = build_fnt(dir, "afm2tfm " .. k .. " -p " .. j
+ .. ".enc" .. " >> " .. dir .. "/" .. map .. ".tmp")
+ end
+ elseif not fileexists(dir .. "/" .. fntencs[j]) then
+ fnt.gwall("Search for encoding specified for " .. j .. " ",dir,1)
+ else
+ errorlevel = build_fnt(dir, "afm2tfm " .. k .. " -p " .. fntencs[j]
+ .. " >> " .. dir .. "/" .. map .. ".tmp")
+ end
+ if errorlevel ~= 0 then
+ fnt.gwall("afm2tfm (" .. j ..") ",dir,errorlevel)
+ else
+ local g = assert(io.open(dir .. "/" .. map .. ".tmp","rb"))
+ local c = g:read("all")
+ g:close()
+ content = content .. string.gsub(c, "\n", " <"
+ .. string.gsub(k,"%.afm",".pfb") .. "\n")
+ rm(dir, map .. ".tmp")
+ end
+ end
+ -- need to do this as uniquify() isn't used
+ -- otherwise the file ends up in localdir (and probably the package)
+ -- catching this is the only benefit I can see in my inability to clean localdir
+ -- if fileexists(dir .. "/pdftex.map") then
+ -- local errorlevel = rm(dir,"pdftex.map")
+ -- fnt.gwall("Removing ","pdftex.map",errorlevel)
+ -- end
+ local f
+ f = assert(io.open(dir .. "/" .. map, "w"))
+ f:write((string.gsub(content,"\n",fnt.os_newline_cp)))
+ f:close()
+ errorlevel = fntkeeper()
+ if errorlevel ~= 0 then
+ fnt.gwall("FONT KEEPER FAILED! DO NOT MAKE STANDARD TARGETS WITHOUT RESOLVING!! ",
+ dir, errorlevel)
+ end
+ return fnt.nifergwall
+end
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- exports {{{
+fnt.build_fnt = build_fnt
+fnt.build_tidy = build_tidy
+fnt.buildinit = buildinit
+fnt.buildinit_fontinst = buildinit_fontinst
+fnt.buildinit_hook = buildinit_hook
+fnt.finst = finst
+fnt.fntkeeper = fntkeeper
+fnt.fntsubsetter = fntsubsetter
+fnt.afm2tfm = afm2tfm
+fnt.fontinst = fontinst
+fnt.uniquify = uniquify
+-- }}}
+-------------------------------------------------
+-------------------------------------------------
+-- vim: ts=2:sw=2:et:foldmethod=marker: