summaryrefslogtreecommitdiff
path: root/tex/context/base/trac-deb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/trac-deb.lua')
-rw-r--r--tex/context/base/trac-deb.lua187
1 files changed, 187 insertions, 0 deletions
diff --git a/tex/context/base/trac-deb.lua b/tex/context/base/trac-deb.lua
new file mode 100644
index 000000000..97753f3e9
--- /dev/null
+++ b/tex/context/base/trac-deb.lua
@@ -0,0 +1,187 @@
+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"
+}
+
+if not lmx then lmx = { } end
+if not lmx.variables then lmx.variables = { } end
+
+lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
+lmx.lmxfile = function(name) return resolvers.find_file(name,'tex') end
+
+if not tracers then tracers = { } end
+if not tracers.list then tracers.list = { } end
+if not tracers.strings then tracers.strings = { } end
+
+tracers.strings.undefined = "undefined"
+
+local splitter = lpeg.splitat(":")
+local lpegmatch = lpeg.match
+
+function tracers.split(csname)
+ return lpegmatch(splitter,csname)
+end
+
+function tracers.type(csname)
+ tag, name = tracers.split(csname)
+ if tag then return tag else return nil end
+end
+
+function tracers.name(csname)
+ tag, name = tracers.split(csname)
+ if tag then return name else return csname end
+end
+
+function tracers.cs(csname)
+ tag, name = tracers.split(csname)
+ if tracers.types[tag] then
+ return tracers.types[tag](name)
+ else
+ return tracers.primitive(csname)
+ end
+end
+
+function tracers.dimen(name)
+ return (tex.dimen[name] and number.topoints(tex.dimen[name])) or tracers.strings.undefined
+end
+
+function tracers.count(name)
+ return tex.count[name] or tracers.strings.undefined
+end
+
+function tracers.toks(name)
+ return (tex.toks[name] and string.limit(tex.toks[name],40)) or tracers.strings.undefined
+end
+
+function tracers.primitive(name)
+ return tex[name] or tracers.strings.undefined
+end
+
+tracers.types = {
+ ['d'] = tracers.dimen,
+ ['c'] = tracers.count,
+ ['t'] = tracers.toks,
+ ['p'] = tracers.primitive
+}
+
+function tracers.knownlist(name)
+ return tracers.list[name] and #tracers.list[name] > 0
+end
+
+function tracers.showdebuginfo()
+ local variables = {
+ ['title'] = 'ConTeXt Debug Information',
+ ['color-background-one'] = lmx.get('color-background-green'),
+ ['color-background-two'] = lmx.get('color-background-blue'),
+ }
+ lmx.show('context-debug.lmx',variables)
+end
+
+function tracers.showerror()
+ local filename = status.filename
+ local linenumber = tonumber(status.linenumber or "0")
+ local variables = {
+ ['title'] = 'ConTeXt Error Information',
+ ['errormessage'] = status.lasterrorstring,
+ ['linenumber'] = status.linenumber,
+ ['color-background-one'] = lmx.get('color-background-yellow'),
+ ['color-background-two'] = lmx.get('color-background-purple'),
+ }
+ if not filename then
+ variables.filename, variables.errorcontext = 'unknown', 'error in filename'
+ elseif type(filename) == "number" then
+ variables.filename, variables.errorcontext = "<read " .. filename .. ">", 'unknown error'
+ elseif io.exists(filename) then
+ -- todo: use an input opener so that we also catch utf16 an reencoding
+ lines = io.lines(filename)
+ if lines then
+ local context = { }
+ n, m = 1, linenumber
+ b, e = m-10, m+10
+ s = string.len(tostring(e))
+ for line in lines do
+ if n > e then
+ break
+ elseif n > b then
+ if n == m then
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " >> " .. line
+ else
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " " .. line
+ end
+ end
+ n = n + 1
+ end
+ variables.filename, variables.errorcontext = filename, table.concat(context,"\n")
+ else
+ variables.filename, variables.errorcontext = filename, ""
+ end
+ else
+ variables.filename, variables.errorcontext = filename, 'file not found'
+ end
+ lmx.show('context-error.lmx',variables)
+end
+
+function tracers.overloaderror()
+ callback.register('show_error_hook', tracers.showerror)
+end
+
+tracers.list['scratch'] = {
+ 0, 2, 4, 6, 8
+}
+
+tracers.list['internals'] = {
+ 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip',
+ 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip'
+}
+
+tracers.list['context'] = {
+ 'd:lineheight',
+ 'c:realpageno', 'c:pageno', 'c:subpageno'
+}
+
+-- dumping the hash
+
+-- \starttext
+-- \ctxlua{tracers.dump_hash()}
+-- \stoptext
+
+local saved = { }
+
+function tracers.save_hash()
+ saved = tex.hashtokens()
+end
+
+function tracers.dump_hash(filename,delta)
+ filename = filename or tex.jobname .. "-hash.log"
+ local list = { }
+ local hash = tex.hashtokens()
+ local command_name = token.command_name
+ for name, token in next, hash do
+ if not delta or not saved[name] then
+ -- token: cmd, chr, csid -- combination cmd,chr determines name
+ local kind = command_name(token)
+ local dk = list[kind]
+ if not dk then
+ -- a bit funny names but this sorts better (easier to study)
+ dk = { names = { }, found = 0, code = token[1] }
+ list[kind] = dk
+ end
+ dk.names[name] = { token[2], token[3] }
+ dk.found = dk.found + 1
+ end
+ end
+ io.savedata(filename,table.serialize(list,true))
+end
+
+function tracers.register_dump_hash(delta)
+ if delta then
+ tracers.save_hash()
+ end
+ main.register_stop_actions(1,function() tracers.dump_hash(nil,true) end) -- at front
+end
+
+directives.register("system.dumphash", function() tracers.register_dump_hash(false) end)
+directives.register("system.dumpdelta", function() tracers.register_dump_hash(true ) end)