diff options
author | Hans Hagen <pragma@wxs.nl> | 2017-10-10 13:36:53 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2017-10-10 13:36:53 +0200 |
commit | d47ee9fc195ba82eef5e4be132b1d88b7f009a9c (patch) | |
tree | 45964c47b2242f6ff9bf6a881639146be1edd201 /tex/context/base/mkiv/strc-ref.lua | |
parent | edaa6851d5c096acba2ad5817f70d3eb7cec46e6 (diff) | |
download | context-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.lua | 68 |
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 |