diff --git a/src/DataViews/GrampletView.py b/src/DataViews/GrampletView.py
index 60398947f..647d8940f 100644
--- a/src/DataViews/GrampletView.py
+++ b/src/DataViews/GrampletView.py
@@ -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
diff --git a/src/plugins/DefaultGramplets.py b/src/plugins/DefaultGramplets.py
index 6896b2128..fe0bc871d 100644
--- a/src/plugins/DefaultGramplets.py
+++ b/src/plugins/DefaultGramplets.py
@@ -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 Frequently Asked Questions Gramplet\n\n")
+ self.render_text(" 1. Test 1\n")
+ self.render_text(" 2. Test 2\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"),
+ )
+