Skip to content

Commit

Permalink
feat: embed links for github/twitter on devto posts
Browse files Browse the repository at this point in the history
  • Loading branch information
Mr-Destructive committed Jul 25, 2023
1 parent fecd5f1 commit b5e57be
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 50 deletions.
39 changes: 17 additions & 22 deletions crossposter/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
import argparse
from rich import print
from pathlib import Path
from .utils import generate_file
from .publications.dev import devto
from .publications.dev import devto, generate_devto_file
from .publications.codenewbie import codenewbie
from .publications.hashnode import hashnode
from .publications.medium import medium


def get_default_or_input(dictionary, keys):
for key in keys:
if key in dictionary.keys():
Expand All @@ -20,7 +18,7 @@ def get_default_or_input(dictionary, keys):

def main():
print("[bold green]Crossposter[/ bold green]")
if len(sys.argv) < 2:
if len(sys.argv)<2:
file_markdown = input("Enter the filename: ")
else:
file_markdown = sys.argv[1]
Expand All @@ -35,19 +33,12 @@ def main():
continue

parser = argparse.ArgumentParser()
parser.add_argument(
"Path",
metavar="path",
type=str,
nargs="?",
const=1,
default=file_markdown,
help="the path to file",
)
parser.add_argument("--dev", action="store_true", help="Post to dev.to")
parser.add_argument("--med", action="store_true", help="Post to medium.com")
parser.add_argument("--cdb", action="store_true", help="Post to codenewbie")
parser.add_argument("--opf", action="store_true", help="Save to a File")
parser.add_argument('Path', metavar='path', type=str, nargs='?', const=1, default=file_markdown, help='the path to file')
parser.add_argument("--dev", action="store_true", help='Post to dev.to')
parser.add_argument("--med", action="store_true", help='Post to medium.com')
parser.add_argument("--cdb", action="store_true", help='Post to codenewbie')
parser.add_argument("--output-file", action="store_true", help="Save to a File")
parser.add_argument("--embeds", action="store_true", help="Enable Embeds(only for devto/codenewbie)")
args = parser.parse_args()
post = frontmatter.load(file_markdown)

Expand All @@ -65,13 +56,14 @@ def main():
article["title"] = get_default_or_input(post, ["title"])
article["description"] = get_default_or_input(post, ["subtitle", "description"])
slug = get_default_or_input(post, ["slug", "canonical_url"])
# while True:
#while True:
# if validators.url(slug):
# break
# else:
# slug = input("Enter a valid URL: ")

if "slug" in post:
if "slug" in post.keys():
print(blog_link)
slug = blog_link + str(slug)
image_url = get_default_or_input(post, ["image_url", "cover_image"])

Expand All @@ -88,6 +80,7 @@ def main():
if "series" in post:
article["series"] = post["series"]


key_file = Path("keys.txt")
if not key_file.exists():
key_file.touch(exist_ok=True)
Expand All @@ -100,14 +93,16 @@ def main():
lines.append("codenewbie:\n")
f.writelines(lines)


allow_embeds = args.embeds
if args.dev:
devto(article, output)
devto(article, output, allow_embeds)
elif args.med:
medium(article, output)
elif args.cdb:
codenewbie(article, output)
codenewbie(article, output, allow_embeds)
elif args.opf:
generate_file(article, output)
generate_devto_file(article, output)
else:
print(f"1. dev.to \n2. hashnode.com\n3. codenewbie\n4. medium.com\n")
opt = input("Where you would like to post? (1/2/3/4) : ")
Expand Down
19 changes: 13 additions & 6 deletions crossposter/publications/codenewbie.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import requests
import json
import sys
from crossposter.utils import hard_to_soft_wraps, replace_line
from crossposter.utils import hard_to_soft_wraps, replace_line, embeds


def codenewbie_file(article, output):
Expand All @@ -18,22 +17,22 @@ def codenewbie_file(article, output):
else:
codenewbie_frontmatter += f"{key}: {post[key]}\n"


lines = hard_to_soft_wraps(codenewbie_frontmatter)

filename = post["title"].replace(" ", "_").lower()
output_file = output / f"{filename}_codenewbie_post.md"
with open(output_file, "w") as f:
with open(output_file, 'w') as f:
f.writelines(lines)
print("The Codenewbie frontmatter is generated in the file -> ", output_file)
return post


def codenewbie(article, output):
def codenewbie(article, output, allow_embeds=False):

from rich.progress import Progress

with Progress() as progress:
task = progress.add_task("Crossposting..", total=100)
task = progress.add_task("Crossposting..", total=100)
while not progress.finished:
progress.update(task, advance=10)

Expand All @@ -48,13 +47,18 @@ def codenewbie(article, output):
codenewbie_keys = input("Enter the Codenewbie API Key: ")
replace_line("keys.txt", 4, f"dev.to: {codenewbie_keys}\n")


post = codenewbie_file(article, output)

post = {}

for key in article:
post[key] = article[key]

# replace github and other embed links
if allow_embeds:
post = embeds(post)

API_ENDPOINT = "https://community.codenewbie.org/api/articles"

data = {
Expand Down Expand Up @@ -87,3 +91,6 @@ def codenewbie(article, output):
print("The article URL is: ", response)
else:
print("Article already published")

def generate_codenewbie_file(article, output):
codenewbie_file(article, output)
22 changes: 14 additions & 8 deletions crossposter/publications/dev.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import requests
import json
from crossposter.utils import hard_to_soft_wraps, replace_line
from crossposter.utils import embeds, hard_to_soft_wraps, replace_line


def devto_file(article, output):
Expand All @@ -19,19 +19,18 @@ def devto_file(article, output):
else:
dev_frontmatter += f"{key}: {post[key]}\n"


filename = post["title"].replace(" ", "_").lower()
output_file = output / f"{filename}_dev_post.md"

import re

lines = hard_to_soft_wraps(dev_frontmatter)
with open(output_file, "w") as f:
with open(output_file, 'w') as f:
f.writelines(lines)
print("The DEV frontmatter is generated in the file -> ", output_file)
return post


def devto(article, output):
def devto(article, output, allow_embeds=False):

post = devto_file(article, output)

Expand All @@ -47,6 +46,9 @@ def devto(article, output):
replace_line("keys.txt", 0, f"dev.to: {dev_keys}\n")
API_ENDPOINT = "https://dev.to/api/articles"

if allow_embeds:
post = embeds(post)

data = {
"Content-Type": "application/json",
"article": post,
Expand All @@ -70,6 +72,8 @@ def devto(article, output):
flag = True
# author_data = json.loads(requests.get("https://dev.to/api/users/me", headers=header).content)
# author_username = author_data["username"]


author_articles_list = json.loads(
requests.get("https://dev.to/api/articles/me/published", headers=header).content
)
Expand All @@ -82,12 +86,14 @@ def devto(article, output):
flag = False

if flag:
response = requests.post(
url=API_ENDPOINT, json=data, headers={"api-key": dev_keys}
).json()
response = requests.post(url=API_ENDPOINT, json=data, headers={"api-key": dev_keys}).json()
if "url" in response:
print("The article URL is: ", response["url"])
else:
print("The article URL is: ", response)
else:
print("Article already published")


def generate_devto_file(article, output):
devto_file(article, output)
42 changes: 29 additions & 13 deletions crossposter/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import re
from crossposter.publications.codenewbie import codenewbie_file

from crossposter.publications.dev import devto_file


def replace_line(file_name, line_num, text):
Expand All @@ -12,17 +9,16 @@ def replace_line(file_name, line_num, text):
f.seek(0)
f.writelines(lines)


def hard_to_soft_wraps(content):
# pre= re.findall(r'\n---\n(.*?)\n```.*$', content, re.DOTALL)
# mid = re.findall(r'\n```\n(.*?)\n```(.*?)',content, re.DOTALL)
# post = re.findall(r'\n```\n\n(.*$)', content, re.DOTALL)
#pre= re.findall(r'\n---\n(.*?)\n```.*$', content, re.DOTALL)
#mid = re.findall(r'\n```\n(.*?)\n```(.*?)',content, re.DOTALL)
#post = re.findall(r'\n```\n\n(.*$)', content, re.DOTALL)

# get all fenced code block
fences = re.findall(r"\n```.*?```\n", content, re.DOTALL)
fences = re.findall(r'\n```.*?```\n', content, re.DOTALL)

# get the frontmatter data
frontmatter = re.findall(r"---.*?---\n", content, re.DOTALL)
frontmatter = re.findall(r'---.*?---\n', content, re.DOTALL)

for fence in fences:
# set the new line character as some value //r to identify later
Expand All @@ -41,12 +37,32 @@ def hard_to_soft_wraps(content):
for w in content:
# replace the newline character which is a hard wrap into a whitespace
# then replace the special character with new line character
content = w.replace("\n", " ").replace("\\r", "\n")
content = w.replace("\n", " ").replace('\\r', "\n")

# returned soft wrapped content
return content


def generate_file(article, output):
devto_file(article, output)
codenewbie_file(article, output)
def embeds(post):
github_regex = re.compile(r'\[([^\]]+)\]\(\s*(https?://github\.com/[^)]+)\s*\)')
twitter_regex = re.compile(r'\[([^\]]+)\]\(\s*https?://twitter\.com/([^)]+)\s*\)')

def embed_github_replace(match):
link_text = match.group(0)
github_link = match.group(2)
embeds = f'{link_text} {{% embed {github_link} %}}'
if len(github_link.split('/')) > 5:
return link_text
return embeds

def embed_twitter_replace(match):
link_text = match.group(0)
twitter_link = match.group(2)
embeds = f"{link_text} {{% embed https://twitter.com/{twitter_link} %}}"
return embeds

text = github_regex.sub(embed_github_replace, post["body_markdown"])
text = twitter_regex.sub(embed_twitter_replace, text)

post["body_markdown"] = text
return post
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

HERE = pathlib.Path(__file__).parent

VERSION = "0.5.2"
VERSION = "0.6.0"
PACKAGE_NAME = "crossposter"
AUTHOR = "Meet Gor"
AUTHOR_EMAIL = "[email protected]"
Expand Down

0 comments on commit b5e57be

Please sign in to comment.