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))
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))
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))
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]))
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]))
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]))
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))
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))
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))
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))