1. Python / Говнокод #13489

    −105

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    def getBoundTextRangeSL(leftBoundary, rightBoundary, pos, doc):
        ''' Get the range between any symbol specified in leftBoundary set and rightBoundary
    
            Search starts from given cursor position...
    
            NOTE `SL' suffix means Single Line -- i.e. when search, do not cross one line boundaries!
        '''
        if not doc.lineLength(pos.line()):
            return KTextEditor.Range(pos, pos)
    
        lineStr = doc.line(pos.line())                          # Get the current line as string to analyse
        found = False
        cc = pos.column()                                       # (pre)initialize 'current column'
        # NOTE If cursor positioned at the end of a line, column()
        # will be equal to the line length and lineStr[cc] will
        # fail... So it must be handled before the `for' loop...
        # And BTW, going to the line begin will start from a
        # previous position -- it is why 'pos.column() - 1'
        initialPos = min(len(lineStr) - 1, pos.column() - 1)    # Let initial index be less than line length
        for cc in range(initialPos, -1, -1):                    # Moving towards the line start
            found = lineStr[cc] in leftBoundary                 # Check the current char for left boundary terminators
            if found:
                break                                           # Break the loop if found smth
    
        startPos = KTextEditor.Cursor(pos.line(), cc + int(found))
    
        cc = pos.column()                                       # Reset 'current column'
        for cc in range(pos.column(), len(lineStr)):            # Moving towards the line end
            if lineStr[cc] in rightBoundary:                    # Check the current char for right boundary terminators
                break                                           # Break the loop if found smth
    
        endPos = KTextEditor.Cursor(pos.line(), cc)
    
        return KTextEditor.Range(startPos, endPos)

    [color=blue]http://patches.fedorapeople.org/pate-docs/_modules/libkatepate/common.html#getBoundTextRangeSL[color]

    Запостил: Elvenfighter, 26 Июля 2013

    Комментарии (7) RSS

    • Кэп?
      Ответить
      • Простите, что?
        Ответить
        • Кэп, ты где пропадал?
          Ответить
        • В чем говнокод-то?
          Ответить
          • В логике работы: если дать заведома невалидный курсор - то вернёт позицию курсора, если дать курсор в конце строчки - выкинет IndexError, если курсор стоит в конце слова (т.е. "word|") -- вернет один символ из rightBoundary после слова (напр. пробел).

            И главное -- этот весь говно-behavior бережно задокументирован.
            Ответить
    • Проблема в том, что курсор может стоять в таком месте, где текста вроде как нету? Ну, вообще, как бы да, тогда странно зачем нужно было еще что-то проверять, если для правой границы места уже и не осталось...

      KTextEditor.Range(pos, pos) - поди пустую строку возвращает?
      Ответить
      • > KTextEditor.Range(pos, pos) - поди пустую строку возвращает?

        Не совсем. Range -- это у них просто координаты начала и конца отрезка текста, чтоб достать текст по этому ренжу надо document.text(range)

        Конкретно это -- отвечает за возврат невалидного Range, если курсор невалиден. И да, это еще и "оптимизация" на случай если строка под курсором - пустая.
        Ответить

    Добавить комментарий