def process_block(self, current_block, previous_block, text):
        """
        Processes a block and setup its folding info.

        This method call ``detect_fold_level`` and handles most of the tricky
        corner cases so that all you have to do is focus on getting the proper
        fold level foreach meaningful block, skipping the blank ones.

        :param current_block: current block to process
        :param previous_block: previous block
        :param text: current block text
        """
        prev_fold_level = TextBlockHelper.get_fold_lvl(previous_block)
        if text.strip() == '':
            # blank line always have the same level as the previous line
            fold_level = prev_fold_level
        else:
            fold_level = self.detect_fold_level(
                previous_block, current_block)
            if fold_level > self.limit:
                fold_level = self.limit

        prev_fold_level = TextBlockHelper.get_fold_lvl(previous_block)

        if fold_level > prev_fold_level:
            # apply on previous blank lines
            block = current_block.previous()
            while block.isValid() and block.text().strip() == '':
                TextBlockHelper.set_fold_lvl(block, fold_level)
                block = block.previous()
            TextBlockHelper.set_fold_trigger(
                block, True)

        # update block fold level
        if text.strip():
            TextBlockHelper.set_fold_trigger(
                previous_block, fold_level > prev_fold_level)
        TextBlockHelper.set_fold_lvl(current_block, fold_level)

        # user pressed enter at the beginning of a fold trigger line
        # the previous blank line will keep the trigger state and the new line
        # (which actually contains the trigger) must use the prev state (
        # and prev state must then be reset).
        prev = current_block.previous()  # real prev block (may be blank)
        if (prev and prev.isValid() and prev.text().strip() == '' and
                TextBlockHelper.is_fold_trigger(prev)):
            # prev line has the correct trigger fold state
            TextBlockHelper.set_collapsed(
                current_block, TextBlockHelper.is_collapsed(
                    prev))
            # make empty line not a trigger
            TextBlockHelper.set_fold_trigger(prev, False)
            TextBlockHelper.set_collapsed(prev, False)
def process_block ( self , current_block , previous_block , text ) : prev_fold_level = TextBlockHelper . get_fold_lvl ( previous_block ) if text . strip ( ) == '' : fold_level = prev_fold_level else : fold_level = self . detect_fold_level ( previous_block , current_block ) if fold_level > self . limit : fold_level = self . limit prev_fold_level = TextBlockHelper . get_fold_lvl ( previous_block ) if fold_level > prev_fold_level : block = current_block . previous ( ) while block . isValid ( ) and block . text ( ) . strip ( ) == '' : TextBlockHelper . set_fold_lvl ( block , fold_level ) block = block . previous ( ) TextBlockHelper . set_fold_trigger ( block , True ) if text . strip ( ) : TextBlockHelper . set_fold_trigger ( previous_block , fold_level > prev_fold_level ) TextBlockHelper . set_fold_lvl ( current_block , fold_level ) prev = current_block . previous ( ) if ( prev and prev . isValid ( ) and prev . text ( ) . strip ( ) == '' and TextBlockHelper . is_fold_trigger ( prev ) ) : TextBlockHelper . set_collapsed ( current_block , TextBlockHelper . is_collapsed ( prev ) ) TextBlockHelper . set_fold_trigger ( prev , False ) TextBlockHelper . set_collapsed ( prev , False )
Processes a block and setup its folding info.

        This method call ``detect_fold_level`` and handles most of the tricky
        corner cases so that all you have to do is focus on getting the proper
        fold level foreach meaningful block, skipping the blank ones.

        :param current_block: current block to process
        :param previous_block: previous block
        :param text: current block text