|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LATEX/2020dn6-error-handling.lua.html
-- http://angg.twu.net/LATEX/2020dn6-error-handling.lua
-- (find-angg "LATEX/2020dn6-error-handling.lua")
-- (find-LATEX "2020dn6-error-handling.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This file replaces some functions in dednat6 with versions with
-- better error handling. To use it, replace this
--
-- \catcode`\^^J=10
-- \directlua{dofile "dednat6load.lua"}
--
-- by this
--
-- \catcode`\^^J=10
-- \directlua{dofile "dednat6load.lua"}
-- \directlua{dofile "2020dn6-error-handling.lua"}
--
-- in your .tex file.
--
-- This is a PROTOTYPE, used by just these files:
--
-- (find-LATEXgrep "grep --color -nH --null -e 2020dn6-error-handling *.tex")
--
-- (find-es "dednat" "plabel-error-handling")
-- (dne)
-- «.getword» (to "getword")
-- «.arrow-modifiers» (to "arrow-modifiers")
-- «.dxyrun» (to "dxyrun")
-- «.BussProofs» (to "BussProofs")
-- «.BussProofs-test» (to "BussProofs-test")
-- «getword» (to ".getword")
-- (find-dn6 "parse.lua" "getword")
-- (find-dn6 "parse.lua" "getword" "getwordasluaexpr =")
--
-- These are higher-level variants of getword() that accept error
-- messages. Mnemonic: they have "_"s in their names, and
-- "getword_lua" is more readable than "getwordlua".
getword_1 = function (funname, errmsg)
errmsg = errmsg or "argument"
return getword() or error(format("In '%s': missing %s", funname, errmsg))
end
getword_2 = function (funname, errmsg1, errmsg2)
local a = getword_1(funname, errmsg1 or "first argument")
local b = getword_1(funname, errmsg2 or "second argument")
return a,b
end
getword_lua = function (funname, errmsg)
return expr(getword_1(funname, errmsg))
end
getword_lualua = function (funname, errmsg1, errmsg2)
local a, b = getword_2(funname, errmsg1, errmsg2)
return expr(a), expr(b)
end
-- «arrow-modifiers» (to ".arrow-modifiers")
-- (find-dn6 "diagforth.lua" "arrow-modifiers")
forths[".plabel="] = function ()
local p, label = getword_2(".plabel=", "first argument (placement)",
"second argument (label)")
ds:pick(0).placement, ds:pick(0).label = p, label
end
forths[".slide="] = function ()
ds:pick(0).slide = getword_1(".slide=")
end
forths[".curve="] = function ()
ds:pick(0).curve = getword_1(".curve=")
end
forths["xy+="] = function ()
local dx,dy = getword_lualua(".plabel=", "first argument (dx)",
"second argument (dy)")
ds:pick(0).x = ds:pick(0).x + dx
ds:pick(0).y = ds:pick(0).y + dy
end
-- «dxyrun» (to ".dxyrun")
-- (find-dn6 "diagforth.lua" "diag-head" "dxyrun =")
-- (find-dn6file "parse.lua" "setsubj =")
-- (find-es "lua5" "xpcall-2020")
-- It should be possible to use dxyrun0 recursively (for macros!) and
-- it should be possible to call it using xpcall and display the
-- offending line before the traceback...
-- (find-dn6 "heads6.lua" "diag-head")
-- (find-es "lua5" "xpcall-2020")
-- dxyrun = function (str, pos, linenum)
-- dxyrun0(str, pos, linenum)
-- end
dxyrun0 = function (str, pos)
local a,b,c,d = subj,pos,startcol,endcol -- backup globals
setsubj(str, pos or 1)
while getword() do
-- PP(word)
if forths[word] then forths[word]()
elseif nodes[word] then ds:push(nodes[word])
else Error("Unknown word: "..word)
end
end
local subj,pos,startcol,endcol = a,b,c,d -- restore globals
end
dxyrun_errhandler = function (errmsg)
local fname = tf.name
local b = lastheadblock
local blockinfo = format("%s-block in lines %d-%d", b.head, b.i, b.j)
local where = format("In %s, in the %s, in line %d",
fname, blockinfo, dxyrun_linenum)
local whereinsubj = (" "):rep(startcol - 1)..("^"):rep(endcol - startcol)
local errmsg0 = errmsg:gsub("^[^ ]* ", "")
print(errmsg0)
print(where..":")
print()
print(subj)
print(whereinsubj)
-- print(debug.traceback())
print()
print("Dednat6 error - aborting!")
end
-- TODO: rewrite dxyrun using the MyXpcall class.
-- (find-angg "edrxrepl/edrxrepl.lua" "MyXpcall-class")
-- (find-angg "LUA/lua50init.lua" "MyXpcall")
dxyrun = function (str, pos, linenum)
dxyrun_linenum = linenum
local f = function () dxyrun0(str, pos) end
local status = xpcall(f, dxyrun_errhandler)
if status == false then os.exit(1) end
end
-- «BussProofs» (to ".BussProofs")
--
BussProofs = Class {
type = "BussProofs",
new = function () return BussProofs {} end,
__index = {
unabbrev = function (bp, str) return unabbrev(str) end,
subtreetolatex = function (bp, tn, i)
local i_,i__ = i.." ", i.." "
if not tn:hasbar() then
local r_ = tn:TeX_root()
return i.."\\AxiomC{$"..bp:unabbrev(r_).."$}"
else
local r_ = tn:TeX_root()
local b_ = tn:barchar()
local l_ = tn:TeX_label()
local h_ = tn:hypslist()
local r = "\\mathstrut "..bp:unabbrev(r_)
local s = function (indent, str)
return str and (indent..str.."\n") or ""
end
local Lines = {["-"]=nil,
["="]="\\doubleLine",
["."]="\\noLine"}
local Line = Lines[b_]
local Label = l_ and l_ ~= "" and format("\\RightLabel{$%s$}", l_)
local Infs = {[0] = "\\UnaryInfC",
"\\UnaryInfC",
"\\BinaryInfC",
"\\TrinaryInfC",
"\\QuaternaryInfC",
"\\QuinaryInfC"}
local Inf = format("%s{$%s$}", Infs[#h_], bp:unabbrev(r_))
local f = function (tn) return bp:subtreetolatex(tn, i__) end
local Hyps = (#h_ > 0) and (mapconcat(f, h_, i__.."\n"))
or i__.."\\AxiomC{}"
return Hyps.."\n"..s(i_,Line)..s(i_,Label)..i..Inf
end
end,
treetolatex = function (bp, tn, i)
return i.."\\hbox{\n"..
bp:subtreetolatex(tn, i).."\n"..
i.."\\DisplayProof\n"..
i.."}\n"
end,
todefded = function (bp, tn, name, link)
local comment = " % "..(link or tf:hyperlink())
return "\\defded{"..name.."}{"..comment.."\n"..
bp:treetolatex(tn, " ")..
" }"
end,
},
}
--[==[
-- «BussProofs-test» (to ".BussProofs-test")
-- To test or use this, put this in the preamble:
\usepackage{bussproofs}
\def\mybussproof#1{\leavevmode\hbox{#1\DisplayProof}}
%\newenvironment{bprooftree}
% {\leavevmode\hbox\bgroup}
% {\DisplayProof\egroup}
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
loaddednat6()
require "block"
dofile "2020dn6-error-handling.lua"
bigstr = [[
%: H
%: - ...
%: A B C E F \Pi
%: =======r ::::\phi ...
%: D G I
%: -------------------
%: J
%:
%: ^bars
%:
]]
output = print
output("foo")
texlines = TexLines.new("test", bigstr)
tf = texlines:toblock()
PP(headblocks)
tf:processuntil(texlines:nlines())
PP(headblocks)
= allsegments[9]
seg = allsegments[9][1]
name = "bars"
output(seg:rootnode():totreenode():TeX_deftree(name))
= seg:rootnode()
= seg:rootnode():totreenode()
tree = seg:rootnode():totreenode()
= tree
= tree[1]
= tree[3]
= tree[3][1]
= tree[3][1][1]
PPV(tree)
PPV(tree[3][1][1])
bp = BussProofs.new()
= bp:subtreetolatex(tree, "")
= bp:treetolatex(tree, "")
= bp:todefded(tree, "NAME")
--]==]
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
loaddednat6()
dofile "2020dn6-error-handling.lua"
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: