91 |
stream.close() |
stream.close() |
92 |
except Exception, ex: |
except Exception, ex: |
93 |
stream.close() |
stream.close() |
|
raise |
|
94 |
|
|
95 |
def on_source_subscribe_button_clicked(self, button, *data): |
def on_source_subscribe_button_clicked(self, button, *data): |
96 |
f = straw.Feed(self._item.source['text'], |
f = straw.Feed(self._item.source['text'], |
149 |
if item.title is not None: |
if item.title is not None: |
150 |
ret.append('<div class="stitle">%s</div>' % item.title) |
ret.append('<div class="stitle">%s</div>' % item.title) |
151 |
if item.pub_date is not None: |
if item.pub_date is not None: |
152 |
|
format = '%a, %d %b %H:%M:%S' |
153 |
ret.append('<div class="sdate">%s</div>' % |
ret.append('<div class="sdate">%s</div>' % |
154 |
str(item.pub_date.localtime().strftime('%a, %d %b %H:%M:%S'))) |
unicode(item.pub_date.localtime().strftime(format),'latin-1').encode('utf-8')) |
155 |
ret.append('<div class="content">') |
ret.append('<div class="content">') |
156 |
if item.description is not None: |
if item.description is not None: |
157 |
ret.append('%s ' % item.description) |
ret.append('%s ' % item.description) |
182 |
item.publication_starting_page)) |
item.publication_starting_page)) |
183 |
ret.append('</p><p>') |
ret.append('</p><p>') |
184 |
if item.link is not None: |
if item.link is not None: |
185 |
ret.append('<a href="%s">Full Story >></a><br />' % item.link) |
ret.append('<a href="%s">%s >></a><br />' % |
186 |
|
(item.link,_("Full Story"))) |
187 |
if item.guid is not None and is_url(item.guid): |
if item.guid is not None and is_url(item.guid): |
188 |
ret.append('<a href="%s">%s >></a>' % |
ret.append('<a href="%s">%s >></a>' % |
189 |
(item.guid, _("Permanent link"))) |
(item.guid, _("Permanent link"))) |
249 |
res_len += 1 |
res_len += 1 |
250 |
return "".join(res) |
return "".join(res) |
251 |
|
|
252 |
|
entity = re.compile(r'\&.\w*?\;') |
253 |
def convert_entities(text): |
def convert_entities(text): |
254 |
nt = [] |
def conv(ents): |
255 |
in_entity = 0 |
entities = htmlentitydefs.entitydefs |
256 |
entity = "" |
ents = ents.group(0) |
257 |
for c in text: |
ent_code = entities.get(ents[1:-1], None) |
258 |
if in_entity: |
if ent_code is not None: |
259 |
entity += c |
return unicode(ent_code, 'iso8859-1') |
260 |
if c == ';': |
else: |
261 |
in_entity = 0; |
if ents[1] == '#': |
262 |
entities = htmlentitydefs.entitydefs |
code = ents[2:-1] |
263 |
e = entities.get(entity[1:-1], None) |
base = 10 |
264 |
if e is not None: |
if code[0] == 'x': |
265 |
nt.append(unicode(e, 'iso8859-1')) |
code = code[1:] |
266 |
else: |
base = 16 |
267 |
try: |
return unichr(int(code, base)) |
|
assert len(entity) > 1, "entity less than 1" |
|
|
if entity[1] == '#': |
|
|
code = entity[2:-1] |
|
|
base = 10 |
|
|
if code[0] == 'x': |
|
|
code = code[1:] |
|
|
base = 16 |
|
|
nt.append(unichr(int(code, base))) |
|
|
else: |
|
|
nt.append(' ') |
|
|
except AssertionError: |
|
|
raise |
|
|
except ValueError: |
|
|
raise |
|
|
entity = "" |
|
|
else: |
|
|
if c == '&': |
|
|
in_entity = 1 |
|
|
entity = "&" |
|
268 |
else: |
else: |
269 |
nt.append(c) |
return |
270 |
return "".join(nt) |
|
271 |
|
in_entity = entity.search(text) |
272 |
|
if in_entity is None: |
273 |
|
return text |
274 |
|
else: |
275 |
|
# convert all entities found in text then return the converted text |
276 |
|
ctext = in_entity.re.sub(conv, text) |
277 |
|
return ctext |
278 |
|
|
279 |
|
html_tags = re.compile(r'\<.*?\>') |
280 |
|
def is_html(text): |
281 |
|
is_tag = html_tags.search(text) |
282 |
|
if is_tag: return 1 |
283 |
|
else: return 0 |
284 |
|
|
285 |
class ItemList: |
class ItemList: |
286 |
COLUMN_TITLE = 0 |
COLUMN_TITLE = 0 |
332 |
count = 0 |
count = 0 |
333 |
for item in feed.items: |
for item in feed.items: |
334 |
title = "" |
title = "" |
|
# None is not == to an empty string, so we'll check for an empty |
|
|
# string as well. |
|
335 |
if item.title is not None and item.title != "": |
if item.title is not None and item.title != "": |
336 |
title = convert_entities(item.title) |
title = convert_entities(item.title) |
337 |
elif item.description is not None and item.description != "": |
elif item.description is not None and item.description != "": |
514 |
self._title_display.hide() |
self._title_display.hide() |
515 |
|
|
516 |
description = feed.channel_description |
description = feed.channel_description |
517 |
self._description_display.set_text(description) |
size = len(description) |
518 |
if len(description): |
if size: |
519 |
|
if is_html(description): |
520 |
|
description = read_text(description, size) |
521 |
|
self._description_display.set_text(description) |
522 |
self._description_display.show() |
self._description_display.show() |
523 |
else: |
else: |
524 |
self._description_display.hide() |
self._description_display.hide() |
642 |
return straw.main.quit() |
return straw.main.quit() |
643 |
|
|
644 |
def on_straw_main_delete_event(self, *args): |
def on_straw_main_delete_event(self, *args): |
645 |
# FALSE emits destroy_event |
return straw.main.quit() |
|
return gtk.FALSE |
|
646 |
|
|
647 |
def on_straw_main_configure_event(self, widget, event, *args): |
def on_straw_main_configure_event(self, widget, event, *args): |
648 |
def check_size((width, height, widget)): |
def check_size((width, height, widget)): |
683 |
straw.main.show_subscribe_dialog() |
straw.main.show_subscribe_dialog() |
684 |
|
|
685 |
def on_menu_about_activate(self, menuitem, *args): |
def on_menu_about_activate(self, menuitem, *args): |
686 |
|
whatis = "Straw is a desktop news aggregator for GNOME" |
687 |
gnome.ui.About( |
gnome.ui.About( |
688 |
straw.APPNAME, straw.VERSION, "Copyright (c) 2002 Juri Pakaste", "", |
straw.APPNAME, straw.VERSION, "Copyright (c) 2002-2003 Juri Pakaste", whatis, |
689 |
["Juri Pakaste <juri@iki.fi>", |
["Juri Pakaste <juri@iki.fi>", |
690 |
"Jan Alonzo <jmalonzo@spaceants.org>" |
"Jan Alonzo <jmalonzo@spaceants.org>", |
691 |
"rssparser.py and rssfinder.py by Mark Pilgrim", |
"rssparser.py and rssfinder.py by Mark Pilgrim", |
692 |
"Icons by Jakub 'jimmac' Steiner and Juri Pakaste"], |
"Icons by Jakub 'jimmac' Steiner and Juri Pakaste"], |
693 |
[], |
[], |
695 |
"Martin Steldinger <tribble@hanfplantage.de>\n" |
"Martin Steldinger <tribble@hanfplantage.de>\n" |
696 |
"David Rousseau <boiteaflood@wanadoo.fr>\n" |
"David Rousseau <boiteaflood@wanadoo.fr>\n" |
697 |
"Sergei Vavinov <svv@cmc.msu.ru>\n" |
"Sergei Vavinov <svv@cmc.msu.ru>\n" |
698 |
"Terje Røsten <terjeros@phys.ntnu.no>", |
u"Terje R\xf8sten <terjeros@phys.ntnu.no>", |
699 |
gtk.gdk.pixbuf_new_from_file(straw.main._libdir + |
gtk.gdk.pixbuf_new_from_file(straw.main._libdir + |
700 |
"/straw.png")).show() |
"/straw.png")).show() |
701 |
|
|
942 |
if ur: |
if ur: |
943 |
uritems += ur |
uritems += ur |
944 |
urfeeds += 1 |
urfeeds += 1 |
945 |
map = {'uritems': uritems, 'urfeeds': urfeeds} |
if urfeeds > 1: feedstr = "feeds" |
946 |
|
else: feedstr = "feed" |
947 |
|
map = {'uritems': uritems, 'urfeeds': urfeeds, 'feedstr': feedstr} |
948 |
self._window.set_title(('%s - ' % straw.APPNAME) + |
self._window.set_title(('%s - ' % straw.APPNAME) + |
949 |
_('%(uritems)d unread in %(urfeeds)d feeds') % |
_('%(uritems)d unread in %(urfeeds)d %(feedstr)s') % |
950 |
map ) |
map ) |
951 |
|
|
952 |
def all_items_read(self, signal, feed_index): |
def all_items_read(self, signal, feed_index): |