Using Python-Markdown on the Command Line
=========================================

While Python-Markdown is primarily a python library, a command line script is 
included as well. While there are many other command line implementations 
of Markdown, you may not have them installed, or you may prefer to use 
Python-Markdown's various extensions.

Setup
-----

Generally, you may simply call the ``markdown`` file from the command 
line. However, if you have fully installed Markdown (``setup.py install`` or 
``easy_install``), then the ``markdown`` script will have been copied to
you Python "Scripts" directory. Different systems require different methods to
ensure that any files in the Python "Scripts" directory are on your system 
path.

* **Windows**:

    Assuming a default install on Windows, your "Scripts" directory is most
    likely something like ``C:\\Python25\Scripts``. Verify the location of
    your "Scripts" directory and add it to you system path.

    Calling ``markdown`` from th ecommand line will call the wrapper batch file
    ``markdown.bat`` in the "Scripts" directory created during install.

* **Linux**:

    As each Linux distribution is different and we can't possibly document all 
    of them here, we'll provide a few helpful pointers:

    * Some systems will automatically install the script on your path. Try it 
      and see if it works. Just run ``markdown`` from the command line.

    * Other systems may maintain a separate "Scripts" directory which you
      need to add to your path. Find it (check with your distribution) and
      either add it to your path or make a symbolic link to it from your path.

    * If you are sure ``markdown`` is on your path, but it still isn't being
      found, check the permissions of the file and make sure it is executable.

    As an alternative, you could just ``cd`` into the directory which contains
    the source distribution, and run it from there. However, remember that your
    markdown text files will not likely be in that directory, so it is much more 
    convenient to have ``markdown`` on your path.

The Basics
----------

To use ``markdown`` from the command line, run it as 

    $ markdown input_file.txt

or 

    $ markdown input_file.txt > output_file.html

More Options
------------

If you are using Python 2.3 or higher, you can also use advanced
command line options to specify encoding or to run extensions.

    $ markdown --help
    Usage: markdown INPUTFILE [options]

    Options:
      -h, --help            show this help message and exit
      -f OUTPUT_FILE, --file=OUTPUT_FILE
                            write output to OUTPUT_FILE
      -e ENCODING, --encoding=ENCODING
                            encoding for input and output files
      -q, --quiet           suppress all messages
      -v, --verbose         print info messages
      -s SAFE_MODE, --safe=SAFE_MODE
                            safe mode ('replace', 'remove' or 'escape'  user's
                            HTML tag)
      -o OUTPUT_FORMAT, --output_format=OUTPUT_FORMAT
                            Format of output. One of 'xhtml1' (default) or
                            'html4'.
      --noisy               print debug messages
      -x EXTENSION, --extension=EXTENSION
                            load extension EXTENSION

Using Extensions
----------------

For an extension to be ran this way it must be provided in a module
which should be in your python path (see [[writing_extensions]] for details). 
It can then be invoked by the name of that module:

    $ markdown -x footnotes text_with_footnotes.txt > output.html

If the extension supports config options, you can pass them in as well:

    $ markdown -x "footnotes(PLACE_MARKER=~~~~~~~~)" input.txt

