diff --git a/ChangeLog b/ChangeLog index 4d3c570db..febe58db5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-02-19 Douglas S. Blank + * src/plugins/DefaultGramplets.py: News renders text with styles + * src/DataViews/GrampletView.py (GuiGramplet.render_text): + First draft of a TextBuffer with markup + 2008-02-19 Benny Malengier * src/ViewManager.py: #1559, CTRL+N/P also if no sidebar diff --git a/src/DataViews/GrampletView.py b/src/DataViews/GrampletView.py index 17c392a3a..c6d8b1eae 100644 --- a/src/DataViews/GrampletView.py +++ b/src/DataViews/GrampletView.py @@ -123,7 +123,7 @@ class LinkTag(gtk.TextTag): LinkTag.lid += 1 gtk.TextTag.__init__(self, str(LinkTag.lid)) tag_table = buffer.get_tag_table() - self.set_property('foreground', "#0000ff") + self.set_property('foreground', "blue") #self.set_property('underline', pango.UNDERLINE_SINGLE) tag_table.add(self) @@ -234,37 +234,33 @@ class Gramplet(object): self._tags.append(link_data) buffer.apply_tag(link_data[0], start, end) + # Shortcuts to the gui functionality: + def get_text(self): - start = self.gui.buffer.get_start_iter() - end = self.gui.buffer.get_end_iter() - return self.gui.buffer.get_text(start, end) + return self.gui.get_text() def insert_text(self, text): - self.gui.buffer.insert_at_cursor(text) + self.gui.insert_text(text) + + def render_text(self, text): + self.gui.render_text(text) def clear_text(self): - self.gui.buffer.set_text('') + self.gui.clear_text() def set_text(self, text, scroll_to='start'): - self.gui.buffer.set_text('') - self.append_text(text, scroll_to) + self.gui.set_text(text, scroll_to) def append_text(self, text, scroll_to="end"): - enditer = self.gui.buffer.get_end_iter() - start = self.gui.buffer.create_mark(None, enditer, True) - self.gui.buffer.insert(enditer, text) - if scroll_to == "end": - enditer = self.gui.buffer.get_end_iter() - end = self.gui.buffer.create_mark(None, enditer, True) - self.gui.textview.scroll_to_mark(end, 0.0, True, 0, 0) - elif scroll_to == "start": # beginning of this append - self.gui.textview.scroll_to_mark(start, 0.0, True, 0, 0) - elif scroll_to == "begin": # beginning of this append - begin_iter = self.gui.buffer.get_start_iter() - begin = self.gui.buffer.create_mark(None, begin_iter, True) - self.gui.textview.scroll_to_mark(begin, 0.0, True, 0, 0) - else: - raise AttributeError, ("no such cursor position: '%s'" % scroll_to) + 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) + + # Other functions of the gramplet: def load_data_to_text(self, pos=0): if len(self.gui.data) >= pos + 1: @@ -419,6 +415,7 @@ class GuiGramplet: self.state = kwargs.get("state", "maximized") self.data = kwargs.get("data", []) ########## + self.use_markup = False self.pui = None # user code self.tooltips = None self.tooltips_text = None @@ -509,15 +506,95 @@ class GuiGramplet: expand,fill,padding,pack = column.query_child_packing(self.mainframe) column.set_child_packing(self.mainframe,self.expand,fill,padding,pack) - def append_text(self, text): - self.buffer.insert_at_cursor(text) + def append_text(self, text, scroll_to="end"): + enditer = self.buffer.get_end_iter() + start = self.buffer.create_mark(None, enditer, True) + self.buffer.insert(enditer, text) + if scroll_to == "end": + enditer = self.buffer.get_end_iter() + end = self.buffer.create_mark(None, enditer, True) + self.textview.scroll_to_mark(end, 0.0, True, 0, 0) + elif scroll_to == "start": # beginning of this append + self.textview.scroll_to_mark(start, 0.0, True, 0, 0) + elif scroll_to == "begin": # beginning of this append + begin_iter = self.buffer.get_start_iter() + begin = self.buffer.create_mark(None, begin_iter, True) + self.textview.scroll_to_mark(begin, 0.0, True, 0, 0) + else: + raise AttributeError, ("no such cursor position: '%s'" % scroll_to) def clear_text(self): self.buffer.set_text('') - - def set_text(self, text): - self.buffer.set_text(text) - + + def get_text(self): + start = self.buffer.get_start_iter() + end = self.buffer.get_end_iter() + return self.buffer.get_text(start, end) + + def insert_text(self, text): + self.buffer.insert_at_cursor(text) + + def render_text(self, text): + markup_pos = {"B": [], "I": [], "U": []} + retval = "" + i = 0 + r = 0 + 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: + retval += text[i] + r += 1 + i += 1 + elif text[i] == "\\": + retval += text[i+1] + r += 1 + i += 2 + elif ord(text[i]) > 126: + while ord(text[i]) > 126: + retval += text[i] + i += 1 + r += 1 + else: + retval += text[i] + r += 1 + i += 1 + self.set_text(retval) + for (a,b) in markup_pos["B"]: + start = self.buffer.get_iter_at_offset(a) + stop = self.buffer.get_iter_at_offset(b) + self.buffer.apply_tag_by_name("bold", start, stop) + for (a,b) in markup_pos["I"]: + start = self.buffer.get_iter_at_offset(a) + stop = self.buffer.get_iter_at_offset(b) + self.buffer.apply_tag_by_name("italic", start, stop) + for (a,b) in markup_pos["U"]: + start = self.buffer.get_iter_at_offset(a) + stop = self.buffer.get_iter_at_offset(b) + self.buffer.apply_tag_by_name("underline", start, stop) + + def set_use_markup(self, value): + if self.use_markup == value: return + self.use_markup = value + if value: + self.buffer.create_tag("bold",weight=pango.WEIGHT_HEAVY) + self.buffer.create_tag("italic",style=pango.STYLE_ITALIC) + self.buffer.create_tag("underline",underline=pango.UNDERLINE_SINGLE) + else: + tag_table = self.buffer.get_tag_table() + tag_table.foreach(lambda tag, data: tag_table.remove(tag)) + + def set_text(self, text, scroll_to='start'): + self.buffer.set_text('') + self.append_text(text, scroll_to) + def get_source_widget(self): """ Hack to allow us to send this object to the drop_widget diff --git a/src/plugins/DefaultGramplets.py b/src/plugins/DefaultGramplets.py index 04cdf0c8f..d08156c87 100644 --- a/src/plugins/DefaultGramplets.py +++ b/src/plugins/DefaultGramplets.py @@ -26,7 +26,7 @@ from BasicUtils import name_displayer from Utils import media_path_full from QuickReports import run_quick_report_by_name import DateHandler -from gettext import gettext as _ +from TransUtils import sgettext as _ import Config # @@ -549,7 +549,7 @@ class PythonGramplet(Gramplet): self.env = {"dbstate": self.gui.dbstate, "uistate": self.gui.uistate, "self": self, - "Date": gen.lib.Date, + _("class name|Date"): gen.lib.Date, } # GUI setup: self.gui.textview.set_editable(True) @@ -676,7 +676,6 @@ 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" @@ -688,7 +687,7 @@ class NewsGramplet(Gramplet): retval = True while retval: retval, text = continuation.next() - self.cleanup(text) + self.set_text(text) yield True self.cleanup(text) yield False @@ -699,7 +698,26 @@ class NewsGramplet(Gramplet): while "\n\n\n" in text: text = text.replace("\n\n\n", "\n\n") text = text.strip() - self.set_text(text) + ## Wiki text: + pattern = re.compile('\[\[(.*?)\|(.*?)\]\]') + matches = pattern.findall(text) + for (g1, g2) in matches: + text = text.replace("[[%s|%s]]" % (g1, g2), "%s" % g2) + pattern = re.compile('\[\[(.*?)\]\]') + matches = pattern.findall(text) + for match in matches: + text = text.replace("[[%s]]" % match, "%s" % match) + pattern = re.compile('\[(.*?) (.*?)\]') + matches = pattern.findall(text) + for (g1, g2) in matches: + text = text.replace("[%s %s]" % (g1, g2), "%s" % g2) + 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 + self.set_use_markup(True) + self.render_text(text) def process(self, title): #print "processing '%s'..." % title