Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/SexpAtEol1.lua.html -- http://anggtwu.net/LUA/SexpAtEol1.lua -- (find-angg "LUA/SexpAtEol1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/SexpAtEol1.lua")) -- Superseded by: -- (find-blogme3 "sandwiches.lua" "SexpIntervals") -- (find-blogme3 "sandwiches.lua" "getsexpr") -- (find-angg "LUA/lua50init.lua" "getsexp") -- «.SexpAtEol» (to "SexpAtEol") -- «.SexpAtEol-tests» (to "SexpAtEol-tests") -- «SexpAtEol» (to ".SexpAtEol") -- SexpAtEol = Class { type = "SexpAtEol", from = function (line) local line1,right = SexpAtEol.spacesateol(line) local sexp,head,skel,left = SexpAtEol.getsexp(line1) return SexpAtEol { line=line, left=left, sexp=sexp, right=right, head=head, skel=skel } end, spacesateol = function (line, n) local rightn = #(line:reverse():match("^[ \t]")) local rightp = #line - (n or rightn) local line1 = line:sub(1, rightp) local right = line:sub(rightp + 1) return line1,right end, getsexp = function (str) if str:sub(-1) ~= ")" then return end local rep_ = function (n) return string.rep("_", n) end local simpq = function (s) return '"'..rep_(#s-2)..'"' end -- simplify '"'s local simpp = function (s) return '('..rep_(#s-2)..')' end -- simplify '()'s local leks = str:gsub("\\.", "__") -- simplify '\char's :reverse() :gsub('"[^"]*"', simpq) :match("^%b)(") if not leks then return end local skel = leks:reverse() local sexp = str:sub(-#skel) local head = sexp:match("^%(([^ ()\"]+)") local skel = "(" .. skel:sub(2):gsub("%b()", simpp) local left = str:sub(1, -1-#skel) return sexp, head, skel, left end, __tostring = function (se) return se:tostring() end, __index = { tostring = function (se) local s = function (str) return string.rep(" ", #str) end local d = function (str) return string.rep("-", #str) end if not se.sexp then return "line: "..se.line end return "line: " .. se.line .. "\nsexp: " .. s(se.left) .. se.sexp .. "\nskel: " .. s(se.left) .. se.skel .. "\nhead: " .. s(se.left) .. " " .. se.head .. "\nleft: " .. se.left end, }, } -- «SexpAtEol-tests» (to ".SexpAtEol-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "SexpAtEol1.lua" li = [[bla_(foo "bar\" \"plic" (+ 2 3)) ]] se = SexpAtEol.from(li) -- PPPV(se) = se --]==] -- Local Variables: -- coding: utf-8-unix -- End: