{% set ns = namespace(account_id = peer.account['id'], prev_msg = none) %} {# Макрос, который парсит сообщение в HTML, результат зависит от типа сообщения Args: msg (vkms.messages.Message): Объект текущего сообщения, которое необходимо спарсить prev_msg (Union[vkms.messages.Message, None]): Предыдущее сообщение is_reply (bool): Флаг, есть ли у текущего сообщения ответ is_fwd (bool): Флаг, является ли текущее сообщение пересланным #} {% macro parse_msg(msg, prev_msg, is_reply=false, is_fwd=false) %} {# Парсим имя пользователя, но делаем его невидимым, если автор предыдущего сообщения - автор текущего (не удаляем, т.к. имя нужно для воспрозиведения голосового сообщения) #}
{{ msg.username }}
{# Если сообщение было пересланно, добавляем точную дату отправки #} {% if is_fwd %}
{{ msg.full_date() }} в {{ msg.time() }}
{% endif %} {# Если сообщение отправлено в ответ, и на текущее сообщение нет ответа, парсим #} {% if not (is_reply or is_fwd) and msg.reply_msg %}
{{ parse_msg(msg.reply_msg, none, is_reply=true) }}
{% endif %} {# Парсим текст сообщения, обрабатывая переносы строк и обращения #} {% if msg.text %}

{{ msg.replace_mention(msg.text.split('\n') | join('
'), '\\1') }}

{% endif %} {# Создаем дерево пересланных сообщений #} {% if msg.fwd_msgs %} {% if is_reply %}
Пересланное сообщение
{% else %}
{% for fwd_msg in msg.fwd_msgs %}
{{ parse_msg(fwd_msg, none, is_fwd=true) }}
{% endfor %}
{% endif %} {% endif %} {% if msg.atchs %} {# Не парсим вложения, если у сообщения есть ответ #} {% if is_reply %}
Медиавложения
{# Большинство вложений - медиа или обычный текст #} {% else %}
{% for atch in msg.atchs %}
{% if atch.tp == 'photo' %} Прикреплённое фото {% elif atch.tp == 'video' %} Прикреплённое видео {% elif atch.tp == 'audio' %} Аудио: {{ atch.title }} {% elif atch.tp == 'doc' %} Документ: {{ atch.filename }} {% elif atch.tp == 'link' %} Ссылка: {{ atch.title }} {% elif atch.tp == 'wall' %} Запись со стены {% elif atch.tp == 'wall_reply' %} Комментарий к записи {% elif atch.tp == 'sticker' %} Стикер {% elif atch.tp == 'gift' %} Подарок
Подарок {% elif atch.tp == 'audio_message' %} {% elif atch.tp == 'graffiti' %} {% elif atch.tp == 'call' %} {{ (atch.call_type + 'звонок') | title }} ({{ atch.get_state(ns.account_id) }}{% if atch.state == 'reached' %}, {{ atch.duration }}{% endif %}) {% elif atch.tp == 'poll' %}

{{ atch.title }}

{{ atch.anon | title }} опрос, {{ atch.mult }}
{% for ans in atch.answers %}

{{ ans['text'] }} ⋅ {{ ans['votes'] }}

{% if ans['id'] in atch.answer_ids %}   {% endif %} {{ ans['rate'] | round | int }}%
{% endfor %}
{% endif %}
{% endfor %}
{% endif %} {% endif %} {# Добавляем время отправки сообщения #} {% if not is_reply and not is_fwd %}
{% if msg.is_edited %}ред.{% endif %} {{ msg.time() }}
{% endif %} {% endmacro %} {% for msg in peer.msgs %} {# Пишем дату текущего сообщения, если предыдущего сообщения не было или #} {# если предыдущее и текущее сообщения были отправлены в разные дни #} {% if ns.prev_msg is none or msg.date.date() != ns.prev_msg.date.date() %}
{{ msg.full_date() }}
{% set ns.prev_msg = none %} {% endif %} {# Если сообщение является сервисным, выводим текст действия #} {% if msg.action %}
{{ msg.action }}
{% set ns.prev_msg = none %} {% else %} {# Вид сообщения зависит от того, является ли оно входящим или исходящим #}
{{ parse_msg(msg, ns.prev_msg) }}
{% endif %} {% set ns.prev_msg = msg %} {% endfor %}