traductor de código ANSI

traductor de código ANSI

¿Existe alguna herramienta que traduzca texto con código ANSI a una salida similar a un texto? tput¿Nombres de gorras o cosas así?

El motivo de la consulta es que me gustaría utilizar scriptalgo similar y ver el archivo resultante sin tener que descifrar secuencias ANSI. Conozco algunos, pero no todos, y un resultado textual sería más fácil de leer.

En la mayoría de los casos, puedo buscar en el código fuente un script o programa que produzca el texto ANSI, pero sería bueno si hubiera una herramienta similar a la de "depuración".

Lo mejor probablemente sería C?nombres de variables, es decir:

^[[K    ->   <clr_eol>

Sé que puedo escribir un guión para ello... por ejemplo:

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 es parte de una prueba rápida que hice en unIrsigrabación.

Pero me pregunto si existe alguna herramienta para el trabajo.

Como nota al margen tenemos aha,Adaptador HTML Ansi, que convierte ANSI a HTML. Pero ese no es el adaptador que estoy buscando.


Respuesta1

Alguien podría sugerir un programa. No es un problema trivialBueno:

  • Las "secuencias ANSI" están estandarizadas en ECMA-48,
  • algunos de sus ejemplos (como la apariencia del cursor yentrar_ca_mode) no están en el estándar,
  • algunos como elentrar_ca_mode 1049El código tiene variaciones ( \E7\E[?47h). Si un programa se basa en una descripción de terminal, sólo se reconocerá una de las variaciones,
  • algunas de las secuencias están parametrizadas, lo que significa que un programa debe tener las reglas incorporadas o ser capaz de transformar las capacidades del terminal, como por ejemplo, \E[%i%p1%d;%p2%dHen una expresión regular que pueda compararse con las entradas.

Teniendo en cuenta todo esto, si alguien sugiere un programa, lo más probable es que no resuelva esos aspectos, sino que simplemente sea un emulador de terminal sin pantalla.

Respuesta2

Si solo desea el movimiento del cursor ANSI, puede crear fácilmente un intérprete usando el módulo NPManalizador de nodos. Usé el mismo módulo para mi biblioteca de JavaScript:Terminal jQuery, donde analizo y proceso escapes ANSI y sobreescritura (salida del comando man).

Puedes ver cómo utilicé el analizador en GitHub.unix_formato.js(el archivo incluye el ansi-parser). Puede intentar modificar el código para procesar solo texto e ignorar los colores (la sintaxis de formato de jQuery Terminal). No debería ser tan difícil.

Si desea algo rápido, puede crear un script que simplemente procesará el archivo y eliminará el formato utilizado por jQuery Terminal. Aquí hay un truco rápido que funciona (pero probablemente sea mejor modificar el archivo unix_formatting.js y eliminar todo lo que no sea necesario).

Para comenzar con jQuery Terminal use esto:

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

luego cree este archivo en el mismo directorio:

ansi-texto.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));
        });
    });
}

Luego puede crear un script de prueba:

prueba.sh

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

Y puedes ver que funciona usando:

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

Producción:

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


   HELLO


                    WORLD

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

unbuffer hará que el script piense que es TTY (es parte de lo esperado).

El código JS no maneja el ancho del terminal, pero se puede agregar fácilmente después de transformar los escapes ANSI. Para dividir el uso de salida: $.terminal.split_equal(string, cols)pero probablemente puedas usar algo más simple ya que no necesitas manejar el formato de jQuery Terminal, ese es el propósito principal de la función.

información relacionada