Ejemplo n.º 1
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    _ = macro.request.getText

    pagename = args or 'Fortune Cookies'
    page = Page(pagename, macro.request)
    raw = page.get_raw_body(fresh=macro.request.set_cache)
    if not macro.request.user.may.read(page):
        raw = ""

    # this selects lines looking like a list item
    # !!! TODO: make multi-line quotes possible
    # (optionally split by "----" or something)
    quotes = raw.splitlines()
    quotes = [quote.strip() for quote in quotes]
    quotes = [quote[2:] for quote in quotes if quote.startswith('* ')]
    
    if not quotes:
        return (macro.formatter.highlight(1) +
                _('No quotes on %(pagename)s.') % {'pagename': pagename} +
                macro.formatter.highlight(0))
                
    quote = random.choice(quotes)

    if quote.lower().find("randomquote") == -1:
        quote = wikiutil.wikifyString(quote, macro.request, page, strong=True)
        quote = wikiutil.stripOuterParagraph(quote)

    return quote
Ejemplo n.º 2
0
def doParse(text, macro, keep_outer_paragraph=False):
    if not text.strip():
        return ''
    parsed = wikiutil.wikifyString(text, macro.request, macro.formatter.page)
    if keep_outer_paragraph:
        return parsed.strip()
    else:
        return wikiutil.stripOuterParagraph(parsed).strip()
Ejemplo n.º 3
0
def execute(macro, args, formatter):
    if not args:
        return "<em>Please provide an address.</em>"
    if not formatter:
        formatter = macro.formatter

    # re for old format Address("address","description")
    oldformat = re.compile(r"^\s*\"(.+)\"\s*,\s*\"(.+)\"\s*$")

    # re for new format Address("address","lat","long")
    newformat = re.compile(r"^\s*\"(.+)\"\s*,\s*\"(.+)\"\s*,\s*\"(.+)\"\s*$")

    lat = None
    long = None
    if newformat.search(args):
        (address, lat, long) = newformat.search(args).groups()
    elif oldformat.search(args):
        (address, parm1) = oldformat.search(args).groups()
    else:
        address = args
        address = address.strip('"')

    # allow links in the address to work properly
    wikified_address = wikiutil.stripOuterParagraph(wikiutil.wikifyString(address, macro.request, formatter.page))
    address = wikiutil.simpleStrip(macro.request, wikified_address).strip()

    if macro.request.config.address_locale and address.find(",") == -1:
        # add the address locale if it's lacking
        full_address = "%s, %s" % (address, macro.request.config.address_locale)
    else:
        full_address = address

    if macro.request.config.has_old_wiki_map:
        # we just ignore [[address]] on davis wiki
        return wikified_address

    if lat is None:
        place = Location(macro, formatter, full_address)
    else:
        place = Location(macro, formatter, full_address, lat, long)

    if place.latitude is None:
        return wikified_address
    else:
        out = wikified_address
        nearby = place.getNearby()
        out += mapHTML(macro, place, nearby)
        ignore = formatter.name != "text_python" or formatter.page.prev_date
        if not ignore:
            if macro.request.addresses.has_key(formatter.page.page_name):
                macro.request.addresses[formatter.page.page_name].append(place)
            else:
                macro.request.addresses[formatter.page.page_name] = [place]
        return out
Ejemplo n.º 4
0
def emit_footnotes(request, formatter):
    # emit collected footnotes
    if request.footnotes:
        request.write(formatter.rawHTML(
            '<div class="footnotes"><div></div><ul>'))
        for idx in range(len(request.footnotes)):
            fn_id = request.footnotes[idx][1]
            fn_no = formatter.anchorlink('fnref'+fn_id, str(idx+1),
                                         id='fndef'+fn_id)

            request.write(formatter.rawHTML('<li><span>%s</span>' % fn_no))
            request.write(wikiutil.stripOuterParagraph(wikiutil.wikifyString(
                request.footnotes[idx][0], formatter.request, formatter.page,
                formatter=formatter)))
            request.write(formatter.rawHTML('</li>'))
        request.write(formatter.rawHTML('</ul></div>'))
        request.footnotes = []
    return ''
