|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/Lisp2.lua.html
-- http://angg.twu.net/LUA/Lisp2.lua
-- (find-angg "LUA/Lisp2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Lisp2.lua"))
-- (defun o () (interactive) (find-angg "LUA/Lisp1.lua"))
-- (defun eo () (interactive) (find-2a '(e) (o)))
-- (defun l () (interactive) (find-es "lpeg" "lpeg-quickref"))
-- (defun j () (interactive) (find-es "lpeg" "lpegrex-json"))
-- Usage:
-- This test block:
-- (to "write-sandwiches-videos")
-- generated this file,
-- (find-angg "blogme3/sandwiches-videos.lua")
-- that is used by:
-- (find-blogme3grep "grep --color=auto -nH --null -e sandwiches-videos *.lua")
-- «.write-sandwiches-videos» (to "write-sandwiches-videos")
require "Tree1" -- (find-anggfile "LUA/Tree1.lua")
require "lpeg" -- (find-es "lpeg" "lpeg-quickref")
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
packlist = function (a, ...)
if type(a) == "string" then return Tree {[0]=a, ...} end
return Tree {a, ...}
end
Tagged = Class {
type = "Tagged",
__tostring = function (tgd) return tgd:abody() end,
__index = {
body = function (tgd)
return subj:sub(tgd.pos, tgd.endpos-1)
end,
abody = function (tgd) return "<"..tgd:body()..">" end,
value = function (ast)
if ast.tag == "string" then return expr(ast:body()) end
if ast.tag == "symbol" then return ast:body():sub(2) end
end,
asvideo = function (ast)
local id = ast[1]:value()
local A = {}
for i=2,#ast-1,2 do
local key,val = ast[i]:value(), ast[i+1]:value()
A[key] = val
end
return id,A
end,
asvideos = function (ast)
local B = {}
for i=1,#ast do
local id,A = ast[i]:asvideo()
B[id] = A
end
return B
end,
},
}
videos_to_expr = function (B)
local f,g,h,m,n
f = function (str) return format("[%q]", str) end
g = function (key,val) return format(" %-11s = %q,\n", f(key), val) end
h = function (A)
local fg = function (key) return g(key, A[key]) end
return mapconcat(fg, sorted(keys(A)), "")
end
m = function (id,A) return format(" %s = {\n%s },", f(id), h(A)) end
n = function (B)
local mk = function (key) return m(key, B[key]) end
return "{\n"..mapconcat(mk, sorted(keys(B)), "\n").."\n}"
end
return n(B)
end
tagged = function (name, patt)
return Ct(Cg(Cc(name),"tag")
* Cg(Cp(),"pos")
* patt
* Cg(Cp(),"endpos"))
/ function (o) return Tagged(o) end
end
sexp = P({
"top",
--
hspaces = S(" \t\n")^0,
comment = ";" * (1-P("\n"))^0 * "\n",
skip = V("hspaces") * (V("comment") * V("hspaces"))^0,
--
symbolchar = R("!~") - S([[()"\]]),
symbol = tagged("symbol", V("symbolchar")^1),
--
strchar = ('\\'*P(1)) + (P(1)-'"'),
str = tagged("string", '"' * V("strchar")^0 * '"'),
--
element = V("symbol") + V("str") + V("list"),
elements = V("skip") * (V("element") * V("skip"))^0,
list = tagged("list", "(" * V("elements") * ")"),
--
top = V("skip") * V("element"),
})
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Lisp2.lua"
subj = [[ ((MLIST SIMP) $X "foo \" bar" $Z) ]]
ast = sexp:match(subj)
= ast
= ast[1]
= ast[1][2]
= ast[3]
PPPV(ast)
# (find-eevfile "eev-videolinks.el" "(defvar ee-1stclassvideos-info")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Lisp2.lua"
bigstr = ee_readfile "~/eev-current/eev-videolinks.el"
pos = bigstr:match "()%(defvar ee%-1stclassvideos%-info"
= pos
subj = bigstr
ast = sexp:match(subj, pos)
= ast
= ast[1]
= ast[3]
= ast[4]
= ast[4][1]
= ast[4][1][1]
= ast[4][1][2]
= ast[4][1][3]
= ast[4][1][2].tag
= ast[4][1][3].tag
= ast[4][1][2]:value()
= ast[4][1][3]:value()
= otype(ast[4][1][3])
= ast[4][1][3]:body()
= expr(ast[4][1][3]:body())
= ast[4][1][3])
PP(ast[4][1]:asvideo())
PPV(ast[4]:asvideos())
videos = ast[4]:asvideos()
PPV(videos)
PPV(keys(videos))
PPV(sorted(keys(videos)))
videos_e = videos_to_expr(videos)
= videos_e
= expr(videos_e)
PPPV(expr(videos_e)["eev2019"])
--]==]
-- «write-sandwiches-videos» (to ".write-sandwiches-videos")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Lisp2.lua"
bigstr = ee_readfile "~/eev-current/eev-videolinks.el"
pos = bigstr:match "()%(defvar ee%-1stclassvideos%-info"
= pos
subj = bigstr
ast = sexp:match(subj, pos)
videos = ast[4]:asvideos()
videos_expr0 = videos_to_expr(videos)
videos_expr = '-- Generated by:\n' ..
'-- (find-angg "LUA/Lisp2.lua" "write-sandwiches-videos")\n' ..
'sandwiches_videos = '..
videos_expr0
= videos_expr
* (find-sh0 "rm -v ~/blogme3/sandwiches-videos.lua")
ee_writefile( "~/blogme3/sandwiches-videos.lua", videos_expr)
-- (find-fline "~/blogme3/sandwiches-videos.lua")
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: