Mirror characters with Bidi Mirrored property
From LuaTeXWiki
This example code for mirroring characters that has Bidi_Mirrored property (as defined by Unicode) in RTL contexts. It uses characters.data table defined in char-def.lua file from ConTeXt distribution to get character properties.
dofile("char-def.lua") -- character definition table local function mirror(hlist) local rtl = false if tex.textdir == "TRT" then rtl = true elseif tex.textdir == "TLT" then rtl = false end for n in node.traverse(hlist) do if n.id == node.id('hlist') then mirror(n.list) end if n.id == node.id("whatsit") and n.subtype == 7 then if n.dir == "+TRT" or n.dir == "-TLT" then rtl = true elseif n.dir == "-TRT" or n.dir == "+TLT" then rtl = false end end if n.id == node.id('glyph') then if rtl then local char = n.char local mirror = characters.data[char].mirror if mirror then n.char = mirror end end end end end callback.register('pre_linebreak_filter', function(h) mirror(h) return true end )
Example usage:
\directlua{dofile("mirror.lua")} (Left to right) {\textdir TRT (RIGHT TO LEFT)} \textdir TRT RIGHT [TO] LEFT (TEXT) \textdir TLT left [to] right (text) \bye
--khaledhosny