Papercraft IRB 지원
이전까지 Papercraft의 가장 큰 제약 사항은 IRB 세션에서 사용할 수 없었다는 점입니다. 이는 Papercraft가 템플릿을 컴파일하기 위해 소스 코드에 접근해야 했으나, IRB에서 정의된 템플릿의 소스 코드를 찾기 어려웠기 때문입니다. 파리행 기차 안에서 IRB가 입력된 코드 라인을 어딘가에 저장할 것이라는 아이디어를 얻었고, 결국 이를 찾아내어 접근할 수 있게 되었습니다. 그 결과, 이제 IRB 세션에서 다음과 같이 즉석 Papercraft 템플릿을 정의하고 렌더링할 수 있습니다.
sh
sharon@nf1:~$ irb -rpapercraft
irb(main):001> ->{ h1 "Hello, IRB!" }.render
=> "<h1>Hello, IRB!</h1>"
irb(main):002>
이 기능은 Papercraft 템플릿을 IRB에서 탐색하고 실험하는 것을 매우 즐겁게 만듭니다.
주요 버그 수정
Papercraft 사용 중 발견된 몇 가지 엣지 케이스들을 처리하는 데 시간을 할애했습니다. 수정된 버그는 다음과 같습니다.
-
빈 템플릿 컴파일 수정: 빈 템플릿 컴파일 시 발생하는 문제를 해결했습니다.
- 자식 노드 또는 내부 텍스트가 있는 무효(void) 요소에 대한 오류 발생: ‘input’이나 ‘hr’과 같은 무효 HTML 요소에 자식 노드나 내부 텍스트가 있을 경우 Papercraft::Error를 발생시키도록 변경했습니다. 이는 잘못된 HTML 구조를 방지합니다.
-> { input 'foo' }.render #=> !!! Papercraft::Error-> { hr { span } }.render #=> !!! Papercraft::Error
- 블록과 함께 호출될 때 ‘apply’ 파라미터 핸들링 수정: ‘apply’ 메서드가 블록과 함께 사용될 때 파라미터가 올바르게 처리되지 않던 문제를 해결했습니다. 이로써 복잡한 템플릿 조합이 더욱 유연해졌습니다.
HTML 이스케이핑 속도 향상
Papercraft가 HTML 콘텐츠 이스케이핑(HTML 삽입 방지)에 사용하는 ‘ERB::Escape.html_escape’ 소스 코드를 분석했습니다. 기존 구현의 개선점을 발견하고 PR을 제출했습니다. 주요 개선 내용은 다음과 같습니다.
-
버퍼 할당 최적화: 기존 ‘html_escape’ 구현은 이스케이프할 문자가 없더라도 항상 입력 문자열 길이의 6배에 달하는 버퍼 공간을 미리 할당했습니다. 새로운 구현은 이스케이프가 필요한 문자가 처음 나타날 때만 출력 버퍼를 할당합니다.
-
memcpy 활용: 이스케이프되지 않은 문자를 하나씩 출력 버퍼로 복사하는 대신, 연속된 이스케이프되지 않은 문자 세그먼트를 ‘memcpy’를 사용하여 복사하도록 변경했습니다.
이러한 변경으로 인해 합성 벤치마크에서 수정된 구현이 기존보다 약 35% 더 빠르게 작동하는 것으로 나타났습니다. 이 PR은 이미 병합되었고 새로운 ERB 버전이 출시되었습니다. 가장 중요한 점은 이 속도 향상이 Papercraft뿐만 아니라 ERB(또는 ‘html_escape’ 메서드)를 사용하는 전체 Ruby 생태계에 적용된다는 것입니다.