mirror of
https://github.com/pelican-plugins/share-post.git
synced 2025-10-15 17:08:54 +02:00
136 lines
3.8 KiB
Python
136 lines
3.8 KiB
Python
"""Share Post plugin for Pelican.
|
|
|
|
This plugin was originally created by
|
|
Talha Mansoor <talha131@gmail.com>
|
|
|
|
This plugin adds social share URLs to each article.
|
|
"""
|
|
|
|
# If you want to add a new link_processor please
|
|
# have a look at the create_link decorator and
|
|
# follow the example of the other functions
|
|
|
|
from urllib.parse import quote
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
from pelican import contents, signals
|
|
from pelican.generators import ArticlesGenerator, PagesGenerator
|
|
|
|
_create_link_functions = []
|
|
|
|
newline = "%0D%0A"
|
|
|
|
|
|
# Use this decorator to mark a function as
|
|
# a link creator. The function's prototype shall be
|
|
# create_link_NAME(title, url, content)
|
|
# where
|
|
# NAME is the name of the target, e.g. "dispora" or "facebook"
|
|
# title is the HTML-safe title of the content
|
|
# url is the content URL
|
|
# content is the full object, should you need to extract more data.
|
|
def create_link(f):
|
|
_create_link_functions.append(f)
|
|
return f
|
|
|
|
|
|
@create_link
|
|
def create_link_email(title, url, content):
|
|
return f"mailto:?subject={title}&body={url}"
|
|
|
|
|
|
@create_link
|
|
def create_link_hacker_news(title, url, content):
|
|
return f"https://news.ycombinator.com/submitlink?t={title}&u={url}"
|
|
|
|
|
|
@create_link
|
|
def create_link_diaspora(title, url, content):
|
|
return f"https://sharetodiaspora.github.io/?title={title}&url={url}"
|
|
|
|
|
|
@create_link
|
|
def create_link_facebook(title, url, content):
|
|
return f"https://www.facebook.com/sharer/sharer.php?u={url}"
|
|
|
|
|
|
@create_link
|
|
def create_link_mastodon(title, url, content):
|
|
hashtags = ""
|
|
|
|
if hasattr(content, "tags"):
|
|
new_taglist = [f"%23{str(i).replace(' ', '')}" for i in content.tags]
|
|
hashtags = " ".join(new_taglist)
|
|
|
|
return f"https://toot.kytta.dev/?text={title}{newline}{url}{newline}{hashtags}"
|
|
|
|
|
|
@create_link
|
|
def create_link_twitter(title, url, content):
|
|
twitter_username = content.settings.get("TWITTER_USERNAME", "")
|
|
via = f"&via={twitter_username}" if twitter_username else ""
|
|
|
|
tags = getattr(content, "tags", [])
|
|
tags = ",".join([tag.slug for tag in tags])
|
|
hashtags = f"&hashtags={tags}" if tags else ""
|
|
|
|
return f"https://twitter.com/intent/tweet?text={title}&url={url}{via}{hashtags}"
|
|
|
|
|
|
@create_link
|
|
def create_link_reddit(title, url, content):
|
|
return f"https://www.reddit.com/submit?url={url}&title={title}"
|
|
|
|
|
|
@create_link
|
|
def create_link_linkedin(title, url, content):
|
|
summary = quote(
|
|
BeautifulSoup(content.summary, "html.parser").get_text().strip().encode("utf-8")
|
|
)
|
|
|
|
return (
|
|
f"https://www.linkedin.com/shareArticle?"
|
|
f"mini=true&url={url}&title={title}&"
|
|
f"summary={summary}&source={url}"
|
|
)
|
|
|
|
|
|
def create_share_links(content):
|
|
if isinstance(content, contents.Static):
|
|
return
|
|
|
|
main_title = BeautifulSoup(content.title, "html.parser").get_text().strip()
|
|
|
|
try:
|
|
sub_title = (
|
|
" " + BeautifulSoup(content.subtitle, "html.parser").get_text().strip()
|
|
)
|
|
except AttributeError:
|
|
sub_title = ""
|
|
|
|
title = quote(f"{main_title}{sub_title}".encode())
|
|
|
|
site_url = content.settings["SITEURL"]
|
|
url = quote(f"{site_url}/{content.url}".encode())
|
|
|
|
content.share_post = {}
|
|
for func in _create_link_functions:
|
|
key = func.__name__.replace("create_link_", "").replace("_", "-")
|
|
content.share_post[key] = func(title, url, content)
|
|
|
|
|
|
def run_plugin(generators):
|
|
for generator in generators:
|
|
if isinstance(generator, ArticlesGenerator):
|
|
for article in generator.articles:
|
|
create_share_links(article)
|
|
for translation in article.translations:
|
|
create_share_links(translation)
|
|
elif isinstance(generator, PagesGenerator):
|
|
for page in generator.pages:
|
|
create_share_links(page)
|
|
|
|
|
|
def register():
|
|
signals.all_generators_finalized.connect(run_plugin)
|