From 6a1bb4b88865652615edac13b2dcb16b06283245 Mon Sep 17 00:00:00 2001 From: syeopite Date: Wed, 26 Jun 2024 00:10:22 -0700 Subject: [PATCH 1/6] Add basic styling for post truncations --- assets/css/base.css | 3 +++ assets/css/post-layout.css | 30 +++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/assets/css/base.css b/assets/css/base.css index 09370fa..53991bb 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -107,6 +107,9 @@ body { --color-poll-proportion-bar-bg: var(--light, var(--color-gray-250)) var(--dark, var(--color-dt-gray-300)); --color-poll-choice-bg: var(--light, var(--color-gray-150)) var(--dark, var(--color-dt-gray-500)); + --color-post-reveal-truncated-content-button: var(--light, var(--color-primary-500)) var(--dark, var(--color-primary-700)); + --color-post-reveal-truncated-content-button-hover: var(--light, var(--color-primary-400)) var(--dark, var(--color-primary-600)); + --color-post-footer: var(--light, var(--color-gray-500)) var(--dark, var(--color-dt-gray-250)); --color-post-footer-post-interaction: var(--light, var(--color-gray-500)) var(--dark, var(--color-dt-gray-225)); --color-post-tag-bg: var(--light, var(--color-gray-125)) var(--dark, var(--color-dt-gray-575)); diff --git a/assets/css/post-layout.css b/assets/css/post-layout.css index 394e693..5a59000 100644 --- a/assets/css/post-layout.css +++ b/assets/css/post-layout.css @@ -7,11 +7,39 @@ .post-body > .text-block:last-child, .post-body > .layout-row:last-child > .text-block:last-child, +.post-body > .layout-truncated:last-child > .text-block:last-child, .post-body > .link-block:last-child, -.post-body > .layout-row:last-child > .link-block:last-child { +.post-body > .layout-row:last-child > .link-block:last-child +.post-body > .layout-truncated:last-child > .text-block:last-child { margin-bottom: 0; } +.layout-row { + margin: 0; +} + +.layout-truncated > summary { + color: var(--color-post-reveal-truncated-content-button); + list-style: none; + font-weight: 650; + cursor: pointer; + text-decoration: underline; + display: inline-block; + + position: relative; + left: 50%; + transform: translateX(-50%); +} + +.layout-truncated > summary:hover { + color: var(--color-post-reveal-truncated-content-button-hover); +} + +.layout-truncated[open=""] > summary { + display: none; +} + + .heading1, .heading2, .quote { font-weight: 500; } From 40ece5d2312aaed1b6681d212dd94ae091683f03 Mon Sep 17 00:00:00 2001 From: syeopite Date: Sat, 16 Nov 2024 16:22:14 -0800 Subject: [PATCH 2/6] npf-renderer-ext: Add request info to format_npf Allows changing behavior based on user preferences defined in request.ctx.preferences --- src/helpers/ext_npf_renderer.py | 33 ++++++++++++++++++++-- src/templates/components/blog_header.jinja | 2 +- src/templates/post/components/body.jinja | 4 +++ src/templates/post/notes/note/reply.jinja | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/helpers/ext_npf_renderer.py b/src/helpers/ext_npf_renderer.py index c3c7346..09b8e77 100644 --- a/src/helpers/ext_npf_renderer.py +++ b/src/helpers/ext_npf_renderer.py @@ -102,8 +102,25 @@ async def parse(self): class NPFFormatter(npf_renderer.format.Formatter): - def __init__(self, content, layout=None, blog_name=None, post_id=None, *, url_handler=None, forbid_external_iframes=False): - super().__init__(content, layout, url_handler=url_handler, forbid_external_iframes=forbid_external_iframes) + def __init__( + self, + content, + layout=None, + *, + blog_name=None, + post_id=None, + url_handler=None, + forbid_external_iframes=False, + request=None, + ): + initialization_arguments = { + "content": content, + "layout": layout, + "url_handler": url_handler, + "forbid_external_iframes": forbid_external_iframes + } + + super().__init__(**initialization_arguments) # We store the blog and post ID as to be able to render a link to # fetch poll results for JS disabled users @@ -171,7 +188,14 @@ def _add_alt_text_element(self, block, image_container): ) -async def format_npf(contents, layouts=None, blog_name=None, post_id=None,*, poll_callback=None): +async def format_npf( + contents, + layouts=None, + blog_name=None, + post_id=None,*, + poll_callback=None, + request=None +): """Wrapper around npf_renderer.format_npf for extra functionalities - Replaces internal Parser and Formatter with the modified variants above @@ -183,6 +207,8 @@ async def format_npf(contents, layouts=None, blog_name=None, post_id=None,*, pol Name of the blog the post comes from. This is used to render links to the parent post post_id: Unique ID of the post. This is used to render links to the parent post + request: + Sanic request object. Used to check user preferences """ try: contents = await NPFParser(contents, poll_callback=poll_callback).parse() @@ -197,6 +223,7 @@ async def format_npf(contents, layouts=None, blog_name=None, post_id=None,*, pol post_id=post_id, url_handler=url_handler, forbid_external_iframes=True, + request=request ).format() except npf_renderer.exceptions.RenderErrorDisclaimerError as e: diff --git a/src/templates/components/blog_header.jinja b/src/templates/components/blog_header.jinja index 4418179..0d177d3 100644 --- a/src/templates/components/blog_header.jinja +++ b/src/templates/components/blog_header.jinja @@ -1,5 +1,5 @@ {% if blog.blog_info.description_npf -%} - {% set contains_errors, content_tag = format_npf(blog.blog_info.description_npf) -%} + {% set contains_errors, content_tag = format_npf(blog.blog_info.description_npf, request=request) -%} {% else -%} {% set content_tag = "" %} {% endif -%} diff --git a/src/templates/post/components/body.jinja b/src/templates/post/components/body.jinja index ca135d0..6cc376b 100644 --- a/src/templates/post/components/body.jinja +++ b/src/templates/post/components/body.jinja @@ -4,6 +4,7 @@ element.content, element.layout, poll_callback=create_poll_callback(request.app.ctx, element.blog.name, element.id), + request=request, ) -%} {%- else -%} @@ -12,6 +13,7 @@ element.layout, element.blog.name, element.id, + request=request, ) -%} {% endif %} @@ -38,6 +40,7 @@ trail_element.content, trail_element.layout, poll_callback=create_poll_callback(request.app.ctx, element.blog.name, element.id), + request=request, ) -%} @@ -47,6 +50,7 @@ trail_element.layout, element.blog.name, element.id, + request=request, ) -%} {% endif %} diff --git a/src/templates/post/notes/note/reply.jinja b/src/templates/post/notes/note/reply.jinja index 5eed58a..6d18a6b 100644 --- a/src/templates/post/notes/note/reply.jinja +++ b/src/templates/post/notes/note/reply.jinja @@ -30,6 +30,7 @@ note.layout, note.blog.name, note.id, + request=request, ) -%} From b26107082a44719185a0665a447baf4a9df8e909 Mon Sep 17 00:00:00 2001 From: syeopite Date: Sat, 16 Nov 2024 18:44:00 -0800 Subject: [PATCH 3/6] Add preference to auto expand truncated posts --- locales/en_US/LC_MESSAGES/priviblur.po | 8 +++++++- src/config/user_preferences.py | 1 + src/helpers/ext_npf_renderer.py | 4 ++++ src/preferences.py | 2 ++ src/templates/settings.jinja | 10 ++++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/locales/en_US/LC_MESSAGES/priviblur.po b/locales/en_US/LC_MESSAGES/priviblur.po index 9afabbc..b53424e 100644 --- a/locales/en_US/LC_MESSAGES/priviblur.po +++ b/locales/en_US/LC_MESSAGES/priviblur.po @@ -296,4 +296,10 @@ msgid "post_note_viewer_view_replies_filter_sort_oldest" msgstr "Oldest first" msgid "post_note_viewer_view_replies_filter_sort_newest" -msgstr "Newest first" \ No newline at end of file +msgstr "Newest first" + +msgid "settings_expand_blogger_truncated_posts" +msgstr "Expand posts" + +msgid "settings_expand_blogger_truncated_posts_desc" +msgstr "Expands truncated posts automatically" diff --git a/src/config/user_preferences.py b/src/config/user_preferences.py index e7eb305..950bb01 100644 --- a/src/config/user_preferences.py +++ b/src/config/user_preferences.py @@ -9,3 +9,4 @@ class DefaultUserPreferences(NamedTuple): language: str = "en_US" theme: str = "auto" + expand_posts: bool = False diff --git a/src/helpers/ext_npf_renderer.py b/src/helpers/ext_npf_renderer.py index 09b8e77..fc6b4dd 100644 --- a/src/helpers/ext_npf_renderer.py +++ b/src/helpers/ext_npf_renderer.py @@ -120,6 +120,10 @@ def __init__( "forbid_external_iframes": forbid_external_iframes } + if request: + # Asking to expand a post is the reverse of asking to truncate a post + initialization_arguments["truncate"] = not request.ctx.preferences.expand_posts + super().__init__(**initialization_arguments) # We store the blog and post ID as to be able to render a link to diff --git a/src/preferences.py b/src/preferences.py index 2411352..e3e72b0 100644 --- a/src/preferences.py +++ b/src/preferences.py @@ -11,6 +11,8 @@ class UserPreferences: language: str theme: str + expand_posts: bool + # Tracks major revisions of the settings cookie # Only bump in case of breaking changes. version: int = 1 diff --git a/src/templates/settings.jinja b/src/templates/settings.jinja index 31f38e0..d435a2b 100644 --- a/src/templates/settings.jinja +++ b/src/templates/settings.jinja @@ -58,6 +58,16 @@ {%- endfor %} +
+
+
+ +

{{translate(request.ctx.language, "settings_expand_blogger_truncated_posts_desc")}}

+
+ + + +