Ejemplo n.º 5
0
    def _heading_repl(self, word):
        """
        Handle section headings.
        """
        self.inhibit_p = 1
        self.inhibit_br += 2
        icons = ''
        result = []
        if self.in_li or self.formatter.in_p:
            self._close_item(result)

        h = word.strip()
        level = 1
        while h[level:level+1] == '=':
            level = level+1
        depth = min(5,level)

        title_text = h[level:-level].strip()
        # we wikify the title so that things like links show up in the heading
        title_text = wikiutil.stripOuterParagraph(wikiutil.wikifyString(
                        title_text, self.request, self.formatter.page))

        self.titles.setdefault(title_text, 0)
        self.titles[title_text] += 1

        unique_id = ''
        if self.titles[title_text] > 1:
            unique_id = '-%d' % self.titles[title_text]

        self.force_print_p = True
        result.append(self.formatter.heading(
            depth, title_text, icons=icons,
            id=("head-" + sha.new(title_text.encode('utf-8')).hexdigest() +
                unique_id
               ).decode('utf-8')))

        return ''.join(result)
Ejemplo n.º 6
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter

    # A regular expression that borders on incomprehensible
    heading = re.compile(r"^\s*(?P<hmarker>=+)\s*(.*)\s*(?P=hmarker)")
    result = []
    baseindent = 0
    indent = 0
    lineno = 0
    titles = {}
    right = False
    left = False
    if args:
        if args.lower() == 'right':
            right = True
        elif args.lower() == 'left':
            left = True

    try:
        mindepth = int(macro.request.getPragma('section-numbers', 1))
    except (ValueError, TypeError):
        mindepth = 1

    try:
        maxdepth = max(int(args), 1)
    except (ValueError, TypeError):
        maxdepth = 99

    for line in macro.parser.lines:
        # Filter out the headings
        lineno = lineno + 1
        # FIXME this also finds "headlines" in {{{ code sections }}}:
        match = heading.match(line)
        if not match:
            continue
        title_text = match.group(2).strip() # A slightly questionable strip
        if not title_text:
            continue
        wikified_title = wikiutil.wikifyString(title_text, macro.request,
                                               formatter.page)
        title_text = wikiutil.simpleStrip(macro.request, 
                        wikiutil.stripOuterParagraph(wikified_title))
        titles.setdefault(title_text, 0)
        titles[title_text] += 1

        # Get new indent level
        newindent = len(match.group(1))
        if newindent > maxdepth:
            continue
        if newindent < mindepth:
            continue

        # Close lists
        for i in range(0,indent-newindent):
            result.append(macro.formatter.number_list(0))

        # Open Lists
        for i in range(0,newindent-indent):
            result.append(macro.formatter.number_list(1))

        # Add the heading
        unique_id = ''
        if titles[title_text] > 1:
            unique_id = '-%d' % titles[title_text]

        result.append(macro.formatter.listitem(1))
        result.append(macro.formatter.anchorlink(
                        "head-" +
                            sha.new(title_text.encode('utf-8')).hexdigest() +
                            unique_id,
                        title_text, escape=False))
        result.append(macro.formatter.listitem(0))
        
        # Set new indent level
        indent = newindent

    # Close pending lists
    for i in range(baseindent, indent):
        result.append(macro.formatter.number_list(0))

    html_class = 'tableOfContents'
    if not result:
        return ''
    if right:
        html_class += ' floatRightTOC'
    elif left:
        html_class += ' floatLeftTOC'
    return ('<table class="%s"><tr><td>' % html_class + ''.join(result) +
            '</td></tr></table>')
