resolve_neutral_types

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