All pastes #1462408 Raw Edit

Strip IRC Color

public text v1 · immutable
#1462408 ·published 2009-06-16 17:58 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