diff options
-rw-r--r-- | src/epub.rs | 32 | ||||
-rw-r--r-- | src/view.rs | 11 |
2 files changed, 17 insertions, 26 deletions
diff --git a/src/epub.rs b/src/epub.rs index 25d4cd6..b3e6c49 100644 --- a/src/epub.rs +++ b/src/epub.rs @@ -153,11 +153,14 @@ impl Chapter { fn render(&mut self, n: Node, open: Attribute, close: Attribute) { self.state.set(open); self.attrs.push((self.text.len(), open, self.state)); + self.render_text(n); + self.state.unset(open); + self.attrs.push((self.text.len(), close, self.state)); + } + fn render_text(&mut self, n: Node) { for child in n.children() { render(child, self); } - self.state.unset(open); - self.attrs.push((self.text.len(), close, self.state)); } } @@ -186,9 +189,14 @@ fn render(n: Node, c: &mut Chapter) { "img" => c.text.push_str("\n[IMG]\n"), "a" => { if let Some(url) = n.attribute("href") { - let start = c.text.len(); - c.render(n, Attribute::Underlined, Attribute::NoUnderline); - c.links.push((start, c.text.len(), url.to_string())); + if url.starts_with("http") { + // TODO open in browser + c.render_text(n) + } else { + let start = c.text.len(); + c.render(n, Attribute::Underlined, Attribute::NoUnderline); + c.links.push((start, c.text.len(), url.to_string())); + } } } "em" => c.render(n, Attribute::Italic, Attribute::NoItalic), @@ -200,23 +208,15 @@ fn render(n: Node, c: &mut Chapter) { } "blockquote" | "p" | "tr" => { c.text.push('\n'); - for child in n.children() { - render(child, c); - } + c.render_text(n); c.text.push('\n'); } "li" => { c.text.push_str("\n- "); - for child in n.children() { - render(child, c); - } + c.render_text(n); c.text.push('\n'); } - _ => { - for child in n.children() { - render(child, c); - } - } + _ => c.render_text(n), } } diff --git a/src/view.rs b/src/view.rs index 11eaccd..7593eea 100644 --- a/src/view.rs +++ b/src/view.rs @@ -244,16 +244,7 @@ impl View for Page { if let Ok(i) = r { let url = &c.links[i].2; - let mut link = bk.links.get(url); - // FIXME hack - if link.is_none() { - let url = url.split('#').next().unwrap(); - link = bk.links.get(url); - if link.is_none() { - return; - } - } - let &(chapter, byte) = link.unwrap(); + let &(chapter, byte) = bk.links.get(url).expect(url); let line = get_line(&bk.chapters[chapter].lines, byte); bk.jump((chapter, line)); } |