Esempio n. 1
0
def str_translate__Rope_ANY_ANY(space, w_string, w_table, w_deletechars=''):
    """charfilter - unicode handling is not implemented

    Return a copy of the string where all characters occurring
    in the optional argument deletechars are removed, and the
    remaining characters have been mapped through the given translation table,
    which must be a string of length 256"""

    if space.is_w(w_table, space.w_None):
        table = DEFAULT_NOOP_TABLE
    else:
        table = space.bufferstr_w(w_table)
        if len(table) != 256:
            raise OperationError(
                space.w_ValueError,
                space.wrap("translation table must be 256 characters long"))

    node = w_string._node
    chars = []
    iter = rope.ItemIterator(node)
    while 1:
        try:
            c = iter.nextchar()
            w_char = W_RopeObject.PREBUILT[ord(c)]
            if not space.is_true(space.contains(w_deletechars, w_char)):
                 chars.append(table[ord(c)])
        except StopIteration:
            break
    return W_RopeObject(rope.rope_from_charlist(chars))
Esempio n. 2
0
def str_translate__Rope_ANY_ANY(space, w_string, w_table, w_deletechars=''):
    """charfilter - unicode handling is not implemented
    
    Return a copy of the string where all characters occurring 
    in the optional argument deletechars are removed, and the 
    remaining characters have been mapped through the given translation table, 
    which must be a string of length 256"""

    # XXX CPython accepts buffers, too, not sure what we should do
    table = space.str_w(w_table)
    if len(table) != 256:
        raise OperationError(
            space.w_ValueError,
            space.wrap("translation table must be 256 characters long"))

    node = w_string._node
    chars = []
    iter = rope.ItemIterator(node)
    while 1:
        try:
            c = iter.nextchar()
            w_char = W_RopeObject.PREBUILT[ord(c)]
            if not space.is_true(space.contains(w_deletechars, w_char)):
                 chars.append(table[ord(c)])
        except StopIteration:
            break
    return W_RopeObject(rope.rope_from_charlist(chars))
Esempio n. 3
0
def _local_transform(node, transform):
    l = node.length()
    res = [' '] * l
    iter = rope.ItemIterator(node)
    for i in range(l):
        ch = iter.nextchar()
        res[i] = transform(ch)

    return W_RopeObject(rope.rope_from_charlist(res))
Esempio n. 4
0
def _local_transform(node, transform):
    l = node.length()
    res = [' '] * l
    iter = rope.ItemIterator(node)
    for i in range(l):
        ch = iter.nextchar()
        res[i] = transform(ch)

    return W_RopeObject(rope.rope_from_charlist(res))
Esempio n. 5
0
def repr__Rope(space, w_str):
    node = w_str._node
    length = node.length()

    i = 0
    buf = [' '] * (length * 4 + 2)  # safely overallocate

    quote = "'"
    if (rope.find_int(node, ord(quote)) != -1
            and rope.find_int(node, ord('"')) == -1):
        quote = '"'

    buf[0] = quote

    iter = rope.ItemIterator(node)
    while 1:
        try:
            c = iter.nextchar()
            i += 1
        except StopIteration:
            break
        bs_char = None  # character quoted by backspace

        if c == '\\' or c == quote:
            bs_char = c
        elif c == '\t':
            bs_char = 't'
        elif c == '\r':
            bs_char = 'r'
        elif c == '\n':
            bs_char = 'n'
        elif not '\x20' <= c < '\x7f':
            n = ord(c)
            buf[i] = '\\'
            i += 1
            buf[i] = 'x'
            i += 1
            buf[i] = "0123456789abcdef"[n >> 4]
            i += 1
            buf[i] = "0123456789abcdef"[n & 0xF]
        else:
            buf[i] = c

        if bs_char is not None:
            buf[i] = '\\'
            i += 1
            buf[i] = bs_char

    i += 1
    buf[i] = quote

    return W_RopeObject(rope.rope_from_charlist(buf[:i + 1]))
Esempio n. 6
0
def repr__Rope(space, w_str):
    node = w_str._node
    length = node.length()

    i = 0
    buf = [" "] * (length * 4 + 2)  # safely overallocate

    quote = "'"
    if rope.find_int(node, ord(quote)) != -1 and rope.find_int(node, ord('"')) == -1:
        quote = '"'

    buf[0] = quote

    iter = rope.ItemIterator(node)
    while 1:
        try:
            c = iter.nextchar()
            i += 1
        except StopIteration:
            break
        bs_char = None  # character quoted by backspace

        if c == "\\" or c == quote:
            bs_char = c
        elif c == "\t":
            bs_char = "t"
        elif c == "\r":
            bs_char = "r"
        elif c == "\n":
            bs_char = "n"
        elif not "\x20" <= c < "\x7f":
            n = ord(c)
            buf[i] = "\\"
            i += 1
            buf[i] = "x"
            i += 1
            buf[i] = "0123456789abcdef"[n >> 4]
            i += 1
            buf[i] = "0123456789abcdef"[n & 0xF]
        else:
            buf[i] = c

        if bs_char is not None:
            buf[i] = "\\"
            i += 1
            buf[i] = bs_char

    i += 1
    buf[i] = quote

    return W_RopeObject(rope.rope_from_charlist(buf[: i + 1]))
