ANSI 코드 변환기

ANSI 코드 변환기

ANSI 코드가 포함된 텍스트를 텍스트와 유사한 출력으로 변환하는 도구가 있습니까? tput모자 이름 같은 것?

문의 이유는 scriptANSI 시퀀스를 해독하지 않고도 결과 파일을 보고 싶기 때문입니다. 나는 일부를 알고 있지만 전부는 아니므로 텍스트 출력이 읽기 더 쉬울 것입니다.

대부분의 경우 ANSI 텍스트를 생성하는 스크립트나 프로그램의 소스 코드를 볼 수 있지만 도구와 같은 "디버그"가 있으면 좋을 것입니다.

가장 좋은 것은 아마도 C일 것이다.?변수 이름, 즉:

^[[K    ->   <clr_eol>

이에 대한 스크립트를 작성할 수 있다는 것을 알고 있습니다. 예를 들면 다음과 같습니다.

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' | \
...

이것은 내가 한 빠른 테스트의 일부입니다.이르시녹음.

하지만 해당 작업을 위한 기존 도구가 있는지 궁금합니다.

참고로 우리 ahaAnsi HTML 어댑터, ANSI를 HTML로 변환합니다. 하지만 그건 내가 찾고 있는 어댑터가 아닙니다.


답변1

누군가 프로그램을 제안할 수도 있습니다. 할 수 있는 사소한 문제가 아닙니다:

  • "ANSI 시퀀스"는 ECMA-48에 표준화되어 있습니다.
  • 몇 가지 예(예: 커서 모양 및enter_ca_mode) 표준에 포함되어 있지 않습니다.
  • 다음과 같은 일부enter_ca_mode 1049코드에는 변형( \E7\E[?47h)이 있습니다. 프로그램이 터미널 설명에 의존하는 경우 변형 중 하나만 인식됩니다.
  • 일부 시퀀스는 매개변수화됩니다. 이는 프로그램에 규칙이 내장되어 있거나 \E[%i%p1%d;%p2%dH입력과 일치할 수 있는 정규식과 같은 터미널 기능을 변환할 수 있어야 함을 의미합니다.

이 모든 것을 감안할 때 누군가 프로그램을 제안하면 이러한 측면을 해결하지 못하고 단순히 디스플레이가 없는 터미널 에뮬레이터일 가능성이 높습니다.

답변2

ANSI 커서 이동만 원하는 경우 NPM 모듈을 사용하여 인터프리터를 쉽게 만들 수 있습니다.노드 앤시파서. 내 JavaScript 라이브러리에 동일한 모듈을 사용했습니다.jQuery 터미널, 여기서는 ANSI 이스케이프 및 겹쳐쓰기(man 명령의 출력)를 구문 분석하고 처리합니다.

GitHub에서 파서를 어떻게 사용했는지 살펴볼 수 있습니다.unix_formatting.js(파일에는 ansi-parser가 포함되어 있습니다). 텍스트만 처리하고 색상은 무시하도록 코드를 수정할 수 있습니다(jQuery 터미널 형식 지정 구문). 그렇게 어렵지는 않습니다.

빠른 작업을 원한다면 파일을 처리하고 jQuery 터미널에서 사용되는 형식을 제거하는 스크립트를 만들 수 있습니다. 여기에 트릭을 수행하는 빠른 해킹이 있습니다(그러나 아마도 unix_formatting.js 파일을 수정하고 필요하지 않은 모든 것을 제거하는 것이 더 나을 것입니다).

jQuery 터미널을 시작하려면 다음을 사용하십시오.

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

그런 다음 동일한 디렉터리에 이 파일을 만듭니다.

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));
        });
    });
}

그런 다음 테스트 스크립트를 만들 수 있습니다.

test.sh

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

그리고 다음을 사용하여 작동하는 것을 볼 수 있습니다.

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

산출:

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


   HELLO


                    WORLD

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

unbuffer는 스크립트가 TTY(예측의 일부)라고 생각하도록 만듭니다.

JS 코드는 터미널 너비를 처리하지 않지만 ANSI 이스케이프를 변환한 후에 쉽게 추가할 수 있습니다. 출력을 분할하려면 다음을 사용하세요. $.terminal.split_equal(string, cols)하지만 함수의 주요 목적인 jQuery 터미널 형식을 처리할 필요가 없으므로 더 간단한 것을 사용할 수도 있습니다.

관련 정보