any inline elements, and postprocessors which allow munging of the
output of the parser before it is returned.
-As the parser builds an [ElementTree]
DOM object which is later rendered
+As the parser builds an [ElementTree] object which is later rendered
as Unicode text, there are also some helpers provided to make manipulation of
DOM tree easier. Each part of the API is discussed in its respective
+the tree easier. Each part of the API is discussed in its respective
section below. You may find reading the source of some [[existing extensions]]
helpful as well. For example, the [[footnote]] extension uses most of the
features documented here.
- * [
+ * [ Postprocessors]
-* [Working with the
+* [Working with the ]
* [Integrating your code into Markdown]
core. This is were stored text gets added back in such as a list of footnotes,
a table of contents or raw html.
-There are two types of postprocessors: [
DOM Postprocessors] and
+There are two types of postprocessors: [ Postprocessors] and
dompostprocessors"> DOM Postprocessors</h4>
+<h4 id="postprocessors"> Postprocessors</h4>
DOM Postprocessor should inherit from `markdown.Postprocessor` and over-ride
+A Postprocessor should inherit from `markdown.Postprocessor` and over-ride
the `run` method which takes one argument `root` and should return either
that root element or a modified root element.
-For specifics on manipulating the
DOM, see [Working with the DOM] below.
+For specifics on manipulating the , see [Working with the ] below.
over-ride the `run` method which takes one argument `text` and returns a
-TextPostprocessors are run after the
DOM has been serialized back into Unicode
+TextPostprocessors are run after the has been serialized back into Unicode
text. For example, this may be an appropriate place to add a table of contents
return MYMARKERRE.sub(MyToc, text)
dom">Working with the DOM</h3>
+<h3 id="working_with_">Working with the </h3>
As mentioned, the Markdown parser converts a source document to an
DOM object before serializing that back to Unicode text.
+[ElementTree] object before serializing that back to Unicode text.
Markdown has provided some helpers to ease that manipulation within the context
-of the Markdown module...
+First of all, to get access to the ElementTree module object you should use:
+It's try to import ElementTree from any known places, first as standard Python
+cElementTree/ElementTree module, then as separately installed cElementTree/ElementTree.
+Another thing you need to know is that all text data, included in <inline> tag will be
+processed later with [InlinePatterns].
+Example below show basic ElementTree functionality:
+ table = etree.Element("table")
+ table.set("cellpadding", "2") # Set cellpadding to 2
+ tr = etree.SubElement(table, "tr") # Added child tr to table
+ td = etree.SubElement(tr, "td") # Added child td to tr
+ td.text = "Cell content" # Added text content to td element
+ table.tail = "Text after table" # Added text after table Element
+ print etree.tostring(table) # Serialized our table
+Now let's write a simple ElementTree Postprocessor, that will add "class" attribute
+ class AttrPostprocessor(markdown.Postprocessor):
+ def _findElement(self, element, name):
+ find elements with @name and return list
+ * element: ElementTree Element
+ * name: tag name to search
+ result += self._findElement(child, name)
+ for element in self._findElement(root, "a"):
+ element.set("class", "MyClass") # Set "class" atribute
+For more information about working with ElementTree visit
+ElementTree [official site](http://effbot.org/zone/element-index.htm).
<h3 id="integrating_into_markdown">Integrating Your Code Into Markdown
[Line Preprocessors]: #linepreprocessors
[DOM Postprocessors]: # dompostprocessors
+ Postprocessors]: #postprocessors
-[Working with the
DOM]: #working_with_ dom
+[Working with the ]: #working_with_
[Integrating your code into Markdown]: #integrating_into_markdown
[Config Settings]: #configsettings