Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/usr/bin/env lua5.1 -- flsfile.lua: extract the important files from a ".fls" file. -- This file: http://angg.twu.net/LUA/flsfiles.lua -- http://angg.twu.net/LUA/flsfiles.lua.html -- (find-angg "LUA/flsfiles.lua") -- By: Eduardo Ochs <eduardoochs@gmail.com> -- Version: 2016feb17 / 2021jul24 -- Public domain. -- -- Here's how I use this script. -- To recompile one of my .tex files from scratch I usually do -- something like this: -- -- cd ~/LATEX/ -- # See: (find-LATEX "2019.mk") -- make -f 2019.mk STEM=2021lindenhovius-j-to-X veryclean -- make -f 2019.mk STEM=2021lindenhovius-j-to-X pdf -- -- which corresponds, modulo small details, to: -- -- cd ~/LATEX/ -- # "rm" lots of files starting with "2021lindenhovius-j-to-X.", then: -- lualatex -record 2021lindenhovius-j-to-X.tex -- biber 2021lindenhovius-j-to-X -- lualatex 2021lindenhovius-j-to-X.tex -- -- the step that starts with "lualatex -record" generates a file -- called "2021lindenhovius-j-to-X.fls", that lists all the files that -- lualatex used to build the .pdf, but that is in a format that needs -- some cleanups to be usable... this script does these clean-ups. The -- "-record" option in mentioned briefly in the manpage of -- tex/latex/pdflatex/lualatex/etc, here: -- -- (find-man "1 tex" "-recorder" ".fls") -- -- In my ~/.zshrc I have these definitions for the shell functions -- "flsfiles", "flsfiles-tgz", and "flsfiles-zip": -- -- # From: (find-angg ".zshrc" "flsfiles") -- function flsfiles () { ~/LUA/flsfiles.lua $1 | grep -v "^/" } -- function flsfiles-tgz () { tar -chvzf "$2" $(flsfiles $1) } -- function flsfiles-zip () { rm -fv "$2"; zip "$2" $(flsfiles $1) } -- -- If I run these commands -- -- cd ~/LATEX/ -- flsfiles-tgz 2021lindenhovius-j-to-X.fls 2021lindenhovius-j-to-X.tgz -- flsfiles-zip 2021lindenhovius-j-to-X.fls 2021lindenhovius-j-to-X.zip -- -- the calls to "flsfiles-tgz" and "flsfiles-zip" produce files -- "2021lindenhovius-j-to-X.tgz" and "2021lindenhovius-j-to-X.zip" -- with all the source files needed to recompile my .tex. This -- includes all the lua files; it was a bit tricky to make this work -- correctly for dednat6... the gory details are here: -- -- http://angg.twu.net/LATEX/dednat6/lualoader.lua.html#dednatlualoader -- (find-LATEX "dednat6/lualoader.lua" "dednatlualoader") -- -- Actually I have a couple of 5-minute(-ish) hacks, as complex as -- these ones here, -- -- (find-angg ".emacs.videos" "eevtempl") -- (find-eevtemplvideo "19:23" "5. `find-youtubedl-links'") -- -- that generate all the shell commands above for a given .tex file -- and that let me execute them with very keystrokes. I haven't -- documented them yet; if you think that you would like to adapt that -- to your workflow, please get in touch: -- -- http://angg.twu.net/contact.html -- NOTE (2022oct23): this file needs my init file. See: -- http://angg.twu.net/LUA/lua50init.lua.html -- (find-angg "LUA/lua50init.lua") -- TODO: fix that! Use this as a reference: -- http://angg.twu.net/luatree/luatree.lua.html -- (find-angg "luatree/luatree.lua") dofile "/home/edrx/LUA/lua50init.lua" -- «.FlsFiles» (to "FlsFiles") -- «.FlsFiles-tests» (to "FlsFiles-tests") -- «.main» (to "main") -- _ _ -- _ __ _ __ ___ __ _ _ __ ___ | |__ | | ___ -- | '_ \| '__/ _ \/ _` | '_ ` _ \| '_ \| |/ _ \ -- | |_) | | | __/ (_| | | | | | | |_) | | __/ -- | .__/|_| \___|\__,_|_| |_| |_|_.__/|_|\___| -- |_| -- -- See: (find-es "lua5" "getdefs") readfile = function (fname) local f = assert(io.open(fname, "r")) local bigstr = f:read("*a") f:close() return bigstr end ee_readfile = function (fname) return readfile(ee_expand(fname)) end split = function (str, pat) local arr = {} string.gsub(str, pat or "([^%s]+)", function (word) table.insert(arr, word) end) return arr end ee_expand = function (path) path = string.gsub(path, "^~$", "$HOME/", 1) path = string.gsub(path, "^~/", "$HOME/", 1) path = string.gsub(path, "^%$(%w+)", os.getenv, 1) return path end Set = Class { type = "Set", new = function () return Set {_={}} end, from = function (L) return Set.fromarray(L) end, fromarray = function (L) local C = Set.new() for i,v in ipairs(L) do C._[v]=v end return C end, __add = function (A, B) -- union local C = Set.new() for k,v in pairs(A._) do C._[v]=v end for k,v in pairs(B._) do C._[v]=v end return C end, __sub = function (A, B) -- difference local C = Set.new() for k,v in pairs(A._) do C._[v]=v end for k,v in pairs(B._) do C._[v]=nil end return C end, __mul = function (A, B) -- intersection local C = Set.new() for k,v in pairs(A._) do if B._[v] then C._[v]=v end end return C end, __len = function (A) print"!" return #(keys(A._)) end, -- number of elements __tostring = function (A) return "(Set with "..A:n().." elements)" end, -- -- Methods __index = { has = function (A, k) return A._[k] end, n = function (A) return #keys(A._) end, k = function (A) return keys(A._) end, ks = function (A) return sorted(keys(A._)) end, ksc = function (A, sep) return table.concat(A:ks(), sep or "\n") end, gen = function (A) return cow(function () for i,v in ipairs(A:ks()) do coy(v) end end) end, add = function (A, key, val) A._[key] = val or key return A end, del = function (A, key) A._[key] = nil return A end, }, } coy = coroutine.yield cow = coroutine.wrap -- _ _ -- | |__ ___ __| |_ _ -- | '_ \ / _ \ / _` | | | | -- | |_) | (_) | (_| | |_| | -- |_.__/ \___/ \__,_|\__, | -- |___/ flsfiles_nontrivial0 = function (bigstr) return cow(function () for li in bigstr:gmatch "[^\n]+" do local fn = li:match("^INPUT (.*)") if fn and not fn:match "/usr/share/" and not fn:match "/%.texmf%-var/" and not fn:match "%.aux$" and not fn:match "%.out$" and true then if fn:match "^%./" then fn = fn:sub(3) end coy(fn) end end end) end flsfiles_nontrivial = function (fname) return flsfiles_nontrivial0(ee_readfile(fname)) end flsfiles_nontrivialset = function (fname) local s = Set:new() for fn in flsfiles_nontrivial(fname) do s:add(fn) end return s end -- local fname = ... -- if fname then -- local s = flsfiles_nontrivialset(fname) -- print(s:ksc()) -- end -- _____ _ _____ _ _ -- | ___| |___| ___(_) | ___ ___ -- | |_ | / __| |_ | | |/ _ \/ __| -- | _| | \__ \ _| | | | __/\__ \ -- |_| |_|___/_| |_|_|\___||___/ -- -- «FlsFiles» (to ".FlsFiles") FlsFiles = Class { type = "FlsFiles", from = function (fname) return FlsFiles {fname=fname, bigstr=ee_readfile(fname)} end, filesfrom = function (fname) return FlsFiles.from(fname):files() -- returns a Set end, __index = { istrivial = function (fl, fname) return fname:match "/usr/share/" or fname:match "/usr/local/" or fname:match "/%.texmf%-var/" or fname:match "/%.texlive" or fname:match "%.aux$" or fname:match "%.out$" end, gen_inputs = function (fl) return cow(function () for li in fl.bigstr:gmatch "[^\n]+" do local fname = li:match "^INPUT (.*)" if fname then coy(fname) end end end) end, gen_nontrivialinputs = function (fl) return cow(function () for fname in fl:gen_inputs() do if not fl:istrivial(fname) then fname = fname:gsub("^%./", "") coy(fname) end end end) end, allfiles = function (fl) local s = Set:new() for fname in fl:gen_inputs() do s:add(fname) end return s end, files = function (fl) local s = Set:new() for fname in fl:gen_nontrivialinputs() do s:add(fname) end return s end, }, } -- «FlsFiles-tests» (to ".FlsFiles-tests") -- (find-fline "~/LATEX/2022tikzwd-2.fls") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "flsfiles.lua" fl = FlsFiles.from "~/LATEX/2022tikzwd-2.fls" for fname in fl:gen_inputs() do print(fname) end for fname in fl:gen_nontrivialinputs() do print(fname) end = fl:files() = fl:files():ksc("\n") = FlsFiles.filesfrom("~/LATEX/2022tikzwd-2.fls") = FlsFiles.filesfrom("~/LATEX/2022tikzwd-2.fls"):ksc("\n") --]] -- «main» (to ".main") local fname = ... if fname then local s = FlsFiles.filesfrom(fname) print(s:ksc()) end --[[ -- Tests etc (very old) -- (find-LATEX "2015-2-GA-P1-gab.tex") -- (find-LATEX "2015-2-GA-P1-gab.fls") -- (find-LATEX "2015-2-GA-P1-gab.files") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "flsfiles.lua" s = flsfiles_nontrivialset "~/LATEX/2015-2-GA-P1-gab.fls" = s:ksc() = s:del("/home/edrx/dednat6/dednat6.lua"):ksc() * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) ~/LUA/flsfiles.lua ~/LATEX/2015-2-GA-P1-gab.fls | grep -v "^/" | tee ~/LATEX/2015-2-GA-P1-gab.files cd ~/LATEX/ zip 2015-2-GA-P1-gab.zip $(~/LUA/flsfiles.lua 2015-2-GA-P1-gab.fls | grep -v "^/") tar -cvzf 2015-2-GA-P1-gab.tgz $(~/LUA/flsfiles.lua 2015-2-GA-P1-gab.fls | grep -v "^/") tar -cvzf 2015-2-GA-P1-gab.tgz $(flsfiles 2015-2-GA-P1-gab.fls | grep -v "^/") # (find-angg ".zshrc" "flsfiles") cd ~/LATEX/ flsfiles 2015-2-GA-P1-gab.fls flsfiles-tgz 2015-2-GA-P1-gab.fls 2015-2-GA-P1-gab.tgz flsfiles-zip 2015-2-GA-P1-gab.fls 2015-2-GA-P1-gab.zip ~/LUA/flsfiles.lua ~/LATEX/2015-2-GA-P1-gab.fls | grep -v "^/" | tee ~/LATEX/2015-2-GA-P1-gab.files rm -v /tmp/z.zip rm -Rfv /tmp/z/ mkdir /tmp/z/ cd ~/LATEX/ zip /tmp/z.zip $(cat 2015-2-GA-P1-gab.files) cd /tmp/z/ unzip -d /tmp/z/ /tmp/z.zip lualatex 2015-2-GA-P1-gab.tex # (find-fline "/tmp/") # (find-fline "/tmp/z/") # (find-fline "/tmp/z.zip") # (find-man "unzip") # (find-sh "cd /tmp/z/ && grep diagxy $(find * -type f)") # (find-sh "cd /tmp/z/ && grep edrxdnt $(find * -type f)") --]] -- Local Variables: -- coding: raw-text-unix -- End: