social media crossposting tool. 3rd time's the charm
mastodon misskey crossposting bluesky

use a better md library (fixes newlines)

zenfyr.dev 5e4317ad 377eb41f

verified
+2 -2
mastodon.py
···
from bs4 import BeautifulSoup, Tag
from bs4.element import NavigableString
-
from markdownify import markdownify as md
+
from html_to_markdown import markdownify as md
FORMATS = {
'video': 'video',
···
mentions: list[dict] = status.get('mentions', [])
def mdd(html):
-
return md(html, escape_asterisks=False, escape_underscores=False)
+
return md(html, escape_asterisks=False, escape_underscores=False, escape_misc=False)
def recurse(node) -> None:
if isinstance(node, NavigableString):
+1 -1
pyproject.toml
···
"atproto>=0.0.61",
"bs4>=0.0.2",
"click>=8.2.1",
-
"markdownify>=1.1.0",
+
"html-to-markdown>=1.3.3",
"requests>=2.32.3",
"websockets>=13.1",
]
-1
util.py
···
import re
-
from markdownify import markdownify as md
import cross
import logging, sys, os
+14 -24
uv.lock
···
]
[[package]]
+
name = "html-to-markdown"
+
version = "1.3.3"
+
source = { registry = "https://pypi.org/simple" }
+
dependencies = [
+
{ name = "beautifulsoup4" },
+
]
+
sdist = { url = "https://files.pythonhosted.org/packages/1d/48/324d3d938e5ff635497965118df510f62725b72e8b378b8710c03b0dd014/html_to_markdown-1.3.3.tar.gz", hash = "sha256:ad4f992d65d96d53e49d0a56a2ae0c52ef606c17592d2d9a87f99e4632a4a9e3", size = 15491, upload-time = "2025-06-03T20:46:40.719Z" }
+
wheels = [
+
{ url = "https://files.pythonhosted.org/packages/a3/d0/b96f7e3579cada841657e5764bc294bd2abb6c1e1dbcfb88ecf7a63ea5d9/html_to_markdown-1.3.3-py3-none-any.whl", hash = "sha256:09325777400e561d2c5a1569f475f9434e70a6f8ed1b4866bba8d00906136495", size = 14951, upload-time = "2025-06-03T20:46:38.138Z" },
+
]
+
+
[[package]]
name = "httpcore"
version = "1.0.9"
source = { registry = "https://pypi.org/simple" }
···
]
[[package]]
-
name = "markdownify"
-
version = "1.1.0"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "beautifulsoup4" },
-
{ name = "six" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/2f/78/c48fed23c7aebc2c16049062e72de1da3220c274de59d28c942acdc9ffb2/markdownify-1.1.0.tar.gz", hash = "sha256:449c0bbbf1401c5112379619524f33b63490a8fa479456d41de9dc9e37560ebd", size = 17127, upload-time = "2025-03-05T11:54:40.574Z" }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/64/11/b751af7ad41b254a802cf52f7bc1fca7cabe2388132f2ce60a1a6b9b9622/markdownify-1.1.0-py3-none-any.whl", hash = "sha256:32a5a08e9af02c8a6528942224c91b933b4bd2c7d078f9012943776fc313eeef", size = 13901, upload-time = "2025-03-05T11:54:39.454Z" },
-
]
-
-
[[package]]
name = "pycparser"
version = "2.22"
source = { registry = "https://pypi.org/simple" }
···
]
[[package]]
-
name = "six"
-
version = "1.17.0"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
-
]
-
-
[[package]]
name = "sniffio"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
···
{ name = "atproto" },
{ name = "bs4" },
{ name = "click" },
-
{ name = "markdownify" },
+
{ name = "html-to-markdown" },
{ name = "requests" },
{ name = "websockets" },
]
···
{ name = "atproto", specifier = ">=0.0.61" },
{ name = "bs4", specifier = ">=0.0.2" },
{ name = "click", specifier = ">=8.2.1" },
-
{ name = "markdownify", specifier = ">=1.1.0" },
+
{ name = "html-to-markdown", specifier = ">=1.3.3" },
{ name = "requests", specifier = ">=2.32.3" },
{ name = "websockets", specifier = ">=13.1" },
]