parent
66aa080033
commit
91540a7d97
6 changed files with 197 additions and 179 deletions
@ -1,75 +1,14 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys, re, difflib, os |
||||
from hb_test_tools import * |
||||
import sys, os |
||||
|
||||
red_color = green_color = end_color = "" |
||||
if "--color" in sys.argv or os.isatty (sys.stdout.fileno ()): |
||||
if "--color" in sys.argv: |
||||
sys.argv.remove ("--color") |
||||
red_color = '\033[41;37;1m' |
||||
green_color = '\033[42;37;1m' |
||||
end_color = '\033[m' |
||||
if len (sys.argv) != 3: |
||||
print "usage: %s [--color] file1 file2" % sys.argv[0] |
||||
sys.exit (1) |
||||
|
||||
def fancy_diff_lines (l1, l2): |
||||
colors = Colors.Auto (sys.argv) |
||||
|
||||
ss = [re.sub ('([A-Za-z0-9_]*)([^A-Za-z0-9_]?)', r'\1\n\2\n', l).splitlines (True) for l in (l1, l2)] |
||||
oo = ["",""] |
||||
st = [False, False] |
||||
for l in difflib.Differ().compare (*ss): |
||||
if l[0] == '?': |
||||
continue |
||||
if l[0] == ' ': |
||||
for i in range(2): |
||||
if st[i]: |
||||
oo[i] += end_color |
||||
st[i] = False |
||||
oo = [o + l[2:] for o in oo] |
||||
continue |
||||
if l[0] == '-': |
||||
if not st[0]: |
||||
oo[0] += red_color |
||||
st[0] = True |
||||
oo[0] += l[2:] |
||||
continue |
||||
if l[0] == '+': |
||||
if not st[1]: |
||||
oo[1] += green_color |
||||
st[1] = True |
||||
oo[1] += l[2:] |
||||
for i in range(2): |
||||
if st[i]: |
||||
oo[i] += end_color |
||||
st[i] = 0 |
||||
oo = [o.replace ('\n', '') for o in oo] |
||||
if oo[0] == oo[1]: |
||||
return [' ', oo[0], '\n'] |
||||
return ['-', oo[0], '\n', '+', oo[1], '\n'] |
||||
f1, f2 = (open_file_or_stdin (f) for f in sys.argv[1:3]) |
||||
|
||||
def fancy_diff_files (f1, f2): |
||||
for (l1,l2) in zip (f1, f2): |
||||
if l1 == l2: |
||||
sys.stdout.writelines ([" ", l1]) |
||||
continue |
||||
|
||||
sys.stdout.writelines (fancy_diff_lines (l1, l2)) |
||||
# Print out residues |
||||
for l in f1: |
||||
sys.stdout.writelines (["-", red_color, l1, end_color]) |
||||
for l in f1: |
||||
sys.stdout.writelines (["-", green_color, l1, end_color]) |
||||
|
||||
|
||||
def open_file (f): |
||||
if f == '-': |
||||
return sys.stdin |
||||
return file (f) |
||||
|
||||
if __name__ == '__main__': |
||||
|
||||
if len (sys.argv) != 3: |
||||
print "Usage: %s [--color] FILE1 FILE2" % sys.argv[0] |
||||
sys.exit (1) |
||||
|
||||
f1, f2 = (open_file (f) for f in sys.argv[1:3]) |
||||
|
||||
fancy_diff_files (f1, f2) |
||||
FancyDiffer.diff_files (f1, f2, colors=colors) |
||||
|
@ -1,28 +1,5 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys |
||||
from hb_test_tools import * |
||||
|
||||
red_color = '\033[41;37;1m' |
||||
green_color = '\033[42;37;1m' |
||||
end_color = '\033[m' |
||||
|
||||
def filter_failures (f): |
||||
for l in f: |
||||
if l[0] in '-+': |
||||
sys.stdout.writelines (l) |
||||
continue |
||||
|
||||
|
||||
def open_file (f): |
||||
if f == '-': |
||||
return sys.stdin |
||||
return file (f) |
||||
|
||||
if __name__ == '__main__': |
||||
|
||||
if len (sys.argv) == 1: |
||||
print "Usage: %s FILE..." % sys.argv[0] |
||||
sys.exit (1) |
||||
|
||||
for s in sys.argv[1:]: |
||||
filter_failures (open_file (s)) |
||||
UtilMains.process_multiple_files (DiffFilters.filter_failures) |
||||
|
@ -1,19 +1,5 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys |
||||
from hb_test_tools import * |
||||
|
||||
def decode (s): |
||||
return '<' + ','.join ("U+%04X" % ord (u) for u in unicode (s, 'utf8')) + '>' |
||||
|
||||
if __name__ == '__main__': |
||||
|
||||
if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): |
||||
print "Usage:\n %s UNICODE_STRING...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) |
||||
sys.exit (1) |
||||
|
||||
if '--stdin' in sys.argv: |
||||
sys.argv.remove ('--stdin') |
||||
for line in sys.stdin.readlines (): |
||||
print decode (line) |
||||
else: |
||||
print ' '.join (decode (x) for x in (sys.argv[1:])) |
||||
UtilMains.filter_multiple_strings_or_stdin (Unicode.decode, "UNICODE_STRING") |
||||
|
@ -1,22 +1,5 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys |
||||
import re |
||||
from hb_test_tools import * |
||||
|
||||
def encode (s): |
||||
s = re.sub (r"[<+>\\uU]", " ", s) |
||||
s = re.sub (r"0[xX]", " ", s) |
||||
return u''.join (unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)) |
||||
|
||||
if __name__ == '__main__': |
||||
|
||||
if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): |
||||
print "Usage:\n %s UNICODE_CODEPOINTS...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) |
||||
sys.exit (1) |
||||
|
||||
if '--stdin' in sys.argv: |
||||
sys.argv.remove ('--stdin') |
||||
for line in sys.stdin.readlines (): |
||||
print encode (line) |
||||
else: |
||||
print encode (','.join (sys.argv[1:])) |
||||
UtilMains.filter_multiple_strings_or_stdin (Unicode.encode, "UNICODE_STRING", '') |
||||
|
@ -1,53 +1,6 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys |
||||
import re |
||||
import unicodedata |
||||
from hb_test_tools import * |
||||
|
||||
shorthands = { |
||||
"ZERO WIDTH NON-JOINER": "ZWNJ", |
||||
"ZERO WIDTH JOINER": "ZWJ", |
||||
"NARROW NO-BREAK SPACE": "NNBSP", |
||||
"COMBINING GRAPHEME JOINER": "CGJ", |
||||
"LEFT-TO-RIGHT MARK": "LRM", |
||||
"RIGHT-TO-LEFT MARK": "RLM", |
||||
"LEFT-TO-RIGHT EMBEDDING": "LRE", |
||||
"RIGHT-TO-LEFT EMBEDDING": "RLE", |
||||
"POP DIRECTIONAL FORMATTING": "PDF", |
||||
"LEFT-TO-RIGHT OVERRIDE": "LRO", |
||||
"RIGHT-TO-LEFT OVERRIDE": "RLO", |
||||
} |
||||
def pretty_name (x): |
||||
try: |
||||
s = unicodedata.name (x) |
||||
except ValueError: |
||||
return "XXX" |
||||
s = re.sub (".* LETTER ", "", s) |
||||
s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s) |
||||
s = re.sub (".* SIGN ", "", s) |
||||
s = re.sub (".* COMBINING ", "", s) |
||||
if re.match (".* VIRAMA", s): |
||||
s = "HALANT" |
||||
if s in shorthands: |
||||
s = shorthands[s] |
||||
return s |
||||
|
||||
|
||||
def pretty_names (s): |
||||
s = re.sub (r"[<+>\\uU]", " ", s) |
||||
s = re.sub (r"0[xX]", " ", s) |
||||
s = [unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)] |
||||
return ' + '.join (pretty_name (x) for x in s) |
||||
|
||||
if __name__ == '__main__': |
||||
|
||||
if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): |
||||
print "Usage:\n %s UNICODE_CODEPOINTS...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) |
||||
sys.exit (1) |
||||
|
||||
if '--stdin' in sys.argv: |
||||
sys.argv.remove ('--stdin') |
||||
for line in sys.stdin.readlines (): |
||||
print pretty_names (line) |
||||
else: |
||||
print pretty_names (','.join (sys.argv[1:])) |
||||
UtilMains.filter_multiple_strings_or_stdin (Unicode.pretty_names, "UNICODE_CODEPOINTS", \ |
||||
concat_separator = ' ') |
||||
|
@ -0,0 +1,180 @@ |
||||
#!/usr/bin/python |
||||
|
||||
import sys, os, re, difflib, unicodedata |
||||
|
||||
class Colors: |
||||
class Null: |
||||
red = '' |
||||
green = '' |
||||
end = '' |
||||
class ANSI: |
||||
red = '\033[41;37;1m' |
||||
green = '\033[42;37;1m' |
||||
end = '\033[m' |
||||
class HTML: |
||||
red = '<span style="color:red">' |
||||
green = '<span style="color:green">' |
||||
end = '</span>' |
||||
|
||||
@staticmethod |
||||
def Auto (argv = [], out = sys.stdout): |
||||
if "--color" in argv or os.isatty (out.fileno ()): |
||||
if "--color" in sys.argv[1:]: |
||||
argv.remove ("--color") |
||||
return Colors.ANSI |
||||
else: |
||||
return Colors.Null |
||||
|
||||
|
||||
class FancyDiffer: |
||||
|
||||
diff_regex = re.compile ('([a-za-z0-9_]*)([^a-za-z0-9_]?)') |
||||
|
||||
@staticmethod |
||||
def diff_lines (l1, l2, colors=Colors.Null): |
||||
|
||||
ss = [FancyDiffer.diff_regex.sub (r'\1\n\2\n', l).splitlines (True) for l in (l1, l2)] |
||||
oo = ["",""] |
||||
st = [False, False] |
||||
for l in difflib.Differ().compare (*ss): |
||||
if l[0] == '?': |
||||
continue |
||||
if l[0] == ' ': |
||||
for i in range(2): |
||||
if st[i]: |
||||
oo[i] += colors.end |
||||
st[i] = False |
||||
oo = [o + l[2:] for o in oo] |
||||
continue |
||||
if l[0] == '-': |
||||
if not st[0]: |
||||
oo[0] += colors.red |
||||
st[0] = True |
||||
oo[0] += l[2:] |
||||
continue |
||||
if l[0] == '+': |
||||
if not st[1]: |
||||
oo[1] += colors.green |
||||
st[1] = True |
||||
oo[1] += l[2:] |
||||
for i in range(2): |
||||
if st[i]: |
||||
oo[i] += colors.end |
||||
st[i] = 0 |
||||
oo = [o.replace ('\n', '') for o in oo] |
||||
if oo[0] == oo[1]: |
||||
return [' ', oo[0], '\n'] |
||||
return ['-', oo[0], '\n', '+', oo[1], '\n'] |
||||
|
||||
@staticmethod |
||||
def diff_files (f1, f2, colors=Colors.Null): |
||||
for (l1,l2) in zip (f1, f2): |
||||
if l1 == l2: |
||||
sys.stdout.writelines ([" ", l1]) |
||||
continue |
||||
|
||||
sys.stdout.writelines (FancyDiffer.diff_lines (l1, l2, colors)) |
||||
# print out residues |
||||
for l in f1: |
||||
sys.stdout.writelines (["-", colors.red, l1, colors.end]) |
||||
for l in f1: |
||||
sys.stdout.writelines (["-", colors.green, l1, colors.end]) |
||||
|
||||
class DiffFilters: |
||||
|
||||
@staticmethod |
||||
def filter_failures (f): |
||||
for l in f: |
||||
if l[0] in '-+': |
||||
sys.stdout.writelines (l) |
||||
|
||||
|
||||
class UtilMains: |
||||
|
||||
@staticmethod |
||||
def process_multiple_files (callback): |
||||
|
||||
if len (sys.argv) == 1: |
||||
print "Usage: %s FILE..." % sys.argv[0] |
||||
sys.exit (1) |
||||
|
||||
for s in sys.argv[1:]: |
||||
callback (open_file_or_stdin (s)) |
||||
|
||||
@staticmethod |
||||
def filter_multiple_strings_or_stdin (callback, string_mnemonic, \ |
||||
separator = " ", \ |
||||
concat_separator = False): |
||||
|
||||
if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): |
||||
print "Usage:\n %s %s...\nor:\n %s --stdin" \ |
||||
% (sys.argv[0], string_mnemonic, sys.argv[0]) |
||||
sys.exit (1) |
||||
|
||||
if '--stdin' in sys.argv: |
||||
sys.argv.remove ('--stdin') |
||||
for line in sys.stdin.readlines (): |
||||
print callback (line) |
||||
else: |
||||
args = sys.argv[1:] |
||||
if concat_separator != False: |
||||
args = [concat_separator.join (args)] |
||||
print separator.join (callback (x) for x in (args)) |
||||
|
||||
|
||||
class Unicode: |
||||
|
||||
@staticmethod |
||||
def decode (s): |
||||
return '<' + ','.join ("U+%04X" % ord (u) for u in unicode (s, 'utf8')) + '>' |
||||
|
||||
@staticmethod |
||||
def encode (s): |
||||
s = re.sub (r"[<+>\\uU]", " ", s) |
||||
s = re.sub (r"0[xX]", " ", s) |
||||
return u''.join (unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)) |
||||
|
||||
shorthands = { |
||||
"ZERO WIDTH NON-JOINER": "ZWNJ", |
||||
"ZERO WIDTH JOINER": "ZWJ", |
||||
"NARROW NO-BREAK SPACE": "NNBSP", |
||||
"COMBINING GRAPHEME JOINER": "CGJ", |
||||
"LEFT-TO-RIGHT MARK": "LRM", |
||||
"RIGHT-TO-LEFT MARK": "RLM", |
||||
"LEFT-TO-RIGHT EMBEDDING": "LRE", |
||||
"RIGHT-TO-LEFT EMBEDDING": "RLE", |
||||
"POP DIRECTIONAL FORMATTING": "PDF", |
||||
"LEFT-TO-RIGHT OVERRIDE": "LRO", |
||||
"RIGHT-TO-LEFT OVERRIDE": "RLO", |
||||
} |
||||
|
||||
@staticmethod |
||||
def pretty_name (u): |
||||
try: |
||||
s = unicodedata.name (u) |
||||
except ValueError: |
||||
return "XXX" |
||||
s = re.sub (".* LETTER ", "", s) |
||||
s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s) |
||||
s = re.sub (".* SIGN ", "", s) |
||||
s = re.sub (".* COMBINING ", "", s) |
||||
if re.match (".* VIRAMA", s): |
||||
s = "HALANT" |
||||
if s in Unicode.shorthands: |
||||
s = Unicode.shorthands[s] |
||||
return s |
||||
|
||||
@staticmethod |
||||
def pretty_names (s): |
||||
s = re.sub (r"[<+>\\uU]", " ", s) |
||||
s = re.sub (r"0[xX]", " ", s) |
||||
s = [unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)] |
||||
return ' + '.join (Unicode.pretty_name (x) for x in s) |
||||
|
||||
def open_file_or_stdin (f): |
||||
if f == '-': |
||||
return sys.stdin |
||||
return file (f) |
||||
|
||||
if __name__ == '__main__': |
||||
pass |
Loading…
Reference in new issue