From 7ab7b06bb2e95947c8f0cd0e2cd842c0c7f92722 Mon Sep 17 00:00:00 2001 From: Eloi Date: Thu, 4 Sep 2025 11:56:17 +0200 Subject: [PATCH] Link to images in RSS output --- example/Makefile | 9 +++++---- example/settings.toml | 1 + src/microblog.py | 2 ++ src/rss.py | 46 ++++++++++++++++++++++++++++++++----------- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/example/Makefile b/example/Makefile index 1775778..380cfe0 100644 --- a/example/Makefile +++ b/example/Makefile @@ -21,7 +21,8 @@ settings: .PHONY: clean clean: - rm ./pages/*.html - rm ./tags/*/*.html - rm ./webring/*.html - rmdir ./pages ./tags/* ./tags ./webring + - rm -f ./pages/*.html + - rm -f ./tags/*/*.html + - rm -f ./webring/*.html + - rm -f ./feeds/*.xml + - rmdir ./pages ./tags/* ./tags ./webring ./feeds diff --git a/example/settings.toml b/example/settings.toml index b519867..79c5f46 100644 --- a/example/settings.toml +++ b/example/settings.toml @@ -85,3 +85,4 @@ title="Your Microblog Title Here" title_tagged = "#{__tagname__} on {__title__}" url = "https://yourdomain.tld/microblog/" description = "Your description here." +trailing_punctuation = ".,)!?>];:" diff --git a/src/microblog.py b/src/microblog.py index 51aff70..1bb197b 100644 --- a/src/microblog.py +++ b/src/microblog.py @@ -549,6 +549,8 @@ if __name__ == "__main__": updated = [] updated += writepage(tpl, tl, tc, cfg["page"], paginate=True if new_posts is None else False) + cfg["rss"]["accepted_images"] = cfg["post"]["accepted_images"] + cfg["rss"]["gallery_path"] = cfg["post"]["gallery"]["path_to_fullsize"] if cfg["rss"]["enabled"]: # ensure output directory for feeds exists if not os.path.exists("feeds"): diff --git a/src/rss.py b/src/rss.py index c10aa32..886d027 100644 --- a/src/rss.py +++ b/src/rss.py @@ -2,6 +2,8 @@ from microblog import My_Html_Parser # from html.parser import HTMLParser from html import escape import sys, traceback, dateutil.parser +from urllib.parse import urljoin + try: import feedgenerator except ImportError: @@ -11,7 +13,7 @@ except ImportError: print("\trss disabled - missing dependency", file=sys.stderr) print("\tYour microblog still may have been generated.", file=sys.stderr) -def line2words(lines, limit): +def line2words(lines, limit, trailing_punctuation): output = [] char_count = 0 break_outer_loop = False @@ -29,15 +31,22 @@ def line2words(lines, limit): # last char of last word last_char = output[-1].strip()[-1] # print(output[-1], file=sys.stderr) - punctuation = [".", ")", ",", "!", "?", ">", ']'] - if last_char not in punctuation: + if last_char not in trailing_punctuation: output.append("...") return output +def _is_image_token(token: str, extensions): + parts = token.rsplit('.', 1) + return len(parts) == 2 and parts[1] in extensions + # this is similar to the markup function in microblog -def enrich_msg(lines, is_atom=True): - if not is_atom: - return lines +def enrich_msg( + lines, + accepted_images=[], + gallery_path="", + trailing_punctuation="", + desc_len_limit=-1, +): content = [] parser = My_Html_Parser([]) for line in lines: @@ -47,6 +56,7 @@ def enrich_msg(lines, is_atom=True): words = line.split() for i in range(len(words)): word = words[i] + core = word.rstrip(trailing_punctuation) if word.find("src=") == 0 \ or word.find("href=") == 0: continue @@ -54,6 +64,12 @@ def enrich_msg(lines, is_atom=True): w = escape(word) new_word = ("%s") % (w, w) words[i] = new_word + elif _is_image_token(core, accepted_images): + suffix = word[len(core):] + abs_url = urljoin(gallery_path, core) + anchor = f"{escape(abs_url)}" + new_word = anchor + suffix + words[i] = new_word words.insert(0,"

") words.append("

") content.append(" ".join(words)) @@ -95,12 +111,18 @@ def write_feed(posts, filename, params, tagname=None): # len of post.message is number of lines msg = post.message ti = " ".join( - line2words(msg,TITLE_LEN_LIMIT)) - if params["use_atom"]: - de = " ".join(enrich_msg(msg)) - else: - de = " ".join( - line2words(msg,DESC_LEN_LIMIT)) + line2words(msg, TITLE_LEN_LIMIT, params["trailing_punctuation"])) + de = " ".join( + enrich_msg( + msg, + gallery_path=urljoin( + params["url"], params.get("gallery_path", "") + "/" + ), + accepted_images=params["accepted_images"], + trailing_punctuation=params["trailing_punctuation"], + desc_len_limit=DESC_LEN_LIMIT, + ) + ) li = base_url + ("#%i" % post.num) p = dateutil.parser.parse(post.timestamp) if params["use_atom"]: