Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/bib.lua.html -- http://angg.twu.net/LUA/bib.lua -- (find-angg "LUA/bib.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/bib.lua")) -- «.tests» (to "tests") -- «.meteor» (to "meteor") require "re" countnewlines = function (str) local str = str:gsub("[^\n]", "") return #str end getcomments_pat = '{("%" [^%nl]* %nl)*}' getcomments_mat = Re({}):c(getcomments_pat) getcomments = function (s) return (getcomments_mat(s):gsub("\n$", "")) end getanchor = function (s) return s:match("«([!-~]+)»") end indexanchor = function (s) local leftpart = format('%% «.bib-%s» ', s) local rightpart = format('(to "bib-%s")', s) local line = format('%-32s%s', leftpart, rightpart) return line end sectionanchor = function (s) return format('%% «bib-%s» (to ".bib-%s")\n', s, s) end withoutfirstline = function (s) return s:match("^[^\n]*\n(.*)$") end withoutanchor = function (s) if not s:match("«") then return s end return withoutfirstline(s) end withanchor = function (s, name) return sectionanchor(name)..withoutanchor(s) end --[[ • (eepitch-lua51) • (eepitch-kill) • (eepitch-lua51) dofile "bib.lua" -- (find-angg "LATEX/catsem-slides.bib") bf = BibFile.read("~/LATEX/catsem-slides.bib"):filter('b.name') bfs = bf:toset() bfkeys = bfs:ks() PP(bfkeys) = bfs:get("CWM2") = bfs:get("CWM2").body bo = bfs:get("CWM2").body = withoutfirstline(bo) = withanchor(bo, "Foo") --]] BibBlock = Class { type = "BibBlock", __tostring = function (bb) return bb:link() end, __index = { link = function (bb) return format('(find-fline "%s" %d "%s")', bb.fname, bb.line, bb.name or "") end, comments = function (bb) return getcomments(bb.body) end, anchor = function (bb) return getanchor (bb.body) end, bodywithanchor = function (bb) if bb:anchor() then return bb.body end return sectionanchor(bb.name)..bb.body end, }, } BibFile = Class { type = "BibFile", read = function (fname) local bigstr = ee_readfile(fname) local blocks = {} for pos,body in bigstr:gmatch("()(.-)\n\n+") do local line = countnewlines(bigstr:sub(1, pos-1))+1 local kind,name = body:match("@([A-Za-z]+)%{([A-Za-z0-9:]+),") local block = { fname=fname, body=body, line=line, pos=pos, kind=kind, name=name, } table.insert(blocks, BibBlock(block)) end return BibFile {fname=fname, bigstr=bigstr, blocks=blocks} end, __tostring = function (bf) return bf:tostring() end, __index = { tostring = function (bf) local str = bf.fname..":" for i,block in ipairs(bf.blocks) do str = format("%s\n%d: %s", str, i, tostring(block)) end return str end, withtheseblocks = function (bf, blocks) return BibFile {fname=bf.fname, bigstr=bf.bigstr, blocks=blocks} end, filter = function (bf, f) if type(f) == "string" then f = Code.ve("b => "..f) end local blocks = {} for i,block in ipairs(bf.blocks) do if f(block) then table.insert(blocks, block) end end return bf:withtheseblocks(blocks) end, toset = function (bf) local s = SetL.new() for i,b in ipairs(bf.blocks) do s:add(b.name, b) end return s end, iblocks = function (bf) return ipairs(bf.blocks) end, buildbib = function (bf, names) local bibblocks = bf:filter('b.name'):toset() local names = names or bibblocks:ks() return buildbib(bibblocks, names) end, }, } buildbib = function (bibblocks, names) local index = mapconcat(indexanchor, names, "\n") local getbody = function (name) return bibblocks:get(name).body end local getbody2 = function (name) return withanchor(getbody(name), name) end local entries = mapconcat(getbody2, names, "\n\n") return index.."\n\n"..entries end -- «tests» (to ".tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "bib.lua" -- (find-angg "LATEX/catsem-u.bib") -- (find-angg "LATEX/catsem-slides.bib") bf = BibFile.read("~/LATEX/catsem-slides.bib") bf = BibFile.read("~/LATEX/catsem-slides.bib"):filter('b.name') bfs = bf:toset() bfkeys = bfs:ks() PP(bfkeys) for i,key in ipairs(bfkeys) do print(key, bfs:get(key):anchor()) end = bf.blocks[3] = bf = bf:filter(Code.ve 'b => b.name') = bf:filter('b.name == "Brady"') = bf:filter('b.name') = bf:filter('b.name'):toset() = bf:filter('b.name'):toset():get("Kromer") = bf:filter('b.name'):toset():ksc() = bf:filter('b.name'):toset():ksc(" ") bb = bfs:get("HOTT") bbb = bfs:get("HOTT").body = bb = bb.body = bb:comments() = bb:anchor() = bb:bodywithanchor() = BibFile.read("~/LATEX/catsem-u.bib") = bfs:get("HOTT").body = bfs:get("HOTT"):anchor() = bfs:get("HOTT"):bodywithanchor() PPPV(bfs:get("HOTT")) bbb = bfs:get("CWM2").body = bbb = withoutanchor(bbb, "Foo") = withanchor(bbb, "Foo") = buildbib(bfs, {"HOTT", "SICP", "CWM2"}) = bf:buildbib({"HOTT", "SICP", "CWM2"}) = bf:buildbib() --]==] --[[ • (eepitch-lua51) • (eepitch-kill) • (eepitch-lua51) dofile "bib.lua" -- (find-angg "LATEX/catsem-slides.bib") bf = BibFile.read("~/LATEX/catsem-slides.bib") = bf:buildbib() --]] -- «meteor» (to ".meteor") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "bib.lua" names0 = [=[ AbramskyTzevelekos AgdaUserManual Awodey BadiouLoW BadiouMoTT CWM2 CaccamoPhD CaccamoWinskel CarsonSappho ChengMorally CoeckeNewStruP CoeckePQP Corfield DSLsofMath EilenbergSteenrod Elephant1 FongSpivak Freyd76 FreydScedrov Ganesalingam Hazratpour HuCarette IDARCT Jacobs Jamnik Kromer KromerSlides LawvereRosebrugh Leinster MDE MacLaneNotes MarsdenCTUSD MilewskiCTFPOCaml MissingAgda NederpeltGeuvers Norell08 OchsLucatelli OchsTallinnAbs OchsVGMS2018 OchsWLD2019 PH1 PH2 PenroseSIGGRAPH2020 Perrone PowerPasting Riehl SICP SeelyBeck SeelyDiff SeelyLCCC SeelyPLC SelingerLN Taylor ThompsonGardner VanBenthemJutting77 WadlerPLFA ]=] namess = Set.from(split(names0)) = namess bf = BibFile.read("~/LATEX/catsem-ab.bib"):filter('b.name') bfs = bf:toset() bfkeys = bfs:ks() PP(bfkeys) for i,key in ipairs(bfkeys) do print(key, bfs:get(key):anchor()) end = (bfs * namess) = (bfs * namess):get"PH1" = (bfs * namess):get"PH1".body = (bfs * namess):ksc() newbib = bfs * namess = newbib = newbib:ksc() for key,val in newbib:gen() do print(key) end out = "\n" for key,val in newbib:gen() do out = out..(val.body).."\n\n" end = out out2 = (out:gsub("\n%%[^\n]*", "")) = out2 -- (find-fline "~/LATEX/2022meteor-test2.bib") --]==] -- Local Variables: -- coding: utf-8-unix -- End: