next_url: install.html
next_title: Installation
prev_title: Table of Contents
prev_url: siteindex.html
Python-Markdown
===============
This is a Python implementation of John Gruber's
[Markdown](http://daringfireball.net/projects/markdown/).
It is almost completely compliant with the reference implementation,
though there are a few very minor [differences](#differences). See John's
[Syntax Documentation](http://daringfireball.net/projects/markdown/syntax)
for the syntax rules.
See the [installation instructions](install.html) to get started.
Goals
-----
The Python-Markdown project is developed with the following goals in mind:
* Maintain a Python 2 *and* Python 3 library (with an optional CLI wrapper)
suited to use in web server environments (never raise an exception, never
write to stdout, etc.) as an implementation of the markdown parser that
follows the [syntax rules](http://daringfireball.net/projects/markdown/syntax)
and the behavior of the original (markdown.pl) implementation as reasonably
as possible (see [differences](#differences) for a few exceptions).
* Provide an [Extension API](extensions/api.html) which makes it possible
to change and/or extend the behavior of the parser.
Features
--------
In addition to the basic markdown syntax, Python-Markdown supports the following
features:
* __International Input__
Python-Markdown will accept [input](reference.html#text) in any language
supported by Unicode including bi-directional text. In fact the test suite
includes documents written in Russian and Arabic.
* __Extensions__
Various [extensions](extensions/index.html) are provided (including
[extra](extensions/extra.html)) to change and/or extend the base syntax.
Additionally, a public [Extension API](extensions/api.html) is available
to write your own extensions.
* __Output Formats__
Python-Markdown can output documents in HTML4, XHTML and HTML5. See the
[Library Reference](reference.html#output_format) for details.
* __"Safe Mode"__
When using Python-Markdown to parse input from untrusted users on the web,
the handling of raw HTML can be controlled in various ways to prevent
harmful code from being injected into your site. See the
[Library Reference](reference.html#safe_mode) for details.
* __Command Line Interface__
In addition to being a Python Library, a
[command line script](cli.html) is available for your convenience.
Differences
-----------
While Python-Markdown strives to fully implement markdown as described in the
[syntax rules](http://daringfireball.net/projects/markdown/syntax), the rules
can be interpreted in different ways and different implementations
occasionally vary in their behavior (see the
[Babelmark FAQ](http://johnmacfarlane.net/babelmark2/faq.html#what-are-some-examples-of-interesting-divergences-between-implementations)
for some examples). Known and intentional differences found in Python-Markdown
are summarized below:
* __Middle-Word Emphasis__
Python-Markdown defaults to ignoring middle-word emphasis. In other words,
`some_long_filename.txt` will not become `somelongfilename.txt`.
This can be switched off if desired. See the
[Library Reference](reference.html#smart_emphasis) for details.
* __Indentation/Tab Length__
The [syntax rules](http://daringfireball.net/projects/markdown/syntax#list)
clearly state that when a list item consists of multiple paragraphs, "each
subsequent paragraph in a list item **must** be indented by either 4 spaces
or one tab" (emphasis added). However, many implementations do not enforce
this rule and allow less than 4 spaces of indentation. The implementers of
Python-Markdown consider it a bug to not enforce this rule, and therefore,
subsequent paragraphs of a list **must** be indented by four spaces or one
tab.
The same strict behavior is enforced on nested lists in Python-Markdown.
A sublist item **must** be nested by at last four spaces. To do otherwise
would be considered a bug.
In the event that one would prefer different behavior,
[tab_length](reference.html#tab_length) can be set to whatever length is
desired. Be warned however, as this will affect indentation for all aspects
of the syntax (including code blocks).
* __Consecutive Lists__
While the syntax rules are not clear on this, many implementations (including
the original) do not end one list and start a second list when the list marker
(asterisks, pluses, hyphens, and numbers) changes. For consistency,
Python-Markdown maintains the same behavior with no plans to change in the
foreseeable future. That said, the [Sane List Extension](extensions/sane_lists.html)
is available to provide a less surprising behavior.
Support
-------
You may ask for help and discuss various other issues on the [mailing list][]
and report bugs on the [bug tracker][].
[mailing list]: http://lists.sourceforge.net/lists/listinfo/python-markdown-discuss
[bug tracker]: http://github.com/waylan/Python-Markdown/issues