Home | History | Annotate | Download | only in markdown
      1 # markdown is released under the BSD license
      2 # Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
      3 # Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
      4 # Copyright 2004 Manfred Stienstra (the original version)
      5 # 
      6 # All rights reserved.
      7 # 
      8 # Redistribution and use in source and binary forms, with or without
      9 # modification, are permitted provided that the following conditions are met:
     10 # 
     11 # *   Redistributions of source code must retain the above copyright
     12 #     notice, this list of conditions and the following disclaimer.
     13 # *   Redistributions in binary form must reproduce the above copyright
     14 #     notice, this list of conditions and the following disclaimer in the
     15 #     documentation and/or other materials provided with the distribution.
     16 # *   Neither the name of the <organization> nor the
     17 #     names of its contributors may be used to endorse or promote products
     18 #     derived from this software without specific prior written permission.
     19 # 
     20 # THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY
     21 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     22 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     23 # DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT
     24 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30 # POSSIBILITY OF SUCH DAMAGE.
     31 
     32 
     33 """
     34 COMMAND-LINE SPECIFIC STUFF
     35 =============================================================================
     36 
     37 """
     38 
     39 import markdown
     40 import sys
     41 import optparse
     42 
     43 import logging
     44 from logging import DEBUG, INFO, CRITICAL
     45 
     46 logger =  logging.getLogger('MARKDOWN')
     47 
     48 def parse_options():
     49     """
     50     Define and parse `optparse` options for command-line usage.
     51     """
     52     usage = """%prog [options] [INPUTFILE]
     53        (STDIN is assumed if no INPUTFILE is given)"""
     54     desc = "A Python implementation of John Gruber's Markdown. " \
     55            "http://packages.python.org/Markdown/"
     56     ver = "%%prog %s" % markdown.version
     57     
     58     parser = optparse.OptionParser(usage=usage, description=desc, version=ver)
     59     parser.add_option("-f", "--file", dest="filename", default=None,
     60                       help="Write output to OUTPUT_FILE. Defaults to STDOUT.",
     61                       metavar="OUTPUT_FILE")
     62     parser.add_option("-e", "--encoding", dest="encoding",
     63                       help="Encoding for input and output files.",)
     64     parser.add_option("-q", "--quiet", default = CRITICAL,
     65                       action="store_const", const=CRITICAL+10, dest="verbose",
     66                       help="Suppress all warnings.")
     67     parser.add_option("-v", "--verbose",
     68                       action="store_const", const=INFO, dest="verbose",
     69                       help="Print all warnings.")
     70     parser.add_option("-s", "--safe", dest="safe", default=False,
     71                       metavar="SAFE_MODE",
     72                       help="'replace', 'remove' or 'escape' HTML tags in input")
     73     parser.add_option("-o", "--output_format", dest="output_format", 
     74                       default='xhtml1', metavar="OUTPUT_FORMAT",
     75                       help="'xhtml1' (default), 'html4' or 'html5'.")
     76     parser.add_option("--noisy",
     77                       action="store_const", const=DEBUG, dest="verbose",
     78                       help="Print debug messages.")
     79     parser.add_option("-x", "--extension", action="append", dest="extensions",
     80                       help = "Load extension EXTENSION.", metavar="EXTENSION")
     81     parser.add_option("-n", "--no_lazy_ol", dest="lazy_ol", 
     82                       action='store_false', default=True,
     83                       help="Observe number of first item of ordered lists.")
     84 
     85     (options, args) = parser.parse_args()
     86 
     87     if len(args) == 0:
     88         input_file = None
     89     else:
     90         input_file = args[0]
     91 
     92     if not options.extensions:
     93         options.extensions = []
     94 
     95     return {'input': input_file,
     96             'output': options.filename,
     97             'safe_mode': options.safe,
     98             'extensions': options.extensions,
     99             'encoding': options.encoding,
    100             'output_format': options.output_format,
    101             'lazy_ol': options.lazy_ol}, options.verbose
    102 
    103 def run():
    104     """Run Markdown from the command line."""
    105 
    106     # Parse options and adjust logging level if necessary
    107     options, logging_level = parse_options()
    108     if not options: sys.exit(2)
    109     logger.setLevel(logging_level)
    110     logger.addHandler(logging.StreamHandler())
    111 
    112     # Run
    113     markdown.markdownFromFile(**options)
    114 
    115 if __name__ == '__main__':
    116     # Support running module as a commandline command. 
    117     # Python 2.5 & 2.6 do: `python -m markdown.__main__ [options] [args]`.
    118     # Python 2.7 & 3.x do: `python -m markdown [options] [args]`.
    119     run()
    120