Added ability to have URL links on textbuffer; fixed writable age on date gramplet; draft FAQ gramplet

svn: r10254
This commit is contained in:
Doug Blank 2008-03-10 04:37:45 +00:00
parent 3efc3daca9
commit 5eb10bd2a2
2 changed files with 82 additions and 17 deletions

View File

@ -86,6 +86,21 @@ def register(**data):
else:
print ("Plugin did not define type.")
def parse_tag_attr(text):
text = text.strip()
parts = text.split(" ", 1)
attrs = {}
if len(parts) == 2:
attr_values = parts[1].split(" ") # "name=value name=value"
for av in attr_values:
attribute, value = av.split("=")
value = value.strip()
# trim off quotes:
if value[0] == value[-1] and value[0] in ['"', "'"]:
value = value[1:-1]
attrs[attribute.strip().lower()] = value
return [parts[0].upper(), attrs]
def get_gramplet_opts(name, opts):
if name in AVAILABLE_GRAMPLETS:
data = AVAILABLE_GRAMPLETS[name]
@ -256,6 +271,11 @@ class Gramplet(object):
if debug: print "%s is connecting" % self.gui.title
pass
def link_region(self, start, stop, link_type, url):
link_data = (LinkTag(self.gui.buffer), link_type, url, url)
self._tags.append(link_data)
self.gui.buffer.apply_tag(link_data[0], start, stop)
def link(self, text, link_type, data, size=None, tooltip=None):
buffer = self.gui.buffer
iter = buffer.get_end_iter()
@ -289,9 +309,6 @@ class Gramplet(object):
def append_text(self, text, scroll_to="end"):
self.gui.append_text(text, scroll_to)
def render_text(self, text):
self.gui.render_text(text)
def set_use_markup(self, value):
self.gui.set_use_markup(value)
@ -438,6 +455,15 @@ class Gramplet(object):
'filterbyname',
handle)
return True
elif link_type == 'URL':
if event.button == 1: # left mouse
GrampsDisplay.url(handle)
return True
elif link_type == 'WIKI':
if event.button == 1: # left mouse
GrampsDisplay.help('gramplet',
handle.replace(" ", "_"))
return True
elif link_type == 'PersonList':
if event.button == 1: # left mouse
if event.type == gtk.gdk._2BUTTON_PRESS: # double
@ -605,24 +631,34 @@ class GuiGramplet:
self.buffer.insert_at_cursor(text)
def render_text(self, text):
markup_pos = {"B": [], "I": [], "U": []}
markup_pos = {"B": [], "I": [], "U": [], "A": []}
retval = ""
i = 0
r = 0
tag = ""
while i < len(text):
if text[i] == "<":
if text[i+1] == "/" and text[i+3] == ">":
markup = text[i+2].upper()
markup_pos[markup][-1].append(r)
i += 4
elif text[i+2] == ">":
markup = text[i+1].upper()
markup_pos[markup].append([r])
i += 3
else:
if text[i:i+2] == "</":
# start of ending tag
stop = text[i:].find(">")
if stop < 0:
retval += text[i]
r += 1
i += 1
else:
markup = text[i+2:i+stop].upper() # close tag
markup_pos[markup][-1].append(r)
i = i + stop + 1
elif text[i] == "<":
# start of start tag
stop = text[i:].find(">")
if stop < 0:
retval += text[i]
r += 1
i += 1
else:
markup, attr = parse_tag_attr(text[i+1:i+stop])
markup_pos[markup].append([r, attr])
i = i + stop + 1
elif text[i] == "\\":
retval += text[i+1]
r += 1
@ -638,18 +674,29 @@ class GuiGramplet:
i += 1
offset = len(self.get_text())
self.append_text(retval)
for (a,b) in markup_pos["B"]:
for (a,attributes,b) in markup_pos["B"]:
start = self.buffer.get_iter_at_offset(a + offset)
stop = self.buffer.get_iter_at_offset(b + offset)
self.buffer.apply_tag_by_name("bold", start, stop)
for (a,b) in markup_pos["I"]:
for (a,attributes,b) in markup_pos["I"]:
start = self.buffer.get_iter_at_offset(a + offset)
stop = self.buffer.get_iter_at_offset(b + offset)
self.buffer.apply_tag_by_name("italic", start, stop)
for (a,b) in markup_pos["U"]:
for (a,attributes,b) in markup_pos["U"]:
start = self.buffer.get_iter_at_offset(a + offset)
stop = self.buffer.get_iter_at_offset(b + offset)
self.buffer.apply_tag_by_name("underline", start, stop)
for (a,attributes,b) in markup_pos["A"]:
start = self.buffer.get_iter_at_offset(a + offset)
stop = self.buffer.get_iter_at_offset(b + offset)
if "href" in attributes:
url = attributes["href"]
self.pui.link_region(start, stop, "URL", url) # tooltip?
elif "wiki" in attributes:
url = attributes["wiki"]
self.pui.link_region(start, stop, "WIKI", url) # tooltip?
else:
print "warning: no url on link: '%s'" % text[start, stop]
def set_use_markup(self, value):
if self.use_markup == value: return

View File

@ -821,6 +821,14 @@ class TODOGramplet(Gramplet):
self.gui.data = [] # clear out old data
self.save_text_to_data()
class FAQGramplet(Gramplet):
def init(self):
self.set_use_markup(True)
self.clear_text()
self.render_text("Draft of a <a wiki='FAQ'>Frequently Asked Questions</a> Gramplet\n\n")
self.render_text(" 1. <a href='http://bugs.gramps-project.org/'>Test 1</a>\n")
self.render_text(" 2. <a href='http://gramps-project.org//'>Test 2</a>\n")
def make_welcome_content(gui):
text = _(
'Welcome to GRAMPS!\n\n'
@ -952,6 +960,7 @@ class AgeOnDateGramplet(Gramplet):
# label, entry
description = gtk.TextView()
description.set_wrap_mode(gtk.WRAP_WORD)
description.set_editable(False)
buffer = description.get_buffer()
buffer.set_text(_("Enter a date in the entry below and click Run."
" This will compute the ages for everyone in your"
@ -1087,3 +1096,12 @@ register(type="gramplet",
detached_width = 600,
detached_height = 400,
)
register(type="gramplet",
name="FAQ Gramplet",
tname=_("FAQ Gramplet"),
height=300,
content = FAQGramplet,
title=_("FAQ"),
)