사용자 정의 텍스트 태그
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}"