resolve_weak_types

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