Fixed bug in render_text; replaced NewsGramplet with HeadlineNewsGramplet that reads a new wiki page every hour

svn: r11723
This commit is contained in:
Doug Blank 2009-01-25 20:08:57 +00:00
parent 1aaa2df5a4
commit ffc025aeca
2 changed files with 83 additions and 51 deletions

View File

@ -93,7 +93,7 @@ def parse_tag_attr(text):
if len(parts) == 2: if len(parts) == 2:
attr_values = parts[1].split(" ") # "name=value name=value" attr_values = parts[1].split(" ") # "name=value name=value"
for av in attr_values: for av in attr_values:
attribute, value = av.split("=") attribute, value = av.split("=", 1)
value = value.strip() value = value.strip()
# trim off quotes: # trim off quotes:
if value[0] == value[-1] and value[0] in ['"', "'"]: if value[0] == value[-1] and value[0] in ['"', "'"]:

View File

@ -1,6 +1,6 @@
# Gramps - a GTK+/GNOME based genealogy program # 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 # 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 # 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 # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id$
#------------------------------------------------------------------------
#
# Python modules
#
#------------------------------------------------------------------------
import sys import sys
import re import re
import urllib import urllib
import posixpath import posixpath
import cgi import cgi
import gobject
#------------------------------------------------------------------------
#
# GRAMPS modules
#
#------------------------------------------------------------------------
from BasicUtils import name_displayer from BasicUtils import name_displayer
from DataViews import register, Gramplet from DataViews import register, Gramplet
from PluginUtils import * from PluginUtils import *
@ -34,45 +47,17 @@ import Config
import DateHandler import DateHandler
import gen.lib import gen.lib
import Errors import Errors
from ReportBase import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY, from ReportBase import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY,
CATEGORY_QR_EVENT, CATEGORY_QR_SOURCE, CATEGORY_QR_EVENT, CATEGORY_QR_SOURCE,
CATEGORY_QR_MISC, CATEGORY_QR_PLACE, CATEGORY_QR_MISC, CATEGORY_QR_PLACE,
CATEGORY_QR_REPOSITORY) 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): class CalendarGramplet(Gramplet):
def init(self): def init(self):
import gtk import gtk
@ -959,14 +944,31 @@ def make_welcome_content(gui):
) )
gui.set_text(text) gui.set_text(text)
class NewsGramplet(Gramplet): class HeadlineNewsGramplet(Gramplet):
URL = "http://www.gramps-project.org/wiki/index.php?title=%s&action=raw" """
Headlines News Gramplet reads the Headline News every hour.
"""
RAW = URL_WIKISTRING + "%s&action=raw"
URL = URL_WIKISTRING + "%s"
def init(self): 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): def main(self):
continuation = self.process('News') continuation = self.process('HeadlineNews')
retval = True retval = True
while retval: while retval:
retval, text = continuation.next() retval, text = continuation.next()
@ -982,33 +984,63 @@ class NewsGramplet(Gramplet):
text = text.replace("\n\n\n", "\n\n") text = text.replace("\n\n\n", "\n\n")
text = text.strip() text = text.strip()
## Wiki text: ## Wiki text:
### Internal wiki URL with title:
pattern = re.compile('\[\[(.*?)\|(.*?)\]\]') pattern = re.compile('\[\[(.*?)\|(.*?)\]\]')
matches = pattern.findall(text) matches = pattern.findall(text)
for (g1, g2) in matches: for (g1, g2) in matches:
text = text.replace("[[%s|%s]]" % (g1, g2), "<U>%s</U>" % g2) text = text.replace("[[%s|%s]]" % (g1, g2),
("""<A HREF="%s%s">%s</A>""" %
(self.wiki(g1), self.nice_title(g2))))
### Internal wiki URL:
pattern = re.compile('\[\[(.*?)\]\]') pattern = re.compile('\[\[(.*?)\]\]')
matches = pattern.findall(text) matches = pattern.findall(text)
for match in matches: for match in matches:
text = text.replace("[[%s]]" % match, "<U>%s</U>" % match) text = text.replace("[[%s]]" % match,
pattern = re.compile('\[(.*?) (.*?)\]') ("""<A HREF="%s">%s</A>""" %
(self.wiki(match), self.nice_title(match))))
### URL with title:
pattern = re.compile('\[http\:\/\/(.*?) (.*?)\]')
matches = pattern.findall(text) matches = pattern.findall(text)
for (g1, g2) in matches: for (g1, g2) in matches:
text = text.replace("[%s %s]" % (g1, g2), "<U>%s</U>" % g2) text = text.replace("[http://%s %s]" % (g1, g2),
("""<A HREF="http://%s">%s</A>""" %
(g1, g2)))
### URL:
pattern = re.compile('\[http\:\/\/(.*?)\]')
matches = pattern.findall(text)
count = 1
for g1 in matches:
text = text.replace("[http://%s]" % (g1),
("""<A HREF="http://%s">%s</A>""" %
(g1, ("[%d]" % count))))
count += 1
### Bold:
pattern = re.compile("'''(.*?)'''") pattern = re.compile("'''(.*?)'''")
matches = pattern.findall(text) matches = pattern.findall(text)
for match in matches: for match in matches:
text = text.replace("'''%s'''" % match, "<B>%s</B>" % match) text = text.replace("'''%s'''" % match, "<B>%s</B>" % match)
text = "News from <I>www.gramps-project.org</I>:\n\n" + text text = """<I>Live update from <A HREF="http://gramps-project.org/">www.gramps-project.org</A></I>:\n\n""" + text
self.clear_text() self.clear_text()
self.set_use_markup(True) self.set_use_markup(True)
try:
self.render_text(text) 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") 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): def process(self, title):
#print "processing '%s'..." % title #print "processing '%s'..." % title
title = title.replace(" ", "_") title = self.nice_title(title)
yield True, (_("Reading") + " '%s'..." % title) yield True, (_("Reading") + " '%s'..." % title)
fp = urllib.urlopen(self.URL % title) fp = urllib.urlopen(self.RAW % title)
text = fp.read() text = fp.read()
#text = text.replace("\n", " ") #text = text.replace("\n", " ")
html = re.findall('<.*?>', text) html = re.findall('<.*?>', text)
@ -1027,7 +1059,7 @@ class NewsGramplet(Gramplet):
if template.lower() == "release": if template.lower() == "release":
newtext = "GRAMPS " + heading + " released.<BR><BR>" newtext = "GRAMPS " + heading + " released.<BR><BR>"
else: else:
newtext = heading + "<BR><BR>" newtext = "<B>%s</B><BR><BR>" % heading
newtext += body + "<BR>" newtext += body + "<BR>"
text = text.replace(oldtext, newtext) text = text.replace(oldtext, newtext)
else: # a macro/redirect else: # a macro/redirect
@ -1933,12 +1965,12 @@ register(type="gramplet",
) )
register(type="gramplet", register(type="gramplet",
name="News Gramplet", name="Headline News Gramplet",
tname=_("News Gramplet"), tname=_("Headline News Gramplet"),
height=300, height=300,
expand=True, expand=True,
content = NewsGramplet, content = HeadlineNewsGramplet,
title=_("News"), title=_("Headline News"),
) )
register(type="gramplet", register(type="gramplet",