-- 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