
Research
SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains
An emerging npm supply chain attack that infects repos, steals CI secrets, and targets developer AI toolchains for further compromise.
SnakeMD
Advanced tools
SnakeMD is your ticket to generating Markdown in Python. To prove it to you, we've generated this entire README using SnakeMD. See readme.py for how it was done. To get started, download and install SnakeMD:
pip install snakemd
In the remainder of this document, we'll show you all of the things this library can do. For more information, check out the official documentation here.
Below you'll find the table of contents, but these can also be generated programatically for every Markdown document as follows:
def _table_of_contents(doc: Document):
doc.add_table_of_contents(range(2, 4))
Paragraphs are the most basic feature of any Markdown file. As a result, they are very easy to create using SnakeMD.
SnakeMD Source
def _paragraph(doc: Document):
doc.add_paragraph("I think. Therefore, I am.")
Markdown Source
I think. Therefore, I am.
Rendered Result
I think. Therefore, I am.
Links are targets to files or web pages and can be embedded in paragraphs in a variety of ways, such as with the insert_link() method.
SnakeMD Source
def _insert_link(doc: Document):
doc.add_paragraph(
"Learn to program with The Renegade Coder (@RenegadeCoder94)."
).insert_link("The Renegade Coder", "https://therenegadecoder.com").insert_link(
"@RenegadeCoder94", "https://twitter.com/RenegadeCoder94"
)
Markdown Source
Learn to program with [The Renegade Coder](https://therenegadecoder.com) ([@RenegadeCoder94](https://twitter.com/RenegadeCoder94)).
Rendered Result
Learn to program with The Renegade Coder (@RenegadeCoder94).
Images can be added by embedding Inline elements in a paragraph.
SnakeMD Source
def _image(doc: Document):
logo = "https://therenegadecoder.com/wp-content/uploads/2020/05/header-logo-without-tag-300x75.png"
doc.add_block(Paragraph([Inline("Logo", image=logo)]))
Markdown Source

Rendered Result

SnakeMD can make a variety of Markdown lists. The three main types of lists are ordered, unordered, and checked.
Ordered lists are lists in which the order of the items matters. As a result, we number them.
SnakeMD Source
def _ordered_list(doc: Document):
doc.add_ordered_list(["Deku", "Bakugo", "Uraraka", "Tsuyu"])
Markdown Source
1. Deku
2. Bakugo
3. Uraraka
4. Tsuyu
Rendered Result
Unordered lists are lists in which the order of the items does not matter. As a result, we bullet them.
SnakeMD Source
def _unordered_list(doc: Document):
doc.add_unordered_list(["Crosby", "Malkin", "Lemieux"])
Markdown Source
- Crosby
- Malkin
- Lemieux
Rendered Result
Checklists are lists in which the items themselves can be checked on and off. This feature is new as of v0.10.0.
SnakeMD Source
def _checklist(doc: Document):
doc.add_checklist(["Pass the puck", "Shoot the puck", "Score a goal"])
Markdown Source
- [ ] Pass the puck
- [ ] Shoot the puck
- [ ] Score a goal
Rendered Result
Nested lists are complex lists that contain lists. Currently, SnakeMD does not support any convenience methods to generate nested lists, but they can be created manually using the MDList object.
SnakeMD Source
def _nested_list(doc: Document):
doc.add_block(
MDList(
[
"Apples",
Inline("Onions", bold=True),
MDList(["Sweet", "Red"]),
Paragraph(["This is the end of the list!"]),
]
)
)
Markdown Source
- Apples
- **Onions**
- Sweet
- Red
- This is the end of the list!
Rendered Result
Tables are sets of rows and columns which can display text in a grid. To style any of the contents of a table, consider using Paragraph or Inline.
SnakeMD Source
def _table(doc: Document):
doc.add_table(
["Height (cm)", "Weight (kg)", "Age (y)"],
[["150", "70", "21"], ["164", "75", "19"], ["181", "87", "40"]],
[Table.Align.LEFT, Table.Align.CENTER, Table.Align.RIGHT],
0,
)
Markdown Source
| Height (cm) | Weight (kg) | Age (y) |
| :---------- | :---------: | ------: |
| 150 | 70 | 21 |
| 164 | 75 | 19 |
| 181 | 87 | 40 |
Rendered Result
| Height (cm) | Weight (kg) | Age (y) |
|---|---|---|
| 150 | 70 | 21 |
| 164 | 75 | 19 |
| 181 | 87 | 40 |
Code blocks are a form of structured text for sharing code snippets with syntax highlighting.
SnakeMD Source
def _code(doc: Document):
doc.add_code("x = 5", lang="py")
Markdown Source
```py
x = 5
```
Rendered Result
x = 5
Quotes are blocks of text that represent quotes from people.
SnakeMD Source
def _quote(doc: Document):
doc.add_quote("How Now Brown Cow")
Markdown Source
> How Now Brown Cow
Rendered Result
How Now Brown Cow
Horizontal Rules are visible dividers in a document.
SnakeMD Source
def _horizontal_rule(doc: Document):
doc.add_horizontal_rule()
Markdown Source
***
Rendered Result
If at any time SnakeMD doesn't meet your needs, you can always add your own text using a raw block. These can be used to insert any preformatted text you like, such as HTML tags, Jekyll frontmatter, and more.
SnakeMD Source
def _raw(doc: Document):
doc.add_raw("4<sup>2</sup> = 16<br />How cool is that?")
Markdown Source
4<sup>2</sup> = 16<br />How cool is that?
Rendered Result
42 = 16
How cool is that?
FAQs
A markdown generation library for Python.
We found that SnakeMD demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
An emerging npm supply chain attack that infects repos, steals CI secrets, and targets developer AI toolchains for further compromise.

Company News
Socket is proud to join the OpenJS Foundation as a Silver Member, deepening our commitment to the long-term health and security of the JavaScript ecosystem.

Security News
npm now links to Socket's security analysis on every package page. Here's what you'll find when you click through.