Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/EScript.lua.html -- http://angg.twu.net/LUA/EScript.lua -- (find-angg "LUA/EScript.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- Parse e-scripts. -- -- (defun e () (interactive) (find-angg "LUA/EScript.lua")) -- (find-es "lpeg" "globals") require "lpeg" B,C,P,R,S,V = lpeg.B,lpeg.C,lpeg.P,lpeg.R,lpeg.S,lpeg.V Cb,Cc,Cf,Cg = lpeg.Cb,lpeg.Cc,lpeg.Cf,lpeg.Cg Cp,Cs,Ct = lpeg.Cp,lpeg.Cs,lpeg.Ct Carg,Cmt = lpeg.Carg,lpeg.Cmt -- (find-es "lpeg" "lpeg-quickref") p_tagchar = R"!~" - S'"' p_tag = p_tagchar^1 p_anchor = P"«" * p_tag:C() * P"»" p_to = P'(to "' * p_tag:C() * '")' p_anchorto = R" ~"^0 * p_anchor * S" \t"^0 * p_to p_headermidline = P'# ' * ((1-P"\n")^0):C() * P'\n' p_header = P'#####\n#\n' * p_headermidline * p_headermidline * P"#\n#####\n\n" p_headeranchorto = p_header * p_anchorto Lines = Class { type = "Lines", from = function (bigstr) local n,line,ltob,btol = 0, {}, {}, {} for pos,li in bigstr:gmatch("()([^\n]-)\n") do n = n + 1 line[n] = li ltob[n] = pos btol[pos] = n end return Lines {bigstr=bigstr, n=n, line=line, ltob=ltob, btol=btol} end, read = function (fname) local lis = Lines.from(ee_readfile(fname)) lis.fname = fname return lis end, __tostring = function (lis) return format("Lines object with %d lines", lis.n) end, __index = { fline = function (lis, linen) return format('(find-fline "%s" %d)', lis.fname, linen) end, lmatch = function (lis, linen, lpegpat) return lpegpat:match(lis.bigstr, lis.ltob[linen]) end, isindex = function (lis, linen) local dtag,tag = lis:lmatch(linen, p_anchorto) if dtag and dtag == "."..tag then return tag end end, isheader = function (lis, linen) local title,date,tag,dtag = lis:lmatch(linen, p_headeranchorto) if title and dtag == "."..tag then return tag,title,date end end, -- error_index_twice = function (lis, tag, line1, line2) local firstline = format('The tag "%s" appears twice in the index:', tag) local link1 = lis:fline(line1) local link2 = lis:fline(line2) return firstline .."\n".. link1 .."\n".. link2 end, error_block_twice = function (lis, tag, line1, line2) local firstline = format('The tag "%s" appears twice in blocks:', tag) local link1 = lis:fline(line1) local link2 = lis:fline(line2) return firstline .."\n".. link1 .."\n".. link2 end, getindex = function (lis) local index, n = {}, 0 for linen=1,lis.n do local tag = lis:isindex(linen) if tag then if index[tag] then print(lis:error_index_twice(tag, index[tag].linen, linen)) end n = n + 1 local A = {n=n, linen=linen, tag=tag} index[tag] = A index[n] = A end end return index end, getblocks = function (lis) local blocks = {} for linen=1,lis.n do local tag,title,date = lis:isheader(linen) if tag then if blocks[tag] then print(lis:error_block_twice(tag, blocks[tag].linen, linen)) end local n = #blocks + 1 local block = {n=n, linen=linen, tag=tag, title=title, date=date} blocks[tag] = block blocks[n] = block end end return blocks end, }, } --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "EScript.lua" -- (find-es "lpeg") lis = Lines.read "~/e/lpeg.e" lis = Lines.read "~/e/lua5.e" lis = Lines.read "~/e/maxima.e" = lis = lis.n = lis:fline(274) lis:getindex() lis:getblocks() PPPV(lis:getindex()) PPPV(lis:getblocks()) --]] EScript = Class { type = "EScript", from = function (fname) local bigstr = ee_readfile(fname) return EScript {fname=fname, bigstr=bigstr} end, __tostring = function (es) return "fname: "..es.fname end, __index = { }, } -- Local Variables: -- coding: utf-8-unix -- End: