diff options
-rw-r--r-- | rst_context.lua | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/rst_context.lua b/rst_context.lua index 92a584b..016ad5b 100644 --- a/rst_context.lua +++ b/rst_context.lua @@ -47,13 +47,16 @@ end local rst_context = {} -rst_context.collected_references = {} rst_context.collected_adornments = {} rst_context.last_section_level = 0 rst_context.anonymous_targets = 0 -rst_context.anonymous_links = 0 +rst_context.anonymous_links = {} + +rst_context.collected_references = {} rst_context.context_references = {} rst_context.structure_references = {} +rst_context.anonymous_set = {} + rst_context.substitutions = {} rst_context.lastitemnumber = 0 -- enumerations in RST allow arbitrary skips @@ -160,9 +163,8 @@ end function rst_context.anon_reference (str) rst_context.addsetups("references") str = str:match("^`?([^`]+)`?__$") - rst_context.anonymous_links = rst_context.anonymous_links + 1 - link = "__target_anon_" .. rst_context.anonymous_links - --return [[\\goto{]] .. str .. [[}[url(]] .. link .. [=[)]]=] + rst_context.anonymous_links[#rst_context.anonymous_links+1] = str + link = "__target_anon_" .. #rst_context.anonymous_links return string.format([[\\RSTchoosegoto{%s}{%s}]], link, str) end @@ -173,20 +175,18 @@ local removewhitespace = Cs((nowhitespace^1 + Cs(whitespace / ""))^0) function rst_context.target (tab) rst_context.addsetups("references") --local tab = { ... } - local refs = rst_context.collected_references + local refs = rst_context.collected_references + local arefs = rst_context.anonymous_set local target = tab[#tab] -- Ct + C could be clearer but who cares tab[#tab] = nil local function create_anonymous () rst_context.anonymous_targets = rst_context.anonymous_targets + 1 - return "anon_" .. rst_context.anonymous_targets + return { "anon_" .. rst_context.anonymous_targets, rst_context.anonymous_targets } end - --target = resolve_indirect (target) - local insert = "" - --if removewhitespace:match(target) == "" then if target == "" then -- links here for _, id in next, tab do insert = insert .. "\n\\reference[__target_" .. id .. "]{}" @@ -195,7 +195,8 @@ function rst_context.target (tab) for i=1,#tab do local id = tab[i] if id == "" then -- anonymous - id = create_anonymous() + local anon = create_anonymous() + id, arefs[anon[1]] = anon[1], anon[2] else id = tab[i]:gsub("\\:",":"):match("`?([^`]+)`?") -- deescaping end @@ -1167,18 +1168,23 @@ function optional_setups.references () ]] local references = {} - local ref_keys = {} + local ref_keys = {} + local arefs = rst_context.anonymous_set for ref, target in next, refs do ref_keys[#ref_keys+1] = [[__target_]] .. rst_context.whitespace_to_underscore(ref) target = resolve_indirect(target) if target ~= false then + ref_text = ref + if arefs[ref_text] then + ref_text = rst_context.anonymous_links[tonumber(arefs[ref_text])] + end references[#references+1] = string.format([[ -\useURL[__target_%s] [%s] [] [%s] ]], rst_context.whitespace_to_underscore(ref), target, ref) +\useURL[__target_%s] [%s] [] [%s] ]], rst_context.whitespace_to_underscore(ref), target, ref_text) end end refsection = refsection .. table.concat(references, "\n") -- this is needed in order to select the right reference command later - refsection = refsection .. "\n\n" .. [[\def\RSTexternalreferences{]] .. table.concat(ref_keys, ",") .. [[} + refsection = refsection .. "\n\n" .. [[\def \RSTexternalreferences{]] .. table.concat(ref_keys, ",") .. [[} % #1 target name, #2 link text \def\RSTchoosegoto#1#2{% |