Por que o OCR comum estraga o código
O reconhecimento de texto comum foi feito para prosa. Ele trata espaços no início da linha como ruído, junta linhas que parecem fazer parte da mesma frase e repassa as aspas do jeito que as vê. Isso funciona bem para um parágrafo, mas quebra o código: o Python para de rodar quando perde o recuo, o YAML muda de sentido, e uma única aspa curva copiada de um slide transforma uma string em erro de sintaxe.
O modo Código lê a imagem de outro jeito:
- O recuo e o espaçamento são mantidos, linha por linha, então blocos aninhados continuam aninhados.
- As aspas curvas são corrigidas, então
“hello”e‘a’voltam como"hello"e'a'. - A linguagem é identificada quando reconhecida, por exemplo “Parece um print de código Python”, um sinal rápido de que o modo combina com a imagem.
Quando você baixa um arquivo Markdown, o código vem dentro de um bloco cercado, pronto para ir para um README, uma página de wiki ou suas anotações.
Temas escuros e sintaxe colorida
Hoje a maioria dos editores e terminais usa tema escuro, e os motores de OCR leem melhor texto escuro sobre fundo claro. A Melhoria automática detecta texto claro sobre fundo escuro e inverte as cores antes da leitura, então prints em modo escuro não precisam de nenhuma preparação.
A sintaxe colorida também costuma funcionar bem. Os pontos mais fracos são as partes de baixo contraste do tema: comentários cinza sobre fundo cinza-escuro ou marcadores de espaço em branco bem apagados. Se esses trechos saírem embaralhados, experimente Tons de cinza e um pouco mais de contraste, depois passe para a visualização tratada para confirmar que nada se perdeu.
Caracteres que merecem uma segunda olhada
Alguns caracteres são quase idênticos em muitas fontes de programação, e um print pequeno piora a situação. Os suspeitos de sempre são:
- 0 e O, principalmente em nomes de variáveis e valores hexadecimais
- 1, l e I, que em algumas fontes diferem por um único pixel
- Colchetes e parênteses:
{e(,]e), além dos sinais de menor e maior em genéricos e tags HTML - Pontuação:
;e:,,e., e uma crase lida como aspa reta - Letras grudadas:
rnlido comom, oucllido comod - Sublinhados que somem ou viram espaços em nomes como
user_id
Fontes de editor com ligaduras desenham !=, => ou >= como um único símbolo, que pode não ser lido de volta como os caracteres que você digitou. Se o print vier do seu próprio editor, desative as ligaduras antes de capturar a tela.
A conferência mais rápida é colar o código num editor com linter ou compilador. Colchetes sem par e caracteres perdidos aparecem em segundos.
Como conferir o recuo em Python e YAML
Em linguagens em que o recuo tem significado, uma linha com um nível a mais ou a menos pode continuar rodando, mas fazer outra coisa. Nem sempre o linter percebe isso, então compare o aninhamento com o print em qualquer bloco importante, como o corpo de um loop ou uma chave aninhada num arquivo de configuração.
Clicar numa linha do resultado destaca o lugar dela na imagem, o que torna rápido ver onde a linha realmente começava. Se um bloco inteiro estiver deslocado, geralmente é mais rápido corrigir no editor, recuando o bloco todo de uma vez, do que linha por linha.
Como tirar um print mais limpo
Muitas vezes você consegue um resultado melhor tirando o print de novo do que corrigindo caracteres à mão depois:
- Aumente o zoom antes de capturar. Texto maior tem mais pixels por caractere, o que ajuda principalmente na pontuação.
- Capture só o código. Deixe de fora barras laterais, abas e minimapas para que nada se misture às suas linhas.
- Desative a quebra automática de linha. Uma linha longa quebrada em duas no editor será lida como duas linhas.
- Atenção a tabulações e espaços. Uma imagem não mostra qual dos dois o original usava, então, se o seu projeto usa tabulações, rode o formatador depois de colar.
Para prints em geral, incluindo conversas e janelas de erro, a página print para texto e o guia como extrair texto de um print cobrem o básico. Se o código faz parte de uma página de documento maior, imagem para Markdown explica como separar o texto corrido e o código em prints diferentes.