feat(replies): Implement author replies #24

Merged
blacklight merged 22 commits from feat/23/author-replies into main 2026-03-13 20:26:21 +01:00
Owner

Closes: #23

Closes: #23
- Add replies_dir under content_dir/replies/<article-slug>/
- Add _parse_reply_metadata() with shared _resolve_and_parse_metadata() helper
- Add get_reply() and _render_reply_html() to BlogApp
- Add /reply/<article_slug>/<reply_slug>[.md] routes
- Create reply.html template with back-link banner
- Exclude replies/ from home page listing in _get_pages_from_files()
- Fix _infer_title_and_url_from_markdown() to skip metadata comment lines
- Extract CachedPage model and generate_etag helper from cache mixin
`generate_etag` has now been moved from a mixin inherited by `BlogApp`
to a stand-alone helper function.
- Add threading model (madblog/threading.py) to build reaction trees
  from webmentions, AP interactions, and author replies
- Create reactions.html template with recursive thread rendering
- Add _get_article_replies() to collect replies for an article
- Add _get_webmentions() and _get_ap_interactions() for raw objects
- Update _get_page_interactions() to return thread tree
- Add hash_id Jinja2 filter for stable anchor ID generation
- Replace separate mentions/ap_interactions blocks with unified
  reactions template include
feat(replies): Add in-page navigation for threaded reactions
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
57945eae5b
- Add parent_anchor parameter to thread node rendering
- Add get_anchor_id() helper macro for anchor computation
- Show "↩" reply-to links for nested reactions
- Add PermalinkNavigationTest with 3 tests for anchor IDs
feat(activitypub): Federate author replies as Note objects
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
9315d52a78
- Add replies mixin with inReplyTo, mention/hashtag tags, and Delete support
- Share publish utilities (guarded threads, mention cache, helpers)
- Start replies ContentMonitor and wire AP + webmentions outgoing processing
- Refactor webmentions storage to handle replies separately and reuse helpers
- Update tests for mention resolution patching and reply federation
- Infer inReplyTo when reply-to metadata is missing
- Keep explicit reply-to precedence
- Add coverage for derived and explicit reply-to behavior
feat: enhance reactions threads, summaries, and author reply federation
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
8cc4a87181
- Fetch AP interactions for author reply URLs and apply unified filters
- Unify guestbook reactions rendering via thread tree
- Add reactions summary counts and collapsible long content UI
- Normalize legacy webmention author_url values on load
- Fix author metadata fallbacks and microformats URL class
- Add template utils + default avatar icon; update tests
fix(webmentions): Normalize legacy "None" strings in content fields
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
0f2aeb186f
- Coerce "None" content/excerpt/title to None when loading mentions
- Avoid writing "None" when serializing missing content
- Add unit tests for content normalization and markdown formatting
- Add Author Replies section to README with metadata, threading, and
  routes
- Document unified threading tree and replies subsystem in
  ARCHITECTURE.md
- Add nested thread styling class
- Reduce indent spacing for deeper threads
- Annotate author replies with ap_full_url when activitypub_link
  differs from link
- Register author reply nodes under both blog-domain and AP-domain
  identities in build_thread_tree
- Add deduplication guard for aliased nodes during tree construction
- Refactor _get_ap_interaction_reply_to for clarity
- Add tests for AP reply threading, dual-domain alias, and likes
- Return AP response (or split-domain redirect) for /reply routes
- Add Nginx proxy guidance for reply URL search
- Cover split-domain redirect and HTML behavior in reply route tests
- Add _build_and_publish() to centralize build/mark/deliver flow
- Add _get_activitypub_object_response() to unify article/reply JSON handling
- Reuse shared startup directory sync for replies
fix(markdown): Use datetime instead of date for authored posts
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
4d63250e39
- Fixed author replies and posts always set at midnight
- Parse `published` as UTC datetime instead of date
- Infer `published` from ctime as UTC datetime
blacklight changed title from WIP: feat(replies): Implement author replies to feat(replies): Implement author replies 2026-03-13 20:26:05 +01:00
blacklight deleted branch feat/23/author-replies 2026-03-13 20:26:21 +01:00
Sign in to join this conversation.
No description provided.