All pastes #1181574 Raw Edit

Strip IRC Color

public python v1 · immutable
#1181574 ·published 2008-08-22 13:09 UTC
rendered paste body
#!/usr/bin/env python# -*- coding: iso-8859-1 -*-'''  Esta função para retirada dos caracteres de cor se baseia em um autômato construído  para este propósito, utilizando-se dos conceitos da Máquina de Turing.  Correção do código:  Para que tudo ocorra da maneira correta, em vez de deletarmos diretamente na máquina  empilhamos cada posição e seu relativo tamanho para, depois de finalizado o autômato,  efetuarmos a deleção dos caracteres de cor, desempilhando-os.  To-do: Corrigir a implementação do laço de repetição que ocasiona na não exclusão de um  marcador de cor propositalmente escrito de maneira incorreta, no final da string.  Corrigido: Substituído Laço For por Laço While para permitir teste de condições de parada  da repetição  To-do: Analizar a função para identificar possíveis falhas exploráveis como Overflow  Underflow e outros tipos de ataques baseados em buffer  Corrigido: Não houve necessidade de mudança no código pois a verificação de tamanho  no laço While resolveu o problema da string vazia  A Expressão pode ser entendida como: <#3 [num [num] [,[num [num]]]>  Licenciado sob FAIL.'''def LimpaString(Texto, Caracter = ''):   Str = Texto[:]   Pos = -1   Tam = -1   Estado = 1   Tamanho = len(Str)   Pilha = []   I = 0   while (I <= Tamanho) or (Estado <> 1):       Char = Str[I:I+1]              if Estado == 1: #Estado atual: 1; Verifica caracter #3           if Char in ('\x03',):               Pos = I               Tam = 1               Estado = 2               I += 1           elif Char in [chr(x) for x in range(1, 32)]:               #Explicação: Todos os caracteres entre #1 e #31 são considerados caracteres de controle,               #por isto estes normalmente não aparecem em mensagens e podem ser excluídos               #sem risco à interpretação da mensagem.               #Os caracteres de 32 à 127 e os ASCII extendidos são os caracteres de input normais.                              Pos = I               Tam = 1               I += 1               Pilha.append({'Pos': Pos, 'Tam': Tam})                           else:                I += 1                       elif Estado == 2: #Estado atual: 2; Verifica primeiro caracter <num>           if Char in [str(x) for x in range(0, 10)]:               Tam += 1               Estado = 3               I += 1           else:               Estado = 1                               Pilha.append({'Pos': Pos, 'Tam': Tam})                       elif Estado == 3: #Estado atual: 3; Verifica caracteres <num> ou ","           if Char in [str(x) for x in range(0, 10)]:               Tam += 1               Estado = 4               I += 1           elif Char in [',']:               Tam += 1               Estado = 5               I += 1           else:               Estado = 1               Pilha.append({'Pos': Pos, 'Tam': Tam})                       elif Estado == 4: #Estado Atual: 4; Verifica caracter ","           if Char in [',']:               Tam += 1               Estado = 5               I += 1           else:               Estado = 1               Pilha.append({'Pos': Pos, 'Tam': Tam})                       elif Estado == 5: #Estado Atual 5; Verifica caracter <num>           if Char in [str(x) for x in range(0, 10)]:               Tam += 1               Estado = 6               I += 1           else:               Estado = 1               Tam -= 1 #Se não houver número depois da virgula, significa que é uma vírgula normal               Pilha.append({'Pos': Pos, 'Tam': Tam})                       elif Estado == 6: #Estado Atual 6; Verifica caracter <num>           if Char in [str(x) for x in range(0, 10)]:               Tam += 1               Estado = 1               Pilha.append({'Pos': Pos, 'Tam': Tam})           else:               Estado = 1               Pilha.append({'Pos': Pos, 'Tam': Tam})   while len(Pilha) > 0:       Cor = Pilha.pop()       Str = Str[:Cor['Pos']] + Str[Cor['Pos']+Cor['Tam']:]   return Str