Ejemplo n.º 7
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    if line_has_just_macro(macro, args, formatter):
      macro.parser.inhibit_br = 2

    macro_text = ''

    baseurl = macro.request.getScriptname()
    action = 'Files' # name of the action that does the file stuff
    html = []
    ticketString = None # for temporary thumbnail generation
    pagename = formatter.page.page_name
    urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name())

    if not args:
        macro_text += formatter.rawHTML(
            '<b>Please supply at least an image name, e.g. '
            '[[Image(image.jpg)]], where image.jpg is an image that\'s been '
            'uploaded to this page.</b>')
	return macro_text

    # image.jpg, "caption, here, yes", 20, right --- in any order
    # (filename first)
    # the number is the 'max' size (width or height) in pixels

    # parse the arguments
    try:
        (image_name, caption, thumbnail, px_size, alignment,
         border) = getArguments(args)
    except:
        macro_text += formatter.rawHTML('[[Image(%s)]]' % wikiutil.escape(args))
        return macro_text

    if not wikiutil.isImage(image_name):
        macro_text += "%s does not seem to be an image file." % image_name
        return macro_text

    url_image_name = urllib.quote(image_name.encode(config.charset))

    if (macro.formatter.processed_thumbnails.has_key(
            (pagename, image_name)) and
        (thumbnail or caption)):
        macro_text += ('<em style="background-color: #ffffaa; padding: 2px;">'
                       'A thumbnail or caption may be displayed only once per '
                       'image.</em>')
        return macro_text

    macro.formatter.processed_thumbnails[(pagename, image_name)] = True
    
    #is the original image even on the page?
    macro.request.cursor.execute("""SELECT name
                                    FROM files
                                    WHERE name=%(image_name)s and
                                    attached_to_pagename=%(pagename)s and
                                    wiki_id=%(wiki_id)s""",
                                 {'image_name':image_name,
                                  'pagename':pagename.lower(),
                                  'wiki_id':macro.request.config.wiki_id})
    result = macro.request.cursor.fetchone()
    image_exists = result

    if not image_exists:
        # lets make a link telling them they can upload the image,
        # just like the normal attachment
        linktext = 'Upload new image "%s"' % (image_name)
        macro_text += wikiutil.attach_link_tag(macro.request,
                  '%s?action=Files&amp;rename=%s#uploadFileArea' % (
                      wikiutil.quoteWikiname(formatter.page.proper_name()),
                      url_image_name),
                  linktext)
        return macro_text

    full_size_url = (baseurl + "/" + urlpagename + "?action=" + action +
                     "&amp;do=view&amp;target=" + url_image_name)
    # put the caption in the db if it's new and if we're not in preview mode
    if not formatter.isPreview():
        touchCaption(pagename, pagename, image_name, caption, macro.request)
    if caption:
        # parse the caption string
        caption = wikiutil.stripOuterParagraph(wikiutil.wikifyString(
            caption, formatter.request, formatter.page, formatter=formatter))

    if thumbnail:
        # let's generated the thumbnail or get the dimensions if it's
        # already been generated
        if not px_size:
            px_size = default_px_size
        (x, y), ticketString = touchThumbnail(macro.request, pagename,
                                              image_name, px_size, formatter)

        d = {'right':'floatRight', 'left':'floatLeft', '':'noFloat'}
        floatSide = d[alignment]
        if caption and border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '<span>%s</span>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name, caption))
        elif border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name))
        elif caption and not border:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '<span>%s</span></span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name, caption))
        else:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name))
    else:
        x, y = getImageSize(pagename, image_name, macro.request)

        if not x and not y:
            # image has no size..something went amuck
            setImageSize(pagename, image_name, macro.request)
            x, y = getImageSize(pagename, image_name, macro.request)

        if not border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s"/></a>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name))
        elif border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s"/></a>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name))
        elif border and caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name, x, caption))
        elif not border and caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name, x, caption))

        if alignment == 'right':
            img_string = '<span class="floatRight">' + img_string + '</span>'
        elif alignment == 'left':
            img_string = '<span class="floatLeft">' + img_string + '</span>'

        html.append(img_string)
      
    macro_text += ''.join(html)
    return macro_text
Ejemplo n.º 8
0
def execute(macro, args, formatter):
    if not args:
        return "<em>Please provide an address.</em>"
    if not formatter:
        formatter = macro.formatter

    # re for old format Address("address","description")
    oldformat = re.compile(r'^\s*\"(.+)\"\s*,\s*\"(.+)\"\s*$')

    # re for new format Address("address","lat","long")
    newformat = re.compile(r'^\s*\"(.+)\"\s*,\s*\"(.+)\"\s*,\s*\"(.+)\"\s*$')

    lat = None
    long = None
    parm1 = None
    if newformat.search(args):
        (address,lat,long) = newformat.search(args).groups()
    elif oldformat.search(args):
        (address,parm1) = oldformat.search(args).groups()
    else:       
        address = args
        address = address.strip('"')
         
    # allow links in the address to work properly
    wikified_address = wikiutil.stripOuterParagraph(
        wikiutil.wikifyString(address, macro.request, formatter.page))
    address = wikiutil.simpleStrip(macro.request, wikified_address).strip()

    if macro.request.config.address_locale and address.find(',') == -1:
        # add the address locale if it's lacking
        full_address = '%s, %s' % (address,
                                   macro.request.config.address_locale)
    else:
        full_address = address

    if macro.request.config.has_old_wiki_map:
        # we just ignore [[address]] on davis wiki
        return wikified_address
    
    if lat is None:
        place = Location(macro,formatter,full_address)
    else:
        place = Location(macro,formatter,full_address,lat,long)

    if place.latitude is None:
        return wikified_address
    else:
        if parm1:
            out = wikiutil.stripOuterParagraph(
                    wikiutil.wikifyString(parm1, macro.request, formatter.page))
        else:
            out = wikified_address
        out += ' <a href="http://maps.google.com/maps?f=d&hl=en&daddr='
        out += urllib.quote_plus(address)
        out += '"><img class="dd_icon" src="'
        out += "%s%s/dd-start.png" % (config.web_dir, config.url_prefix)
        out += '" alt="[Directions]" title="Click for driving, walking, or bus '
        out += 'directions from Google" height="17" width="10"></a>'
        addresscount = place.getAddressCount()
        if addresscount > 5:
            # There's more addresses than usual; let's ratchet back the nearbys
            maxnearby = int(75/addresscount)
            out += ' <!-- limiting to %i of %i nearby locations -->' % (
                    maxnearby, addresscount)
        else:
            maxnearby=15
        nearby = place.getNearby(max=maxnearby)
        out += mapHTML(macro,place,nearby)
        ignore = formatter.name != 'text_python' or formatter.page.prev_date
        if not ignore:
            if macro.request.addresses.has_key(formatter.page.page_name):
                macro.request.addresses[formatter.page.page_name].append(place)
            else:
                macro.request.addresses[formatter.page.page_name] = [place]
        return out