Esempio n. 7
0
def repr__Rope(space, w_str):
    node = w_str._node
    length = node.length()

    i = 0
    buf = [' '] * (length * 4 + 2) # safely overallocate

    quote = "'"
    if (rope.find_int(node, ord(quote)) != -1 and
        rope.find_int(node, ord('"')) == -1):
        quote = '"'

    buf[0] = quote

    iter = rope.ItemIterator(node)
    while 1:
        try:
            c = iter.nextchar()
            i += 1
        except StopIteration:
            break
        bs_char = None # character quoted by backspace

        if c == '\\' or c == quote:
            bs_char = c
        elif c == '\t': bs_char = 't'
        elif c == '\r': bs_char = 'r'
        elif c == '\n': bs_char = 'n'
        elif not '\x20' <= c < '\x7f':
            n = ord(c)
            buf[i] = '\\'
            i += 1
            buf[i] = 'x'
            i += 1
            buf[i] = "0123456789abcdef"[n>>4]
            i += 1
            buf[i] = "0123456789abcdef"[n&0xF]
        else:
            buf[i] = c

        if bs_char is not None:
            buf[i] = '\\'
            i += 1
            buf[i] = bs_char

    i += 1
    buf[i] = quote

    return W_RopeObject(rope.rope_from_charlist(buf[:i+1]))
Esempio n. 8
0
def str_title__Rope(space, w_self):
    node = w_self._node
    length = node.length()
    buffer = [' '] * length
    prev_letter = ' '

    iter = rope.ItemIterator(node)
    for pos in range(0, length):
        ch = iter.nextchar()
        if not prev_letter.isalpha():
            buffer[pos] = _upper(ch)
        else:
            buffer[pos] = _lower(ch)

        prev_letter = buffer[pos]

    return W_RopeObject(rope.rope_from_charlist(buffer))
Esempio n. 9
0
def str_title__Rope(space, w_self):
    node = w_self._node
    length = node.length()
    buffer = [' '] * length
    prev_letter = ' '

    iter = rope.ItemIterator(node)
    for pos in range(0, length):
        ch = iter.nextchar()
        if not prev_letter.isalpha():
            buffer[pos] = _upper(ch)
        else:
            buffer[pos] = _lower(ch)

        prev_letter = buffer[pos]

    return W_RopeObject(rope.rope_from_charlist(buffer))
Esempio n. 10
0
def str_capitalize__Rope(space, w_self):
    node = w_self._node
    length = node.length()
    buffer = [' '] * length
    if length > 0:
        iter = rope.ItemIterator(node)
        ch = iter.nextchar()
        if ch.islower():
            o = ord(ch) - 32
            buffer[0] = chr(o)
        else:
            buffer[0] = ch

        for i in range(1, length):
            ch = iter.nextchar()
            if ch.isupper():
                o = ord(ch) + 32
                buffer[i] = chr(o)
            else:
                buffer[i] = ch
    else:
        return W_RopeObject.EMPTY

    return W_RopeObject(rope.rope_from_charlist(buffer))
Esempio n. 11
0
def str_capitalize__Rope(space, w_self):
    node = w_self._node
    length = node.length()
    buffer = [' '] * length
    if length > 0:
        iter = rope.ItemIterator(node)
        ch = iter.nextchar()
        if ch.islower():
            o = ord(ch) - 32
            buffer[0] = chr(o)
        else:
            buffer[0] = ch

        for i in range(1, length):
            ch = iter.nextchar()
            if ch.isupper():
                o = ord(ch) + 32
                buffer[i] = chr(o)
            else:
                buffer[i] = ch
    else:
        return W_RopeObject.EMPTY

    return W_RopeObject(rope.rope_from_charlist(buffer))
