# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - TaskPaper Parser
    @copyright: 2007 David O'Callaghan <david.ocallaghan@cs.tcd.ie>
    @license: GNU GPL
    @version: 20071112

    based on:

    MoinMoin - ToDo Parser
     by Terry Brown <terry_n_brown@yahoo.com>

    MoinMoin wiki parser
"""

import MoinMoin.parser.wiki as wiki
import re

Dependencies = []

class Parser:
    """
        Format TaskPaper items
    """

    extensions = '*'
    Dependencies = []

    def __init__(self, raw, request, **kw):
        self.raw = raw
        self.request = request
        self.form = request.form
        self._ = request.getText
        self.list_indents = []
        self.list_types = []
        self.in_li = 0

    # Adapted from wiki.py
    def _indent_level(self):
        """Return current char-wise indent level."""
        return len(self.list_indents) and self.list_indents[-1]

    # Adapted from wiki.py
    def _indent_to(self, new_level, list_type="ul"):
        """Close and open lists."""
        open = []   # don't make one out of these two statements!
        close = []

        #self.request.write("<!-- old: %d, new: %d -->\n" %(self._indent_level(), new_level))

        # Close lists while char-wise indent is greater than the current one
        while ((self._indent_level() > new_level) or
               ( new_level and
                (self._indent_level() == new_level) and
                (self.list_types[-1]) != list_type)):
            self._close_item(close)
            tag = self.formatter.bullet_list(0)
            close.append(tag)

            del(self.list_indents[-1])
            del(self.list_types[-1])
            
            if self.list_types: # we are still in a list
                self.in_li = 1
        # Open new list, if necessary
        if self._indent_level() < new_level:
                    
            self.list_indents.append(new_level)
            self.list_types.append(list_type)

            if self.formatter.in_p:
               close.append(self.formatter.paragraph(0))
            
            tag = self.formatter.bullet_list(1)
            open.append(tag)

            self.first_list_item = 1
            self.in_li = 0

        return ''.join(close) + ''.join(open)


    # Adapted from wiki.py
    def _undent(self):
        """Close all open lists."""
        result = []
        #result.append("<!-- _undent start -->\n")
        self._close_item(result)
        for type in self.list_types:
                result.append(self.formatter.bullet_list(0))
        #result.append("<!-- _undent end -->\n")
        self.list_indents = []
        self.list_types = []
        return ''.join(result)

    # Adapted from wiki.py
    def _close_item(self, result):
        #result.append("<!-- close item begin -->\n")
        if self.in_li:
            self.in_li = 0
            if self.formatter.in_p:
                result.append(self.formatter.paragraph(0))
            result.append(self.formatter.listitem(0))
        #result.append("<!-- close item end -->\n")

    def format(self, formatter):
        """ Send the text. """

        _ = self._

        def emit(x): self.request.write(x)
        def wemit(x):
            """emit something using wiki parser"""
            wk = wiki.Parser(x, self.request)
            wk.format(formatter)

        f = formatter
        self.formatter = formatter

        indent_re = re.compile("^\s*", re.UNICODE)

        for line in self.raw.split('\n'):

            if line.startswith('#'): continue  # a comment

            if line.endswith(':'): # heading
                emit(self._undent())
                emit(f.heading(1,1))
                emit(line)
                emit(f.heading(0,1))

            elif line.lstrip().startswith('-'): # task
                indent = indent_re.match(line)
                indlen = len(indent.group(0))
                emit(self._indent_to(indlen+1))

                done = line.find('@done') != -1
                if(done):
                        emit(f.listitem(1, style="list-style-type: disc; text-decoration: line-through; filter:alpha(opacity=60); opacity:.60"))
                else:
                        emit(f.listitem(1, style="list-style-type: circle"))
                
                #find tags
                #tagre = re.compile("@[a-zA-Z0-9]+(?:\\([-a-zA-Z0-9]\\))??")
                tagre = re.compile("@[a-zA-Z0-9]+")
                tags =  tagre.findall(line)
                task = re.sub(tagre, "", line)

                emit(task) 

                for tag in tags:
                        emit(f.small(1))
                        emit(f.emphasis(1))
                        emit(tag)
                        emit(f.emphasis(0))
                        emit(f.small(0))

                emit(f.listitem(0))
#            try:
#                done = '2611' if int(item['percent']) == 100 else '2610'
#            except:  # int() raised something
#                done = '2610'
#                if k == 'title': txt = '&#x%s; %s' % (done, txt)
#                wemit(txt)

#            if line.startswith((' ','\t')) or line == '':  # extra material
#                continue
            else:
                wemit(line)

        emit(self._undent())
