# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - WordCount Macro

    @copyright: 2002 by Jürgen Hermann <jh@web.de>
    @license: GNU GPL, see COPYING for details.
"""


Dependencies = ["pages"]

from MoinMoin.Page import Page
from MoinMoin.action import LikePages
import string, re

def execute(macro, args):
    targetLength = 0
    thisPage = macro.request.getPathinfo()[1:]
    # deal with arguments
    if ((args==None) or (args=="")):
        pagenames_raw = [thisPage]
        targetLength = 0
    else:
        argv = string.split(args,",")
        if (len(argv)>1):
           try:
               targetLength = int(argv[-1])
               pagenames_raw = argv[:-1]
           except:
               targetLength = 0
               pagenames_raw = argv
        else:
           arg0 = argv[0]
           try:
               targetLength = int(arg0)
               pagenames_raw = [thisPage]
           except:
               targetLength = 0
               pagenames_raw = [arg0]

    pagenames = []
    for pagename in pagenames_raw:
        if (pagename == "subpages"):
            allPages = macro.request.rootpage.getPageList(user='', exists='')
            matches = LikePages.wikiMatches(thisPage,allPages)
	    for potentialPage in  matches[2].keys():
                if (matches[2][potentialPage]==4):
                    pagenames.append(potentialPage)
        else:
            pagenames.append(pagename)

    sepCount = 0
    separator = re.compile(r"[' ,\.;:\-()]+")

    for pagename in pagenames:
        page = Page(macro.request, pagename)
        body = page.get_raw_body()
        sepCount += len(separator.findall(body))

    result = []
    result.append(macro.formatter.paragraph(1))
    result.append("Word count for " + string.join(pagenames," ") + " is ")
    result.append(macro.formatter.strong(1))
    result.append(macro.formatter.text(str(sepCount)))
    result.append(macro.formatter.strong(0))
    if (targetLength):
        delta = sepCount - targetLength
        message = " exactly"
        if (delta > 0):
            message = macro.formatter.sup(1) + str(delta) + macro.formatter.sup(0) + " over count" 
        elif (delta <0):
            message = macro.formatter.sub(1) + str(abs(delta)) + macro.formatter.sub(0) + " to write"

        result.append(" (target is " + str(targetLength) + ", " + message + ")")
    result.append(macro.formatter.paragraph(0))
    
    return ''.join(result)

