in lib/twitter_cldr/shared/bidi.rb [406:459]
def resolve_neutral_types
run_count = get_run_count
previous_level = @base_embedding
run_count.times do |run|
start = get_run_start(run)
finish = get_run_limit(run)
level = get_run_level(run)
next unless level
embedding_direction = level.even? ? :L : :R
sor = [previous_level, level].max.even? ? :L : :R
next_level = if run == (run_count - 1)
@base_embedding
else
get_run_level(run + 1)
end
eor = [level, next_level].max.even? ? :L : :R
prev_strong = sor
neutral_start = -1
start.upto(finish) do |i|
new_strong = -1
this_type = i == finish ? eor : @types[i]
case this_type
when :L
new_strong = :L
when :R, :AN, :EN
new_strong = :R
when :BN, :ON, :S, :B, :WS
neutral_start = i if neutral_start == -1
end
if new_strong != -1
if neutral_start != -1
override = prev_strong == new_strong ? prev_strong : embedding_direction
neutral_start.upto(i - 1) { |j| @types[j] = override }
end
prev_strong = new_strong
neutral_start = -1
end
end
previous_level = level
end
end