Source code for nefelibata.assistants.reading_time
import math
from bs4 import BeautifulSoup
from nefelibata.assistants import Assistant
from nefelibata.assistants import Scope
from nefelibata.post import Post
from nefelibata.utils import modify_html
THRESHOLD_MINUTES = 2
[docs]class ReadingTimeAssistant(Assistant):
scopes = [Scope.POST]
[docs] def process_post(self, post: Post, force: bool = False) -> None:
# Use formula from Medium (https://www.quora.com/How-does-Medium-determine-an-article%E2%80%99s-estimated-read-time/answer/Alan-Hamlett)
soup = BeautifulSoup(post.html, "html.parser")
num_images = len(soup.find_all("img"))
num_words = len(soup.text.split(" "))
image_weight = max(13 - num_images, 3)
seconds = num_words / 265 * 60 + image_weight * num_images
minutes = math.ceil(seconds / 60)
if minutes < THRESHOLD_MINUTES:
return
with modify_html(post.file_path.with_suffix(".html")) as soup:
el = soup.find(id="post-reading-time")
if el:
span = soup.new_tag("span")
span.string = f"Approximate reading time: {minutes} minutes"
el.clear()
el.append(span)