# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - SimpleInclude Macro
    Version 0.1

    Includes the specified page in the current page
    [[SimpleInclude(pagename)]]

    @copyright: 2007 by Kenneth Bull
    @license: GNU GPL, see COPYING for details.

"""

import StringIO
from MoinMoin.Page import Page
from MoinMoin import wikiutil

def getPageContent(request, formatter, pagename):
    _ = request.getText

    inc_name = wikiutil.AbsPageName(request, formatter.page.page_name, pagename)
    this_page = formatter.page

    if not hasattr(this_page, '_macroInclude_pagelist'):
        this_page._macroInclude_pagelist = {}

    if this_page._macroInclude_pagelist.has_key(inc_name):
        return '<p><strong class="error">Recursive include of "%s" forbidden</strong></p>' % inc_name

    fmt = formatter.__class__(request, is_included=True)
    fmt._base_depth = formatter._base_depth
    inc_page = Page(request, inc_name, formatter=fmt)

    # set or increment include marker
    this_page._macroInclude_pagelist[inc_name] = \
        this_page._macroInclude_pagelist.get(inc_name, 0) + 1

    inc_page._macroInclude_pagelist = this_page._macroInclude_pagelist

    if not hasattr(request, "_Include_backto"):
        request._Include_backto = this_page.page_name

    # output the included page
    strfile = StringIO.StringIO()
    request.redirect(strfile)
    try:
        cid = request.makeUniqueID("Include_%s" % wikiutil.quoteWikinameURL(inc_page.page_name))
        inc_page.send_page(request, content_only=1, content_id=cid,
                           omit_footnotes=True)
    finally:
        request.redirect()

    # decrement or remove include marker
    if this_page._macroInclude_pagelist[inc_name] > 1:
        this_page._macroInclude_pagelist[inc_name] = \
            this_page._macroInclude_pagelist[inc_name] - 1
    else:
        del this_page._macroInclude_pagelist[inc_name]

    # return include text
    return strfile.getvalue()

def getEditLink(request, formatter, pagename):
    _ = request.getText
    inc_name = wikiutil.AbsPageName(request, formatter.page.page_name, pagename)
    fmt = formatter.__class__(request, is_included=True)
    fmt._base_depth = formatter._base_depth
    inc_page = Page(request, inc_name, formatter=fmt)
    return "".join([formatter.div(1, css_class="include-link"),
                    inc_page.link_to(request, '[%s]' % (inc_name), css_class="include-page-link"),
                    inc_page.link_to(request, '[%s]' % (_('edit'),), css_class="include-edit-link", querystr={'action': 'edit', 'backto': request._Include_backto}),
                    formatter.div(0)])

def execute(macro, args):
#    print_mode = macro.form.has_key('action') and macro.form['action'][0] in ("print", "format")
    result = getPageContent(macro.request, macro.formatter, args)
    result += getEditLink(macro.request, macro.formatter, args)
    return result    
