markdown_to_mrkdwn
A lightweight, efficient library for converting standard Markdown to Slack's mrkdwn format. This library helps you maintain consistent formatting when sending messages to Slack from your applications.
Features
- Fast and lightweight conversion from Markdown to Slack's mrkdwn format
- No external dependencies
- Comprehensive support for Markdown elements:
- Headings (H1, H2, H3, H4, H5, H6)
- Text formatting (bold, italic, strikethrough)
- Lists (ordered and unordered, with nesting)
- Ordered lists (numbered lists with proper indentation)
- Task lists (checked and unchecked items)
- Tables (with header formatting)
- Links and image references
- Code blocks (with language specification preserved)
- Blockquotes
- Horizontal rules
- Preserves code blocks without converting their contents
- Handles special characters and edge cases
Installation
Install from PyPI using pip:
pip install markdown_to_mrkdwn
Requirements:
- Python 3.8 or higher
Usage
Basic Usage
from markdown_to_mrkdwn import SlackMarkdownConverter
# Create a converter instance
converter = SlackMarkdownConverter()
# Convert markdown to mrkdwn
markdown_text = """
# Heading 1
**Bold text**
- List item
[Link](https://example.com)
~~Strikethrough text~~
"""
mrkdwn_text = converter.convert(markdown_text)
print(mrkdwn_text)
Output
*Heading 1*
*Bold text*
• List item
<https://example.com|Link>
~Strikethrough text~
Supported Conversions
| Markdown | Slack mrkdwn |
|---|---|
# Heading |
*Heading* |
## Heading |
*Heading* |
### Heading |
*Heading* |
#### Heading |
*Heading* |
##### Heading |
*Heading* |
###### Heading |
*Heading* |
**Bold** |
*Bold* |
__Bold__ |
*Bold* |
*Italic* |
_Italic_ |
~~Strikethrough~~ |
~Strikethrough~ |
[Link](https://example.com) |
<https://example.com|Link> |
 |
<https://example.com/img.png> |
- List item |
• List item |
* List item |
• List item |
1. Ordered item |
1. Ordered item |
- [ ] Task |
• ☐ Task |
- [x] Task |
• ☑ Task |
> Quote |
> Quote |
`Code` |
`Code` |
```python |
```python |
--- |
────────── |
| Tables | Simple text tables with bold headers |
Testing in Slack
You can test the output in Slack Block Kit Builder: Slack Block Kit Builder
Advanced Usage
Custom Encoding
You can specify a custom encoding when initializing the converter:
converter = SlackMarkdownConverter()
Plugin System
You can extend the converter with your own plugins.
Function Plugin Example
from markdown_to_mrkdwn.converter import SlackMarkdownConverter
def to_upper(line):
return line.upper()
converter = SlackMarkdownConverter()
converter.register_plugin(
name="to_upper",
converter_func=to_upper,
priority=10,
scope="line",
timing="after"
)
print(converter.convert("hello")) # Output: HELLO
Regex Plugin Example
# Add comma to thousands
converter.register_regex_plugin(
name="add_comma_to_thousands",
pattern=r"(?<=\\d)(?=(\\d{3})+(?!\\d))",
replacement=",",
priority=10,
timing="after"
)
print(converter.convert("1234567")) # Output: 1,234,567
# Mask email addresses
converter.register_regex_plugin(
name="mask_email",
pattern=r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+",
replacement="[EMAIL]",
priority=20,
timing="after"
)
print(converter.convert("Contact: test.user@example.com")) # Output: Contact: [EMAIL]
prioritycontrols execution order (lower runs first)timingcan be "before" or "after" (default: "after")scopeis always "line" for regex plugins
Error Handling
The converter will return the original markdown text if an error occurs during conversion:
try:
mrkdwn_text = converter.convert(markdown_text)
except Exception as e:
print(f"Conversion error: {e}")
Contributing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin feature/your-feature-name - Submit a pull request
Please make sure to update tests as appropriate.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Metadata
Release files for markdown-to-mrkdwn 0.3.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| markdown_to_mrkdwn-0.3.3.tar.gz | 14.6 kB | Without provenance | Details for markdown_to_mrkdwn-0.3.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| markdown_to_mrkdwn-0.3.3-py3-none-any.whl | Python 3 | none | any | Details for markdown_to_mrkdwn-0.3.3-py3-none-any.whl |
Total release size: 28.6 kB
Release files / markdown_to_mrkdwn-0.3.3.tar.gz
| Download URL | markdown_to_mrkdwn-0.3.3.tar.gz |
|---|---|
| Size | 14.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5a2c0c8b8b73eb1051fe82d1a2ae9864d72bf7f6877f8add9589d01de33defd4
|
|
BLAKE2b-256 checksum How to use checksums |
449a701c308edbac6fed7d6b25101e2877729c839328ff172cb87d9ff49b05d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Release files / markdown_to_mrkdwn-0.3.3-py3-none-any.whl
| Download URL | markdown_to_mrkdwn-0.3.3-py3-none-any.whl |
|---|---|
| Size | 14.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4164538e370aea9a5b5e0ee688128b722c1d14d9f9fbd6014745273eca63032f
|
|
BLAKE2b-256 checksum How to use checksums |
1d161a1bf1ddfa5dd811e95faeacf29fd34907eaea1c4456c603adeee036b725
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Security for markdown-to-mrkdwn 0.3.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.