Tradutor de código ANSI

Tradutor de código ANSI

Existe alguma ferramenta que traduza texto com código ANSI para saída semelhante a texto? tputnomes de boné ou algo parecido?

O motivo da consulta é que eu gostaria de usar scriptou algo semelhante e visualizar o arquivo resultante sem precisar decifrar as sequências ANSI. Conheço alguns, mas não todos, e uma saída textual seria mais fácil de ler.

Na maioria dos casos, posso procurar no código-fonte um script ou programa que produza o texto ANSI, mas seria bom se houvesse uma ferramenta semelhante a "depuração".

O melhor provavelmente seria C?nomes de variáveis, ou seja:

^[[K    ->   <clr_eol>

Sei que posso escrever um script para isso... por exemplo:

sed 's/$/<newline>/' rec001.txt | \
sed 's/\x07/\n<bell>/g' | \
sed 's/\x1b\[K/\n<clr_eol>/g' | \
sed 's/\x1b\[?12l\x1b\[?25h/\n<cursor_normal>/g' | \
sed 's/\x1b\[\([0-9]\+\);\([0-9]\+\)H/\n<cursor_position(\1, \2)>/g' | \
sed 's/\x1b\[?1049h/\n<enter_ca_mode>/g' | \
sed 's/\x1b\[?25l/\n<cursor_invisible>/g' | \
sed 's/\x0d/<CR>/g' | \
...

que faz parte de um teste rápido que fiz em umIrssigravação.

Mas estou me perguntando se existe alguma ferramenta para o trabalho.

Como observação lateral, temos aha,Adaptador HTML Ansi, que converte ANSI em HTML. Mas esse não é o adaptador que procuro.


Responder1

Alguém pode sugerir um programa. Não é um problema trivial de se fazerbem:

  • "Sequências ANSI" são padronizadas em ECMA-48,
  • alguns de seus exemplos (como a aparência do cursor eenter_ca_mode) não estão no padrão,
  • alguns como oenter_ca_mode 1049código tem variações ( \E7\E[?47h). Se um programa depende de uma descrição de terminal, apenas uma das variações será reconhecida,
  • algumas das sequências são parametrizadas, o que significa que um programa deve ter as regras integradas ou ser capaz de transformar recursos do terminal, como \E[%i%p1%d;%p2%dHem uma expressão regular que possa ser comparada com as entradas.

Diante de tudo isso, se alguém sugerir um programa, é provável que ele não resolva esses aspectos, mas seja simplesmente um emulador de terminal sem display.

Responder2

Se você deseja apenas o movimento do cursor ANSI, você pode facilmente criar um interpretador usando o módulo NPManalisador de nó. Usei o mesmo módulo para minha biblioteca JavaScript:Terminal jQuery, onde analiso e processo escapes ANSI e sobrescrições (saída do comando man).

Você pode dar uma olhada em como usei o analisador no GitHubunix_formatting.js(o arquivo inclui o analisador ansi). Você pode tentar modificar o código para processar apenas texto e ignorar as cores (a sintaxe de formatação do Terminal jQuery). Não deveria ser tão difícil.

Se você quiser algo rápido, você pode criar um script que irá apenas processar o arquivo e retirar a formatação usada pelo jQuery Terminal. Aqui está um hack rápido que resolve o problema (mas provavelmente será melhor modificar o arquivo unix_formatting.js e remover tudo o que não é necessário).

Para começar com o jQuery Terminal, use isto:

mkdir ansi-text
cd ansi-text
npm init -y # you need nodeJS installed
npm install jquery.terminal

então crie este arquivo no mesmo diretório:

ansi-text.js

#!/usr/bin/env node
// mock jQuery that is not actually required
const $ = global.$ = global.jQuery = {
    fn: {
        extend: function(obj) {
            Object.assign(global.jQuery.fn, obj);
        }
    },
    extend:  Object.assign
};

global.navigator = {
    userAgent: 'Node'
};

require('jquery.terminal')(global, global.$);
require('jquery.terminal/js/unix_formatting')(global, global.$);

read_stdin().then(function(buff) {
    const str = buff.toString();
    const formatted = $.terminal.apply_formatters(str);
    console.log($.terminal.strip(formatted));
});

function read_stdin() {
    return new Promise((resolve) => {
        const buff = [];

        process.stdin.on('data', data => {
            buff.push(data);
        }).on('end', () => {
            var len = buff.map(x => x.length).reduce((acc, e) => acc + e);
            resolve(Buffer.concat(buff, len));
        });
    });
}

Você pode então criar um script de teste:

teste.sh

tput cup 2 3;
echo HELLO;
tput cup 5 20;
echo WORLD;

E você pode ver que funciona usando:

unbuffer ./test.sh | ./ansi-text.js

Saída:

kuba@jcubic:~/projects/jcubic/ansi-text$ unbuffer test.sh | ./ansi-text.js 


   HELLO


                    WORLD

kuba@jcubic:~/projects/jcubic/ansi-text$ 

unbuffer fará o script pensar que é TTY (faz parte do expect).

O código JS não controla a largura do terminal, mas pode ser facilmente adicionado depois de transformar os escapes ANSI. Para dividir a saída, use: $.terminal.split_equal(string, cols)mas você provavelmente pode usar algo mais simples, já que não precisa lidar com a formatação do Terminal jQuery, que é o objetivo principal da função.

informação relacionada