P2는 Papercraft와 유사하게 HTML을 Ruby DSL 형태로 작성할 수 있게 하여, div { h1 title }
과 같이 직관적인 HTML 구조 표현과 동적 값 삽입을 용이하게 합니다. 기존 DSL 방식은 Ruby 블록 호출의 성능 오버헤드를 가졌으나, P2는 이를 해결하기 위해 ERB와 유사한 문자열 기반의 효율적인 컴파일 방식을 도입했습니다.
P2의 핵심은 Ruby의 새로운 파서 젬인 Prism과, Proc의 소스 코드를 동적으로 얻어 AST(추상 구문 트리)로 변환하고 다시 소스 코드로 변환하는 기능을 제공하는 Sirop 젬을 활용하는 것입니다. P2는 이 기술들을 통해 DSL 호출을 최적화된 HTML 문자열로 변환합니다.
템플릿 컴파일 과정은 크게 세 단계로 이루어집니다. 먼저, Sirop을 이용해 템플릿 Proc을 AST로 변환합니다. 다음으로, AST를 변환하여 P2::TagNode를 포함하도록 합니다. 마지막으로, 변환된 AST를 소스 코드로 다시 변환하면서 TagNode를 적절한 HTML 코드로 최종 변환합니다. 이 과정에서는 버퍼링, HTML 이스케이프, 지연 렌더링 등 다양한 요소가 고려됩니다. 또한, 컴파일된 템플릿에서 예외 발생 시 정확한 디버깅을 위해 소스 맵을 생성하여 원본 템플릿 소스 코드의 해당 라인을 가리키도록 처리합니다.