Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Creole markup tools written in Python.
Tree: 0d1de10a39

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


Build Status on


python-creole is a OpenSource (GPL) Python lib for converting markups. python-creole is pure python. No external libs needed. It's compatible with Python v2.6-v3.2 and PyPy.

Existing converters:

  • creole -> html
  • html -> creole markup
  • reSt -> html (for clean html code)
  • html -> reStructuredText markup (only a subset of reSt supported)
  • html -> textile markup (not completed yet)

The creole2html part based on the creole markup parser and emitter from the MoinMoin project by Radomir Dopieralski and Thomas Waldmann.


Python packages available on:

~$ pip install python-creole


For the most parts (creole2html and html2creole) no external libraries are needed.

For all functionality (and running the unittests) these modules are needed:



Convert creole markup to html code:

>>> from creole import creole2html
>>> creole2html("This is **creole //markup//**")
u'<p>This is <strong>creole <i>markup</i></strong></p>\n'


Convert html code back into creole markup:

>>> from creole import html2creole
>>> html2creole(u'<p>This is <strong>creole <i>markup</i></strong></p>\n')
u'This is **creole //markup//**'


Convert ReStructuredText into clean html code (needs docutils):

>>> from creole.rest2html.clean_writer import rest2html
>>> rest2html(u"A ReSt link to `PyLucid CMS <>`_ :)")
u'<p>A ReSt link to <a href="">PyLucid CMS</a> :)</p>\\n'

(more information: rest2html wiki page)


Convert html code into ReStructuredText markup:

>>> from creole import html2rest
>>> html2rest(u'<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
u'This is **ReStructuredText** *markup*!'


Convert html code into textile markup

>>> from creole import html2textile
>>> html2textile(u'<p>This is <strong>textile <i>markup</i></strong>!</p>')
u'This is *textile __markup__*!'

See also:


We store documentation/exmplate into the project wiki:

How to handle unknown html tags in html2creole:

Contributers should take a look at this page:

run unittests

From source package, use to run unittests:

.../path/to/python-creole$ python test

If you have install python-creole do this to run unittests:

~$ cd /path/to/site-packages
...path/to/site-packages/$ cd 
...path/to/site-packages/python_creole-0.9.0.pre-py2.7.egg$ cd /creole/tests
...path/to/site-packages/python_creole-0.9.0.pre-py2.7.egg/creole/tests$ python

Note: You can pass the arguments --verbose or --quite to and

You can also run tests inside interactive python:

>>> from creole.tests import run_unittests
>>> run_unittests()
Ran 126 tests in 0.966s

>>> from creole.tests.all_tests import run_all_doctests
>>> run_all_doctests()
Ran 21 DocTests from 49 files in 0.368s: failed=0, attempted=88

or do this:

~$ python -c "from creole.tests import run_unittests;run_unittests()"
Ran 126 tests in 0.917s

~$ python -c "from creole.tests.all_tests import run_all_doctests;run_all_doctests()"
Ran 21 DocTests from 49 files in 0.368s: failed=0, attempted=88

We using Shining Panda and Travis CI for running unittests automaticly on GIT changes, see:

Use creole in README

With python-creole you can convert a README on-the-fly from creole into ReStructuredText in How to do this, read:

Note: In this case you must install docutils! See above.


  • v1.0.4
    • html2rest: Handle double link/image substitution and raise better error messages
    • Bugfix in unittests (include test README file in python package). Thanks to Wen Heping for reporting this.
  • v1.0.3
    • Bugfix: AttributeError: 'module' object has no attribute 'interesting_cdata' from HTMLParser patch. Thanks to Wen Heping for reporting this.
    • Fix a bug in get_long_description() ReSt test for Py3k and his unittests.
    • Use Travis CI, too.
  • v1.0.2
  • v1.0.1
  • v1.0.0
    • Change API: Replace 'parser_kwargs' and 'emitter_kwargs' with separate arguments. (More information on API Wiki Page)
  • v0.9.2
    • Turn zip_safe in on and change unittests API.
  • v0.9.1
    • Many Bugfixes, tested with CPython 2.6, 2.7, 3.2 and PyPy v1.6
  • v0.9.0
  • v0.8.5
    • Bugfix in html2creole: ignore links without href
  • v0.8.4
  • v0.8.3
  • v0.8.2
    • Bugfix in get_long_description() error handling (local variable 'long_description_origin' referenced before assignment)
  • v0.8.1
    • Bugfix for installation under python 2.5
    • Note: setup helper changed: rename GetLongDescription(...) to get_long_description(...)
  • v0.8
  • v0.7.3
    • Bugfix in html2rest:
      • table without <th> header
      • new line after table
      • create reference hyperlinks in table cells intead of embedded urls.
      • Don't always use raise_unknown_node()
    • Add child content to raise_unknown_node()
  • v0.7.2
    • Activate ---- to <hr> in html2rest
    • Update
  • v0.7.1
    • Bugfix if docutils are not installed
    • API change: rest2html is now here: from creole.rest2html.clean_writer import rest2html
  • v0.7.0
    • NEW: Add a html2reStructuredText converter (only a subset of reSt supported)
  • v0.6.1
    • Bugfix: separate lines with one space in "wiki style line breaks" mode
  • v0.6
    • NEW: html2textile converter
    • some API changed!
  • v0.5
    • API changed:
      • Html2CreoleEmitter optional argument 'unknown_emit' takes now a callable for handle unknown html tags.
      • No macros used as default in creole2html converting.
      • We remove the support for callable macros. Only dict and modules are allowed.
    • remove unknown html tags is default behaviour in html2creole converting.
    • restructure and cleanup sourcecode files.
  • v0.4
    • only emit children of empty tags like div and span (contributed by Eric O'Connell)
    • remove inter wiki links and doesn't check the protocol
  • v0.3.3
    • Use <tt> when {{{ ... }}} is inline and not <pre>, see: PyLucid Forum Thread
    • Bugfix in html2creole: insert newline before new list. TODO: apply to all block tags: issues 16
  • v0.3.2
  • v0.3.1
    • Make argument 'block_rules' in Parser() optional
  • v0.3.0
    • creole2html() has the optional parameter 'blog_line_breaks' to switch from default blog to wiki line breaks
  • v0.2.8
    • bugfix in
  • v0.2.7
    • handle obsolete non-closed <br> tag
  • v0.2.6
    • bugfix in
    • Cleanup DocStrings
    • add unittests
  • v0.2.5
    • creole2html: Bugfix if "--", "//" etc. stands alone, see also: issues 12
    • Note: bold, italic etc. can't cross line any more.
  • v0.2.4
    • creole2html: ignore file extensions in image tag
  • v0.2.3
    • html2creole bugfix/enhanced: convert image tag without alt attribute:
      • see also: issues 6
      • Thanks Betz Stefan alias 'encbladexp'
  • v0.2.2
    • html2creole bugfix: convert <a href="/url/">Search & Destroy</a>
  • v0.2.1
    • html2creole bugfixes in:
      • converting tables: ignore tbody tag and better handling p and a tags in td
      • converting named entity
  • v0.2
    • remove all django template tag stuff: issues 3
    • html code always escaped
  • v0.1.1
    • improve macros stuff, patch by Vitja Makarov: issues 2
  • v0.1.0



Google code
IRC #pylucid on
Shining Panda
Something went wrong with that request. Please try again.