A markdown generation library for Python.

Overview

Welcome to SnakeMD

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.

Table of Contents

Below you'll find the table of contents, but these can also be generated programatically for every Markdown document. As of v0.8.0, you can also specify which types of headings are included in the table of contents.

def _table_of_contents(doc: Document):
    doc.add_table_of_contents(range(2, 4))
  1. Table of Contents
  2. Paragraphs
  3. Links
  4. Images
  5. Lists
    1. Ordered List
    2. Unordered List
    3. Nested List
  6. Tables
  7. Code Blocks
  8. Quotes
  9. Horizontal Rule

Paragraphs

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

Links are targets to files or web pages and can be embedded in a Paragraph in a variety of ways. As of v0.2.0, we're able to add links to existing paragraphs using the insert_link() method. Even better, in v0.4.0, we can chain these insert_link() calls.

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

Images can be added by embedding InlineText 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_element(Paragraph([InlineText("Logo", url=logo, image=True)]))

Markdown Source

![Logo](https://therenegadecoder.com/wp-content/uploads/2020/05/header-logo-without-tag-300x75.png)

Rendered Result

Logo

Lists

SnakeMD can make a variety of Markdown lists. The two main types of lists are ordered and unordered.

Ordered List

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

  1. Deku
  2. Bakugo
  3. Uraraka
  4. Tsuyu

Unordered List

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

  • Crosby
  • Malkin
  • Lemieux

Nested List

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. As of v0.4.0, you can forego the InlineText elements if you don't need them.

SnakeMD Source

def _nested_list(doc: Document):
    doc.add_element(
        MDList([
            "Apples",
            InlineText("Onions"),
            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

  • Apples
  • Onions
    • Sweet
    • Red
  • This is the end of the list!

Tables

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 InlineText. As of v0.4.0, you can also align the columns of the table using the Table.Align enum.

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]
    )

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

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

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 Rule

Horizontal Rules are visible dividers in a document.

SnakeMD Source

def _horizontal_rule(doc: Document):
    doc.add_horizontal_rule()

Markdown Source

---

Rendered Result


Comments
  • Allow multiple heading levels in table of contents

    Allow multiple heading levels in table of contents

    Only showing the level 2 headings is a bit restrictive. Maybe allow for two-element list or a tuple defining the top and bottom level of the range of headings that the user would like to show in the TOC. The Table of Contents would then be a nested-list of headings. Default would remain just the level 2 headings, with the list/tuple being a range of a single value [2, 2].

    enhancement 
    opened by ddukki 11
  • Created a Checkbox Class, Based on InlineText

    Created a Checkbox Class, Based on InlineText

    I found the need to create a list of checkboxes for task management. PR #55 wsa to create a list direclty, this PR is to create a CheckBox Instance than can be used with MDlist directly, so each checkbox can be checked or unchecked individually.

    Tests are based on InlineText's tests, everything passing.

    enhancement 
    opened by Bass-03 4
  • Implement a List of Checkboxes

    Implement a List of Checkboxes

    I found the need to create a list of checkboxes for task management. This PR includes a quick way to create a list of all checked or all un-checked boxes, based on MDList class.

    Tests are based on MDList's tests, everything passing.

    enhancement 
    opened by Bass-03 4
  • MDList Does Not Support Complex Structures

    MDList Does Not Support Complex Structures

    I'm trying to convert all of the existing Sample Programs Docs Generator code over to the new library, but there's a problem. The library doesn't support certain actions that we'd like to replicate. One of those actions is creating list items with multiple links. It never dawned on me that we would need to support this, so the existing MDList code only supports InlineText elements. I'm thinking that MDList should support Paragraphs instead.

    For reference, SnakeMD doesn't support this:

    - :white_check_mark: [Hello World in C\*](https://sample-programs.therenegadecoder.com/projects/hello-world/c-star) [[Requirements](https://sample-programs.therenegadecoder.com/projects/hello-world)]
    
    bug 
    opened by jrg94 4
  • Syntax Error in AWS Lambda

    Syntax Error in AWS Lambda

    I get the following error when I try to import snakemd in AWS Lambda: Syntax error in module 'cost_report': invalid syntax (generator.py, line 604)

    Locally, the file gets created normally. Any ideas?

    bug 
    opened by sofiadel06 2
  • Building Custom Paragraphs Is Painful

    Building Custom Paragraphs Is Painful

    Here's the current chunk of code I'm trying to write:

    def _generate_program_list(language: LanguageCollection) -> MDList:
        """
        A helper function which generates a list of programs for the README.
        :param language: a language collection
        :return: a list of sample programs list items
        """
        list_items = list()
        for program in language.sample_programs:
            program_line = Paragraph([])
            readable_name = program.normalized_name.replace("-", " ").title()
            program_name = f"{readable_name} in {language.get_readable_name()}"
            program_link = InlineText(program_name, url=program.sample_program_doc_url)
            if not program_link.verify_url():
                program_line.add(":warning: ")
                program_link = InlineText(program_name, url=program.sample_program_issue_url)
            else:
                program_line.add(":white_check_mark: ")
            program_line.add(program_link)
            program_line.add(" [Requirements]")
            program_line.insert_link("Requirements", program.sample_program_req_url)
            list_items.append(program_line)
        return MDList(list_items)
    

    All of this to just generate a couple of sentences. The main trouble I'm running into pertains to #19. But even beyond that, it's really hard to tell what this code is even supposed to do. Part of me thinks that the pattern should be to avoid InlineText at all costs. I feel like this would be a lot more readable if the user was able to construct their text first. That way, we could leverage various paragraph functions to modify the text after the fact. One idea I currently have is having a parameter which allows the user to test if their link is valid as they insert it. Right now, insert_link returns a Paragraph, so you can chain the calls. Maybe we need a function that checks all links in a paragraph...

    bug 
    opened by jrg94 2
  • Support table indentation to better integrate with superfences.

    Support table indentation to better integrate with superfences.

    When using Markdown extensions like pymdownx.superfences and pymdownx.tabbed, like we do via Material for MkDocs, an optional indent size paramter now ensures compatibility.

    Spoken in Markdown:

    === "Tab 1"
    
        | Header 1  | Header 2 |
        | --------- | ---------|
        | row1col1  | row1col2 |
    
    == "Tab 2"
    
        | Header 1  | Header 2 |
        | --------- | ---------|
        | row1col1  | row1col2 |
    
    enhancement 
    opened by adepretis 1
  • UnicodeEncodeError when using .output_page

    UnicodeEncodeError when using .output_page

    I am using .output_page and I get the following error: """ C:\ProgramData\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final) 17 class IncrementalEncoder(codecs.IncrementalEncoder): 18 def encode(self, input, final=False): ---> 19 return codecs.charmap_encode(input,self.errors,encoding_table)[0] 20 21 class IncrementalDecoder(codecs.IncrementalDecoder):

    UnicodeEncodeError: 'charmap' codec can't encode characters in position 678150-678153: character maps to """

    bug 
    opened by ichsanulamal 1
  • Add a URL Replacement Feature

    Add a URL Replacement Feature

    I was very excited about the following README code:

    def _generate_program_list(language: LanguageCollection) -> MDList:
        """
        A helper function which generates a list of programs for the README.
        :param language: a language collection
        :return: a list of sample programs list items
        """
        list_items = list()
        for program in language.sample_programs:
            readable_name = program.normalized_name.replace("-", " ").title()
            program_name = f"{readable_name} in {language.get_readable_name()}"
            program_line = Paragraph([f":white_check_mark: {program_name} [Requirements]"]) \
                .insert_link(f"{readable_name} in {language.get_readable_name()}", program.sample_program_doc_url) \
                .insert_link("Requirements", program.sample_program_req_url)
            if not program_line.verify_urls()[program.sample_program_doc_url]:
                program_line.replace(":white_check_mark:", ":warning:")
                program_line.insert_link(program_name, program.sample_program_issue_url)
            list_items.append(program_line)
        return MDList(list_items)
    

    The only problem is it doesn't work. The second time we call insert link, it doesn't actually replace the link. I'm not really sure how this should work at the moment, but as it stands, this doesn't work.

    enhancement 
    opened by jrg94 1
  • Links Cannot Be Added Within Strings

    Links Cannot Be Added Within Strings

    We ran into this issue with punctuation (#18), and I'm realizing that this issue is bigger than I thought. I'm not sure how to solve this at the moment, but something to think about for sure. The particular issue that I'm noticing is that we can't even embed links in the middle of structures. For example, I can't do this with SnakeMD:

    [[Link](https://test.com)]
    

    This will render with spaces on either end as follows:

    [ [Link](https://test.com) ]
    

    This turned out to be the same issue we were having with punctuation, and I already didn't like the regex then.

    bug 
    opened by jrg94 1
  • Verify Link Is Clunky

    Verify Link Is Clunky

    When I exposed Verify Link in 0.2.0, I figured that would make life easier, but it introduces a new problem. The text of the InlineText object needs to be set before the URL can be tested. This isn't a problem necessarily, but if the text is dependent on the URL existing, then you'll have to create a separate InlineText object (or update the existing one).

    I'm not sure there is anything to rework here as there may just need to be a pattern defined when this types of situations arise.

    bug 
    opened by jrg94 1
  • Add tables row-by-row

    Add tables row-by-row

    I need to write hundreds of rows to markdown, and want to write the header, then run an async function to get some output and then send write rows to markdown.

    Currently, I need to create an array to include all the rows, then write everything to the list.

    It would be good to have a way to write a table, e.g.:

    doc.write_table_header(...)
    for row in long_running_iterator():
        doc.write_table_row(...)
    
    enhancement 
    opened by hughbe 1
  • Add Ability to Insert Existing Documents Into Files

    Add Ability to Insert Existing Documents Into Files

    My initial thought was to have small chunks of markdown stored in files that could be injected into an existing doc. I still like this idea but it may involve parsing. A shortcut would be to let people input raw markdown and just not check it for them. Their risk.

    opened by jrg94 1
  • Add Limits to Line Length

    Add Limits to Line Length

    Right now, paragraphs are rendered on a single line. One thing I'd love for this library to do would be to have some support for pretty printing the documents. At the very least, it would be nice to render the text with line length limits.

    opened by jrg94 0
  • Add a URL Reference Feature

    Add a URL Reference Feature

    One feature I'd like to see is an option to use the reference structure for URLs. Here's an example where I think that would be really nice:

    The following table contains all the existing languages in the repository that start with the letter A:
    
    | Language                                                                         | Article(s)                                                             | Issue(s)                                                                                           | Test(s)                                                                        | # of Snippets |
    | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------- |
    | [Abap](/TheRenegadeCoder/sample-programs/tree/main/archive/a/abap)               |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+abap)        |                                                                                | 1             |
    | [Ada](/TheRenegadeCoder/sample-programs/tree/main/archive/a/ada)                 |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+ada)         | [Here](/TheRenegadeCoder/sample-programs/tree/main/archive/a/ada/testinfo.yml) | 1             |
    | [Agda](/TheRenegadeCoder/sample-programs/tree/main/archive/a/agda)               |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+agda)        |                                                                                | 1             |
    | [Algol68](/TheRenegadeCoder/sample-programs/tree/main/archive/a/algol68)         | [Here](https://sample-programs.therenegadecoder.com/languages/algol68) | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+algol68)     |                                                                                | 1             |
    | [Apex](/TheRenegadeCoder/sample-programs/tree/main/archive/a/apex)               |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+apex)        |                                                                                | 2             |
    | [Applescript](/TheRenegadeCoder/sample-programs/tree/main/archive/a/applescript) |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+applescript) |                                                                                | 1             |
    | [Arkscript](/TheRenegadeCoder/sample-programs/tree/main/archive/a/arkscript)     |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+arkscript)   |                                                                                | 1             |
    | [Astro](/TheRenegadeCoder/sample-programs/tree/main/archive/a/astro)             |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+astro)       |                                                                                | 1             |
    | [Autohotkey](/TheRenegadeCoder/sample-programs/tree/main/archive/a/autohotkey)   |                                                                        | [Here](/TheRenegadeCoder/sample-programs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+autohotkey)  |                                                                                | 1             |
    | **Totals**                                                                       |                                                                        |                                                                                                    |                                                                                | 10            |
    
    < [Previous (Z)](/TheRenegadeCoder/sample-programs/wiki/Z) | [Next (B)](/TheRenegadeCoder/sample-programs/wiki/B) >
    

    This table is absurd. We could simplify it dramatically by converting these long links to numbers.

    enhancement 
    opened by jrg94 2
  • Think About Adding a Condense Function to Paragraph

    Think About Adding a Condense Function to Paragraph

    With the addition of replace, I suspect that many InlineText objects are going to be generated in Paragraphs. I don't know that it matters, but I think it's a bit easier to make sense of the underlying structure if text-only elements are aggregated.

    enhancement 
    opened by jrg94 0
Releases(v0.11.0)
  • v0.11.0(Sep 6, 2022)

    What's Changed

    • Support table indentation to better integrate with superfences. by @adepretis in https://github.com/TheRenegadeCoder/SnakeMD/pull/61
    • Updated Setup File Version to 0.11.0 by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/62

    New Contributors

    • @adepretis made their first contribution in https://github.com/TheRenegadeCoder/SnakeMD/pull/61

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.10.1...v0.11.0

    Source code(tar.gz)
    Source code(zip)
  • v0.10.1(May 11, 2022)

    What's Changed

    • Fixed an Issue Where output_page() Would Fail Almost Randomly by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/59

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.10.0...v0.10.1

    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Jan 1, 2022)

    What's Changed

    • Implement a List of Checkboxes by @Bass-03 in https://github.com/TheRenegadeCoder/SnakeMD/pull/55
    • Created a Checkbox Class, Based on InlineText by @Bass-03 in https://github.com/TheRenegadeCoder/SnakeMD/pull/56
    • Added Convenience Checkbox Function to Document Class by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/57

    New Contributors

    • @Bass-03 made their first contribution in https://github.com/TheRenegadeCoder/SnakeMD/pull/55

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.9.3...v0.10.0

    Source code(tar.gz)
    Source code(zip)
  • v0.9.3(Dec 15, 2021)

    What's Changed

    • Added Super Linter Action to Lint Markdown by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/49
    • Added Python Matrix of Version Testing by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/50
    • Updated Version History by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/52

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.9.0...v0.9.3

    Source code(tar.gz)
    Source code(zip)
  • v0.9.0(Dec 15, 2021)

    What's Changed

    • Added a Way to Create a New Document Without Importing Any Classes by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/45
    • Added Support for Read The Docs by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/46
    • Removed All References to Local Docs by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/47

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.8.1...v0.9.0

    Source code(tar.gz)
    Source code(zip)
  • v0.8.1(Dec 15, 2021)

    What's Changed

    • Fixed Issue That Caused Linting Errors for Markdown Lists by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/44

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.8.0...v0.8.1

    Source code(tar.gz)
    Source code(zip)
  • v0.8.0(Dec 14, 2021)

    What's Changed

    • Added Nesting to Table of Contents by @jrg94 in https://github.com/TheRenegadeCoder/SnakeMD/pull/42

    Full Changelog: https://github.com/TheRenegadeCoder/SnakeMD/compare/v0.7.0...v0.8.0

    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(Jul 22, 2021)

    • Added replace_link() method to Paragraph
    • Added various state methods to InlineText
    • Expanded testing
    • Lowered log level to INFO for verify URL errors
    • Added code coverage to build
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Jul 22, 2021)

    • Restructured api, so snakemd is the import module
    • Updated usage page to show more features
    • Fixed issue where base docs link would reroute to index.html directly
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Jul 21, 2021)

    • Added favicon to docs (#26)
    • Added mass URL verification function to Paragraph class (#27)
    • Expanded testing to ensure code works as expected
    • Changed behavior of insert_link() to mimic str.replace() (#19)
    • Added a replace method to Paragraph (#27)
    • Added plausible tracking to latest version of docs (#25)
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Jul 20, 2021)

  • v0.4.0(Jul 20, 2021)

    • Added support for Python logging library
    • Expanded support for strings in the Header, Paragraph, and MDList classes
    • Fixed an issue where Paragraphs would sometimes render unexpected spaces
    • Added GitHub links to version history page
    • Added support for column alignment on tables
    • Fixed issue where tables sometimes wouldn't pretty print properly
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Jul 19, 2021)

    • Gave documentation a major overhaul
    • Added support for paragraphs in MDList
    • Added is_text() method to Paragraph
    • Fixed issue where punctuation sometimes rendered with an extra space in front
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jul 17, 2021)

    This release features some major upgrades including:

    • Added support for horizontal rules
    • Added automated testing through PyTest and GitHub Actions
    • Added document verification services
    • Added documentation link to README as well as info about installing the package
    • Fixed table of contents single render problem
    • Added a feature which allows users to insert links in existing paragraphs
    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jul 16, 2021)

    SnakeMD is a markdown generation library for Python. It includes a set of convenience methods for generating markdown documents alongside an object oriented library if you need more customization. Currently supported markdown features include:

    • Links
    • Images
    • Lists
    • Tables
    • Code blocks
    • Quotes

    Bonus features include:

    • Table of Contents
    Source code(tar.gz)
    Source code(zip)
Owner
The Renegade Coder
The Renegade Coder is a software curriculum website which supports the development of opens-source educational resources and software
The Renegade Coder
A markdown lexer and parser which gives the programmer atomic control over markdown parsing to html.

A markdown lexer and parser which gives the programmer atomic control over markdown parsing to html.

stonepresto 4 Aug 13, 2022
A fast yet powerful Python Markdown parser with renderers and plugins.

Mistune v2 A fast yet powerful Python Markdown parser with renderers and plugins. NOTE: This is the re-designed v2 of mistune. Check v1 branch for ear

Hsiaoming Yang 2.2k Jan 4, 2023
A Python implementation of John Gruber’s Markdown with Extension support.

Python-Markdown This is a Python implementation of John Gruber's Markdown. It is almost completely compliant with the reference implementation, though

Python-Markdown 3.1k Dec 30, 2022
A Python implementation of John Gruber’s Markdown with Extension support.

Python-Markdown This is a Python implementation of John Gruber's Markdown. It is almost completely compliant with the reference implementation, though

Python-Markdown 3.1k Dec 31, 2022
Static site generator that supports Markdown and reST syntax. Powered by Python.

Pelican Pelican is a static site generator, written in Python. Write content in reStructuredText or Markdown using your editor of choice Includes a si

Pelican dev team 11.3k Jan 5, 2023
Extensions for Python Markdown

PyMdown Extensions Extensions for Python Markdown. Documentation Extension documentation is found here: https://facelessuser.github.io/pymdown-extensi

Isaac Muse 685 Jan 1, 2023
markdown2: A fast and complete implementation of Markdown in Python

Markdown is a light text markup format and a processor to convert that to HTML. The originator describes it as follows: Markdown is a text-to-HTML con

Trent Mick 2.4k Dec 30, 2022
Markdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed. Now in Python!

markdown-it-py Markdown parser done right. Follows the CommonMark spec for baseline parsing Configurable syntax: you can add new rules and even replac

Executable Books 398 Dec 24, 2022
A fast, extensible and spec-compliant Markdown parser in pure Python.

mistletoe mistletoe is a Markdown parser in pure Python, designed to be fast, spec-compliant and fully customizable. Apart from being the fastest Comm

Mi Yu 546 Jan 1, 2023
Lightweight Markdown dialect for Python desktop apps

Litemark is a lightweight Markdown dialect originally created to be the markup language for the Codegame Platform project. When you run litemark from the command line interface without any arguments, the Litemark Viewer opens and displays the rendered demo.

null 10 Apr 23, 2022
A lightweight and fast-to-use Markdown document generator based on Python

A lightweight and fast-to-use Markdown document generator based on Python

快乐的老鼠宝宝 1 Jan 10, 2022
A markdown template manager for writing API docs in python.

DocsGen-py A markdown template manager for writing API docs in python. Contents Usage API Reference Usage You can install the latest commit of this re

Ethan Evans 1 May 10, 2022
Convert HTML to Markdown-formatted text.

html2text html2text is a Python script that converts a page of HTML into clean, easy-to-read plain ASCII text. Better yet, that ASCII also happens to

Alireza Savand 1.3k Dec 31, 2022
Comprehensive Markdown plugin built for Django

Django MarkdownX Django MarkdownX is a comprehensive Markdown plugin built for Django, the renowned high-level Python web framework, with flexibility,

neutronX 740 Jan 8, 2023
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI

martor Martor is a Markdown Editor plugin for Django, supported for Bootstrap & Semantic-UI. Features Live Preview Integrated with Ace Editor Supporte

null 659 Jan 4, 2023
Livemark is a static page generator that extends Markdown with interactive charts, tables, and more.

Livermark This software is in the early stages and is not well-tested Livemark is a static site generator that extends Markdown with interactive chart

Frictionless Data 86 Dec 25, 2022
A super simple script which uses the GitHub API to convert your markdown files to GitHub styled HTML site.

A super simple script which uses the GitHub API to convert your markdown files to GitHub styled HTML site.

Çalgan Aygün 213 Dec 22, 2022
Remarkable Markdown Debian Package Fix

Remarkable debian package fix For some reason the Debian package for remarkable markdown editor has not been made to install properly on Ubuntu 20.04

Eric Seifert 37 Jan 2, 2023
Read a list in markdown and do something with it!

Markdown List Reader A simple tool for reading lists in markdown. Usage Begin by running the mdr.py file and input either a markdown string with the -

Esteban Garcia 3 Sep 13, 2021