AbsolutePosition.__init__()   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
1
from coalib.results.TextPosition import TextPosition
2
from coala_utils.decorators import enforce_signature
3
4
5
class AbsolutePosition(TextPosition):
6
7
    @enforce_signature
8
    def __init__(self,
9
                 text: (tuple, list, None)=None,
10
                 position: (int, None)=None):
11
        """
12
        Creates an AbsolutePosition object that represents the index of a
13
        character in a string.
14
15
        :param text:     The text containing the character.
16
        :param position: Position identifying the index of character
17
                         in text.
18
        """
19
        line = column = None
20
        if position is not None and text is not None:
21
            line, column = calc_line_col(text, position)
22
        self._text = text
23
        self._position = position
24
        super().__init__(line, column)
25
26
    @property
27
    def position(self):
28
        return self._position
29
30
31
def calc_line_col(text, position):
32
    r"""
33
    Creates a tuple containing (line, column) by calculating line number
34
    and column in the text, from position.
35
36
    The position represents the index of a character. In the following
37
    example 'a' is at position '0' and it's corresponding line and column are:
38
39
    >>> calc_line_col(('a\n',), 0)
40
    (1, 1)
41
42
    All special characters(including the newline character) belong in the same
43
    line, and have their own position. A line is an item in the tuple:
44
45
    >>> calc_line_col(('a\n', 'b\n'), 1)
46
    (1, 2)
47
    >>> calc_line_col(('a\n', 'b\n'), 2)
48
    (2, 1)
49
50
    :param text:          A tuple/list of lines in which position is to
51
                          be calculated.
52
    :param position:      Position (starting from 0) of character to be found
53
                          in the (line, column) form.
54
    :return:              A tuple of the form (line, column), where both line
55
                          and column start from 1.
56
    """
57
    for linenum, line in enumerate(text, start=1):
58
        linelen = len(line)
59
        if position < linelen:
60
            return linenum, position + 1
61
        position -= linelen
62
63
    raise ValueError("Position not found in text")
64