사용자 정의 텍스트 태그

Ren'Py에서는 직접 텍스트 태그를 정의할 수 있습니다. 이러한 태그는 내부의 텍스트와 텍스트 태그를 조작할 수 있으며, 텍스트나 다른 텍스트 태그를 추가하거나 제거할 수도 있습니다.

사용자 정의 텍스트 태그는 다음 딕셔너리 중 하나의 항목에 텍스트 태그 함수를 대입하여 만듭니다.

define config.custom_text_tags = { }

다른 텍스트를 감싸는 텍스트 태그의 이름을 텍스트 태그 함수에 연결합니다.

define config.self_closing_custom_text_tags = { }

다른 텍스트를 감싸지 않는 자체 닫힘 텍스트 태그의 이름을 해당 함수에 연결합니다.

경고

이 함수들은 예측 로딩 과정에서 언제든 호출될 수 있습니다. 따라서 동작이 게임 상태, 특히 전역 변수에 의존해서는 안 되며, 부수 효과를 일으켜서도 안 됩니다. 예를 들어 문에 대응하는 함수를 호출하거나 전역 변수를 변경해서는 안 됩니다.

텍스트 태그 함수는 태그 자체, 태그의 인수, 내용 튜플의 리스트라는 세 인수를 받습니다. 예를 들어 다음 텍스트에서는

"{big=2}안녕, {b}세상아{/b}{/big}"

태그가 "big", 인수가 문자열 "2"이며, 내용 튜플의 리스트는 다음과 같습니다.

[
    (renpy.TEXT_TEXT, "안녕, "),
    (renpy.TEXT_TAG, "b"),
    (renpy.TEXT_TEXT, "세상아"),
    (renpy.TEXT_TAG, "/b"),
]

텍스트 태그 함수는 새 내용 튜플 리스트를 반환해야 합니다. 이 리스트가 텍스트 태그와 그 내용을 대체합니다.

내용 튜플은 두 요소로 이루어집니다. 첫 번째 요소는 다음 목록의 상수 중 하나입니다. 두 번째 요소는 첫 번째 요소에 따라 달라지며, 아래에서 설명합니다.

renpy.TEXT_TEXT

두 번째 요소는 사용자에게 표시할 텍스트입니다.

renpy.TEXT_TAG

두 번째 요소는 중괄호를 제외한 텍스트 태그의 내용입니다.

renpy.TEXT_DISPLAYABLE

두 번째 요소는 텍스트 안에 삽입할 디스플레이어블입니다.

renpy.TEXT_PARAGRAPH

문단 사이의 구분을 나타냅니다. 두 번째 요소의 값은 정의되지 않지만, 요소 자체는 반드시 있어야 합니다.

자체 닫힘 텍스트 태그 함수도 비슷하지만 세 번째 인수를 받지 않습니다.

Text()의 tokenized 인수가 True이면 토큰 리스트를 전달할 수 있습니다.

경고

대사 텍스트 태그 {p}, {w}, {nw}, {fast}는 사용자 정의 텍스트 태그보다 먼저 처리됩니다. 따라서 사용자 정의 텍스트 태그 안에 넣지 않거나, 변경 없이 그대로 전달해야 합니다.

예제

예제의 big 텍스트 태그는 {size} 텍스트 태그처럼 작동하지만 인수에 배율을 적용합니다.

init python:

    def big_tag(tag, argument, contents):

        size = int(argument) * 20

        return [
                (renpy.TEXT_TAG, u"size={}".format(size)),
            ] + contents + [
                (renpy.TEXT_TAG, u"/size"),
            ]

    config.custom_text_tags["big"] = big_tag


"이건 {big=3}커요!{/big}"

예제의 rot13 텍스트 태그는 텍스트에 ROT13 변환을 적용합니다. ROT13을 두 번 적용하는 ROT26은 원래 텍스트와 같습니다.

init python:

    def rot13_transform(s):

        ROT13 = { }

        for i, j in zip("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"):
             ROT13[i] = j
             ROT13[j] = i

             i = i.lower()
             j = j.lower()

             ROT13[i] = j
             ROT13[j] = i

        return "".join(ROT13.get(i, i) for i in s)

    def rot13_tag(tag, argument, contents):
        rv = [ ]

        for kind, text in contents:

            if kind == renpy.TEXT_TEXT:
                text = rot13_transform(text)

            rv.append((kind, text))

        return rv

    config.custom_text_tags["rot13"] = rot13_tag

"Rot0. {rot13}Rot13. {rot13}Rot26. {/rot13}Rot13. {/rot13}Rot0."

bang 텍스트 태그는 텍스트에 특정 이미지를 삽입하며 닫는 태그가 필요 없습니다.

init python:
    def bang_tag(tag, argument):
        return [ ( renpy.TEXT_TAG, "size=40"), (renpy.TEXT_TEXT, "!"), (renpy.TEXT_TAG, "/size") ]

    config.self_closing_custom_text_tags["bang"] = bang_tag

"정말 멋져요{bang}"