summaryrefslogtreecommitdiff
path: root/tex/context/base/typo-dha.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/typo-dha.lua')
-rw-r--r--tex/context/base/typo-dha.lua398
1 files changed, 0 insertions, 398 deletions
diff --git a/tex/context/base/typo-dha.lua b/tex/context/base/typo-dha.lua
deleted file mode 100644
index d5ad66e7e..000000000
--- a/tex/context/base/typo-dha.lua
+++ /dev/null
@@ -1,398 +0,0 @@
-if not modules then modules = { } end modules ['typo-dha'] = {
- version = 1.001,
- comment = "companion to typo-dir.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- Some analysis by Idris:
---
--- 1. Assuming the reading- vs word-order distinction (bidi-char types) is governing;
--- 2. Assuming that 'ARAB' represents an actual arabic string in raw input order, not word-order;
--- 3. Assuming that 'BARA' represent the correct RL word order;
---
--- Then we have, with input: LATIN ARAB
---
--- \textdir TLT LATIN ARAB => LATIN BARA
--- \textdir TRT LATIN ARAB => LATIN BARA
--- \textdir TRT LRO LATIN ARAB => LATIN ARAB
--- \textdir TLT LRO LATIN ARAB => LATIN ARAB
--- \textdir TLT RLO LATIN ARAB => NITAL ARAB
--- \textdir TRT RLO LATIN ARAB => NITAL ARAB
-
--- elseif d == "es" then -- European Number Separator
--- elseif d == "et" then -- European Number Terminator
--- elseif d == "cs" then -- Common Number Separator
--- elseif d == "nsm" then -- Non-Spacing Mark
--- elseif d == "bn" then -- Boundary Neutral
--- elseif d == "b" then -- Paragraph Separator
--- elseif d == "s" then -- Segment Separator
--- elseif d == "ws" then -- Whitespace
--- elseif d == "on" then -- Other Neutrals
-
--- todo : delayed inserts here
--- todo : get rid of local functions here
--- beware: math adds whatsits afterwards so that will mess things up
--- todo : use new dir functions
--- todo : make faster
--- todo : move dir info into nodes
--- todo : swappable tables and floats i.e. start-end overloads (probably loop in builders)
--- todo : check if we still have crashes in luatex when non-matched (used to be the case)
-
--- I removed the original tracing code and now use the colorful one. If I ever want to change
--- something I will just inject prints for tracing.
-
-local nodes, node = nodes, node
-
-local trace_directions = false trackers.register("typesetters.directions.default", function(v) trace_directions = v end)
-
-local report_directions = logs.reporter("typesetting","text directions")
-
-
-local insert_node_before = nodes.insert_before
-local insert_node_after = nodes.insert_after
-local remove_node = nodes.remove
-local end_of_math = nodes.end_of_math
-
-local nodepool = nodes.pool
-
-local nodecodes = nodes.nodecodes
-local whatcodes = nodes.whatcodes
-local mathcodes = nodes.mathcodes
-
-local glyph_code = nodecodes.glyph
-local whatsit_code = nodecodes.whatsit
-local math_code = nodecodes.math
-local penalty_code = nodecodes.penalty
-local kern_code = nodecodes.kern
-local glue_code = nodecodes.glue
-local hlist_code = nodecodes.hlist
-local vlist_code = nodecodes.vlist
-
-local localpar_code = whatcodes.localpar
-local dir_code = whatcodes.dir
-
-local new_textdir = nodepool.textdir
-
-local hasbit = number.hasbit
-local formatters = string.formatters
-local insert = table.insert
-
-local fonthashes = fonts.hashes
-local fontdata = fonthashes.identifiers
-local fontchar = fonthashes.characters
-
-local chardirections = characters.directions
-local charmirrors = characters.mirrors
-local charclasses = characters.textclasses
-
-local directions = typesetters.directions
-local setcolor = directions.setcolor
-local getglobal = directions.getglobal
-
-local a_state = attributes.private('state')
-local a_directions = attributes.private('directions')
-
-local strip = false
-
-local s_isol = fonts.analyzers.states.isol
-
-local function stopdir(finish)
- return new_textdir(finish == "TRT" and "-TRT" or "-TLT")
-end
-
-local function startdir(finish)
- return new_textdir(finish == "TRT" and "+TRT" or "+TLT")
-end
-
-local function process(start)
-
- local head = start
-
- local current = head
- local inserted = nil
- local finish = nil
- local autodir = 0
- local embedded = 0
- local override = 0
- local pardir = 0
- local textdir = 0
- local done = false
- local finished = nil
- local finidir = nil
- local stack = { }
- local top = 0
- local obsolete = { }
- local lro = false
- local lro = false
- local prevattr = false
- local fences = { }
-
- local function finish_auto_before()
- head, inserted = insert_node_before(head,current,stopdir(finish))
- finished, finidir, autodir = inserted, finish, 0
- finish, done = nil, true
- end
-
- local function finish_auto_after()
- head, current = insert_node_after(head,current,stopdir(finish))
- finished, finidir, autodir = current, finish, 0
- finish, done = nil, true
- end
-
- local function force_auto_left_before(direction)
- if finish then
- head, inserted = insert_node_before(head,current,stopdir(finish))
- finished = inserted
- finidir = finish
- end
- if embedded >= 0 then
- finish, autodir = "TLT", 1
- else
- finish, autodir = "TRT", -1
- end
- done = true
- if finidir == finish then
- head = remove_node(head,finished,true)
- else
- head, inserted = insert_node_before(head,current,startdir(finish))
- end
- end
-
- local function force_auto_right_before(direction)
- if finish then
- head, inserted = insert_node_before(head,current,stopdir(finish))
- finished = inserted
- finidir = finish
- end
- if embedded <= 0 then
- finish, autodir, done = "TRT", -1
- else
- finish, autodir, done = "TLT", 1
- end
- done = true
- if finidir == finish then
- head = remove_node(head,finished,true)
- else
- head, inserted = insert_node_before(head,current,startdir(finish))
- end
- end
-
- local function nextisright(current)
- current = current.next
- local id = current.id
- if id == glyph_code then
- local character = current.char
- local direction = chardirections[character]
- return direction == "r" or direction == "al" or direction == "an"
- end
- end
-
- local function previsright(current)
- current = current.prev
- local id = current.id
- if id == glyph_code then
- local char = current.char
- local direction = chardirections[character]
- return direction == "r" or direction == "al" or direction == "an"
- end
- end
-
- while current do
- local id = current.id
- if id == math_code then
- current = end_of_math(current.next).next
- else
- local attr = current[a_directions]
- if attr and attr > 0 and attr ~= prevattr then
- if not getglobal(a) then
- lro, rlo = false, false
- end
- prevattr = attr
- end
- if id == glyph_code then
- if attr and attr > 0 then
- local character = current.char
- local direction = chardirections[character]
- local reversed = false
- if rlo or override > 0 then
- if direction == "l" then
- direction = "r"
- reversed = true
- end
- elseif lro or override < 0 then
- if direction == "r" or direction == "al" then
- current[a_state] = s_isol
- direction = "l"
- reversed = true
- end
- end
- if direction == "on" then
- local mirror = charmirrors[character]
- if mirror and fontchar[current.font][mirror] then
- local class = charclasses[character]
- if class == "open" then
- if nextisright(current) then
- if autodir >= 0 then
- force_auto_right_before(direction)
- end
- current.char = mirror
- done = true
- elseif autodir < 0 then
- current.char = mirror
- done = true
- else
- mirror = false
- end
- local fencedir = autodir == 0 and textdir or autodir
- fences[#fences+1] = fencedir
- elseif class == "close" and #fences > 0 then
- local fencedir = fences[#fences]
- fences[#fences] = nil
- if fencedir < 0 then
- current.char = mirror
- done = true
- force_auto_right_before(direction)
- else
- mirror = false
- end
- elseif autodir < 0 then
- current.char = mirror
- done = true
- else
- mirror = false
- end
- end
- if trace_directions then
- setcolor(current,direction,false,mirror)
- end
- elseif direction == "l" then
- if trace_directions then
- setcolor(current,"l",reversed)
- end
- if autodir <= 0 then -- could be option
- force_auto_left_before(direction)
- end
- elseif direction == "r" then
- if trace_directions then
- setcolor(current,"r",reversed)
- end
- if autodir >= 0 then
- force_auto_right_before(direction)
- end
- elseif direction == "en" then -- european number
- if trace_directions then
- setcolor(current,"l")
- end
- if autodir <= 0 then -- could be option
- force_auto_left_before(direction)
- end
- elseif direction == "al" then -- arabic number
- if trace_directions then
- setcolor(current,"r")
- end
- if autodir >= 0 then
- force_auto_right_before(direction)
- end
- elseif direction == "an" then -- arabic number
- if trace_directions then
- setcolor(current,"r")
- end
- if autodir >= 0 then
- force_auto_right_before(direction)
- end
- elseif direction == "lro" then -- Left-to-Right Override -> right becomes left
- top = top + 1
- stack[top] = { override, embedded }
- override = -1
- obsolete[#obsolete+1] = current
- elseif direction == "rlo" then -- Right-to-Left Override -> left becomes right
- top = top + 1
- stack[top] = { override, embedded }
- override = 1
- obsolete[#obsolete+1] = current
- elseif direction == "lre" then -- Left-to-Right Embedding -> TLT
- top = top + 1
- stack[top] = { override, embedded }
- embedded = 1
- obsolete[#obsolete+1] = current
- elseif direction == "rle" then -- Right-to-Left Embedding -> TRT
- top = top + 1
- stack[top] = { override, embedded }
- embedded = -1
- obsolete[#obsolete+1] = current
- elseif direction == "pdf" then -- Pop Directional Format
- if top > 0 then
- local s = stack[top]
- override, embedded = s[1], s[2]
- top = top - 1
- end
- obsolete[#obsolete+1] = current
- else
- setcolor(current)
- end
- else
- -- we do nothing
- end
- elseif id == whatsit_code then
- local subtype = current.subtype
- if subtype == localpar_code then
- local dir = current.dir
- if dir == 'TRT' then
- autodir = -1
- elseif dir == 'TLT' then
- autodir = 1
- end
- pardir = autodir
- textdir = pardir
- elseif subtype == dir_code then
- -- todo: also treat as lro|rlo and stack
- if finish then
- finish_auto_before()
- end
- local dir = current.dir
- if dir == "+TRT" then
- finish, autodir = "TRT", -1
- elseif dir == "-TRT" then
- finish, autodir = nil, 0
- elseif dir == "+TLT" then
- finish, autodir = "TLT", 1
- elseif dir == "-TLT" then
- finish, autodir = nil, 0
- end
- textdir = autodir
- else
- if finish then
- finish_auto_before()
- end
- end
- elseif finish then
- finish_auto_before()
- end
- local cn = current.next
- if cn then
- -- we're okay
- elseif finish then
- finish_auto_after()
- end
- current = cn
- end
- end
-
- if done and strip then
- local n = #obsolete
- if n > 0 then
- for i=1,n do
- remove_node(head,obsolete[i],true)
- end
- report_directions("%s character nodes removed",n)
- end
- end
-
- return head, done
-
-end
-
-directions.installhandler(interfaces.variables.default,process)
-