# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - ShowCSV2

    This macro is used to show csv data as wiki table

    default extension is .csv
    you can change that with the args parameter:
    extension=<namen> (extension=csv)
   
    default delimiter is ; (semicolon)
    you can change that with the args paramter:
    delimiter = semicolon | comma | pipe (delimiter=pipe)

    First element of each column in csv table is used as column description

    History:
    07-21-2008: Added some arguments for the extension and the delimiter 
                MoinMoin:MarcelHäfner

    @copyright: 2007 MoinMoin:ReimarBauer
    @license: GNU GPL, see COPYING for details.
"""

Dependencies = ['time'] # do not cache

import os, codecs, csv
from MoinMoin import config, wikiutil
from MoinMoin.action import AttachFile
from MoinMoin.parser.text_moin_wiki import Parser

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

def execute(macro, args):
    request = macro.request
    formatter = macro.formatter

    if args is None:
        args = u''
    try:
        # Parse given arguments
        params, named_params, trailing = wikiutil.parse_quoted_separated(args)
        # Unpack parameters; but no default parameter are needed
    except (ValueError, TypeError), err:
        return macro.format_error(err)

    # get the params and add some default, also lower them
    extension = wikiutil.escape(named_params.get("extension", "csv")).lower()
    delimiter = wikiutil.escape(named_params.get("delimiter", "semikolon")).lower()

    class SKV(csv.excel):
        # class for the csv.reader 
        # default delimiter is the semicolon
        delimiter = ";"

    # parse the args for a delimiter, if no match the default in class SKV is used
    if delimiter == "semicolon":
        SKV.delimiter = ";"
    if delimiter == "comma":
        SKV.delimiter = ","
    if delimiter == "pipe":
       SKV.delimiter = "|"
    
    #register the SKV for the csv.reader later
    csv.register_dialect("SKV", SKV)

    pagename = formatter.page.page_name
    files = AttachFile._get_files(request, pagename)
    attach_dir = AttachFile.getAttachDir(request, pagename)

    for file in files:
        if file.lower().endswith(extension.lower()):
            file_id = codecs.open(os.path.join(attach_dir, file), 'rb', config.charset)
            reader = csv.reader(utf_8_encoder(file_id), "SKV" )
            index = 0
            result = ""
            for row in reader:
                if index == 0:
                    result += "|| '''"
                    result += "''' || '''".join(row)
                    result += "''' ||\n"
                else:
                    result += '|| '
                    result += '|| '.join(row)
                    result += ' ||\n'
                index += 1

            result += ' . \n'
            result = wikiutil.url_unquote(result)
            result += '[[attachment:%s]]' % file

            result = wikiutil.escape(result)
            p = Parser(result, request)
            p.format(request.formatter)

    return ""

