Пользовательские теги текста

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}"