# -*- coding: utf-8 -*-
"""
    MoinMoin - Multiline parser

    Allows line breaks in wiki page source.

    Lines are truncated at the delimiter (default is #),
    then joined with the next line.
    

    EXAMPLES:


{{{#!Multiline
A very long # This comment will be ignored.
line.

[[attachment:Multiline.py  A very #
long link label]]

Escaped \#.  This is NOT a comment.

||'''Name'''||'''Email'''||'''Phone'''||
|| Albert Einstein          #
|| weird_al@einste.in       #
|| 800-314-1897             #
||
|| David Hilbert                # name
|| root@math.uni-goettingen.de  # email
|| 49-(0)551 39 1337            # phone
||
}}}



{{{#!Multiline  delimiter=//
A very long  // C++ pwned Python
line.
}}}


    NON-EXAMPLE:

    {{{#!Multiline
       {{{#!SomeLesserKnownParser
           Moin doesn't support #
           nested brackets.
       }}}
    }}}


    @copyright: 2007 by Paisa Seeluangsawat <paisa@users.sf.net>
    @license: GNU GPL v.2 or later.
"""


from MoinMoin import wikiutil
import re

Dependencies = []


class Parser:

    # allow caching
    caching = 1
    Dependencies = []

    def __init__(self, raw, request, **kw):
        self.delimiter = '#'

        # standard __init__ for a Parser
        self.raw = raw
        self.request = request
        self.form = request.form
        self._ = request.getText

        for arg in kw.get('format_args', '').split(','):
            if arg.find('=') > -1:
                key, value = arg.split('=')
                setattr(self, key, value)

        ### Make sure that our delimiter is sane.
        d = self.delimiter.strip()
        if len(d)==0:
            d = '#'
        # Remove quotes
        if len(d)>2 and (d[0]==d[-1]=="'" or d[0]==d[-1]=='"') :
            d = d[1:-1]
        # Escape non-alphanumeric characters.
        # d = ''.join(  [c.isalnum() and c or '\\'+c for c in d]  )
        d = re.sub('(\W)', lambda m: '\\%s'%m.groups(),  d)
        self.delimiter = d


    def format(self, formatter):
        pattern = re.compile(r"""
            (?<!\\)   # Is the delimiter escaped?
            %s[^\n]*  # delimiter and comments
            \n
        """ % self.delimiter, re.VERBOSE + re.UNICODE)

        new_raw = pattern.sub('', self.raw)

#       # Uncomment this block if you are paranoid.
#         try:
#             processor = wikiutil.importPlugin(self.request.cfg, "parser", "wiki", "Parser")
#         except wikiutil.PluginMissingError:
#             self.request.write(formatter.text(new_raw))

        res = formatter.processor('wiki', [new_raw], 1)      # 1 for "is_parser"
        self.request.write(res)
