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/check-settings.py b/src/check-settings.py index efa6891..1322462 100644 --- a/src/check-settings.py +++ b/src/check-settings.py @@ -1,4 +1,3 @@ - import os, argparse from tomlkit import loads from tomlkit import dump @@ -34,7 +33,7 @@ class MicroblogConfig: def check(self, r, u): # (reference, user) for key in r: - if key == "latestpages": continue; + if key == "latestpages": continue # post and webring have subtables # webring.profile # webring.following diff --git a/src/microblog.py b/src/microblog.py index f2ba260..03c7309 100644 --- a/src/microblog.py +++ b/src/microblog.py @@ -549,7 +549,11 @@ 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"] if cfg["rss"]["enabled"]: + # ensure output directory for feeds exists + if not os.path.exists("feeds"): + os.mkdir("feeds") feed_filename = "feeds/__index__.xml" rss.write_feed( p[:cfg["rss"]["limit"]], \ diff --git a/src/rss.py b/src/rss.py index cba2fbb..8922523 100644 --- a/src/rss.py +++ b/src/rss.py @@ -1,4 +1,3 @@ - from microblog import My_Html_Parser # from html.parser import HTMLParser from html import escape @@ -7,12 +6,12 @@ try: import feedgenerator except ImportError: traceback.print_exc() - def write_feed(posts, filename, params): + def write_feed(posts, filename, params, tagname=None): pass 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 @@ -22,7 +21,7 @@ def line2words(lines, limit): l = len(word) if limit > 0 and (l + char_count > limit): break_outer_loop = True - break; + break output.append(word) char_count += l if break_outer_loop: @@ -30,15 +29,37 @@ 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 -# this is similar tot he markup function in microblog -def enrich_msg(lines, is_atom=True): +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, + accepted_images=[], + base_url="", + trailing_punctuation="", + desc_len_limit=-1, +): if not is_atom: - return string + from urllib.parse import urljoin + words = line2words(lines, desc_len_limit, trailing_punctuation) + for i in range(len(words)): + token = words[i] + core = token.rstrip(trailing_punctuation) + suffix = token[len(core):] + if len(core) == 0 or "<" in core or ">" in core: + continue + if _is_image_token(core, accepted_images): + abs_url = urljoin(base_url, core) + anchor = f"{escape(abs_url)}" + words[i] = anchor + suffix + return words content = [] parser = My_Html_Parser([]) for line in lines: @@ -66,9 +87,9 @@ def enrich_msg(lines, is_atom=True): content.append(line) return content -def write_feed(posts, filename, params, tagname=str()): +def write_feed(posts, filename, params, tagname=None): feed = None - if tagname != str(): + if tagname: t = params["title_tagged"].format( __tagname__ = tagname, __title__ = params["title"]) @@ -96,12 +117,17 @@ def write_feed(posts, filename, params, tagname=str()): # 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, + is_atom=params["use_atom"], + base_url=params["url"], + 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"]: