531 lines
28 KiB
Python
531 lines
28 KiB
Python
#################################################################################################### ################### SOF
|
|
#################################################################################################### #######################
|
|
from glob import glob
|
|
from time import sleep
|
|
import sys,tty,os,termios
|
|
"""MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh+MMMMMMMMMMMMMMhsMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm/ oMMMMMMMMMMMMMMm +NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy` yMMMMMMMMMMMMMMM- -mMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMs+dMMMMMMMMMM+ sMMMMMMMMMMMMMMM- `dMMMMMMMMMMms/NMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMM+ .omMMMMMM: -MMMMMMMMMMMMMMo `yMMMMMMMy: `dMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMM- /dMMM+ sMMMMMMMMMMMMh `hMMMNo` sMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMd :dm `mMMMMMMMMMMN. .NNo` .MMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMM: - :MMMMMMMMMMs :` sMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMs ymNMMMMMNm. NMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMy `-/-` .MMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMo .NMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMNh+. :sdMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMhso+:. `-/+syMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMM- dMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMM` `.:+/. `/s+:. sMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMNo -oms. .//-` `:/:` `+md+` .hMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMNs` .odNdo. .ohmd+` :dMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMNo` .. .- :hMMMMMMMMMMM #######################
|
|
MMMMMMMMMd+` -sNMMMMMMMM #######################
|
|
###MMMNs- `.. `/-. `+dMMMMMM #######################
|
|
###Ny: ./sdNMMMh: `sNMMMNds/. .odMMM #######################
|
|
MM+ :ymMMMMMMMMMMh. +NMMMMMMMMMMmo- /NM #######################
|
|
MMMh: .sNMMMMMMMMMMMMMMN- `hMMMMMMMMMMMMMMMm+` :hMMM #######################
|
|
MMMMMd:` ``-:+shmMMMMMMMMMMMMMMMMMMN. hMMMMMMMMMMMMMMMMMMMmhs+/-..``````./dMMMMM #######################
|
|
MMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMo .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN. /MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN+` `+NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs. -hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #######################
|
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdyymMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM""" #######################
|
|
#################################################################################################### #######################
|
|
|
|
### "00", "01", "02", "03", "04", "05", "06", "07", ###########################################
|
|
### "08", "09", "10", "11", "12", "13", "14", "15", ###########################################
|
|
|
|
0xFFFFFF, 0x000000, 0x00007F, 0x009300, 0xFF0000, 0x7F0000, 0x9C009C, 0xFC7F00, ###########################################
|
|
0xFFFF00, 0x00FC00, 0x009393, 0x00FFFF, 0x0000FC, 0xFF00FF, 0x7F7F7F, 0xD2D2D2, ###########################################
|
|
#####
|
|
#############################################################################################################################
|
|
#############################################################################################################################
|
|
### #####
|
|
### "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", #####
|
|
### "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", #####
|
|
### "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", #####
|
|
### "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", #####
|
|
### "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", #####
|
|
### "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", #####
|
|
### "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98" ''' #####
|
|
|
|
0x470000, 0x472100, 0x474700, 0x324700, 0x004700, 0x00472C, 0x004747, 0x002747, 0x000047, 0x2E0047, 0x470047, 0x47002A, #####
|
|
0x740000, 0x743a00, 0x747400, 0x517400, 0x007400, 0x007449, 0x007474, 0x004074, 0x000074, 0x4b0074, 0x740074, 0x740045, #####
|
|
0xb50000, 0xb56300, 0xb5b500, 0x7db500, 0x00b500, 0x00b571, 0x00b5b5, 0x0063b5, 0x0000b5, 0x7500b5, 0xb500b5, 0xb5006b, #####
|
|
0xff0000, 0xff8c00, 0xffff00, 0xb2ff00, 0x00ff00, 0x00ffa0, 0x00ffff, 0x008cff, 0x0000ff, 0xa500ff, 0xff00ff, 0xff0098, #####
|
|
0xff5959, 0xffb459, 0xffff71, 0xcfff60, 0x6fff6f, 0x65ffc9, 0x6dffff, 0x59b4ff, 0x5959ff, 0xc459ff, 0xff66ff, 0xff59bc, #####
|
|
0xff9c9c, 0xffd39c, 0xffff9c, 0xe2ff9c, 0x9cff9c, 0x9cffdb, 0x9cffff, 0x9cd3ff, 0x9c9cff, 0xdc9cff, 0xff9cff, 0xff94d3, #####
|
|
0x000000, 0x131313, 0x282828, 0x363636, 0x4d4d4d, 0x656565, 0x818181, 0x9f9f9f, 0xbcbcbc, 0xe2e2e2, 0xffffff #####
|
|
#####
|
|
#############################################################################################################################
|
|
#############################################################################################################################
|
|
|
|
########################################################################################################## CLASS DR1P4NS1 - 2
|
|
class dr1p4ns1:
|
|
############################################################################################################ LOOKUP TABLE
|
|
commands = {
|
|
'A': 'up',
|
|
'B': 'down',
|
|
'C': 'forward',
|
|
'D': 'back',
|
|
'H': 'position',
|
|
'f': 'position',
|
|
'J': 'erase',
|
|
'K': 'erase_line',
|
|
's': 'save_cursor',
|
|
'u': 'restore_cursor',
|
|
'm': 'color',
|
|
'R': 'report_cursor_position'}
|
|
############################################################################################################ LOOKUP TABLE
|
|
asc_table="""\
|
|
╟ⁿΘΓΣαστΩδΦ∩ε∞─┼╔µ╞⌠÷≥√∙ ╓▄óúÑ₧ƒ\
|
|
ßφ≤·±╤¬║┐⌐¼╜╝í½╗░▒▓│┤╡╢╖╕╣║╗╝╜╛┐\
|
|
└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀\
|
|
α▀ΓπΣσ╡τΦΘΩδ∞φε∩≡▒≥≤⌠⌡≈≈░∙╖√ⁿ▓■á"""
|
|
##################################################################################################### ASCII TABLE CLEANUP
|
|
for r in (('\n',''),(' ','')):
|
|
asc_table=asc_table.replace(*r)
|
|
############################################################################################################ LOOKUP TABLE
|
|
asc_table_full="""\
|
|
\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼\
|
|
\_!"#$%&\'()*+,-./0123456789:;<=>\
|
|
?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^\
|
|
_`abcdefghijklmnopqrstuvwxyz{|}~\
|
|
⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧\
|
|
ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛\
|
|
┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐\
|
|
▀ɑϐᴦᴨ∑ơµᴛɸϴΩẟ∞∅∈∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■\
|
|
ÿ"""
|
|
##################################################################################################### ASCII TABLE CLEANUP
|
|
for r in ((' ',''),('\_',' ')):
|
|
asc_table_full=asc_table_full.replace(*r)
|
|
############################################################################################################ LOOKUP TABLE
|
|
asc2uni=dict(zip([i for i in range(128,256)],[ord(c) for c in asc_table]))
|
|
############################################################################################################ LOOKUP TABLE
|
|
asc2chr=dict(zip([i for i in range(128,256)],[c for c in asc_table]))
|
|
############################################################################################################ LOOKUP TABLE
|
|
rgb2irc = { 52: '16', 94: '17', 100: '18', 58: '19',
|
|
22: '20', 29: '21', 23: '22', 24: '23',
|
|
17: '24', 54: '25', 53: '26', 89: '27',
|
|
88: '28', 130: '29', 142: '30', 64: '31',
|
|
28: '32', 35: '33', 30: '34', 25: '35',
|
|
18: '36', 91: '37', 90: '38', 125: '39',
|
|
124: '40', 166: '41', 184: '42', 106: '43',
|
|
34: '44', 49: '45', 37: '46', 33: '47',
|
|
19: '48', 129: '49', 127: '50', 161: '51',
|
|
196: '52', 208: '53', 226: '54', 154: '55',
|
|
46: '56', 86: '57', 51: '58', 75: '59',
|
|
21: '60', 171: '61', 201: '62', 198: '63',
|
|
203: '64', 215: '65', 227: '66', 191: '67',
|
|
83: '68', 122: '69', 87: '70', 111: '71',
|
|
63: '72', 177: '73', 207: '74', 205: '75',
|
|
217: '76', 223: '77', 229: '78', 193: '79',
|
|
157: '80', 158: '81', 159: '82', 153: '83',
|
|
147: '84', 183: '85', 219: '86', 212: '87',
|
|
16: '88', 233: '89', 235: '90', 237: '91',
|
|
239: '92', 241: '93', 244: '94', 247: '95',
|
|
250: '96', 254: '97', 231: '98', }
|
|
########################################################################################################## CLASS INIT - 3
|
|
def __init__(self,ansifile="",width=80,height=25,debug=False):
|
|
self.DEBUG=debug
|
|
self.width=width
|
|
self.height=height
|
|
self.filename=ansifile
|
|
self.openansi(ansifile)
|
|
#self.openascii()
|
|
self.code='\x1b[0m'
|
|
self.cmps=[]
|
|
self.op=[]
|
|
self.optype=[]
|
|
self.sauce_found=False
|
|
self.boot()
|
|
######################################################################################################### FILE OPERATIONS
|
|
def fifo(self,s):
|
|
s=[s]
|
|
f=open('~/.weechat/weechat_fifo','w')
|
|
[f.write('*{}\n'.format(x)) for x in s]
|
|
f.close()
|
|
######################################################################################################### FILE OPERATIONS
|
|
def openansi(self,s):
|
|
f=open(s,'rb')
|
|
self.ansifile=f.read().decode('cp437')
|
|
f.close()
|
|
############################################################################################# DEBUGGING - FILE OPERATIONS
|
|
def openascii(self):
|
|
f=open('ansiscii/work.asc','r')
|
|
self.reference=f.read()
|
|
f.close()
|
|
#################################################################################################################### TOOL
|
|
def printascii(self):
|
|
for i,_ in enumerate(self.asc_table):
|
|
_int=str(i+128).zfill(3)
|
|
_hex=hex(i+128)[2:].upper().zfill(2)
|
|
_ord=str(ord(_)).zfill(4)
|
|
print(f'{_} - {_int} - {_hex} - {_ord}')
|
|
############################################################################################################### DEBUGGING
|
|
def printrange(self,n,nn):
|
|
for index,_ in enumerate(self.ansifile):
|
|
h=hex(_)[2:].upper()
|
|
i=str(_).zfill(3)
|
|
s=''
|
|
if _>47 and _<127:
|
|
s=chr(_)
|
|
else:
|
|
s='.'
|
|
l=str(index).zfill(len(str(len(self.ansifile))))
|
|
if index >=n and index <=nn:
|
|
print(f"{l} {i} {h} {s}")
|
|
if index==nn:
|
|
break
|
|
############################################################################################################### DEBUGGING
|
|
def printhex(self):
|
|
theasc=[]
|
|
thehex=[]
|
|
buffer=''
|
|
for _ in self.ansifile:
|
|
buffer+=hex(ord(_)).upper()[2:].zfill(2)
|
|
for _ in self.chunk(buffer,32):
|
|
subchunks=''
|
|
for i,__ in enumerate(self.chunk(_,2)):
|
|
if i>0 and i%4==0: subchunks+=" "
|
|
subchunks+=f'{__} '
|
|
thehex.append(subchunks.strip())
|
|
for __ in thehex:
|
|
buffer=''
|
|
for _ in __.split():
|
|
i=int(_,16)
|
|
if i>47 and i<127:
|
|
buffer+=chr(i)
|
|
else:
|
|
buffer+='.'
|
|
theasc.append(buffer)
|
|
for _ in range(len(thehex)):
|
|
old=buffer
|
|
buffer={thehex[_]}
|
|
if not buffer == old:
|
|
print(f"{hex(16 * _)[2:].zfill(8)} {thehex[_]} {theasc[_]}")
|
|
############################################################################################################### DEBUGGING
|
|
def hexdump(self):
|
|
self.codes=[]
|
|
code_start=0
|
|
code_end=0
|
|
code_state=False
|
|
for i,_ in enumerate(self.ansifile):
|
|
if code_state==False:
|
|
if _ == '\x1b':
|
|
code_state=True
|
|
code_start=i
|
|
elif _ == '\x1a':
|
|
code=self.ansifile[i:]
|
|
self.codes.append([code,i,len(self.ansifile)])
|
|
else:
|
|
if 64 <= ord(_) <= 126:
|
|
if _ in self.commands:
|
|
code_state=False
|
|
code_end=i+1
|
|
code=self.ansifile[code_start:code_end]
|
|
self.codes.append([code,code_start,code_end])
|
|
############################################################################################################### DEBUGGING
|
|
def codedump(self):
|
|
xpos_old=0
|
|
xpos_new=0
|
|
self.codes=[]
|
|
code_start=0
|
|
code_end=0
|
|
code_state=False
|
|
for i,_ in enumerate(self.ansifile):
|
|
if code_state==False:
|
|
if _ == '\x1b':
|
|
code_state=True
|
|
code_start=i
|
|
elif _ == '\x1a':
|
|
self.op.append(self.ansifile[code_end:i])
|
|
code=self.ansifile[i:]
|
|
self.codes.append([code,i,len(self.ansifile)])
|
|
if code[1:6].upper()=="SAUCE":
|
|
self.getsauce(code[1:])
|
|
else:
|
|
if 64 <= ord(_) <= 126:
|
|
try:
|
|
if _ in self.commands:
|
|
code_state=False
|
|
code_end=i+1
|
|
code=self.ansifile[code_start:code_end]
|
|
self.codes.append([code,code_start,code_end])
|
|
xpos_new=code_start
|
|
distance=xpos_new-xpos_old
|
|
if not distance == 0:
|
|
nonop=self.ansifile[xpos_old:xpos_old+distance]
|
|
self.op.append(nonop)
|
|
self.optype.append(1)
|
|
self.op.append(code)
|
|
xpos_old=code_end
|
|
if self.commands[_] == 'color':
|
|
self.optype.append(2)
|
|
elif self.commands[_] == 'forward':
|
|
self.optype.append(3)
|
|
else:
|
|
self.optype.append(0)
|
|
except Exception as e:
|
|
print(f'error: {e}')
|
|
if not self.sauce_found:
|
|
code=self.ansifile[i:]
|
|
#################################################################################################################### TOOL
|
|
def processdump(self):
|
|
offset=0
|
|
offsets=[]
|
|
processed=[]
|
|
uniqued=[]
|
|
uniques=[]
|
|
processing=''
|
|
for i,_optype in enumerate(self.optype):
|
|
if _optype==2:
|
|
processing+=self.op[i]
|
|
offset+=len(self.op[i])
|
|
elif _optype==3:
|
|
count=int(self.op[i].split('[')[1].split('C')[0])
|
|
processing+=' '*count
|
|
elif _optype==1:
|
|
processing+=self.op[i]
|
|
_bseq='\r\n'
|
|
_xpos=processing.find(_bseq)
|
|
distance=0
|
|
while not processing.find(_bseq) == -1:
|
|
_xpos=processing.find(_bseq)
|
|
if not _xpos == -1:
|
|
uniques.append(_bseq)
|
|
uniques.append(_xpos)
|
|
if len(self.stripcodes(processing[:_xpos])) >= 80: distance=80
|
|
gaps=self.width-len(self.stripcodes(processing)[distance:].split('\r\n')[0])
|
|
processing=processing.replace(_bseq,chr(32)*gaps,1)
|
|
if len(processing)-offset > self.width:
|
|
trailing_size=0
|
|
while len(processing)-offset > self.width:
|
|
deconcatenate=processing[0:self.width+offset]
|
|
if deconcatenate.endswith('m'):
|
|
if not deconcatenate.rfind('\x1b')==-1:
|
|
trailing_size=len(deconcatenate[deconcatenate.rfind('\x1b'):])
|
|
deconcatenate=deconcatenate[:deconcatenate.rfind('\x1b')]
|
|
processed.append(deconcatenate)
|
|
if len(uniques) < 2:
|
|
uniqued.append('')
|
|
else:
|
|
uniqued.append(uniques)
|
|
uniqued.append(uniques)
|
|
uniques=[]
|
|
offsets.append(offset)
|
|
processing=processing.replace(deconcatenate,'',1)
|
|
offset=0+trailing_size
|
|
if len(processing) > 0:
|
|
gaps=int(80-len(self.stripcodes(processing)))
|
|
processing+=chr(32)*gaps
|
|
processed.append(processing)
|
|
|
|
processed_colors=[]; last_colors=''; color_fg=''; color_bg=''; color_set='';
|
|
for y,__ in enumerate(processed):
|
|
code_start=0; code_end=0; code_state=False; codes=[];
|
|
for x,_ in enumerate(__):
|
|
if not code_state:
|
|
if _ =='\x1b':
|
|
code_start = x
|
|
code_state = True
|
|
else:
|
|
if _ in self.commands:
|
|
if self.commands[_] == 'color':
|
|
code_end = x+1
|
|
code_state = False
|
|
codes.append(__[code_start:code_end])
|
|
for code in codes:
|
|
for _ in code.replace('m','').split('[')[1].split(';'):
|
|
if 0 <= int(_) <= 9:
|
|
color_set=_
|
|
if 30 <= int(_) <= 39:
|
|
color_fg=_
|
|
if 40 <= int(_) <= 49:
|
|
color_bg=_
|
|
colors=f"{color_set}"
|
|
processed_colors.append(colors)
|
|
|
|
# last_processed_color_set=0
|
|
# for i,_ in enumerate(processed):
|
|
# line=''
|
|
# if last_processed_color_set:
|
|
# line+='\x1b[1m'
|
|
# if int(processed_colors[i]):
|
|
# line+=f'{_}\x1b[0m'
|
|
# else:
|
|
# line+=f'{_}'
|
|
# last_processed_color_set=int(processed_colors[i])
|
|
# for r in (('\x16',chr(9644)),('\x15','\u00A7')):
|
|
# line=line.replace(*r)
|
|
# print(line+f" - {str(i).zfill(3)}")
|
|
|
|
for _ in processed:
|
|
line=_
|
|
for r in (('\x16',chr(9644)),('\x15','\u00A7')):
|
|
line=line.replace(*r)
|
|
print(line)
|
|
|
|
#################################################################################################################### TOOL
|
|
def getsauce(self,sauce):
|
|
self.sauce=sauce
|
|
self.sauce_found=True
|
|
self.width=ord(self.sauce[96])
|
|
self.height=ord(self.sauce[98])
|
|
offset=len("SAUCE")
|
|
self.sauce_version=str(int(self.sauce[offset:offset+2].strip()))
|
|
offset+=2
|
|
self.sauce_title=self.sauce[offset:offset+35].strip()
|
|
offset+=35
|
|
self.sauce_title=self.sauce[offset:offset+20].strip()
|
|
offset+=20
|
|
self.sauce_group=self.sauce[offset:offset+20].strip()
|
|
offset+=20
|
|
self.sauce_date=self.sauce[offset:offset+8].strip()
|
|
offset+=8
|
|
# SAUCE_PASS='\x1b[1;31m[ SAUCE INFO FOUND ] - X: {} Y: {}\x1b[0m\n'
|
|
# SAUCE_FAIL='\x1b[1;31m[ NO SAUCE INFO FOUND ]\x1b[0m\n'
|
|
# if self.sauce_found==True:
|
|
# print(SAUCE_PASS.format(self.width,self.height))
|
|
# else:
|
|
# print(SAUCE_FAIL.format(self))
|
|
#################################################################################################################### TOOL
|
|
def findall(self,s,w):
|
|
return [i for i in range(len(s)) if s.startswith(w, i)]
|
|
############################################################################################################### DEBUGGING
|
|
def cmpans(self,s1,s2,n1=0,n2=0):
|
|
_s1=''; _s2=''; _sn1=''; _sn2=''
|
|
_s1=self.stripcodes(s1)
|
|
_s2=self.stripcodes(s2)
|
|
if not n1 == n2:
|
|
_sn1=_s1[n1:n2]
|
|
_sn2=_s2[n1:n2]
|
|
_sn3=''
|
|
for i in range(self.width):
|
|
try:
|
|
if ord(_sn1[i]) == ord(_sn2[i]):
|
|
_sn3+='\x1b[32m0\x1b[0m'
|
|
else:
|
|
_sn3+='\x1b[31m1\x1b[0m'
|
|
except Exception as e:
|
|
print(e)
|
|
self.cmps.append(f'{_sn1}\n{_sn2}\n{_sn3}')
|
|
n1+=self.width
|
|
n2+=self.width
|
|
#################################################################################################################### TOOL
|
|
def chunk(self,s,n):
|
|
return [s[i:i+n] for i in range(0,len(s),n)]
|
|
#################################################################################################################### TOOL
|
|
def stripcodes(self,s):
|
|
buffer=s
|
|
code_start=0
|
|
code_end=0
|
|
code_state=False
|
|
for i,_ in enumerate(s):
|
|
if code_state==False:
|
|
if _ == '\x1b':
|
|
code_state=True
|
|
code_start=i
|
|
else:
|
|
if 64 <= ord(_) <= 126:
|
|
if _ in self.commands:
|
|
code_state=False
|
|
code_end=i+1
|
|
code=s[code_start:code_end]
|
|
buffer=buffer.replace(code,'')
|
|
return buffer
|
|
#################################################################################################################### TOOL
|
|
def rgb(self,t='',r=0,g=0,b=0):
|
|
"""colorize text with rgb values"""
|
|
return f"\033[38;2;{r};{g};{b}m{t}\033[38;2;255;255;255m"
|
|
#################################################################################################################### TOOL
|
|
def vga(self,t='',i=0):
|
|
"""colorize text using vga color set"""
|
|
vga = [ '#000000','#aa0000','#00aa00','#aa5500',
|
|
'#0000aa','#aa00aa','#00aaaa','#aaaaaa',
|
|
'#555555','#ff5555','#55ff55','#ffff55',
|
|
'#5555ff','#ff55ff','#55ffff','#ffffff', ]
|
|
try:
|
|
r=int(vga[i][1:][0:2],16)
|
|
g=int(vga[i][1:][2:4],16)
|
|
b=int(vga[i][1:][4:6],16)
|
|
except:
|
|
r,g,b=0,0,0
|
|
return f"\033[38;2;{r};{g};{b}m{t}\033[38;2;255;255;255m"
|
|
#################################################################################################################### TOOL
|
|
def invert_dict(self,d):
|
|
return {v: k for k, v in d.items()}
|
|
########################################################################################################## CLASS MAIN - 4
|
|
def boot(self):
|
|
if self.DEBUG:
|
|
print("\n\x1b[1;31m[ HEXDUMP ]\x1b[0m\n")
|
|
self.printhex()
|
|
self.codedump()
|
|
self.processdump()
|
|
#############################################################################################################################
|
|
def getkey():
|
|
old_settings = termios.tcgetattr(sys.stdin)
|
|
tty.setcbreak(sys.stdin.fileno())
|
|
try:
|
|
while True:
|
|
b = os.read(sys.stdin.fileno(), 3).decode()
|
|
if len(b) == 3:
|
|
k = ord(b[2])
|
|
else:
|
|
k = ord(b)
|
|
key_mapping = {
|
|
27: 'esc',
|
|
67: 'right',
|
|
68: 'left',
|
|
113: 'q',
|
|
120: 'x'
|
|
}
|
|
return key_mapping.get(k, chr(k))
|
|
finally:
|
|
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
|
|
################################################################################################################### ENTRY - 1
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1:
|
|
PATH=''
|
|
if sys.argv[1]=='.':
|
|
PATH=os.getcwd()
|
|
files=glob(PATH+"/*.ans")
|
|
files+=glob(PATH+"/*.ANS")
|
|
else:
|
|
files=glob(sys.argv[1]+"/*.ans")
|
|
files+=glob(sys.argv[1]+"/*.ANS")
|
|
else:
|
|
files=glob('ansiscii/*.ans')
|
|
files+=glob('ansiscii/*.ANS')
|
|
|
|
if len(files)==0:
|
|
print('ERROR: NO ANSI FILES IN THE PATH SPECIFIED',end='')
|
|
sys.exit(1)
|
|
|
|
index=0
|
|
d=dr1p4ns1(ansifile=files[index],width=80,debug=False)
|
|
try:
|
|
while True:
|
|
B='\x1b[1;94m'; C='\x1b[1;94m'; S='\x1b[1;36m'; M='\x1b[1;92m'; E='\x1b[0m'
|
|
msg=f"{B}[ {C}DR1P {B}] {S}- {B}[ {C}q{S}: {M}quit{S}, {C}left{S}: {M}previous{S}, {C}right{S}: {M}next {B}] {S}- {C}filename{S}: {M}"
|
|
msg+=f"{d.filename}{E}"
|
|
print(msg)
|
|
k = getkey()
|
|
if k == 'left':
|
|
index-=1
|
|
if index < 0: index=len(files)-1
|
|
d=dr1p4ns1(ansifile=files[index],width=80,debug=False)
|
|
if k == 'right':
|
|
index+=1
|
|
if index >= len(files): index=0
|
|
d=dr1p4ns1(ansifile=files[index],width=80,debug=False)
|
|
if k == 'esc' or k == 'q' or k == 'x':
|
|
quit()
|
|
except (KeyboardInterrupt, SystemExit):
|
|
os.system('stty sane')
|
|
|
|
######################################################################################################################### EOF |