summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/strc-ref.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2017-10-10 13:36:53 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2017-10-10 13:36:53 +0200
commitd47ee9fc195ba82eef5e4be132b1d88b7f009a9c (patch)
tree45964c47b2242f6ff9bf6a881639146be1edd201 /tex/context/base/mkiv/strc-ref.lua
parentedaa6851d5c096acba2ad5817f70d3eb7cec46e6 (diff)
downloadcontext-d47ee9fc195ba82eef5e4be132b1d88b7f009a9c.tar.gz
2017-10-10 12:06:00
Diffstat (limited to 'tex/context/base/mkiv/strc-ref.lua')
-rw-r--r--tex/context/base/mkiv/strc-ref.lua68
1 files changed, 49 insertions, 19 deletions
diff --git a/tex/context/base/mkiv/strc-ref.lua b/tex/context/base/mkiv/strc-ref.lua
index 6b2d3f240..75b66fd7b 100644
--- a/tex/context/base/mkiv/strc-ref.lua
+++ b/tex/context/base/mkiv/strc-ref.lua
@@ -59,7 +59,7 @@ local texconditionals = tex.conditionals
local productcomponent = resolvers.jobs.productcomponent
local justacomponent = resolvers.jobs.justacomponent
------ settings_to_array = utilities.parsers.settings_to_array
+local settings_to_array = utilities.parsers.settings_to_array
local settings_to_table = utilities.parsers.settings_to_array_obey_fences
local process_settings = utilities.parsers.process_stripped_settings
local unsetvalue = attributes.unsetvalue
@@ -1515,7 +1515,7 @@ local function identify_outer(set,var,i)
local inner = var.inner
local external = externals[outer]
if external then
- local v = identify_inner(set,var,nil,external)
+ local v = identify_inner(set,var,"",external)
if v then
v.kind = "outer with inner"
set.external = true
@@ -1524,19 +1524,24 @@ local function identify_outer(set,var,i)
end
return v
end
- local v = identify_inner(set,var,var.outer,external)
- if v then
- v.kind = "outer with inner"
- set.external = true
- if trace_identifying then
- report_identify_outer(set,v,i,"2b")
+ -- somewhat rubish: we use outer as first step in the externals table so it makes no
+ -- sense to have it as prefix so the next could be an option
+ local external = external[""]
+ if external then
+ local v = identify_inner(set,var,var.outer,external)
+ if v then
+ v.kind = "outer with inner"
+ set.external = true
+ if trace_identifying then
+ report_identify_outer(set,v,i,"2b")
+ end
+ return v
end
- return v
end
end
local external = productdata.componentreferences[outer]
if external then
- local v = identify_inner(set,var,nil,external)
+ local v = identify_inner(set,var,"",external)
if v then
v.kind = "outer with inner"
set.external = true
@@ -1575,7 +1580,12 @@ local function identify_outer(set,var,i)
end
var.i = inner
var.f = outer
- var.r = (inner.references and inner.references.realpage) or (inner.pagedata and inner.pagedata.realpage) or 1
+ if type(inner) == "table" then
+ -- can this really happen?
+ var.r = (inner.references and inner.references.realpage) or (inner.pagedata and inner.pagedata.realpage) or 1
+ else
+ var.r = 1
+ end
if trace_identifying then
report_identify_outer(set,var,i,"2e")
end
@@ -1893,26 +1903,42 @@ end)
-- the housekeeping happens the backend side.
local innermethod = v_auto -- only page|auto now
+local outermethod = v_auto -- only page|auto now
local defaultinnermethod = defaultinnermethod
+local defaultoutermethod = defaultoutermethod
references.innermethod = innermethod -- don't mess with this one directly
+references.outermethod = outermethod -- don't mess with this one directly
-function references.setinnermethod(m)
- if toboolean(m) or m == v_page or m == v_yes then
+function references.setlinkmethod(inner,outer)
+ if not outer and type(inner) == "string" then
+ local m = settings_to_array(inner)
+ inner = m[1]
+ outer = m[2] or v_auto
+ end
+ if toboolean(inner) or inner == v_page or inner == v_yes then
innermethod = v_page
- elseif m == v_name then
+ elseif inner == v_name then
innermethod = v_name
else
innermethod = v_auto
end
+ if toboolean(outer) or outer == v_page or outer == v_yes then
+ outermethod = v_page
+ elseif inner == v_name then
+ outermethod = v_name
+ else
+ outermethod = v_auto
+ end
references.innermethod = innermethod
- function references.setinnermethod()
- report_references("inner method is already set and frozen to %a",innermethod)
+ references.outermethod = outermethod
+ function references.setlinkmethod()
+ report_references("link method is already set and frozen: inner %a, outer %a",innermethod,outermethod)
end
end
implement {
- name = "setinnerreferencemethod",
- actions = references.setinnermethod,
+ name = "setreferencelinkmethod",
+ actions = references.setlinkmethod,
arguments = "string",
-- onlyonce = true
}
@@ -1921,8 +1947,12 @@ function references.getinnermethod()
return innermethod or defaultinnermethod
end
+function references.getoutermethod()
+ return outermethod or defaultoutermethod
+end
+
directives.register("references.linkmethod", function(v) -- page auto
- references.setinnermethod(v)
+ references.setlinkmethod(v)
end)
-- we can call setinternalreference with an already known internal or with