diff options
Diffstat (limited to 'tex/context/base/mkiv/trac-deb.lmt')
-rw-r--r-- | tex/context/base/mkiv/trac-deb.lmt | 419 |
1 files changed, 0 insertions, 419 deletions
diff --git a/tex/context/base/mkiv/trac-deb.lmt b/tex/context/base/mkiv/trac-deb.lmt deleted file mode 100644 index b9827c3a9..000000000 --- a/tex/context/base/mkiv/trac-deb.lmt +++ /dev/null @@ -1,419 +0,0 @@ -if not modules then modules = { } end modules ['trac-deb'] = { - version = 1.001, - comment = "companion to trac-deb.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- This is an old mechanism, a result of some experiments in the early days of --- luatex and mkiv, but still nice anyway. I will clean it up in lmtx. - -local status = status - -local tonumber, tostring, type = tonumber, tostring, type -local format, concat, match, find, gsub = string.format, table.concat, string.match, string.find, string.gsub - -local report_nl = logs.newline -local report_str = logs.writer - -tracers = tracers or { } -local tracers = tracers - -local implement = interfaces.implement - -local ioflush = io.flush -local ioread = io.read -local writenl = texio.write_nl -local write = texio.write - -local runlocal = tex.runlocal -local terminaldata = false -local context = context - -interfaces.implement { - name = "fetchterminaldata", - actions = function() - context(terminaldata) - end, -} - -function texio.terminal() - writenl("\n" .. "entering interactive mode, use \\quit to abort reading" .."\n\n") - while true do - write(">") - ioflush() - terminaldata = ioread() - if terminaldata == "\\quit" then - terminaldata = false - break - else - runlocal("t_syst_terminal_data",nil,nil,true) -- obeymode - end - end -end - -interfaces.implement { - name = "readfromterminal", - public = true, - protected = true, - actions = texio.terminal, -} - -local savedluaerror = nil -local usescitelexer = nil -local quitonerror = true - -local function errorreporter(luaerror) - local category = luaerror and "lua error" or "tex error" - local report = logs.reporter(category) - logs.enable(category) - return report -end - -function tracers.showlines(filename,linenumber,offset,luaerrorline) - local data = io.loaddata(filename) - if not data or data == "" then - local hash = url.hashed(filename) - if not hash.noscheme then - local ok, d, n = resolvers.loaders.byscheme(hash.scheme,filename) - if ok and n > 0 then - data = d - end - end - end - local scite = usescitelexer and require("util-sci") - if scite then - return utilities.scite.tohtml(data,"tex",linenumber or true,false) - else - local lines = data and string.splitlines(data) - if lines and #lines > 0 then - if luaerrorline and luaerrorline > 0 then - -- lua error: linenumber points to last line - local start = "\\startluacode" - local stop = "\\stopluacode" - local n = linenumber - for i=n,1,-1 do - local line = lines[i] - if not line then - break - elseif find(line,start) then - n = i + luaerrorline - 1 - if n <= linenumber then - linenumber = n - end - break - end - end - end - offset = tonumber(offset) or 10 - linenumber = tonumber(linenumber) or 10 - local start = math.max(linenumber - offset,1) - local stop = math.min(linenumber + offset,#lines) - if stop > #lines then - return "<linenumber past end of file>" - else - local result, fmt = { }, "%" .. #tostring(stop) .. "d %s %s" - for n=start,stop do - result[#result+1] = format(fmt,n,n == linenumber and ">>" or " ",lines[n]) - end - return concat(result,"\n") - end - else - return "<empty file>" - end - end -end - --- todo: last tex error has ! prepended --- todo: some nested errors have two line numbers --- todo: collect errorcontext in string (after code cleanup) --- todo: have a separate status.lualinenumber --- todo: \starttext bla \blank[foo] bla \stoptext - -local nop = function() end -local resetmessages = status.resetmessages or nop - -local function processerror(offset,errortype) - local readstate = status.readstate - local filename = readstate.filename - local linenumber = readstate.linenumber - local skiplinenumber = readstate.skiplinenumber - local errorstate = status.errorstate - local lastcontext = errorstate.errorcontext - local lasttexerror = errorstate.error or "?" - local lastluaerror = errorstate.luaerror or "?" -- lasttexerror - local luaerrorline = match(lastluaerror,[[lua%]?:.-(%d+)]]) or (lastluaerror and find(lastluaerror,"?:0:",1,true) and 0) - local lastmpserror = match(lasttexerror,[[^.-mp%serror:%s*(.*)$]]) - resetmessages() - lastluaerror = gsub(lastluaerror,"%[\\directlua%]","[ctxlua]") - tracers.printerror { - filename = filename, - linenumber = linenumber, - skiplinenumber = skiplinenumber, - offset = tonumber(offset) or 10, - lasttexerror = lasttexerror, - lastmpserror = lastmpserror, - lastluaerror = lastluaerror, -- can be the same as lasttexerror - luaerrorline = luaerrorline, - lastcontext = lastcontext, - lasttexhelp = tex.gethelptext and tex.gethelptext() or nil, - errortype = errortype, - } - if job and type(job.disablesave) == "function" then - job.disablesave() - end -end - -directives.register("system.quitonerror",function(v) - quitonerror = toboolean(v) -end) - -directives.register("system.usescitelexer",function(v) - usescitelexer = toboolean(v) -end) - -local busy = false - -function tracers.printerror(specification) - if not busy then - busy = true - local errorvalues = table.swapped(tex.geterrorvalues()) - local filename = specification.filename - local linenumber = specification.linenumber - local lasttexerror = specification.lasttexerror - local lastmpserror = specification.lastmpserror - local lastluaerror = specification.lastluaerror - local lastcontext = specification.lastcontext - local luaerrorline = specification.luaerrorline - local errortype = specification.errortype - local offset = specification.offset - local endoffile = specification.endoffile - local report = errorreporter(luaerrorline) - if errortype == errorvalues.warning then - report("warning error: %s",lasttexerror or "-") - busy = false; - return; - elseif errortype == errorvalues.eof then - report("runaway error: %s",lasttexerror or "-") - if not quitonerror and texio.terminal then - texio.terminal() -- not well tested - end - elseif errortype == errorvalues.condition then - linenumber = specification.skiplinenumber - if linenumber > 0 then - report("condition error on line %s in file %s: %s",linenumber,filename,lasttexerror) - report_nl() - report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline))) - report_nl() - else - report("runaway condition error: %s",lasttexerror or "-") - end - quitonerror = true - elseif not filename then - report("fuzzy error:") - report(" tex: %s",lasttexerror or "-") - report(" lua: %s",lastluaerror or "-") - report(" mps: %s",lastmpserror or "-") - elseif type(filename) == "number" then - report("error on line %s of filehandle %s: %s ...",linenumber,lasttexerror) - else - report_nl() - if luaerrorline then - if linenumber == 0 or not filename or filename == "" then - print("\nfatal lua error:\n\n",lastluaerror,"\n") - luatex.abort() - return - else - report("lua error on line %s in file %s:\n\n%s",linenumber,filename,lastluaerror) - end - elseif lastmpserror then - report("mp error on line %s in file %s:\n\n%s",linenumber,filename,lastmpserror) - else - report("tex error on line %s in file %s: %s",linenumber,filename,lasttexerror) - if lastcontext then - report_nl() - report_str(lastcontext) - report_nl() - else - report_nl() - -- tex.showcontext() - end - if lastluaerror and not match(lastluaerror,"^%s*[%?]*%s*$") then - print("\nlua error:\n\n",lastluaerror,"\n") - quitonerror = true - end - end - report_nl() - report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline))) - report_nl() - end - local errname = file.addsuffix(tex.jobname .. "-error","log") - if quitonerror then - table.save(errname,specification) - local help = specification.lasttexhelp - if help and #help > 0 then - report_nl() - report_str(help) - report_nl() - report_nl() - end - luatex.abort() - end - busy = false - end -end - -luatex.wrapup(function() os.remove(file.addsuffix(tex.jobname .. "-error","log")) end) - -local function processwarning(offset) - local warningstate = status.warningstate - local lastwarning = warningstate.warning or "?" - local lastlocation = warningstate.warningtag or "?" - resetmessages() - tracers.printwarning { - lastwarning = lastwarning, - lastlocation = lastlocation, - } -end - -function tracers.printwarning(specification) - logs.report("luatex warning","%s: %s",specification.lastlocation,specification.lastwarning) -end - -directives.register("system.errorcontext", function(v) - local register = callback.register - if v then - register('show_error_message', nop) - register('show_warning_message', function() processwarning(v) end) - register('intercept_lua_error', function() processerror(v) end) - register('intercept_tex_error', function(mode,eof) processerror(v,eof) return mode end) - else - register('show_error_message', nil) - register('show_warning_message', nil) - register('intercept_lua_error', nil) - register('intercept_tex_error', nil) - end -end) - --- this might move - -lmx = lmx or { } - -lmx.htmfile = function(name) return environment.jobname .. "-status.html" end -lmx.lmxfile = function(name) return resolvers.findfile(name,'tex') end - -local function reportback(lmxname,default,variables) - if lmxname == false then - return variables - else - local name = lmx.show(type(lmxname) == "string" and lmxname or default,variables) - if name then - logs.report("context report","file: %s",name) - end - end -end - -local function showerror(lmxname) - local readstate = status.readstate() - local filename = readstate.filename - local linenumber = tonumber(readstate.linenumber) or 0 - local errorcontext = "" - if not filename then - filename = status.iocodes[readstate.iocode] - errorcontext = 'error in filename' - else - errorcontext = tracers.showlines(filename,linenumber,offset) - end - local variables = { - ['title'] = 'ConTeXt Error Information', - ['errormessage'] = status.errorstatus.error or "?", - ['linenumber'] = linenumber, - ['color-background-one'] = lmx.get('color-background-yellow'), - ['color-background-two'] = lmx.get('color-background-purple'), - ['filename'] = filename, - ['errorcontext'] = errorcontext, - } - reportback(lmxname,"context-error.lmx",variables) - luatex.abort() -end - -lmx.showerror = showerror - -function lmx.overloaderror(v) - if v == "scite" then - usescitelexer = true - end - callback.register('show_error_message', function() showerror() end) - callback.register('intercept_lua_error', function() showerror() end) - callback.register('intercept_tex_error', function() showerror() end) -end - -directives.register("system.showerror", lmx.overloaderror) - --- local debugger = utilities.debugger --- --- local function trace_calls(n) --- debugger.enable() --- luatex.registerstopactions(function() --- debugger.disable() --- debugger.savestats(tex.jobname .. "-luacalls.log",tonumber(n)) --- end) --- trace_calls = function() end --- end --- --- directives.register("system.tracecalls", function(n) --- trace_calls(n) --- end) -- indirect is needed for nilling - --- Obsolete ... not that usefull as normally one runs from an editor and --- when run unattended it makes no sense either. - --- local editor = [[scite "-open:%filename%" -goto:%linenumber%]] --- --- directives.register("system.editor",function(v) --- editor = v --- end) --- --- callback.register("call_edit",function(filename,linenumber) --- if editor then --- editor = gsub(editor,"%%s",filename) --- editor = gsub(editor,"%%d",linenumber) --- editor = gsub(editor,"%%filename%%",filename) --- editor = gsub(editor,"%%linenumber%%",linenumber) --- logs.report("system","starting editor: %s",editor) --- os.execute(editor) --- end --- end) - -local implement = interfaces.implement - -implement { name = "showtrackers", public = true, protected = true, actions = trackers.show } -implement { name = "enabletrackers", public = true, protected = true, actions = trackers.enable, arguments = "optional" } -implement { name = "disabletrackers", public = true, protected = true, actions = trackers.disable, arguments = "optional" } -implement { name = "resettrackers", public = true, protected = true, actions = trackers.reset } - -implement { name = "showdirectives", public = true, protected = true, actions = directives.show } -implement { name = "enabledirectives", public = true, protected = true, actions = directives.enable, arguments = "optional" } -implement { name = "disabledirectives", public = true, protected = true, actions = directives.disable, arguments = "optional" } - -implement { name = "showexperiments", public = true, protected = true, actions = experiments.show } -implement { name = "enableexperiments", public = true, protected = true, actions = experiments.enable, arguments = "optional" } -implement { name = "disableexperiments", public = true, protected = true, actions = experiments.disable, arguments = "optional" } - -implement { name = "overloaderror", public = true, protected = true, actions = lmx.overloaderror } -implement { name = "showlogcategories", public = true, protected = true, actions = logs.show } - -local debugger = utilities.debugger - -directives.register("system.profile",function(n) - luatex.registerstopactions(function() - debugger.disable() - debugger.savestats("luatex-profile.log",tonumber(n) or 0) - report_nl() - logs.report("system","profiler stopped, log saved in %a","luatex-profile.log") - report_nl() - end) - logs.report("system","profiler started") - debugger.enable() -end) |