#!/usr/bin/python
# -*- python -*-
import codecs
import locale
from optparse import OptionParser
import slacklog
from slacklog import parsers
from slacklog import formatters

def u(str):
    if str: return str.decode(locale.getpreferredencoding())
    return None

def i(str):
    if str: return int(str)
    return None

#
#   Define options
#
options = OptionParser(usage='USAGE: %prog [options] --changelog FILE --datadir DATADIR',
                       version='%%prog %s' % slacklog.__version__,
                       description='Convert Slackware ChangeLog to PyBlosxom blog entries',
                       epilog='Bug reports, suggestions, and patches should be sent to vmj@linuxbox.fi.'
                             +'This software is Free Software, released under GPLv3.')
options.add_option('--changelog',      metavar='FILE',           help='Read input from FILE')
options.add_option('--encoding',       default='iso8859-1',      help='ChangeLog encoding [default: %default]')
options.add_option('--min-date',       metavar='DATE',           help='Last date to include [default: include all]')
options.add_option('--datadir',        metavar='DATADIR',        help='PyBlosxom blog datadir')
options.add_option('--quiet',          action='store_true',      help='Do not print warnings')
options.add_option('--max-entries',    metavar='NUM',            help='Maximum number of blog entries [default: infinity]')
options.add_option('--slackware',      default='Slackware 13.1', help='Slackware version [default: %default]')
options.add_option('--entry-extension',default='txt',            help='PyBlosxom entry extention [default: %default]')
options.add_option('--entry-encoding', default='utf-8',          help='PyBlosxom entry encoding [default: %default]')
options.add_option('--tags-separator', default=',',              help='PyBlosxom tags separator [default: %default]')
options.add_option('--pkg-separator',  default=':',              help='Separator for pkg and description [default: %default]')
options.add_option('--pyfilemtime',    action='store_true',      help='Enable pyfilemtime compliance')
options.add_option('--overwrite',      action='store_true',      help='Overwrite entries that exist')
options.add_option('--no-backup',      action='store_true',      help='Make a backup before overwriting')

#
#   Handle command line options
#
(opts, args) = options.parse_args()
if opts.changelog is None or opts.datadir is None:
    options.error('Options --changelog and --datadir are required')

#
#   Apply options to parser and formatter
#
parsers.SlackLogParser.quiet    = opts.quiet
parsers.SlackLogParser.min_date = parsers.SlackLogParser.parse_date(u(opts.min_date))

formatters.SlackLogPyblosxomFormatter.max_entries    = i(opts.max_entries)
formatters.SlackLogPyblosxomFormatter.quiet          = opts.quiet
formatters.SlackLogPyblosxomFormatter.slackware      = u(opts.slackware)
formatters.SlackLogPyblosxomFormatter.datadir        = u(opts.datadir)
formatters.SlackLogPyblosxomFormatter.extension      = u(opts.entry_extension)
formatters.SlackLogPyblosxomFormatter.encoding       = u(opts.entry_encoding)
formatters.SlackLogPyblosxomFormatter.tags_separator = u(opts.tags_separator)
formatters.SlackLogPyblosxomFormatter.pkg_separator  = u(opts.pkg_separator)
formatters.SlackLogPyblosxomFormatter.overwrite      = opts.overwrite
formatters.SlackLogPyblosxomFormatter.backup         = not opts.no_backup
formatters.SlackLogPyblosxomFormatter.pyfilemtime    = opts.pyfilemtime

#
#   Read input
#
try:
    f = codecs.open(opts.changelog, 'r', opts.encoding)
except IOError, e:
    print "%s: %s" % (e.filename, e.strerror)
    exit(e.errno)
try:
    txt = f.read()
except UnicodeDecodeError, e:
    print "%s: %s-%s: %s: %s" % (opts.changelog, e.start, e.end, e.encoding, e.reason)
    exit(-1)
f.close()

#
#   Format output (output goes to files, no need to capture the result)
#
formatters.SlackLogPyblosxomFormatter.format(parsers.SlackLogParser.parse(txt))

