in lib/twitter_cldr/shared/bidi.rb [274:368]
def resolve_weak_types
run_count = @runs.size
previous_level = @base_embedding
run_count.times do |run_idx|
start = get_run_start(run_idx)
finish = get_run_limit(run_idx)
level = get_run_level(run_idx) || 0
sor = [previous_level, level].max.even? ? :L : :R
next_level = if run_idx == (run_count - 1)
@base_embedding
else
get_run_level(run_idx + 1) || 0
end
eor = [level, next_level].max.even? ? :L : :R
prev_type = sor
prev_strong_type = sor
start.upto(finish - 1) do |i|
next_type = (i == finish - 1) ? eor : @types[i + 1]
if @types[i] == :NSM
@types[i] = prev_type
else
prev_type = @types[i]
end
if @types[i] == :EN
if prev_strong_type == :AL
@types[i] = :AN
end
elsif @types[i] == :L || @types[i] == :R || @types[i] == :AL
prev_strong_type = @types[i]
end
if @types[i] == :AL
@types[i] = :R
end
if prev_type == :EN && next_type == :EN
if @types[i] == :ES || @types[i] == :CS
@types[i] = nextType
end
elsif prev_type == :AN && next_type == :AN && @types[i] == :CS
@types[i] = next_type
end
if @types[i] == :ET || @types[i] == :BN
if prev_type == :EN
@types[i] = prev_type
else
j = i + 1
while j < finish && @types[j] == :ET || @types[j] == :BN
j += 1
end
if j < finish && @types[j] == :EN
i.upto(j - 1) do |k|
@types[k] = :EN
end
end
end
end
if @types[i] == :ET || @types[i] == :CS || @types[i] == :BN
@types[i] = :ON
end
if prev_strong_type == :L && @types[i] == :EN
@types[i] = prev_strong_type
end
end
previous_level = level
end
end