# 리치 텍스트 내부 언뜻 보기에 Wagtail의 리치 텍스트 기능은 편집자에게 HTML 콘텐츠 블록에 대한 직접적인 제어권을 제공하는 것처럼 보입니다. 실제로는 여러 가지 이유로 편집자에게 최종 HTML 출력과 몇 단계 떨어진 리치 텍스트 콘텐츠 표현을 제공해야 합니다. - 편집기 인터페이스는 특정 종류의 원치 않는 마크업을 필터링해야 합니다. 여기에는 악성 스크립팅, 외부 워드 프로세서에서 붙여넣은 글꼴 스타일, 사이트 디자인의 유효성 또는 일관성을 깨뜨릴 수 있는 요소(예: 페이지는 일반적으로 `
` 요소를 활성화"라고 말하는 것보다 더 복잡합니다. Wagtail의 다양한 구성 요소(클라이언트 및 서버 측 모두)가 해당 기능을 처리하는 방법에 대해 동의해야 하기 때문입니다. 여기에는 편집기 인터페이스에서 어떻게 노출되어야 하는지, 데이터베이스 내에서 어떻게 표현되어야 하는지, 그리고 (적절한 경우) 프런트엔드에서 렌더링될 때 어떻게 번역되어야 하는지가 포함됩니다. Wagtail의 리치 텍스트 처리에 관련된 구성 요소는 아래에 설명되어 있습니다. ## 데이터 형식 리치 텍스트 데이터([RichTextField](rich_text_field) 및 [StreamField](../topics/streamfield) 내의 `RichTextBlock` 에서 처리됨)는 HTML과 유사하지만 동일하지는 않은 형식으로 데이터베이스에 저장됩니다. 예를 들어, 페이지 링크는 다음과 같이 저장될 수 있습니다. ```htmlContact us for more information.
``` 여기서 `linktype` 속성은 태그를 다시 작성하는 데 사용될 규칙을 식별합니다. `|richtext` 필터([리치 텍스트 필터](rich_text_filter) 참조)를 통해 템플릿에 렌더링될 때, 이것은 유효한 HTML로 변환됩니다. ```htmlContact us for more information.
``` `RichTextBlock` 의 경우, 블록의 값은 문자열로 렌더링될 때 이 변환을 자동으로 수행하는 `RichText` 객체이므로 `|richtext` 필터는 필요하지 않습니다. 마찬가지로, 리치 텍스트 콘텐츠 내의 이미지는 다음과 같이 저장될 수 있습니다. ```html ``` 이는 렌더링될 때 `img` 요소로 변환됩니다. ```html``` 다시 말하지만, `embedtype` 속성은 태그를 다시 작성하는 데 사용될 규칙을 식별합니다. `` 및 `` 를 제외한 모든 태그는 변환된 HTML에서 변경되지 않습니다. `` 및 `` 태그에는 변환을 문자열 대체로 효율적으로 수행할 수 있도록 몇 가지 추가 제약 조건이 적용됩니다. - 태그 이름과 속성은 소문자여야 합니다. - 속성 값은 이중 따옴표로 묶어야 합니다. - `embed` 요소는 XML 자체 닫는 태그 구문(닫는 `` 태그 대신 `/>` 로 끝나는 태그)을 사용해야 합니다. - 속성 값에 허용되는 유일한 HTML 엔티티는 `<`, `>`, `&` 및 `"` 입니다. (rich_text_manual_conversion)= ### 수동 변환 `RichTextBlock` 또는 `|richtext` 필터가 적절하지 않은 시나리오의 경우, Wagtail의 `expand_db_html` 유틸리티 함수를 직접 사용하십시오. 이 함수는 CMS 콘텐츠(이미지, 임베드, 문서, 페이지 링크)에 대한 내부 참조를 확장하여 표시할 준비가 된 HTML을 생성합니다. ```python from wagtail.rich_text import expand_db_html # 저장된 리치 텍스트 데이터 형식을 렌더링에 적합한 HTML로 변환합니다. expand_db_html(page.body) ``` ## 기능 레지스트리 프로젝트 내의 모든 앱은 새 `linktype` 및 `embedtype` 규칙과 같이 Wagtail의 리치 텍스트 처리에 대한 확장을 정의할 수 있습니다. _기능 레지스트리_라고 하는 객체는 리치 텍스트가 어떻게 동작해야 하는지에 대한 중앙 소스 역할을 합니다. 이 객체는 시작 시 리치 텍스트와 관련된 모든 정의를 수집하기 위해 호출되는 [리치 텍스트 기능 등록](register_rich_text_features) 후크를 통해 액세스할 수 있습니다. ```python # my_app/wagtail_hooks.py from wagtail import hooks @hooks.register('register_rich_text_features') def register_my_feature(features): # 여기에 새 정의를 'features'에 추가합니다. ``` (rich_text_rewrite_handlers)= ## 재작성 핸들러 재작성 핸들러는 `` 및 `` 와 같은 리치 텍스트 태그의 내용을 프런트엔드 HTML로 변환하는 방법을 아는 클래스입니다. 예를 들어, `PageLinkHandler` 클래스는 리치 텍스트 태그 `` 를 HTML 태그 `` 로 변환하는 방법을 알고 있습니다. 재작성 핸들러는 리치 텍스트 태그에 대한 다른 유용한 정보도 제공할 수 있습니다. 예를 들어, 적절한 태그가 주어지면 `PageLinkHandler` 를 사용하여 참조되는 페이지를 추출할 수 있습니다. 이는 리치 텍스트에서 참조되는 객체에 대한 정보가 필요한 다운스트림 코드에 유용할 수 있습니다. 새로운 `linktype` 및 `embedtype` 태그를 지원하기 위해 사용자 지정 재작성 핸들러를 만들 수 있습니다. 새 핸들러는 `wagtail.richtext.LinkHandler` 또는 `wagtail.richtext.EmbedHandler` 중 하나를 상속하는 Python 클래스여야 합니다. 새 클래스는 다음 메서드 중 적어도 일부를 재정의해야 합니다(`LinkHandler` 에 대해 여기에 나열되어 있지만 `EmbedHandler` 는 동일한 서명을 가짐). ```{eval-rst} .. class:: LinkHandler .. attribute:: identifier 필수. :code:`identifier` 속성은 이 핸들러가 처리해야 하는 리치 텍스트 태그를 나타내는 문자열입니다. 예를 들어, :code:`PageLinkHandler.identifier` 는 문자열 :code:`"page"` 로 설정되어 :code:`` 가 있는 모든 리치 텍스트 태그가 이 핸들러에 의해 처리되어야 함을 나타냅니다. .. method:: expand_db_attributes(attrs) 선택 사항. :code:`expand_db_attributes` 메서드는 데이터베이스 리치 텍스트 :code:`` 태그(:code:`EmbedHandler` 의 경우 :code:`