diff --git a/etpgrf_site/blog/templates/blog/page_detail.html b/etpgrf_site/blog/templates/blog/page_detail.html
index 94dc7ee..2a500df 100644
--- a/etpgrf_site/blog/templates/blog/page_detail.html
+++ b/etpgrf_site/blog/templates/blog/page_detail.html
@@ -1,14 +1,18 @@
{% extends 'typograph/base.html' %}
{% load static %}
+{% load typograph_extras %}
-{% block title %}{{ page.seo_title|default:page.title }} — ETPGRF{% endblock %}
-{% block description %}{{ page.seo_description|default:page.content|striptags|truncatechars:160 }}{% endblock %}
-{% block keywords %}{{ page.seo_keywords|default:'типограф, типографика, онлайн типограф, подготовка текста для веба, html типограф, неразрывные пробелы, кавычки елочки, длинное тире, очистка текста от мусора, интернет верстка, муравьев' }} seo_keywords {% endblock %}
-{% block og_title %}{{ page.seo_title|default:page.title }}{% endblock %}
-{% block og_description %}{{ page.seo_description|default:page.content|striptags|truncatechars:160 }}{% endblock %}
+
+
+{% block title %}{% if page.seo_title %}{{ page.seo_title }}{% else %}{{ page.title|striptags|unescape|safe }}{% endif %} — ETPGRF{% endblock %}
+{% block description %}{% if page.seo_description %}{{ page.seo_description }}{% else %}{{ page.excerpt|striptags|unescape|safe|truncatechars:160 }}{% endif %}{% endblock %}
+{% block keywords %}{% if page.seo_keywords %}{{ post.seo_keywords }}{% else %}типограф, типографика, блог типограф, онлайн типограф, подготовка текста для веба, html типограф, неразрывные пробелы, кавычки елочки, длинное тире, очистка текста от мусора, интернет верстка, муравьев, лебедев{% endif %}{% endblock %}
+
+{% block og_title %}{% if page.seo_title %}{{ page.seo_title }}{% else %}{{ page.title|striptags|unescape|safe }}{% endif %}{% endblock %}
+{% block og_description %}{% if page.seo_description %}{{ page.seo_description }}{% else %}{{ page.excerpt|safe|striptags|unescape|truncatechars:160 }}{% endif %}{% endblock %}
{% block og_image %}{% if page.image %}{{ request.scheme }}://{{ request.get_host }}{{ page.image.url }}{% else %}{{ request.scheme }}://{{ request.get_host }}{% static 'img/etpgrf-logo-for-fb-vk-x.gif' %}{% endif %}{% endblock %}
-{% block twitter_title %}{{ page.seo_title|default:page.title }}{% endblock %}
-{% block twitter_description %}{{ page.seo_description|default:page.content|striptags|truncatechars:160 }}{% endblock %}
+{% block twitter_title %}{% if page.seo_title %}{{ page.seo_title }}{% else %}{{ page.title|striptags|unescape|safe }}{% endif %}{% endblock %}
+{% block twitter_description %}{% if page.seo_description %}{{ page.seo_description }}{% else %}{{ page.excerpt|striptags|unescape|safe|truncatechars:160 }}{% endif %}{% endblock %}
{% block twitter_image %}{% if page.image %}{{ request.scheme }}://{{ request.get_host }}{{ page.image.url }}{% else %}{{ request.scheme }}://{{ request.get_host }}{% static 'img/etpgrf-logo-for-fb-vk-x.gif' %}{% endif %}{% endblock %}
{% block content %}
@@ -17,33 +21,28 @@
{# Левая колонка: Дата и Картинка #}
-
- {{ page.published_at|date:"d.M.Y"|lower }}
-
-
-
- {% if post.image %}
-
- {% else %}
-
- {% endif %}
+ {{ page.published_at|date:"d.M.Y"|lower }}
+
{% if page.image %}
+
+ {% else %}
+ {% endif %}
{# Правая колонка: Контент #}
-
{{ page.title|safe }}
+
{{ page.title|safe }}
- {% if page.excerpt %}
-
- {{ page.excerpt|safe }}
-
- {% endif %}
-
-
- {{ page.content|safe }}
+ {% if page.excerpt %}
+
+ {{ page.excerpt|safe }}
+ {% endif %}
+
+
+ {{ page.content|safe }}
+
diff --git a/etpgrf_site/blog/templates/blog/post_detail.html b/etpgrf_site/blog/templates/blog/post_detail.html
index b0fa76a..beb8fee 100644
--- a/etpgrf_site/blog/templates/blog/post_detail.html
+++ b/etpgrf_site/blog/templates/blog/post_detail.html
@@ -1,58 +1,53 @@
{% extends 'typograph/base.html' %}
{% load static %}
+{% load typograph_extras %}
-{% block title %}{{ post.seo_title|default:post.title }} — ETPGRF{% endblock %}
-{% block description %}{{ post.seo_description|default:post.excerpt|default:post.content|striptags|truncatechars:160 }}{% endblock %}
-{% block og_title %}{{ post.seo_title|default:post.title }}{% endblock %}
-{% block og_description %}{{ post.seo_description|default:post.excerpt|default:post.content|striptags|truncatechars:160 }}{% endblock %}
+{% block title %}{% if post.seo_title %}{{ post.seo_title }}{% else %}{{ post.title|striptags|unescape|safe }}{% endif %} — ETPGRF{% endblock %}
+{% block description %}{% if post.seo_description %}{{ post.seo_description }}{% else %}{{ post.excerpt|striptags|unescape|safe|truncatechars:160 }}{% endif %}{% endblock %}
+{% block keywords %}{% if post.seo_keywords %}{{ post.seo_keywords }}{% else %}типограф, типографика, блог типограф, онлайн типограф, подготовка текста для веба, html типограф, неразрывные пробелы, кавычки елочки, длинное тире, очистка текста от мусора, интернет верстка, муравьев, лебедев{% endif %}{% endblock %}
+
+{% block og_title %}{% if post.seo_title %}{{ post.seo_title }}{% else %}{{ post.title|striptags|unescape|safe }}{% endif %}{% endblock %}
+{% block og_description %}{% if post.seo_description %}{{ post.seo_description }}{% else %}{{ post.excerpt|striptags|unescape|safe|truncatechars:160 }}{% endif %}{% endblock %}
{% block og_image %}{% if post.image %}{{ request.scheme }}://{{ request.get_host }}{{ post.image.url }}{% else %}{{ request.scheme }}://{{ request.get_host }}{% static 'img/etpgrf-logo-for-fb-vk-x.gif' %}{% endif %}{% endblock %}
-{% block twitter_title %}{{ post.seo_title|default:post.title }}{% endblock %}
-{% block twitter_description %}{{ post.seo_description|default:post.excerpt|default:post.content|striptags|truncatechars:160 }}{% endblock %}
+{% block twitter_title %}{% if post.seo_title %}{{ post.seo_title }}{% else %}{{ post.title|striptags|unescape|safe }}{% endif %}{% endblock %}
+{% block twitter_description %}{% if post.seo_description %}{{ post.seo_description }}{% else %}{{ post.excerpt|striptags|unescape|safe|truncatechars:160 }}{% endif %}{% endblock %}
{% block twitter_image %}{% if post.image %}{{ request.scheme }}://{{ request.get_host }}{{ post.image.url }}{% else %}{{ request.scheme }}://{{ request.get_host }}{% static 'img/etpgrf-logo-for-fb-vk-x.gif' %}{% endif %}{% endblock %}
{% block content %}
-
{# Левая колонка: Дата и Картинка #}
-
- {{ post.published_at|date:"d.M.Y"|lower }}
-
-
-
- {% if post.image %}
-
- {% else %}
-
- {% endif %}
+
+ {{ post.published_at|date:"d.M.Y"|lower }}
+
+
{% if post.image %}
+
+ {% else %}
+ {% endif %}
-
{# Правая колонка: Контент #}
+
{{ post.title|safe }}
-
{{ post.title }}
+ {% if post.excerpt %}
+ {{ post.excerpt|safe }}
+
{% endif %}
- {% if post.excerpt %}
-
- {{ post.excerpt|linebreaksbr }}
-
- {% endif %}
+
+ {{ post.content|safe }}
+
-
- {{ post.content|safe }}
-
-
-
+
-
+
{% endblock %}
diff --git a/etpgrf_site/typograph/templatetags/typograph_extras.py b/etpgrf_site/typograph/templatetags/typograph_extras.py
index a5c2545..91d1307 100644
--- a/etpgrf_site/typograph/templatetags/typograph_extras.py
+++ b/etpgrf_site/typograph/templatetags/typograph_extras.py
@@ -1,5 +1,6 @@
from django import template
from django.utils.safestring import mark_safe
+import html
register = template.Library()
@@ -40,6 +41,25 @@ def humanize_num(value):
formatted = formatted.replace(",", " ").replace(".", ",")
return mark_safe(f"{formatted}{suffix}")
-
+
except (ValueError, TypeError):
return value
+
+
+@register.filter(name='unescape')
+def unescape_filter(value):
+ """
+ Декодирует HTML-сущности ( -> ' ', — -> —)
+ и удаляет лишние пробелы и переводы строк.
+ Полезно для мета-тегов (title, description, og:title).
+ """
+ if not value:
+ return ""
+
+ # 1. Декодируем сущности
+ text = html.unescape(str(value))
+
+ # 2. Удаляем лишние пробелы и переводы строк
+ # split() без аргументов разбивает по любым пробельным символам (\n, \t, space)
+ # " ".join(...) собирает обратно через один пробел
+ return " ".join(text.split())