Existe alguma ferramenta que traduza texto com código ANSI para saída semelhante a texto? tput
nomes de boné ou algo parecido?
O motivo da consulta é que eu gostaria de usar script
ou 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
1049
có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%dH
em 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.