-- Leo's gemini proxy
-- Connecting to typed-hole.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
commit 134d1dd0a7c1e948ca5ebdcdfe3af41f5524c32c
Author: Julien Blanchard <julien@typed-hole.org>
Date: Tue Apr 21 15:19:59 2020 +0200
[gopher] download images
diff --git a/src/gopher/client.rs b/src/gopher/client.rs
index ec4afb3..138bc5f 100644
--- a/src/gopher/client.rs
+++ b/src/gopher/client.rs
@@ -29,7 +29,7 @@ pub fn get_data<T: Protocol>(url: T) -> Result<(Option<Vec<u8>>, Vec<u8>), Strin
None => format!("{}\n", path),
};
- let url = if url.starts_with("/0/") || url.starts_with("/1/") {
+ let url = if url.starts_with("/0/") || url.starts_with("/1/") || url.starts_with("/g/") {
url.split_off(2)
} else {
url
diff --git a/src/gopher/link.rs b/src/gopher/link.rs
index f7949be..0f4c5ac 100644
--- a/src/gopher/link.rs
+++ b/src/gopher/link.rs
@@ -6,6 +6,7 @@ pub enum Link {
Gemini(Url, String),
Gopher(Url, String),
Http(Url, String),
+ Image(Url, String),
Relative(String, String),
Unknown(Url, String),
}
@@ -54,6 +55,40 @@ impl FromStr for Link {
} else {
Err(ParseError)
}
+ } else if line.starts_with('g') || line.starts_with('I') {
+ let label = els.next().expect("no label");
+ let path = els.next();
+ let host = els.next();
+ let port = els.next();
+
+ if let Some(host) = host {
+ if let Some(p) = path {
+ let mut text = String::from(label);
+ let selector = text.remove(0);
+
+ let path = if p.starts_with('/') {
+ p.to_string()
+ } else {
+ format!("/{}", p)
+ };
+
+ if let Some(port) = port {
+ match Url::parse(&format!("gopher://{}:{}/{}{}", host, port, selector, path)) {
+ Ok(url) => Ok(Link::Image(url, text)),
+ Err(e) => {
+ println!("ERR {:?}", e);
+ Err(ParseError)
+ }
+ }
+ } else {
+ Err(ParseError)
+ }
+ } else {
+ Err(ParseError)
+ }
+ } else {
+ Err(ParseError)
+ }
} else if line.starts_with('[') {
let mut url = String::from(line);
let url = url.split_off(4);
diff --git a/src/gopher/parser.rs b/src/gopher/parser.rs
index b316fda..21edf63 100644
--- a/src/gopher/parser.rs
+++ b/src/gopher/parser.rs
@@ -30,12 +30,8 @@ impl FromStr for TextElement {
Ok(TextElement::Text(colors::colorize(&text)))
} else if line.starts_with('h') {
Ok(TextElement::ExternalLinkItem(colors::cleanup(line)))
- } else if line.starts_with('I') {
- let mut els = line.split('\t');
- let text = els.next().expect("");
- let mut text = String::from(text);
- text.remove(0);
- Ok(TextElement::Image(colors::cleanup(&text)))
+ } else if line.starts_with('I') || line.starts_with('g') {
+ Ok(TextElement::Image(colors::cleanup(line)))
} else if line.contains("://") {
if line.contains("gopher://") {
Ok(TextElement::LinkItem(String::from(line)))
diff --git a/src/main.rs b/src/main.rs
index dcf84f0..7f53f1d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -393,9 +393,8 @@ fn draw_gopher_content(
Ok(gopher::parser::TextElement::ExternalLinkItem(link_item)) => {
draw_gopher_link(&gui, link_item);
}
- Ok(gopher::parser::TextElement::Image(_link_item)) => {
- // draw_gopher_link(&gui, link_item);
- ();
+ Ok(gopher::parser::TextElement::Image(link_item)) => {
+ draw_gopher_link(&gui, link_item);
}
Err(_) => println!("Something failed."),
}
@@ -434,10 +433,10 @@ fn draw_gemini_link(gui: &Arc<Gui>, link_item: String) {
label
};
let finger_label = format!("{} [Finger]", button_label);
- insert_gemini_button(&gui, url, finger_label);
+ insert_button(&gui, url, finger_label);
}
Ok(GeminiLink::Gemini(url, label)) => {
- insert_gemini_button(&gui, url, label);
+ insert_button(&gui, url, label);
}
Ok(GeminiLink::Gopher(url, label)) => {
let button_label = if label.is_empty() {
@@ -446,7 +445,7 @@ fn draw_gemini_link(gui: &Arc<Gui>, link_item: String) {
label
};
let gopher_label = format!("{} [Gopher]", button_label);
- insert_gemini_button(&gui, url, gopher_label);
+ insert_button(&gui, url, gopher_label);
}
Ok(GeminiLink::Http(url, label)) => {
let button_label = if label.is_empty() {
@@ -460,7 +459,7 @@ fn draw_gemini_link(gui: &Arc<Gui>, link_item: String) {
}
Ok(GeminiLink::Relative(url, label)) => {
let new_url = Gemini { source: url }.to_absolute_url().unwrap();
- insert_gemini_button(&gui, new_url, label);
+ insert_button(&gui, new_url, label);
}
Ok(GeminiLink::Unknown(_, _)) => (),
Err(_) => (),
@@ -486,21 +485,30 @@ fn draw_gopher_link(gui: &Arc<Gui>, link_item: String) {
label
};
let gopher_label = format!("{} [Gopher]", button_label);
- insert_gemini_button(&gui, url, gopher_label);
+ insert_button(&gui, url, gopher_label);
+ }
+ Ok(GopherLink::Image(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let image_label = format!("{} [Image]", button_label);
+ insert_gopher_file_button(&gui, url, image_label);
}
Ok(GopherLink::Gemini(url, label)) => {
- insert_gemini_button(&gui, url, label);
+ insert_button(&gui, url, label);
}
Ok(GopherLink::Relative(url, label)) => {
let new_url = Gopher { source: url }.to_absolute_url().unwrap();
- insert_gemini_button(&gui, new_url, label);
+ insert_button(&gui, new_url, label);
}
Ok(GopherLink::Unknown(_, _)) => (),
Err(_) => (),
}
}
-fn insert_gemini_button(gui: &Arc<Gui>, url: Url, label: String) {
+fn insert_button(gui: &Arc<Gui>, url: Url, label: String) {
let content_view = gui.content_view();
let buffer = content_view.get_buffer().unwrap();
@@ -512,7 +520,6 @@ fn insert_gemini_button(gui: &Arc<Gui>, url: Url, label: String) {
let button = gtk::Button::new_with_label(&button_label);
button.set_tooltip_text(Some(&url.to_string()));
- // button.set_background_color();
button.connect_clicked(clone!(@weak gui => move |_| {
match url.scheme() {
@@ -530,6 +537,31 @@ fn insert_gemini_button(gui: &Arc<Gui>, url: Url, label: String) {
buffer.insert(&mut end_iter, "\n");
}
+fn insert_gopher_file_button(gui: &Arc<Gui>, url: Url, label: String) {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+
+ let button = gtk::Button::new_with_label(&button_label);
+ button.set_tooltip_text(Some(&url.to_string()));
+
+ button.connect_clicked(move |_| {
+ let (_meta, content) = gopher::client::get_data(Gopher {source: url.to_string()}).unwrap();
+ client::download(content);
+ });
+
+ let mut start_iter = buffer.get_end_iter();
+ let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
+ content_view.add_child_at_anchor(&button, &anchor);
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert(&mut end_iter, "\n");
+}
+
fn insert_external_button(gui: &Arc<Gui>, url: Url, label: &str) {
let content_view = gui.content_view();
let buffer = content_view.get_buffer().unwrap();
---
Served by Pollux Gemini Server.
-- Response ended
-- Page fetched on Sun May 19 07:55:06 2024