bidi/algorithm.py
def explicit_embed_and_overrides(storage, debug=False):
    """Apply X1 to X9 rules of the unicode algorithm.

    See http://unicode.org/reports/tr9/#Explicit_Levels_and_Directions

    """
    overflow_counter = almost_overflow_counter = 0
    directional_override = 'N'
    levels = deque()

    # X1
    embedding_level = storage['base_level']

    for _ch in storage['chars']:
        bidi_type = _ch['type']

        level_func, override = X2_X5_MAPPINGS.get(bidi_type, (None, None))

        if level_func:
            # So this is X2 to X5
            # if we've past EXPLICIT_LEVEL_LIMIT, note it and do nothing

            if overflow_counter != 0:
                overflow_counter += 1
                continue

            new_level = level_func(embedding_level)
            if new_level < EXPLICIT_LEVEL_LIMIT:
                levels.append((embedding_level, directional_override))
                embedding_level, directional_override = new_level, override

            elif embedding_level == EXPLICIT_LEVEL_LIMIT - 2:
                # The new level is invalid, but a valid level can still be
                # achieved if this level is 60 and we encounter an RLE or
                # RLO further on.  So record that we 'almost' overflowed.
                almost_overflow_counter += 1

            else:
                overflow_counter += 1
        else:
            # X6
            if bidi_type not in X6_IGNORED:
                _ch['level'] = embedding_level
                if directional_override != 'N':
                    _ch['type'] = directional_override

            # X7
            elif bidi_type == 'PDF':
                if overflow_counter:
                    overflow_counter -= 1
                elif almost_overflow_counter and \
                        embedding_level != EXPLICIT_LEVEL_LIMIT - 1:
                    almost_overflow_counter -= 1
                elif levels:
                    embedding_level, directional_override = levels.pop()

            # X8
            elif bidi_type == 'B':
                levels.clear()
                overflow_counter = almost_overflow_counter = 0
                embedding_level = _ch['level'] = storage['base_level']
                directional_override = 'N'

    # Removes the explicit embeds and overrides of types
    # RLE, LRE, RLO, LRO, PDF, and BN. Adjusts extended chars
    # next and prev as well

    # Applies X9. See http://unicode.org/reports/tr9/#X9
    storage['chars'] = [_ch for _ch in storage['chars']
                        if _ch['type'] not in X9_REMOVED]

    calc_level_runs(storage)

    if debug:
        debug_storage(storage, runs=True)
def explicit_embed_and_overrides(storage, debug=False):
    overflow_counter = almost_overflow_counter = 0
    directional_override = 'N'
    levels = deque()

    # X1
    embedding_level = storage['base_level']

    for _ch in storage['chars']:
        bidi_type = _ch['type']

        level_func, override = X2_X5_MAPPINGS.get(bidi_type, (None, None))

        if level_func:
            # So this is X2 to X5
            # if we've past EXPLICIT_LEVEL_LIMIT, note it and do nothing

            if overflow_counter != 0:
                overflow_counter += 1
                continue

            new_level = level_func(embedding_level)
            if new_level < EXPLICIT_LEVEL_LIMIT:
                levels.append((embedding_level, directional_override))
                embedding_level, directional_override = new_level, override

            elif embedding_level == EXPLICIT_LEVEL_LIMIT - 2:
                # The new level is invalid, but a valid level can still be
                # achieved if this level is 60 and we encounter an RLE or
                # RLO further on.  So record that we 'almost' overflowed.
                almost_overflow_counter += 1

            else:
                overflow_counter += 1
        else:
            # X6
            if bidi_type not in X6_IGNORED:
                _ch['level'] = embedding_level
                if directional_override != 'N':
                    _ch['type'] = directional_override

            # X7
            elif bidi_type == 'PDF':
                if overflow_counter:
                    overflow_counter -= 1
                elif almost_overflow_counter and \
                        embedding_level != EXPLICIT_LEVEL_LIMIT - 1:
                    almost_overflow_counter -= 1
                elif levels:
                    embedding_level, directional_override = levels.pop()

            # X8
            elif bidi_type == 'B':
                levels.clear()
                overflow_counter = almost_overflow_counter = 0
                embedding_level = _ch['level'] = storage['base_level']
                directional_override = 'N'

    # Removes the explicit embeds and overrides of types
    # RLE, LRE, RLO, LRO, PDF, and BN. Adjusts extended chars
    # next and prev as well

    # Applies X9. See http://unicode.org/reports/tr9/#X9
    storage['chars'] = [_ch for _ch in storage['chars']
                        if _ch['type'] not in X9_REMOVED]

    calc_level_runs(storage)

    if debug:
        debug_storage(storage, runs=True)
def explicit_embed_and_overrides ( storage , debug = False ) : overflow_counter = almost_overflow_counter = 0 directional_override = 'N' levels = deque ( ) # X1 embedding_level = storage [ 'base_level' ] for _ch in storage [ 'chars' ] : bidi_type = _ch [ 'type' ] level_func , override = X2_X5_MAPPINGS . get ( bidi_type , ( None , None ) ) if level_func : # So this is X2 to X5 # if we've past EXPLICIT_LEVEL_LIMIT, note it and do nothing if overflow_counter != 0 : overflow_counter += 1 continue new_level = level_func ( embedding_level ) if new_level < EXPLICIT_LEVEL_LIMIT : levels . append ( ( embedding_level , directional_override ) ) embedding_level , directional_override = new_level , override elif embedding_level == EXPLICIT_LEVEL_LIMIT - 2 : # The new level is invalid, but a valid level can still be # achieved if this level is 60 and we encounter an RLE or # RLO further on.  So record that we 'almost' overflowed. almost_overflow_counter += 1 else : overflow_counter += 1 else : # X6 if bidi_type not in X6_IGNORED : _ch [ 'level' ] = embedding_level if directional_override != 'N' : _ch [ 'type' ] = directional_override # X7 elif bidi_type == 'PDF' : if overflow_counter : overflow_counter -= 1 elif almost_overflow_counter and embedding_level != EXPLICIT_LEVEL_LIMIT - 1 : almost_overflow_counter -= 1 elif levels : embedding_level , directional_override = levels . pop ( ) # X8 elif bidi_type == 'B' : levels . clear ( ) overflow_counter = almost_overflow_counter = 0 embedding_level = _ch [ 'level' ] = storage [ 'base_level' ] directional_override = 'N' # Removes the explicit embeds and overrides of types # RLE, LRE, RLO, LRO, PDF, and BN. Adjusts extended chars # next and prev as well # Applies X9. See http://unicode.org/reports/tr9/#X9 storage [ 'chars' ] = [ _ch for _ch in storage [ 'chars' ] if _ch [ 'type' ] not in X9_REMOVED ] calc_level_runs ( storage ) if debug : debug_storage ( storage , runs = True )
Apply X1 to X9 rules of the unicode algorithm.

    See http://unicode.org/reports/tr9/#Explicit_Levels_and_Directions
Apply X1 to X9 rules of the unicode algorithm .