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.
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 | |
|---|---|---|---|
| markdown_to_mrkdwn-0.3.3.tar.gz | 14.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| markdown_to_mrkdwn-0.3.3-py3-none-any.whl | Python 3 | none | any | Details |
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
|