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
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()
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
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 ''
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)
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>')
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&rename=%s#uploadFileArea' % ( wikiutil.quoteWikiname(formatter.page.proper_name()), url_image_name), linktext) return macro_text full_size_url = (baseurl + "/" + urlpagename + "?action=" + action + "&do=view&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
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
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