A post containing an org example in a #+BEGIN_SRC block (e.g. the :BOT:
chess example) was cut in half: the '**' lines of the example were
parsed as new post headers, truncating the code block and creating
phantom posts. Skip header matches inside #+BEGIN_.../#+END_... ranges.
Also accept src blocks with no language or with header args
(:results ...) in the code block extraction.
- Hide posts with a future ID (scheduled posts) from the blog.
- Hide :VISIBILITY: mention posts from the public blog, except when the
post has :GROUP:, where visibility does not apply.
- Extract #+PINNED: and show the pinned post first with an indicator.
- :BOT: posts already render their body as a regular post and the
property is never displayed, as the spec requires.
Org-mode keywords, property drawers and headings are case-insensitive,
but the parser only matched uppercase, so feeds using #+title: or
* posts lost all metadata or posts. Also, \s* after the keyword colon
crossed newlines, so an empty #+DESCRIPTION: captured the next line
(e.g. '* Posts' or a #+FOLLOW: URL) as the description. Match with
IGNORECASE, restrict post-colon whitespace to spaces/tabs, and
normalize property names to uppercase.
Query-string parsers decode + as space, so a post URL fragment like
+0200 arrives as " 0200", causing find_post_by_id to fail with 404.
Normalize spaces back to + in parse_post_url before searching.
- Changed 🔗 to 📅 for post timestamp display
- Fixed org-social mention links to include space after username
Prevents text from being concatenated with the mention link
Updates parser to handle both post ID formats per updated specification:
- ID in header: ** 2026-02-27T09:06:21+0100
- ID in properties: :ID: timestamp
Header ID takes priority when both are present. Fixes 404 errors for posts using the new header format.