화면은 순수한 PHP로 작성된 터미널 렌더러입니다. Laravel의 솔로에 전원을 공급하며 PHP 응용 프로그램에서 풍부한 텍스트 기반 사용자 인터페이스를 구축하는 데 사용할 수 있습니다.

메모

화면은 PHP 응용 프로그램에 통합 될 라이브러리입니다. 독립형 터미널 응용 프로그램이 아닙니다.

터미널 렌더러는 텍스트 및 ANSI 이스케이프 시퀀스를 처리하여 터미널 출력의 가상 표현을 만듭니다. 완전한 터미널 에뮬레이터와 달리 화면은 입력, 대화식 세션 또는 프로세스 관리를 다루지 않고 형식의 텍스트 내용을 올바르게 해석하고 렌더링하는 데 중점을 둡니다.

터미널 렌더러는 이스케이프 시퀀스를 다음과 같이 해석합니다.

  • 커서 위치를 추적하십시오
  • 텍스트 색상과 스타일을 적용합니다 (대담한, 밑줄 등)
  • 화면 콘텐츠를 관리합니다
  • 특수 문자 세트를 처리합니다
  • 최종 렌더링 된 출력을 생성합니다

화면은이 기능을 순수한 PHP에서 구현하여 개발자가 외부 종속성 또는 기본 코드에 의존하지 않고 터미널 사용자 인터페이스를 구축 할 수 있습니다.

화면은 원래 Laravel의 솔로에서 특정 문제를 해결하기 위해 만들어졌습니다.

Tmux와 마찬가지로 Solo는 별도의 패널에서 여러 프로세스를 동시에 실행하는 TUI (텍스트 사용자 인터페이스)를 제공합니다. 그러나 이러한 프로세스가 커서 이동 및 스크린 조작을위한 ANSI 탈출 코드를 출력하면 시각적 컨테이너를 “파산”하고 인터페이스의 다른 부분을 방해 할 수 있습니다.

이 문제를 해결하기 위해 화면은 가상 터미널 버퍼를 만듭니다.

  1. 모든 ANSI 작업 (커서 이동, 색상 변경, 스크린 클리어)은 고립 된 환경 내에서 안전하게 해석됩니다.
  2. 모든 작업이 처리 된 후 최종 렌더링 상태가 캡처됩니다.
  3. 사용자의 장치에 최종 시각적 출력 만 표시됩니다.

이 접근법은 터미널 출력이 렌더링되는 방식을 완전히 제어하여 지정된 영역 내에 복잡한 ANSI 작업이 포함되도록합니다. 솔로 목적으로 처음으로 제작되었지만 화면은 터미널 렌더링이 필요한 PHP 응용 프로그램에 사용할 수있는 독립형 라이브러리로 발전했습니다.

  • 순수한 PHP 구현 : 단 하나의 종속성 (Grapheme, 다른 솔로 라이브러리)
  • 포괄적 인 ANSI 지원 : 커서 포지셔닝, 텍스트 스타일 및 스크린 작업 처리
  • 유니 코드/멀티 바이트 지원 : 이모티콘 및 와이드 캐릭터와 같은 UTF-8 문자와 적절하게 거래
  • 버퍼 관리 : 텍스트 내용 및 스타일에 대한 별도의 버퍼 유지 관리
  • 문자 너비 처리 : CJK 및 기타 이중 폭의 표시 너비를 올바르게 계산합니다.
  • 스크롤 : 적절한 컨텐츠 관리를 통한 수직 스크롤 지원

작곡가를 통해 설치하십시오.

작곡가는 Soloterm/Screen이 필요합니다

  • PHP 8.1 이상
  • MBString 확장

화면 사용의 간단한 예는 다음과 같습니다.

Soloterm \ Screen \ Screen을 사용하십시오. // 크기 (열, 행)를 사용하여 화면 생성 $ screen = 새 화면 (80, 24); // 텍스트 쓰기, ANSI ESCAPES SCREENT-> WRITE ( “Hello, \ e[1;32Mworld!\e[0m”);//커서를텍스트로텍스트로이동->쓰기(“\e[5;10HPositionEdText”);//렌더링된컨텐츠echo$screen->output();

화면은 몇 가지 중요한 구성 요소와 함께 작동합니다.

모든 기능을 조정하는 메인 클래스. 커서 포지셔닝, 컨텐츠 생성 및 최종 출력 렌더링을 지원합니다.

