From 60c242de9b6521db6c176c06738a88b9417b0dec Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 15 Sep 2010 02:21:29 +0200 Subject: hyperlinks now work for both internal and external targets --- rst_context.lua | 46 +++++++++++++++++++++++++--------------------- rst_parser.lua | 4 ++-- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/rst_context.lua b/rst_context.lua index 0c657df..4f333a2 100644 --- a/rst_context.lua +++ b/rst_context.lua @@ -151,15 +151,10 @@ end function rst_context.reference (str) rst_context.addsetups("references") str = str:match("^`?([^`]+)`?_$") -- LPEG could render this gibberish legible but not time - local link = rst_context.collected_references[str] or rst_context.context_references[str] - if not link then -- assume internal - return [[\\goto{]] .. str .. [[}[__target_]] .. str .. "]" - end - return [[\\goto{]] - .. str - .. [[}[url(]] - .. link - .. [=[)]]=] + --local link = rst_context.collected_references[str] or rst_context.context_references[str] + --return [[\\goto{]] .. str .. [[}[__target_]] .. rst_context.whitespace_to_underscore(str) .. "]" + return [[\\RSTchoosegoto{__target_]] .. rst_context.whitespace_to_underscore(str) .. "}{" + .. str .. "}" end function rst_context.anon_reference (str) @@ -167,11 +162,7 @@ function rst_context.anon_reference (str) str = str:match("^`?([^`]+)`?__$") rst_context.anonymous_links = rst_context.anonymous_links + 1 link = "__target_anon_" .. rst_context.anonymous_links - return [[\\goto{]] - .. str - .. [[}[]] - .. link - .. [=[]]=] + return [[\\goto{]] .. str .. [[}[]] .. link .. [=[]]=] end local whitespace = S" \n\t\v" @@ -198,13 +189,18 @@ function rst_context.target (tab) --if removewhitespace:match(target) == "" then if target == "" then -- links here for _, id in next, tab do + print(id) insert = insert .. "\n\\reference[__target_" .. id .. "]{}" end else for i=1,#tab do - local id = tab[i]:gsub("\\:",":"):match("`?([^`]+)`?") -- deescaping + local id = tab[i] + if id == "" then -- anonymous + id = create_anonymous() + else + id = tab[i]:gsub("\\:",":"):match("`?([^`]+)`?") -- deescaping + end if id then - id = id ~= "" and id or create_anonymous () refs[id] = refs[id] or target end end @@ -434,16 +430,11 @@ function rst_context.section (...) -- TODO general cleanup; move validity local section, str = true, "" local adornchar if #tab == 3 then -- TODO use unicode length with ConTeXt - --print(">>"..tab[1].."<>"..tab[2].."<<") adornchar = tab[1]:sub(1,1) - -- overline == underline && len(overline) = len(sectionstring) section = tab[1] == tab[3] and #tab[1] >= #tab[2] - -- if overline consists only of one char then keep truth value else - -- false section = get_line_pattern(adornchar):match(tab[1]) ~= nil and section str = string.strip(tab[2]) else -- no overline - --print(">>"..tab[1].."<>"..tab[2].."<<") adornchar = tab[2]:sub(1,1) section = #tab[1] <= #tab[2] section = get_line_pattern(adornchar):match(tab[2]) ~= nil and section @@ -1006,12 +997,25 @@ function optional_setups.references () ]] local references = {} + local ref_keys = {} for ref, target in next, refs do + ref_keys[#ref_keys+1] = [[__target_]] .. rst_context.whitespace_to_underscore(ref) target = resolve_indirect(target) references[#references+1] = string.format([[ \useURL[__target_%s] [%s] [] [%s] ]], rst_context.whitespace_to_underscore(ref), target, ref) 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, ",") .. [[} + +% #1 target name, #2 link text +\def\RSTchoosegoto#1#2{% + \rawdoifinsetelse{#1}{\RSTexternalreferences} + {\from[#1]} + {\goto{#2}[#1]} +} +]] + return refsection end diff --git a/rst_parser.lua b/rst_parser.lua index 04aa01a..b065bea 100644 --- a/rst_parser.lua +++ b/rst_parser.lua @@ -1258,8 +1258,8 @@ local function main() return 1 end - --for i,j in next, rst.anonymous_links do - --print(i,j) + --for i,j in next, rst.context_references do + --print(i,j[1], j[2]) --end --print(">>>Last used char>: " ..state.lastbullet.." <<<<") -- cgit v1.2.3