|
|
===================================== |
|
|
An Introduction to reStructuredText |
|
|
===================================== |
|
|
:Author: David Goodger |
|
|
:Contact: docutils-develop@lists.sourceforge.net |
|
|
:Revision: $Revision: 7302 $ |
|
|
:Date: $Date: 2012-01-03 20:23:53 +0100 (Di, 03 Jan 2012) $ |
|
|
:Copyright: This document has been placed in the public domain. |
|
|
|
|
|
reStructuredText_ is an easy-to-read, what-you-see-is-what-you-get |
|
|
plaintext markup syntax and parser system. It is useful for inline |
|
|
program documentation (such as Python docstrings), for quickly |
|
|
creating simple web pages, and for standalone documents. |
|
|
reStructuredText_ is a proposed revision and reinterpretation of the |
|
|
StructuredText_ and Setext_ lightweight markup systems. |
|
|
|
|
|
reStructuredText is designed for extensibility for specific |
|
|
application domains. Its parser is a component of Docutils_. |
|
|
|
|
|
This document defines the goals_ of reStructuredText and provides a |
|
|
history_ of the project. It is written using the reStructuredText |
|
|
markup, and therefore serves as an example of its use. For a gentle |
|
|
introduction to using reStructuredText, please read `A |
|
|
ReStructuredText Primer`_. The `Quick reStructuredText`_ user |
|
|
reference is also useful. The `reStructuredText Markup |
|
|
Specification`_ is the definitive reference. There is also an |
|
|
analysis of the `Problems With StructuredText`_. |
|
|
|
|
|
ReStructuredText's web page is |
|
|
http://docutils.sourceforge.net/rst.html. |
|
|
|
|
|
.. _reStructuredText: http://docutils.sourceforge.net/rst.html |
|
|
.. _StructuredText: |
|
|
http://www.zope.org/DevHome/Members/jim/StructuredTextWiki/FrontPage |
|
|
.. _Setext: http://docutils.sourceforge.net/mirror/setext.html |
|
|
.. _Docutils: http://docutils.sourceforge.net/ |
|
|
.. _A ReStructuredText Primer: ../../user/rst/quickstart.html |
|
|
.. _Quick reStructuredText: ../../user/rst/quickref.html |
|
|
.. _reStructuredText Markup Specification: restructuredtext.html |
|
|
.. _Problems with StructuredText: ../../dev/rst/problems.html |
|
|
|
|
|
|
|
|
Goals |
|
|
===== |
|
|
|
|
|
The primary goal of reStructuredText_ is to define a markup syntax for |
|
|
use in Python docstrings and other documentation domains, that is |
|
|
readable and simple, yet powerful enough for non-trivial use. The |
|
|
intended purpose of the reStructuredText markup is twofold: |
|
|
|
|
|
- the establishment of a set of standard conventions allowing the |
|
|
expression of structure within plaintext, and |
|
|
|
|
|
- the conversion of such documents into useful structured data |
|
|
formats. |
|
|
|
|
|
The secondary goal of reStructuredText is to be accepted by the Python |
|
|
community (by way of being blessed by PythonLabs and the BDFL [#]_) as |
|
|
a standard for Python inline documentation (possibly one of several |
|
|
standards, to account for taste). |
|
|
|
|
|
.. [#] Python's creator and "Benevolent Dictator For Life", |
|
|
Guido van Rossum. |
|
|
|
|
|
To clarify the primary goal, here are specific design goals, in order, |
|
|
beginning with the most important: |
|
|
|
|
|
1. Readable. The marked-up text must be easy to read without any |
|
|
prior knowledge of the markup language. It should be as easily |
|
|
read in raw form as in processed form. |
|
|
|
|
|
2. Unobtrusive. The markup that is used should be as simple and |
|
|
unobtrusive as possible. The simplicity of markup constructs |
|
|
should be roughly proportional to their frequency of use. The most |
|
|
common constructs, with natural and obvious markup, should be the |
|
|
simplest and most unobtrusive. Less common constructs, for which |
|
|
there is no natural or obvious markup, should be distinctive. |
|
|
|
|
|
3. Unambiguous. The rules for markup must not be open for |
|
|
interpretation. For any given input, there should be one and only |
|
|
one possible output (including error output). |
|
|
|
|
|
4. Unsurprising. Markup constructs should not cause unexpected output |
|
|
upon processing. As a fallback, there must be a way to prevent |
|
|
unwanted markup processing when a markup construct is used in a |
|
|
non-markup context (for example, when documenting the markup syntax |
|
|
itself). |
|
|
|
|
|
5. Intuitive. Markup should be as obvious and easily remembered as |
|
|
possible, for the author as well as for the reader. Constructs |
|
|
should take their cues from such naturally occurring sources as |
|
|
plaintext email messages, newsgroup postings, and text |
|
|
documentation such as README.txt files. |
|
|
|
|
|
6. Easy. It should be easy to mark up text using any ordinary text |
|
|
editor. |
|
|
|
|
|
7. Scalable. The markup should be applicable regardless of the length |
|
|
of the text. |
|
|
|
|
|
8. Powerful. The markup should provide enough constructs to produce a |
|
|
reasonably rich structured document. |
|
|
|
|
|
9. Language-neutral. The markup should apply to multiple natural (as |
|
|
well as artificial) languages, not only English. |
|
|
|
|
|
10. Extensible. The markup should provide a simple syntax and |
|
|
interface for adding more complex general markup, and custom |
|
|
markup. |
|
|
|
|
|
11. Output-format-neutral. The markup will be appropriate for |
|
|
processing to multiple output formats, and will not be biased |
|
|
toward any particular format. |
|
|
|
|
|
The design goals above were used as criteria for accepting or |
|
|
rejecting syntax, or selecting between alternatives. |
|
|
|
|
|
It is emphatically *not* the goal of reStructuredText to define |
|
|
docstring semantics, such as docstring contents or docstring length. |
|
|
These issues are orthogonal to the markup syntax and beyond the scope |
|
|
of this specification. |
|
|
|
|
|
Also, it is not the goal of reStructuredText to maintain compatibility |
|
|
with StructuredText_ or Setext_. reStructuredText shamelessly steals |
|
|
their great ideas and ignores the not-so-great. |
|
|
|
|
|
Author's note: |
|
|
|
|
|
Due to the nature of the problem we're trying to solve (or, |
|
|
perhaps, due to the nature of the proposed solution), the above |
|
|
goals unavoidably conflict. I have tried to extract and distill |
|
|
the wisdom accumulated over the years in the Python Doc-SIG_ |
|
|
mailing list and elsewhere, to come up with a coherent and |
|
|
consistent set of syntax rules, and the above goals by which to |
|
|
measure them. |
|
|
|
|
|
There will inevitably be people who disagree with my particular |
|
|
choices. Some desire finer control over their markup, others |
|
|
prefer less. Some are concerned with very short docstrings, |
|
|
others with full-length documents. This specification is an |
|
|
effort to provide a reasonably rich set of markup constructs in a |
|
|
reasonably simple form, that should satisfy a reasonably large |
|
|
group of reasonable people. |
|
|
|
|
|
David Goodger (goodger@python.org), 2001-04-20 |
|
|
|
|
|
.. _Doc-SIG: http://www.python.org/sigs/doc-sig/ |
|
|
|
|
|
|
|
|
History |
|
|
======= |
|
|
|
|
|
reStructuredText_, the specification, is based on StructuredText_ and |
|
|
Setext_. StructuredText was developed by Jim Fulton of `Zope |
|
|
Corporation`_ (formerly Digital Creations) and first released in 1996. |
|
|
It is now released as a part of the open-source "Z Object Publishing |
|
|
Environment" (ZOPE_). Ian Feldman's and Tony Sanders' earlier Setext_ |
|
|
specification was either an influence on StructuredText or, by their |
|
|
similarities, at least evidence of the correctness of this approach. |
|
|
|
|
|
I discovered StructuredText_ in late 1999 while searching for a way to |
|
|
document the Python modules in one of my projects. Version 1.1 of |
|
|
StructuredText was included in Daniel Larsson's pythondoc_. Although |
|
|
I was not able to get pythondoc to work for me, I found StructuredText |
|
|
to be almost ideal for my needs. I joined the Python Doc-SIG_ |
|
|
(Documentation Special Interest Group) mailing list and found an |
|
|
ongoing discussion of the shortcomings of the StructuredText |
|
|
"standard". This discussion has been going on since the inception of |
|
|
the mailing list in 1996, and possibly predates it. |
|
|
|
|
|
I decided to modify the original module with my own extensions and |
|
|
some suggested by the Doc-SIG members. I soon realized that the |
|
|
module was not written with extension in mind, so I embarked upon a |
|
|
general reworking, including adapting it to the "re" regular |
|
|
expression module (the original inspiration for the name of this |
|
|
project). Soon after I completed the modifications, I discovered that |
|
|
StructuredText.py was up to version 1.23 in the ZOPE distribution. |
|
|
Implementing the new syntax extensions from version 1.23 proved to be |
|
|
an exercise in frustration, as the complexity of the module had become |
|
|
overwhelming. |
|
|
|
|
|
In 2000, development on StructuredTextNG_ ("Next Generation") began at |
|
|
`Zope Corporation`_ (then Digital Creations). It seems to have many |
|
|
improvements, but still suffers from many of the problems of classic |
|
|
StructuredText. |
|
|
|
|
|
I decided that a complete rewrite was in order, and even started a |
|
|
`reStructuredText SourceForge project`_ (now inactive). My |
|
|
motivations (the "itches" I aim to "scratch") are as follows: |
|
|
|
|
|
- I need a standard format for inline documentation of the programs I |
|
|
write. This inline documentation has to be convertible to other |
|
|
useful formats, such as HTML. I believe many others have the same |
|
|
need. |
|
|
|
|
|
- I believe in the Setext/StructuredText idea and want to help |
|
|
formalize the standard. However, I feel the current specifications |
|
|
and implementations have flaws that desperately need fixing. |
|
|
|
|
|
- reStructuredText could form part of the foundation for a |
|
|
documentation extraction and processing system, greatly benefitting |
|
|
Python. But it is only a part, not the whole. reStructuredText is |
|
|
a markup language specification and a reference parser |
|
|
implementation, but it does not aspire to be the entire system. I |
|
|
don't want reStructuredText or a hypothetical Python documentation |
|
|
processor to die stillborn because of over-ambition. |
|
|
|
|
|
- Most of all, I want to help ease the documentation chore, the bane |
|
|
of many a programmer. |
|
|
|
|
|
Unfortunately I was sidetracked and stopped working on this project. |
|
|
In November 2000 I made the time to enumerate the problems of |
|
|
StructuredText and possible solutions, and complete the first draft of |
|
|
a specification. This first draft was posted to the Doc-SIG in three |
|
|
parts: |
|
|
|
|
|
- `A Plan for Structured Text`__ |
|
|
- `Problems With StructuredText`__ |
|
|
- `reStructuredText: Revised Structured Text Specification`__ |
|
|
|
|
|
__ http://mail.python.org/pipermail/doc-sig/2000-November/001239.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2000-November/001240.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2000-November/001241.html |
|
|
|
|
|
In March 2001 a flurry of activity on the Doc-SIG spurred me to |
|
|
further revise and refine my specification, the result of which you |
|
|
are now reading. An offshoot of the reStructuredText project has been |
|
|
the realization that a single markup scheme, no matter how well |
|
|
thought out, may not be enough. In order to tame the endless debates |
|
|
on Doc-SIG, a flexible `Docstring Processing System framework`_ needed |
|
|
to be constructed. This framework has become the more important of |
|
|
the two projects; reStructuredText_ has found its place as one |
|
|
possible choice for a single component of the larger framework. |
|
|
|
|
|
The project web site and the first project release were rolled out in |
|
|
June 2001, including posting the second draft of the spec [#spec-2]_ |
|
|
and the first draft of PEPs 256, 257, and 258 [#peps-1]_ to the |
|
|
Doc-SIG. These documents and the project implementation proceeded to |
|
|
evolve at a rapid pace. Implementation history details can be found |
|
|
in the `project history file`_. |
|
|
|
|
|
In November 2001, the reStructuredText parser was nearing completion. |
|
|
Development of the parser continued with the addition of small |
|
|
convenience features, improvements to the syntax, the filling in of |
|
|
gaps, and bug fixes. After a long holiday break, in early 2002 most |
|
|
development moved over to the other Docutils components, the |
|
|
"Readers", "Writers", and "Transforms". A "standalone" reader |
|
|
(processes standalone text file documents) was completed in February, |
|
|
and a basic HTML writer (producing HTML 4.01, using CSS-1) was |
|
|
completed in early March. |
|
|
|
|
|
`PEP 287`_, "reStructuredText Standard Docstring Format", was created |
|
|
to formally propose reStructuredText as a standard format for Python |
|
|
docstrings, PEPs, and other files. It was first posted to |
|
|
comp.lang.python_ and the Python-dev_ mailing list on 2002-04-02. |
|
|
|
|
|
Version 0.4 of the reStructuredText__ and `Docstring Processing |
|
|
System`_ projects were released in April 2002. The two projects were |
|
|
immediately merged, renamed to "Docutils_", and a 0.1 release soon |
|
|
followed. |
|
|
|
|
|
.. __: `reStructuredText SourceForge project`_ |
|
|
|
|
|
.. [#spec-2] The second draft of the spec: |
|
|
|
|
|
- `An Introduction to reStructuredText`__ |
|
|
- `Problems With StructuredText`__ |
|
|
- `reStructuredText Markup Specification`__ |
|
|
- `Python Extensions to the reStructuredText Markup |
|
|
Specification`__ |
|
|
|
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001858.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001859.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001860.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001861.html |
|
|
|
|
|
.. [#peps-1] First drafts of the PEPs: |
|
|
|
|
|
- `PEP 256: Docstring Processing System Framework`__ |
|
|
- `PEP 258: DPS Generic Implementation Details`__ |
|
|
- `PEP 257: Docstring Conventions`__ |
|
|
|
|
|
Current working versions of the PEPs can be found in |
|
|
http://docutils.sourceforge.net/docs/peps/, and official versions |
|
|
can be found in the `master PEP repository`_. |
|
|
|
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001855.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001856.html |
|
|
__ http://mail.python.org/pipermail/doc-sig/2001-June/001857.html |
|
|
|
|
|
|
|
|
.. _Zope Corporation: http://www.zope.com |
|
|
.. _ZOPE: http://www.zope.org |
|
|
.. _reStructuredText SourceForge project: |
|
|
http://structuredtext.sourceforge.net/ |
|
|
.. _pythondoc: http://starship.python.net/crew/danilo/pythondoc/ |
|
|
.. _StructuredTextNG: |
|
|
http://www.zope.org/DevHome/Members/jim/StructuredTextWiki/StructuredTextNG |
|
|
.. _project history file: ../../../HISTORY.html |
|
|
.. _PEP 287: ../../peps/pep-0287.html |
|
|
.. _Docstring Processing System framework: ../../peps/pep-0256.html |
|
|
.. _comp.lang.python: news:comp.lang.python |
|
|
.. _Python-dev: http://mail.python.org/pipermail/python-dev/ |
|
|
.. _Docstring Processing System: http://docstring.sourceforge.net/ |
|
|
.. _master PEP repository: http://www.python.org/peps/ |
|
|
|
|
|
|
|
|
.. |
|
|
Local Variables: |
|
|
mode: indented-text |
|
|
indent-tabs-mode: nil |
|
|
sentence-end-double-space: t |
|
|
fill-column: 70 |
|
|
End:
|
|
|
|