diff --git a/curseradio/__init__.py b/curseradio/__init__.py index 605b28e..36c9c8d 100644 --- a/curseradio/__init__.py +++ b/curseradio/__init__.py @@ -1,4 +1,4 @@ __author__ = "Gordon Ball " -__version__ = "0.2" +__version__ = "0.3" from .curseradio import OPMLBrowser diff --git a/curseradio/curseradio.py b/curseradio/curseradio.py index beda01b..cf8457c 100644 --- a/curseradio/curseradio.py +++ b/curseradio/curseradio.py @@ -42,7 +42,8 @@ 'enter': 'KEY_ENTER', 'stop': 'k', 'exit': 'q', - 'favourite': 'f' + 'parent': 'h', + 'favourite': 'f', } } @@ -59,7 +60,8 @@ def from_xml(cls, url, text="", attr=None): is currently discarded). """ if attr is None: attr = {} - tree = lxml.etree.parse(url) + parser = lxml.etree.XMLParser(dtd_validation=False, no_network=False) + tree = lxml.etree.parse(url, parser=parser) result = cls(text=text, attr=attr) result.children = [OPMLNode.from_element(o) for o in tree.xpath('/opml/body/outline')] @@ -311,7 +313,8 @@ def get_keymap(self): else: keysrc = self.config['keymap.default'] for key in ('up', 'down', 'start', 'end', 'pageup', 'pagedown', - 'enter', 'stop', 'exit', 'favourite'): + 'enter', 'stop', 'exit', 'favourite', + 'parent'): value = keysrc.get(key, self.config['keymap.default'][key]) if value.startswith('KEY_'): keymap[key] = getattr(curses, value) @@ -356,6 +359,16 @@ def move(self, rel=None, to=None): target = 0 elif to == "end": target = len(self.flat) - 1 + elif to == "parent": + target = self.top + self.cursor + showobjs = self.flat[0:target] + cdepth = self.flat[target][1] + for i, (obj, depth) in tuple(reversed(list(enumerate(showobjs)))): + if target >= 0: + target = target - 1 + if depth == cdepth - 1: + break + elif rel is not None: target = self.top + self.cursor + rel @@ -392,6 +405,8 @@ def interact(self): self.move(rel=-self.maxy) elif ch == self.keymap['pagedown']: # page down self.move(rel=self.maxy) + elif ch == self.keymap['parent']: + self.move(to="parent") elif ch == self.keymap['enter'] or ch == ord('\n'): for msg in self.selected.activate(): if isinstance(msg, str):