recode/recode-3.7.1-python-3-compatibility.patch
2019-08-20 08:26:49 +02:00

221 lines
8.0 KiB
Diff

From 98a1eff200a60d81f404b2874db24a88ee2a592f Mon Sep 17 00:00:00 2001
From: Shlomi Fish <shlomif@shlomifish.org>
Date: Tue, 25 Jun 2019 12:23:39 +0300
Subject: [PATCH] python 3 compatibility.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
See https://github.com/rrthomas/recode/issues/15 .
Petr Pisar: Ported to 3.7.1 from py3-take2 branch of
<https://github.com/shlomif/recode>:
commit 04aefb26fa080c8e9d6ba7a136a8ae263727fba8
Author: Shlomi Fish <shlomif@shlomifish.org>
Date: Tue Jun 25 12:23:39 2019 +0300
Signed-off-by: Petr Písař <ppisar@redhat.com>
---
tables.py | 59 +++++++++++++++++++++++++++++++++++--------------------
1 file changed, 38 insertions(+), 21 deletions(-)
diff --git a/tables.py b/tables.py
index 2604dfe..51752a6 100755
--- a/tables.py
+++ b/tables.py
@@ -43,6 +43,16 @@ When `-F' and `-n' are used, process Alain's tables.
import re, sys
+def to_unicode(s):
+ import six
+ if isinstance(s, six.text_type):
+ return s
+ try:
+ s = six.text_type(s, 'utf-8')
+ except UnicodeDecodeError as err:
+ s = six.text_type(s, 'utf-8', 'ignore')
+ return s
+
# Character constants.
REPLACEMENT_CHARACTER = 0xFFFD
NOT_A_CHARACTER = 0xFFFF
@@ -127,7 +137,7 @@ class Main:
self.mnemonics = Mnemonics()
self.mnemonics.digest_mnemonics_ds(input)
break
- if input.match('Network Working Group +K\. Simonsen$'):
+ if input.match('Network Working Group +K\\. Simonsen$'):
if (self.charnames
and self.charnames.do_sources
and not French_option):
@@ -201,12 +211,15 @@ class Charnames(Options):
def digest_french(self, input):
self.preset_french()
- fold_table = range(256)
- for before, after in map(
- None,
+ fold_table = list(range(256))
+ def myord(c):
+ if isinstance(c, int):
+ return c
+ return ord(c)
+ for before, after in zip(
u'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÂÇÈÉÊÎÏÑÔÖÛ'.encode('ISO-8859-1'),
u'abcdefghijklmnopqrstuvwxyzàâçèéêîïñôöû'.encode('ISO-8859-1')):
- fold_table[ord(before)] = ord(after)
+ fold_table[myord(before)] = myord(after)
folding = ''.join(map(chr, fold_table))
ignorables = (
u'<commande>'.encode('ISO-8859-1'),
@@ -314,6 +327,8 @@ class Charnames(Options):
if len(text) > self.max_length:
self.max_length = len(text)
for word in text.split():
+ word = to_unicode(word)
+ assert isinstance(word, str)
self.code_map[word] = self.code_map.get(word, 0) + 1
def presort_word(self, word):
@@ -334,18 +349,18 @@ class Charnames(Options):
# the second cycling faster from 1 to 255.
if run.verbose:
sys.stdout.write(' sorting words...')
- pairs = map(self.presort_word, self.code_map.keys())
+ pairs = list(map(self.presort_word, self.code_map.keys()))
pairs.sort()
- words = map(lambda pair: pair[1], pairs)
+ words = list(map(lambda pair: pair[1], pairs))
pairs = None
if run.verbose:
sys.stdout.write(' %d of them\n' % len(words))
count = len(words)
- singles = (255 * 255 - count) / 254
+ singles = (255 * 255 - count) // 254
# Transmit a few values for further usage by the C code.
if run.verbose:
sys.stdout.write(' sorting names...')
- ucs2_table = self.charname_map.keys()
+ ucs2_table = list(self.charname_map.keys())
ucs2_table.sort()
if run.verbose:
sys.stdout.write(' %d of them\n' % len(ucs2_table))
@@ -366,12 +381,14 @@ class Charnames(Options):
word = words[counter]
write(' %-28s/* \\%0.3o */\n'
% ('"%s",' % re.sub('"', r'\"', word), char1))
+ assert isinstance(word, str)
self.code_map[words[counter]] = char1
char1 += 1
for counter in range(singles, count):
word = words[counter]
write(' %-28s/* \\%0.3o\\%0.3o */\n'
% ('"%s",' % re.sub('"', r'\"', word, 1), char1, char2))
+ assert isinstance(word, str)
self.code_map[words[counter]] = 256 * char1 + char2
if char2 == 255:
char1 += 1
@@ -397,7 +414,7 @@ class Charnames(Options):
if code < 256:
write('\\%0.3o' % code)
else:
- write('\\%0.3o\\%0.3o' % (code / 256, code % 256))
+ write('\\%0.3o\\%0.3o' % (code // 256, code % 256))
else:
sys.stdout.write('??? %s\n' % word)
write('"},\n')
@@ -540,7 +557,7 @@ class Mnemonics(Options):
continue
if len(line) == 3:
continue
- if input.begins(' \.\.\.'):
+ if input.begins(' \\.\\.\\.'):
continue
if line == ' Presentation forms\n':
continue
@@ -667,7 +684,7 @@ class Mnemonics(Options):
'static const struct entry table[TABLE_LENGTH] =\n'
' {\n')
count = 0
- indices = self.mnemonic_map.keys()
+ indices = list(self.mnemonic_map.keys())
indices.sort()
for ucs2 in indices:
text = self.mnemonic_map[ucs2]
@@ -681,7 +698,7 @@ class Mnemonics(Options):
'static const unsigned short inverse[TABLE_LENGTH] =\n'
' {')
count = 0
- keys = inverse_map.keys()
+ keys = list(inverse_map.keys())
keys.sort()
for text in keys:
if count % 10 == 0:
@@ -744,7 +761,7 @@ class Strips(Options):
def digest_rfc1345(self, input):
self.init_write_data()
# Informal canonical order of presentation.
- CHARSET, REM, ALIAS, ESC, BITS, CODE = range(6)
+ CHARSET, REM, ALIAS, ESC, BITS, CODE = list(range(6))
charset = None
skip = False
while True:
@@ -956,7 +973,7 @@ class Strips(Options):
if input.search('\032'):
# Old MS-DOS C-z !!
break
- match = input.match('0x([0-9A-F]+)\t0x([0-9A-F]+)\t\#')
+ match = input.match('0x([0-9A-F]+)\t0x([0-9A-F]+)\t#')
if match:
self.table[int(match.group(1), 16)] = int(match.group(2), 16)
else:
@@ -1125,7 +1142,7 @@ class Strips(Options):
write = Output('fr-%s' % self.TEXINFO, noheader=True).write
else:
write = Output(self.TEXINFO, noheader=True).write
- charsets = self.remark_map.keys()
+ charsets = list(self.remark_map.keys())
charsets.sort()
for charset in charsets:
write('\n'
@@ -1161,12 +1178,12 @@ class Input:
def __init__(self, name):
self.name = name
- self.input = file(name)
+ self.input = open(name, "rb")
self.line_count = 0
sys.stdout.write("Reading %s\n" % name)
def readline(self):
- self.line = self.input.readline()
+ self.line = to_unicode(self.input.readline())
self.line_count += 1
return self.line
@@ -1184,16 +1201,16 @@ class Input:
return self.line[:len(text)] == text
def match(self, pattern):
- return re.match(pattern, self.line)
+ return re.match(pattern, to_unicode(self.line))
def search(self, pattern):
- return re.search(pattern, self.line)
+ return re.search(pattern, to_unicode(self.line))
class Output:
def __init__(self, name, noheader=False):
self.name = name
- self.write = file(name, 'w').write
+ self.write = open(name, 'w').write
sys.stdout.write("Writing %s\n" % name)
if not noheader:
self.write("""\
--
2.21.0