Esempio n. 12
0
def repr__RopeUnicode(space, w_unicode):
    hexdigits = "0123456789abcdef"
    node = w_unicode._node
    size = node.length()

    singlequote = doublequote = False
    iter = rope.ItemIterator(node)
    for i in range(size):
        c = iter.nextunichar()
        if singlequote and doublequote:
            break
        if c == u'\'':
            singlequote = True
        elif c == u'"':
            doublequote = True
    if singlequote and not doublequote:
        quote = '"'
    else:
        quote = '\''
    result = ['u', quote]
    iter = rope.ItemIterator(node)
    j = 0
    while j < size:
        code = iter.nextint()
        if code >= 0x10000:
            result.extend(['\\', "U",
                           hexdigits[(code >> 28) & 0xf],
                           hexdigits[(code >> 24) & 0xf],
                           hexdigits[(code >> 20) & 0xf],
                           hexdigits[(code >> 16) & 0xf],
                           hexdigits[(code >> 12) & 0xf],
                           hexdigits[(code >>  8) & 0xf],
                           hexdigits[(code >>  4) & 0xf],
                           hexdigits[(code >>  0) & 0xf],
                           ])
            j += 1
            continue
        if code >= 0xD800 and code < 0xDC00:
            if j < size - 1:
                code2 = iter.nextint()
                # XXX this is wrong: if the next if is false,
                # code2 is lost
                if code2 >= 0xDC00 and code2 <= 0xDFFF:
                    code = (((code & 0x03FF) << 10) | (code2 & 0x03FF)) + 0x00010000
                    result.extend(['\\', "U",
                                   hexdigits[(code >> 28) & 0xf],
                                   hexdigits[(code >> 24) & 0xf],
                                   hexdigits[(code >> 20) & 0xf],
                                   hexdigits[(code >> 16) & 0xf],
                                   hexdigits[(code >> 12) & 0xf],
                                   hexdigits[(code >>  8) & 0xf],
                                   hexdigits[(code >>  4) & 0xf],
                                   hexdigits[(code >>  0) & 0xf],
                                  ])
                    j += 2
                    continue

        if code >= 0x100:
            result.extend(['\\', "u",
                           hexdigits[(code >> 12) & 0xf],
                           hexdigits[(code >>  8) & 0xf],
                           hexdigits[(code >>  4) & 0xf],
                           hexdigits[(code >>  0) & 0xf],
                          ])
            j += 1
            continue
        if code == ord('\\') or code == ord(quote):
            result.append('\\')
            result.append(chr(code))
            j += 1
            continue
        if code == ord('\t'):
            result.append('\\')
            result.append('t')
            j += 1
            continue
        if code == ord('\r'):
            result.append('\\')
            result.append('r')
            j += 1
            continue
        if code == ord('\n'):
            result.append('\\')
            result.append('n')
            j += 1
            continue
        if code < ord(' ') or code >= 0x7f:
            result.extend(['\\', "x",
                           hexdigits[(code >> 4) & 0xf],
                           hexdigits[(code >> 0) & 0xf],
                          ])
            j += 1
            continue
        result.append(chr(code))
        j += 1
    result.append(quote)
    return W_RopeObject(rope.rope_from_charlist(result))
Esempio n. 13
0
def repr__RopeUnicode(space, w_unicode):
    hexdigits = "0123456789abcdef"
    node = w_unicode._node
    size = node.length()

    singlequote = doublequote = False
    iter = rope.ItemIterator(node)
    for i in range(size):
        c = iter.nextunichar()
        if singlequote and doublequote:
            break
        if c == u'\'':
            singlequote = True
        elif c == u'"':
            doublequote = True
    if singlequote and not doublequote:
        quote = '"'
    else:
        quote = '\''
    result = ['u', quote]
    iter = rope.ItemIterator(node)
    j = 0
    while j < size:
        code = iter.nextint()
        if code >= 0x10000:
            result.extend([
                '\\',
                "U",
                hexdigits[(code >> 28) & 0xf],
                hexdigits[(code >> 24) & 0xf],
                hexdigits[(code >> 20) & 0xf],
                hexdigits[(code >> 16) & 0xf],
                hexdigits[(code >> 12) & 0xf],
                hexdigits[(code >> 8) & 0xf],
                hexdigits[(code >> 4) & 0xf],
                hexdigits[(code >> 0) & 0xf],
            ])
            j += 1
            continue
        if code >= 0xD800 and code < 0xDC00:
            if j < size - 1:
                code2 = iter.nextint()
                # XXX this is wrong: if the next if is false,
                # code2 is lost
                if code2 >= 0xDC00 and code2 <= 0xDFFF:
                    code = (((code & 0x03FF) << 10) |
                            (code2 & 0x03FF)) + 0x00010000
                    result.extend([
                        '\\',
                        "U",
                        hexdigits[(code >> 28) & 0xf],
                        hexdigits[(code >> 24) & 0xf],
                        hexdigits[(code >> 20) & 0xf],
                        hexdigits[(code >> 16) & 0xf],
                        hexdigits[(code >> 12) & 0xf],
                        hexdigits[(code >> 8) & 0xf],
                        hexdigits[(code >> 4) & 0xf],
                        hexdigits[(code >> 0) & 0xf],
                    ])
                    j += 2
                    continue

        if code >= 0x100:
            result.extend([
                '\\',
                "u",
                hexdigits[(code >> 12) & 0xf],
                hexdigits[(code >> 8) & 0xf],
                hexdigits[(code >> 4) & 0xf],
                hexdigits[(code >> 0) & 0xf],
            ])
            j += 1
            continue
        if code == ord('\\') or code == ord(quote):
            result.append('\\')
            result.append(chr(code))
            j += 1
            continue
        if code == ord('\t'):
            result.append('\\')
            result.append('t')
            j += 1
            continue
        if code == ord('\r'):
            result.append('\\')
            result.append('r')
            j += 1
            continue
        if code == ord('\n'):
            result.append('\\')
            result.append('n')
            j += 1
            continue
        if code < ord(' ') or code >= 0x7f:
            result.extend([
                '\\',
                "x",
                hexdigits[(code >> 4) & 0xf],
                hexdigits[(code >> 0) & 0xf],
            ])
            j += 1
            continue
        result.append(chr(code))
        j += 1
    result.append(quote)
    return W_RopeObject(rope.rope_from_charlist(result))