$ screen = 새 화면 (80, 24); // 너비, 높이 $ screen-> 쓰기 ( “텍스트 및 ANSI 코드”);

화면은 여러 버퍼 유형을 사용하여 컨텐츠와 스타일을 추적합니다.

  • PrintableBuffer : 표시 가능한 문자 및 너비의 계산을 처리합니다
  • Ansibuffer : 스타일링 정보 (색상, 대담한, 밑줄 등)

화면은 ANSI 이스케이프 시퀀스에서 올바르게 해석됩니다.

  • 커서 운동 (위, 아래, 왼쪽, 오른쪽, 절대 포지셔닝)
  • 텍스트 스타일링 (색상, 대담한, 이탤릭체, 밑줄)
  • 화면을 지우고 라인 작동
  • 스크롤

// 커서를 위치로 이동 (행 5, 열 10) $ 스크린-> 쓰기 ( “\ e[5;10H”);//커서를3줄을움직입니다.(“\e7”);//$screen->write(“moretext”);$screen->write(“\e8″);//restore//boldredText$screen->writ[0m”);//256-colorsupport$screen->write(“\e[38;5;208morangetext\e[0m”);//rgbcolors$screen->writ[2J”);//clearcreen->write(“\e[0k”);//line$screen->write(“\e[2l”);//$screen->write(“\e[2s”);

콜백을 구성하여 터미널 쿼리에 응답 할 수 있습니다.

$ screen-> responstoqueriesvia (function ($ response) {// 프로세스 응답 (예 : 커서 위치) echo $ 응답;});

메모

이것은 여전히 ​​진행 중입니다. 여기에는 더 많은 테스트/사용 사례가 필요합니다.

예 : 간단한 UI 구축 Soloterm \ Screen \ Screen을 구축합니다. $ screen = 새 화면 (80, 24); // border $ screen-> write ( “┌”.str_repeat ( “─”, 78). “┐ \ n”); ($ i = 0; $ i <22; $ i ++){$ screen-> writ } $ screen-> write ( “└”.str_repeat ( “─”, 78). “┘”); // 제목 $ screen-> write ( “\ e[1;30H\e[1;36MMyApplication\e[0m”);//일부내용추가$screen->write(“\e[5;5HwelcomeTotheApplication!”);$screen->write(“\e[7;5hpress’q’quit.”);유니코드및넓은문자처리

화면을 올바르게 처리하십시오. 여러 열을 차지하는 이모티콘 및 CJK 문자를 포함한 유니 코드 문자를 처리합니다.

$ screen-> write ( “일반 텍스트 : hello”); $ screen-> write ( “\ nwide 문자 : 你大好”); $ screen-> write ( “\ nemoji : 🚀🚀🌍”);

화면에는 고유 한 시각적 비교 시스템이있는 포괄적 인 테스트 스위트가 포함되어 있습니다.

화면은 시각적 출력을 검증하는 혁신적인 스크린 샷 기반 테스트 접근법 (비교 시각적 특성 참조)을 사용합니다.

  1. 테스트는 실제 장치 (ITERM)에서 컨텐츠를 렌더링합니다.
  2. 터미널 출력의 스크린 샷을 캡처하십시오
  3. 화면 렌더러를 통해 동일한 컨텐츠를 실행하십시오
  4. 렌더링 된 출력의 스크린 샷을 캡처하십시오
  5. 스크린 샷을 비교하고 픽셀 바이 픽셀을 비교하여 정확성을 보장하십시오

이 테스트 전략은 화면 렌더링이 실제 장치의 동작과 정확하게 일치하도록합니다.

  • 멀티 바이트 문자
  • 복잡한 ANSI 형식
  • 커서 운동
  • 스크롤 동작
  • 선 포장

스크린 샷 기능이없는 환경의 경우 테스트는 고정 기반 비교로 돌아가 CI/CD 파이프 라인에 대한 테스트 스위트를 제공합니다.

모든 테스트에 대한 스크린 샷을 활성화하려면 다음 명령을 사용하십시오.

enable_screenshot_testing = 1 작곡가 테스트

아직 소모품이없는 테스트 전용 스크린 샷을 활성화하려면 다음 명령을 사용하십시오.

enable_screenshot_testing = 2 작곡가 테스트

기부금을 환영합니다! 풀 요청을 보내주십시오.

라이센스 (함께).

이것은 무료입니다! 나를 지원하고 싶다면 :

솔로 스크린은 Aaron Francis에 의해 개발되었습니다. 당신이 그것을 좋아한다면, 알려주세요!

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.