|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/DeleteComments1.lua.html
-- http://anggtwu.net/LUA/DeleteComments1.lua
-- (find-angg "LUA/DeleteComments1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/DeleteComments1.lua"))
-- Based on: (find-dn6 "output.lua" "Deletecomments-class")
-- «.DeleteComments» (to "DeleteComments")
-- ____ _ _ ____ _
-- | _ \ ___| | ___| |_ ___ / ___|___ _ __ ___ _ __ ___ ___ _ __ | |_ ___
-- | | | |/ _ \ |/ _ \ __/ _ \ | / _ \| '_ ` _ \| '_ ` _ \ / _ \ '_ \| __/ __|
-- | |_| | __/ | __/ || __/ |__| (_) | | | | | | | | | | | __/ | | | |_\__ \
-- |____/ \___|_|\___|\__\___|\____\___/|_| |_| |_|_| |_| |_|\___|_| |_|\__|___/
--
-- «DeleteComments» (to ".DeleteComments")
-- This class implements a way to delete comments that TRIES to
-- simulate what TeX does. The TeXBook explains in its pages 46-47
-- that the "eyes" and "mouth" of TeX enter the "State S" (for
-- "skipping blanks") after a "%"; we simulate that by splitting
-- bigstr in a certain way, and then after each "%" we delete the
-- "%..." part of that line plus the whitespaces and newlines in
-- (hopefully) the right places.
--
-- This version doesn't treat backslashes followed by "%"s in the
-- right way. This is still to be done.
--
-- See: (find-es "tex" "comments")
-- (find-es "tex" "comments" "Skipping blanks")
--
DeleteComments = Class {
type = "DeleteComments",
split = function (bigstr)
local A = {}
for _,li in ipairs(splitlines(bigstr)) do
local a,b = li:match("^([^%%]*)(.*)")
table.insert(A, {a, b, "\n"})
end
return DeleteComments(A)
end,
from = function (bigstr)
return DeleteComments.split(bigstr):delcomments():concat()
end,
__tostring = function (dc) return mytabletostring(dc) end,
__index = {
hascomment = function (dc, k) return dc[k][2] ~= "" end,
endswithcmd = function (dc, k)
return dc[k][1]:reverse():match("^[A-Za-z]+\\")
end,
addspaceaftercmd = function (dc, k)
dc[k][1] = dc[k][1].." "
end,
valid = function (dc, k) return 1 <= k and k <= #dc end,
ltrim = function (dc, k)
dc[k][1] = dc[k][1]:match("^[ \t]*(.*)")
end,
delcomment = function (dc, k)
if dc:endswithcmd(k) then dc:addspaceaftercmd(k) end
dc[k][2] = "" -- delete the "%..."
dc[k][3] = "" -- delete the newline
if dc:valid(k+1) then dc:ltrim(k+1) end
end,
delcomments = function (dc)
for k=1,#dc do if dc:hascomment(k) then dc:delcomment(k) end end
return dc
end,
concat = function (dc)
local bigstr = ""
for k=1,#dc-1 do bigstr = bigstr..dc[k][1]..dc[k][2]..dc[k][3] end
if #dc > 0 then bigstr = bigstr..dc[#dc][1]..dc[#dc][2] end
return bigstr
end,
},
}
-- «DeleteComments-tests» (to ".DeleteComments-tests")
-- (find-es "dednat" "deletecomments-2021")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "DeleteComments1.lua"
bigstr = [[
foo%12
bar\plic%34
qoo%56
blep
bletch
%
woo
]]
dc = DeleteComments.split(bigstr)
= dc
= dc:delcomments()
= dc:concat()
--]==]
-- Local Variables:
-- coding: utf-8-unix
-- End: