diff --git a/src/DataViews/GrampletView.py b/src/DataViews/GrampletView.py index 0c33360a9..e1d07c228 100644 --- a/src/DataViews/GrampletView.py +++ b/src/DataViews/GrampletView.py @@ -93,7 +93,7 @@ def parse_tag_attr(text): if len(parts) == 2: attr_values = parts[1].split(" ") # "name=value name=value" for av in attr_values: - attribute, value = av.split("=") + attribute, value = av.split("=", 1) value = value.strip() # trim off quotes: if value[0] == value[-1] and value[0] in ['"', "'"]: diff --git a/src/plugins/gramplet/DefaultGramplets.py b/src/plugins/gramplet/DefaultGramplets.py index 7699e10f4..cfc8dbd87 100644 --- a/src/plugins/gramplet/DefaultGramplets.py +++ b/src/plugins/gramplet/DefaultGramplets.py @@ -1,6 +1,6 @@ # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2007 Donald N. Allingham +# Copyright (C) 2007-2009 Douglas S. Blank # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,12 +16,25 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# $Id$ + +#------------------------------------------------------------------------ +# +# Python modules +# +#------------------------------------------------------------------------ import sys import re import urllib import posixpath import cgi +import gobject +#------------------------------------------------------------------------ +# +# GRAMPS modules +# +#------------------------------------------------------------------------ from BasicUtils import name_displayer from DataViews import register, Gramplet from PluginUtils import * @@ -34,45 +47,17 @@ import Config import DateHandler import gen.lib import Errors - from ReportBase import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY, CATEGORY_QR_EVENT, CATEGORY_QR_SOURCE, CATEGORY_QR_MISC, CATEGORY_QR_PLACE, CATEGORY_QR_REPOSITORY) +from const import URL_WIKISTRING, URL_MANUAL_PAGE +#------------------------------------------------------------------------ # -# Hello World, in Gramps Gramplets +# Gramplets # -# First, you need a function or class that takes a single argument -# a GuiGramplet: - -#from DataViews import register -#def init(gui): -# gui.set_text("Hello world!") - -# In this function, you can do some things to update the gramplet, -# like set text of the main scroll window. - -# Then, you need to register the gramplet: - -#register(type="gramplet", # case in-senstitive keyword "gramplet" -# name="Hello World Gramplet", # gramplet name, unique among gramplets -# height = 20, -# content = init, # function/class; takes guigramplet -# title="Sample Gramplet", # default title, user changeable -# ) - -# There are a number of arguments that you can provide, including: -# name, height, content, title, expand, state, data - -# Here is a Gramplet object. It has a number of method possibilities: -# init- run once, on construction -# active_changed- run when active-changed is triggered -# db_changed- run when db-changed is triggered -# main- run once per db change, main process (a generator) - -# You should call update() to run main; don't call main directly - +#------------------------------------------------------------------------ class CalendarGramplet(Gramplet): def init(self): import gtk @@ -959,14 +944,31 @@ def make_welcome_content(gui): ) gui.set_text(text) -class NewsGramplet(Gramplet): - URL = "http://www.gramps-project.org/wiki/index.php?title=%s&action=raw" +class HeadlineNewsGramplet(Gramplet): + """ + Headlines News Gramplet reads the Headline News every hour. + """ + RAW = URL_WIKISTRING + "%s&action=raw" + URL = URL_WIKISTRING + "%s" def init(self): - self.set_tooltip(_("Read news from the GRAMPS wiki")) + """ + Initialize gramplet. Start up update timer. + """ + self.set_tooltip(_("Read headline news from the GRAMPS wiki")) + self.update_interval = 3600 * 1000 # in miliseconds (1 hour) + self.timer = gobject.timeout_add(self.update_interval, + self.update_by_timer) + + def update_by_timer(self): + """ + Update, and return True to continually update on interval. + """ + self.update() + return True # keep updating! def main(self): - continuation = self.process('News') + continuation = self.process('HeadlineNews') retval = True while retval: retval, text = continuation.next() @@ -982,33 +984,63 @@ class NewsGramplet(Gramplet): text = text.replace("\n\n\n", "\n\n") text = text.strip() ## Wiki text: + ### Internal wiki URL with title: pattern = re.compile('\[\[(.*?)\|(.*?)\]\]') matches = pattern.findall(text) for (g1, g2) in matches: - text = text.replace("[[%s|%s]]" % (g1, g2), "%s" % g2) + text = text.replace("[[%s|%s]]" % (g1, g2), + ("""%s""" % + (self.wiki(g1), self.nice_title(g2)))) + ### Internal wiki URL: pattern = re.compile('\[\[(.*?)\]\]') matches = pattern.findall(text) for match in matches: - text = text.replace("[[%s]]" % match, "%s" % match) - pattern = re.compile('\[(.*?) (.*?)\]') + text = text.replace("[[%s]]" % match, + ("""%s""" % + (self.wiki(match), self.nice_title(match)))) + ### URL with title: + pattern = re.compile('\[http\:\/\/(.*?) (.*?)\]') matches = pattern.findall(text) for (g1, g2) in matches: - text = text.replace("[%s %s]" % (g1, g2), "%s" % g2) + text = text.replace("[http://%s %s]" % (g1, g2), + ("""%s""" % + (g1, g2))) + ### URL: + pattern = re.compile('\[http\:\/\/(.*?)\]') + matches = pattern.findall(text) + count = 1 + for g1 in matches: + text = text.replace("[http://%s]" % (g1), + ("""%s""" % + (g1, ("[%d]" % count)))) + count += 1 + ### Bold: pattern = re.compile("'''(.*?)'''") matches = pattern.findall(text) for match in matches: text = text.replace("'''%s'''" % match, "%s" % match) - text = "News from www.gramps-project.org:\n\n" + text + text = """Live update from www.gramps-project.org:\n\n""" + text self.clear_text() self.set_use_markup(True) - self.render_text(text) + try: + self.render_text(text) + except: + cla, exc, trbk = sys.exc_info() + self.append_text(_("Error") + (" : %s %s\n\n" %(cla, exc))) + self.append_text(text) self.append_text("", scroll_to="begin") + + def wiki(self, title): + return (self.URL % title) + + def nice_title(self, title): + return title.replace("_", " ") def process(self, title): #print "processing '%s'..." % title - title = title.replace(" ", "_") + title = self.nice_title(title) yield True, (_("Reading") + " '%s'..." % title) - fp = urllib.urlopen(self.URL % title) + fp = urllib.urlopen(self.RAW % title) text = fp.read() #text = text.replace("\n", " ") html = re.findall('<.*?>', text) @@ -1027,7 +1059,7 @@ class NewsGramplet(Gramplet): if template.lower() == "release": newtext = "GRAMPS " + heading + " released.

" else: - newtext = heading + "

" + newtext = "%s

" % heading newtext += body + "
" text = text.replace(oldtext, newtext) else: # a macro/redirect @@ -1933,12 +1965,12 @@ register(type="gramplet", ) register(type="gramplet", - name="News Gramplet", - tname=_("News Gramplet"), + name="Headline News Gramplet", + tname=_("Headline News Gramplet"), height=300, expand=True, - content = NewsGramplet, - title=_("News"), + content = HeadlineNewsGramplet, + title=_("Headline News"), ) register(type="gramplet",