if not modules then modules = { } end modules ['supp-fil'] = { version = 1.001, comment = "companion to supp-fil.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -- This module will be redone ! -- context is not defined yet! todo! (we need to load tupp-fil after cld) --[[ldx--

It's more convenient to manipulate filenames (paths) in than in . These methods have counterparts at the side.

--ldx]]-- local find, gsub, match, format, concat = string.find, string.gsub, string.match, string.format, table.concat local texcount = tex.count local isfile = lfs.isfile local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end) local report_modules = logs.new("modules") commands = commands or { } local commands = commands environment = environment or { } local environment = environment local findbyscheme = resolvers.finders.byscheme function commands.checkfilename(str) -- "/whatever..." "c:..." "http://..." texcount.kindoffile = (find(str,"^/") or find(str,"[%a]:") and 1) or 0 end function commands.thesanitizedfilename(str) context((gsub(str,"\\","/"))) end local testcase = commands.testcase function commands.splitfilename(fullname) local path, name, base, suffix, kind = '', fullname, fullname, '', 0 local p, n = match(fullname,"^(.+)/(.-)$") if p and n then path, name, base = p, n, n end local b, s = match(base,"^(.+)%.(.-)$") if b and s then name, suffix = b, s end texcount.splitoffkind = (path == "" and 0) or (path == '.' and 1) or 2 local setvalue = context.setvalue setvalue("splitofffull", fullname) setvalue("splitoffpath", path) setvalue("splitoffbase", base) setvalue("splitoffname", name) setvalue("splitofftype", suffix) end function commands.splitfiletype(fullname) local name, suffix = fullname, '' local n, s = match(fullname,"^(.+)%.(.-)$") if n and s then name, suffix = n, s end local setvalue = context.setvalue setvalue("splitofffull", fullname) setvalue("splitoffpath", "") setvalue("splitoffname", name) setvalue("splitofftype", suffix) end function commands.doifparentfileelse(n) testcase(n == environment.jobname or n == environment.jobname .. '.tex' or n == environment.outputfilename) end -- saves some .15 sec on 12 sec format generation local lastexistingfile = "" function commands.doiffileexistelse(name) if not name or name == "" then lastexistingfile = "" else lastexistingfile = resolvers.findtexfile(name) or "" end return testcase(lastexistingfile ~= "") end function commands.lastexistingfile() context(lastexistingfile) end -- more, we can cache matches local finders, loaders, openers = resolvers.finders, resolvers.loaders, resolvers.openers local found = { } -- can best be done in the resolver itself -- todo: tracing local function readfilename(specification,backtrack,treetoo) local name = specification.filename local fnd = found[name] if not fnd then if fnd ~= "" and isfile(name) then fnd = name end if backtrack and (not fnd or fnd == "") then local fname = name for i=1,backtrack,1 do fname = "../" .. fname if isfile(fname) then fnd = fname break end end end if not fnd and treetoo then fnd = resolvers.findtexfile(name) end found[name] = fnd end return fnd or "" end function commands.readfilename(filename) return findbyscheme("any",filename) end function finders.job(specification) return readfilename(specification,false,false) end -- current path, no backtracking function finders.loc(specification) return readfilename(specification,2, false) end -- current path, backtracking function finders.sys(specification) return readfilename(specification,false,true ) end -- current path, obeys tex search function finders.fix(specification) return readfilename(specification,2, false) end -- specified path, backtracking function finders.set(specification) return readfilename(specification,false,false) end -- specified path, no backtracking function finders.any(specification) return readfilename(specification,2, true ) end -- loc job sys openers.job = openers.file loaders.job = loaders.file -- default anyway openers.loc = openers.file loaders.loc = loaders.file openers.sys = openers.file loaders.sys = loaders.file openers.fix = openers.file loaders.fix = loaders.file openers.set = openers.file loaders.set = loaders.file openers.any = openers.file loaders.any = loaders.file function commands.doreadfile(scheme,path,name) -- better do a split and then pass table local fullname if url.hasscheme(name) then fullname = name else fullname = ((path == "") and format("%s:///%s",scheme,name)) or format("%s:///%s/%s",scheme,path,name) end context(resolvers.findtexfile(fullname)) -- can be more direct end -- modules can have a specific suffix or can specify one local prefixes = { "m", "p", "s", "x", "v", "t" } local suffixes = { "mkiv", "tex", "mkvi" } -- order might change and how about cld local modstatus = { } local function usemodule(name,hasscheme) local foundname if hasscheme then -- no auto suffix as http will return a home page or error page -- so we only add one if missing local fullname = file.addsuffix(name,"tex") if trace_modules then report_modules("checking scheme driven file '%s'",fullname) end foundname = resolvers.findtexfile(fullname) or "" elseif file.extname(name) ~= "" then if trace_modules then report_modules("checking suffix driven file '%s'",name) end foundname = findbyscheme("any",name) or "" elseif true then for i=1,#suffixes do local fullname = file.addsuffix(name,suffixes[i]) if trace_modules then report_modules("checking suffix driven file '%s'",fullname) end foundname = findbyscheme("any",fullname) or "" if foundname ~= "" then break end end else -- -- we don't want a tex file for each mkiv file so we do some checking -- local foundtexname = readfilename(file.addsuffix(name,"tex"), false,true) or "" -- local foundmkivname = readfilename(file.addsuffix(name,"mkiv"),false,true) or "" -- if foundtexfile ~= "" and foundmkivfile ~= "" then -- if file.dirname(foundtexname) == file.dirname(foundmkivname) then -- foundname = foundtexname -- we assume that this (shared) file loads the mkiv file -- if trace_modules then -- report_modules("using tex file for module '%s' (mkiv file on same dir)",name) -- end -- else -- foundname = foundmkivname -- we assume that the tex file is an old one someplace else -- if trace_modules then -- report_modules("using mkiv file for module '%s' (tex file on other dir)",name) -- end -- end -- elseif foundtexfile ~= "" then -- foundname = foundtexname -- if trace_modules then -- report_modules("using tex file for module '%s'",name) -- end -- elseif foundmkivfile ~= "" then -- foundname = foundmkivname -- if trace_modules then -- report_modules("using mkiv file for module '%s'",name) -- end -- else -- -- nothing -- end end if foundname ~= "" then if trace_modules then report_modules("loading '%s'",foundname) end context.startreadingfile() context.input(foundname) context.stopreadingfile() return true else return false end end function commands.usemodules(prefix,askedname,truename) local hasprefix = prefix and prefix ~= "" local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename local status = modstatus[hashname] if status == 0 then -- not found elseif status == 1 then status = status + 1 else if trace_modules then report_modules("locating '%s'",truename) end local hasscheme = url.hasscheme(truename) if hasscheme then -- no prefix and suffix done if usemodule(truename,true) then status = 1 else status = 0 end elseif hasprefix then if usemodule(prefix .. "-" .. truename) then status = 1 else status = 0 end else for i=1,#prefixes do -- todo: reconstruct name i.e. basename local thename = prefixes[i] .. "-" .. truename if usemodule(thename) then status = 1 break end end if status then -- ok, don't change elseif usemodule(truename) then status = 1 else status = 0 end end end if status == 0 then if trace_modules then report_modules("skipping '%s' (not found)",truename) else interfaces.showmessage("systems",6,askedname) end elseif status == 1 then if not trace_modules then interfaces.showmessage("systems",5,askedname) end else if trace_modules then report_modules("skipping '%s' (already loaded)",truename) else interfaces.showmessage("systems",7,askedname) end end modstatus[hashname] = status end statistics.register("loaded tex modules", function() if next(modstatus) then local t, f, nt, nf = { }, { }, 0, 0 for k, v in table.sortedhash(modstatus) do k = file.basename(k) if v == 0 then nf = nf + 1 f[nf] = k else nt = nt + 1 t[nt] = k end end local ts = (nt>0 and format(" (%s)",concat(t," "))) or "" local fs = (nf>0 and format(" (%s)",concat(f," "))) or "" return format("%s requested, %s found%s, %s missing%s",nt+nf,nt,ts,nf,fs) else return nil end end)