Пользовательские теги текста
Ren'Py поддерживает определение собственных тегов текста. Эти теги могут управлять текстом и другими тегами текста, определёнными внутри них, включая добавление и удаление текста и других тегов.
Пользовательские теги текста создаются путём присвоения функции тега текста элементу одного из следующих словарей.
- define config.custom_text_tags = { }
Сопоставляет имена тегов текста с функциями тегов текста, когда тег может оборачивать другой текст.
- define config.self_closing_custom_text_tags = { }
Сопоставляет имена тегов текста с функциями самозакрывающихся тегов текста, когда тег не оборачивает другой текст.
Предупреждение
Эти функции могут быть вызваны в любой момент в рамках процесса прогнозирования (prediction). По этой причине их поведение не должно зависеть от состояния игры (как правило, от глобальных переменных) и они не должны вызывать побочных эффектов (например, вызывать Эквиваленты операторов или изменять глобальные переменные).
Функция тега текста принимает три аргумента: сам тег, аргумент для тега и список кортежей содержимого. Например, для текста:
"{big=2}Hello, {b}World{/b}{/big}"
Тегом будет "big", аргументом будет строка "2", а списком кортежей содержимого будет:
[
(renpy.TEXT_TEXT, "Hello, "),
(renpy.TEXT_TAG, "b"),
(renpy.TEXT_TEXT, "World"),
(renpy.TEXT_TAG, "/b"),
]
Функция тега текста должна возвращать новый список кортежей содержимого, который используется для замены тега текста и его содержимого.
Кортежи содержимого состоят из двух компонентов. Первый компонент — одна из констант в следующем списке. Второй компонент варьируется в зависимости от первого, как описано ниже.
- renpy.TEXT_TEXT
Второй компонент — это текст, предназначенный для отображения пользователю.
- renpy.TEXT_TAG
Второй компонент — это содержимое тега текста без обрамляющих фигурных скобок.
- renpy.TEXT_DISPLAYABLE
Второй компонент — это 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
"This is {big=3}BIG!{/big}"
Пример тега rot13 применяет к тексту преобразование ROT13. Обратите
внимание, что ROT26 — это ROT13, применённый дважды, — является обычным
текстом.
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
"This is awesome{bang}"