import sys ####################################################################################################################### class C: ################################################################################################################### 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' } ################################################################################################################### ascii_table=""" ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒ\ áíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐\ └┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀\ αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■  """ ################################################################################################################### for r in (('\n',''),(' ','')): ascii_table=ascii_table.replace(*r) ################################################################################################################### asc2uni=dict(zip([i for i in range(128,256)],[ord(c) for c in ascii_table])) ################################################################################################################### asc2chr=dict(zip([i for i in range(128,256)],[c for c in ascii_table])) ################################################################################################################### def __init__(self,ansifile="",width=80,height=25): self.width=width self.height=height self.openansi(ansifile) self.code='\x1b[0m' print("\x1bc\x1b[1;31m[ DR1P LOADED ]\x1b[0m\n") ################################################################################################################### def openansi(self,s): try: f=open(s,'rb') self.ansifile=f.read().decode('cp437') f.close() except: print(f'\n\x1b[1;31m[ ERROR: "{s}" FILE NOT FOUND ] - *USAGE: `python3 {sys.argv[0]} work.ans`\x1b[0m') sys.exit(1) ################################################################################################################### def printascii(self): for i,_ in enumerate(self.ascii_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}') ################################################################################################################### def printrange(self,n,nn): for index,_ in enumerate(c.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(c.ansifile)))) if index >=n and index <=nn: print(f"{l} {i} {h} {s}") if index==nn: break ################################################################################################################### 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[_]}") ################################################################################################################### def hexdump(self,visible=True): if visible == True: self.printhex() self.codes=[] code_start=0 code_end=0 code_state=False buffer='' 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]) ################################################################################################################### def findall(self,s,w): return [i for i in range(len(s)) if s.startswith(w, i)] ################################################################################################################### def getsauce(self): try: self.ansifile[-128:] self.ansifile_xwidth=ord(c.ansifile[-128:][96]) self.ansifile_yheight=ord(c.ansifile[-128:][98]) self.width=self.ansifile_xwidth self.height=self.ansifile_yheight print(f'\x1b[31m[ SAUCE INFO FOUND ] - X: {self.width} Y: {self.height}\x1b[0m\n') except: print('\x1b[31m[ NO SAUCE INFO FOUND ]\x1b[0m\n') ################################################################################################################### def chunk(self,s,n): return [s[i:i+n] for i in range(0,len(s),n)] ################################################################################################################### 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" ################################################################################################################### 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,g,b=int(vga[i][1:][0:2],16),int(vga[i][1:][2:4],16),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" ####################################################################################################################### if __name__ == "__main__": ################################################################ try: input_file=sys.argv[1] except: input_file='work.ans' c=C(ansifile=input_file,width=80) c.getsauce() c.hexdump(visible=False) ################################################################ op=[] fb=c.ansifile xnew=0 xold=0 ############ for _ in c.codes: xnew=_[1] distance=xnew-xold if not distance == 0: gap=fb[xold:xold+distance] op.append(gap) op.append(_[0]) xold=_[2] ################################################################ optype=[] ############ for i,_op in enumerate(op): if _op.startswith('\x1b'): if _op.endswith('m'): optype.append(2) ######################################################## elif _op.endswith('C'): optype.append(3) ######################################################## else: optype.append(0) ############################################################ elif _op.startswith('\x1a'): optype.append(4) ############################################################ else: optype.append(1) ################################################################ offset=0 processed=[] processing='' ############ for i,_optype in enumerate(optype): if _optype==2: processing+=op[i] offset+=len(op[i]) ############################################################ elif _optype==3: count=int(op[i].split('[')[1].split('C')[0]) processing+=' '*count ############################################################ elif _optype==1: processing+=op[i] ############################################################ if len(processing)-offset > c.width: while len(processing)-offset > c.width: deconcatenate=processing[0:c.width+offset] processed.append(deconcatenate) processing=processing.replace(deconcatenate,'',1) offset=0 ################################################################# for _ in processed: print(_) print('\x1b[1;31m[ COMPLETED ]\x1b[0m\n') #####################################################################