Ejemplo n.º 9
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    if line_has_just_macro(macro, args, formatter):
      macro.parser.inhibit_br = 2

    if config.memcache:
        mc = macro.request.mc
    else:
        return formatter.rawHTML('<!-- Flickr support requires memcache -->')

    macro_text = ''

    baseurl = config.flickr_cgiurl
    html = []
    pagename = formatter.page.page_name
    urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name())

    if not args:
        macro_text += formatter.rawHTML(
            '<b>Please supply at least an image ID, e.g. '
            '[[Flickr(3046120549)]], where 3046120549 is a Flickr '
            'photo ID number.</b>')
        return macro_text

    # id, "caption, here, yes", Large, right --- in any order
    # (filename first)
    # the 'Large' is the size

    # parse the arguments
    try:
        (image_name, caption, thumbnail, px_size, alignment,
         border) = getArguments(args)
    except:
        macro_text += formatter.rawHTML('[[Flickr(%s)]]' % wikiutil.escape(args))
        return macro_text

    url_image_name = urllib.quote(image_name.encode(config.charset))

    photohandle = flickr.Photo(image_name)
    try:
        validsizes = mc.get('flickr-%s-validsizes' % url_image_name)
        if not validsizes:
            validsizes = []
            for i in photohandle.getSizes():
                validsizes.append(i['label'].lower())
                mc.set('flickr-%s-validsizes' % url_image_name, validsizes, time=3*24*60*60)
    except flickr.FlickrError:
        macro_text += '%s does not seem to be a valid Flickr photo' % image_name
        return macro_text

    licensename = mc.get('flickr-license-%s' % photohandle.license)
    try:
        # sanity check on licensename
        tmpfoo1, tmpfoo2 = licensename
        if not (type(tmpfoo1) == type(tmpfoo2) == type(str())):
            licensename = None
    except:
        licensename = None

    if not licensename:
        licensename = licenses_getInfo(photohandle.license)
        if licensename:
            mc.set('flickr-license-%s' % photohandle.license, licensename, time=3*24*60*60)
        else:
            licensename = ('unknown license id %s', 'http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html')
            mc.set('flickr-license-%s' % photohandle.license, licensename, time=60*60)

    size = px_size
    oklicenses = ['1','2','3','4','5','6','7','8']
    ok = mc.get('flickr-%s-%s-ok' % (url_image_name, size))

    if not ok:
        if (photohandle.license in oklicenses) and (photohandle.ispublic):
            ok = True
            mc.set('flickr-%s-%s-ok' % (url_image_name, size), ok, time=60*60*12)
        else:
            ok = False

    if not ok:
        macro_text += 'License for image %s does not allow us to include this image.' % image_name
        return macro_text
    if px_size.lower() not in validsizes:
        macro_text += '%s is not a valid size for %s.  Try: %s' % (px_size, image_name, string.join(validsizes, ', '))
        return macro_text

    ownername = mc.get('flickr-%s-owner' % (url_image_name))
    if not ownername:
        ownername = photohandle.owner.username
        mc.set('flickr-%s-owner' % (url_image_name), ownername)

    if not ownername: ownername = '(unknown)'

    if (macro.formatter.processed_thumbnails.has_key(
            (pagename, image_name)) and
        (thumbnail or caption)):
        macro_text += ('<em style="background-color: #ffffaa; padding: 2px;">'
                       'A thumbnail or caption may be displayed only once per '
                       'image.</em>')
        return macro_text

    macro.formatter.processed_thumbnails[(pagename, image_name)] = True

    urls = mc.get('flickr-%s-%s-urls' % (url_image_name, size))
    if not urls:
        urls = {}
        urls['img'] = photohandle.getURL(urlType='source',size=size)
        urls['link'] = photohandle.getURL(urlType='url',size=size)
        mc.set('flickr-%s-%s-urls' % (url_image_name, size), urls, time=60*60*24)

    full_size_url = urls['link']

    # put the caption in the db if it's new and if we're not in preview mode
    if not formatter.isPreview():
        touchCaption(pagename, pagename, image_name, caption, macro.request)
    if caption:
        caption += ' (by Flickr user %s [%s license info])' % (ownername, licensename[1])
        # parse the caption string
        caption = wikiutil.stripOuterParagraph(wikiutil.wikifyString(
            caption, formatter.request, formatter.page, formatter=formatter))

    if thumbnail:
        # let's generated the thumbnail or get the dimensions if it's
        # already been generated
        if not px_size:
            px_size = default_px_size
        x, y = getImageSize(pagename, photohandle, px_size, macro.request)
        d = {'right':'floatRight', 'left':'floatLeft', '':'noFloat'}
        floatSide = d[alignment]
        if caption and border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" title="%s" style="display:block;"/></a>'
                        '<span>%s</span>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
             baseurl + '?id=' + image_name + '&size=' + px_size,
                         image_name, licensename[0], caption))
        elif border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" title="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
             baseurl + '?id=' + image_name + '&size=' + px_size,
                         image_name, licensename[0]))
        elif caption and not border:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" title="%s" style="display:block;"/></a>'
                        '<span>%s</span></span>' %
                        (floatSide, int(x)+2, full_size_url,
             baseurl + '?id=' + image_name + '&size=' + px_size,
                         image_name, licensename[0], caption))
        else:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" title="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
             baseurl + '?id=' + image_name + '&size=' + px_size,
                         image_name, licensename[0]))
    else:
        x, y = getImageSize(pagename, photohandle, px_size, macro.request)

        if not border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s" title="%s"/></a>' %
                          (full_size_url,
               baseurl + '?id=' + image_name + '&size=' + px_size,
                           image_name, licensename[0]))
        elif border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s" title="%s"/></a>' %
                          (full_size_url,
               baseurl + '?id=' + image_name + '&size=' + px_size,
                           image_name, licensename[0]))
        elif border and caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s" title="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
               baseurl + '?id=' + image_name + '&size=' + px_size,
                           image_name, licensename[0], x, caption))
        elif not border and caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s" title="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
               baseurl + '?id=' + image_name + '&size=' + px_size,
                           image_name, licensename[0], x, caption))

        if alignment == 'right':
            img_string = '<span class="floatRight">' + img_string + '</span>'
        elif alignment == 'left':
            img_string = '<span class="floatLeft">' + img_string + '</span>'

        html.append(img_string)

    macro_text += ''.join(html)
    return macro_text