summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/meta-nod.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/meta-nod.lua')
-rw-r--r--tex/context/base/mkiv/meta-nod.lua81
1 files changed, 81 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/meta-nod.lua b/tex/context/base/mkiv/meta-nod.lua
new file mode 100644
index 000000000..422b4ee14
--- /dev/null
+++ b/tex/context/base/mkiv/meta-nod.lua
@@ -0,0 +1,81 @@
+if not modules then modules = { } end modules ['meta-nod'] = {
+ version = 1.001,
+ comment = "companion to meta-nod.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tonumber = tonumber
+local P, R, Cs, lpegmatch = lpeg.P, lpeg.R, lpeg.Cs, lpeg.match
+
+local references = { }
+local trace = false
+local report = logs.reporter("metapost","nodes")
+
+local context = context
+local implement = interfaces.implement
+
+trackers.register("metapost.nodes", function(v) trace = v end)
+
+local word = R("AZ","az","__")^1
+
+local pattern = Cs (
+ (
+ word / function(s) return references[s] or s end
+ + P("{") / "["
+ + P("}") / "]"
+ + P(1)
+ )^1
+)
+
+implement {
+ name = "grph_nodes_initialize",
+ actions = function()
+ references = { }
+ end
+}
+
+implement {
+ name = "grph_nodes_reset",
+ actions = function()
+ references = { }
+ end
+}
+
+implement {
+ name = "grph_nodes_register",
+ arguments = { "string", "integer" },
+ actions = function(s,r)
+ if not tonumber(s) then
+ if trace then
+ report("register %i as %a",t,s)
+ end
+ references[s] = r
+ end
+ end
+}
+
+implement {
+ name = "grph_nodes_resolve",
+ arguments = "string",
+ actions = function(s)
+ local r = references[s]
+ if r then
+ if trace then
+ report("resolve %a to %i",s,r)
+ end
+ context(r)
+ return
+ end
+ local n = lpegmatch(pattern,s)
+ if s ~= n then
+ if trace then
+ report("resolve '%s' to %s",s,n)
+ end
+ context(n)
+ return
+ end
+ context(s)
+ end
+}