# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - Plain Text Parser, fallback for text/*

    You can supply format_args like this:
    {{{#!text cssclass1/cssclass2,<show_num>
    ...
    }}}
    The css classes are used for a wrapping div (same way as wiki parser does
    it).
    If show_num is 1, we use the code_area formatter and you will be able to
    toggle the line numbers by some javascript toggling link.

    @copyright: 2000-2002 Juergen Hermann <jh@web.de>,
                2007 MoinMoin:ThomasWaldmann
    @license: GNU GPL, see COPYING for details.
"""

import sha
from MoinMoin import config

Dependencies = []

class Parser:
    """
        Send plain text in a HTML <pre> element.
    """

    ## specify extensions willing to handle (for inline:)
    ## should be a list of extensions including the leading dot
    ## TODO: remove the leading dot from the extension. This is stupid.
    #extensions = ['.txt']
    ## use '*' instead of the list(!) to specify a default parser
    ## which is used as fallback
    extensions = '*'
    Dependencies = []
    
    def __init__(self, raw, request, **kw):
        self.raw = raw
        self.request = request
        self.form = request.form
        self._ = request.getText
        format_args = kw.get('format_args', '').strip() + ','
        wrapping_div_class, show_num = format_args.split(',')[:2]
        self.wrapping_div_class = wrapping_div_class.replace('/', ' ')
        try:
            self.show_num = int(show_num)
            self.num_start = 1
            self.num_step = 1
        except:
            self.show_num = 0

    def format(self, formatter):
        """ Send the text. """
        if self.wrapping_div_class:
            div_kw = {'css_class': self.wrapping_div_class, }
            if 'comment' in self.wrapping_div_class.split():
                # show comment divs depending on user profile (and wiki configuration)
                div_kw['style'] = self.request.user.show_comments and "display:''" or "display:none"
            self.request.write(formatter.div(1, **div_kw))

        lines = self.raw.expandtabs().split('\n')
        output = []
        if self.show_num:
            _code_id = sha.new(self.raw.encode(config.charset)).hexdigest()
            self.request.write(formatter.code_area(1, _code_id, 'NumberedText', self.show_num, self.num_start, self.num_step))
            for line in lines:
                output.extend([formatter.code_line(1),
                               formatter.text(line),
                               formatter.code_line(0), ])
            self.request.write(''.join(output))
            self.request.write(formatter.code_area(0, _code_id))
        else:
            self.request.write(formatter.preformatted(1))
            for line in lines:
                output.extend([formatter.text(line),
                               formatter.linebreak(), ])
            self.request.write(''.join(output))
            self.request.write(formatter.preformatted(0))

        if self.wrapping_div_class:
            self.request.write(formatter.div(0))
