-- Leo's gemini proxy
-- Connecting to typed-hole.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
commit b6e2afe7d303bdd2ee64eece56e5666d8bf846a9
Author: Julien Blanchard <julien@sideburns.eu>
Date: Thu Jul 11 18:35:49 2019 +0200
Only use one SelectView
breaks vi keys for now
diff --git a/src/main.rs b/src/main.rs
index d657a3c..e29ee1c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,8 +1,8 @@
-use cursive::traits::*;
use cursive::align::HAlign;
+use cursive::event::EventResult;
+use cursive::traits::*;
use cursive::view::Scrollable;
-use cursive::views::{Dialog, Panel, TextView, EditView, SelectView, OnEventView};
-use cursive::event::{EventResult};
+use cursive::views::{Dialog, EditView, OnEventView, Panel, SelectView, TextView};
use cursive::Cursive;
extern crate native_tls;
@@ -11,8 +11,8 @@ extern crate regex;
use native_tls::TlsConnector;
use regex::Regex;
-use std::net::TcpStream;
use std::io::{Read, Write};
+use std::net::TcpStream;
use std::fs::File;
use std::fs::OpenOptions;
@@ -22,7 +22,7 @@ use url::Url;
struct Status {
code: i8,
- meta: String
+ meta: String,
}
impl FromStr for Status {
@@ -49,12 +49,29 @@ fn main() {
let mut siv = Cursive::default();
+ let mut select = SelectView::new();
+
+ select.add_all_str(HELP.lines());
+ select.set_on_submit(follow_link);
+
+ // let select_view = OnEventView::new(select)
+ // .on_pre_event_inner('k', |s, _| {
+ // s.select_up(1);
+ // Some(EventResult::Consumed(None))
+ // })
+ // .on_pre_event_inner('j', |s, _| {
+ // s.select_down(1);
+ // Some(EventResult::Consumed(None))
+ // });
+
siv.add_fullscreen_layer(
- Dialog::around(Panel::new(TextView::new(HELP).with_id("content").scrollable().full_screen()))
- .title("Asuka Browser")
- // This is the alignment for the button
- .h_align(HAlign::Center)
- .button("Quit", |s| s.quit()),
+ Dialog::around(Panel::new(
+ select.with_id("main").scrollable().full_screen()
+ ))
+ .title("Asuka Browser")
+ .h_align(HAlign::Center)
+ .button("Quit", |s| s.quit())
+ .with_id("container")
);
// Show a welcome popup
@@ -81,38 +98,27 @@ fn prompt_for_url(s: &mut Cursive) {
.content(
EditView::new()
.on_submit(visit_url)
- .with_id("url_field")
.fixed_width(20)
- ));
+ ).with_id("url_popup")
+ );
}
fn visit_url(s: &mut Cursive, url: &str) {
- // s.pop_layer();
+ // Close URL popup if any
+ if s.find_id::<Dialog>("url_popup").is_some() {
+ s.pop_layer();
+ }
match get_data(&url) {
Ok(new_content) => {
- let mut select = SelectView::new()
- .h_align(HAlign::Left);
-
- s.add_layer(Dialog::info(url));
-
- select.add_all_str(new_content.lines());
- select.set_on_submit(follow_link);
-
- let select = OnEventView::new(select)
- .on_pre_event_inner('k', |s, _| {
- s.select_up(1);
- Some(EventResult::Consumed(None))
- })
- .on_pre_event_inner('j', |s, _| {
- s.select_down(1);
- Some(EventResult::Consumed(None))
- });
-
- s.add_layer(
- Dialog::around(select.scrollable().full_screen()).title(url),
- );
- },
+ let mut main_view = s.find_id::<SelectView>("main").unwrap();
+ let mut container = s.find_id::<Dialog>("container").unwrap();
+
+ container.set_title(url);
+ main_view.clear();
+ main_view.add_all_str(new_content.lines());
+ main_view.set_on_submit(follow_link);
+ }
Err(msg) => {
s.add_layer(Dialog::info(msg));
}
@@ -122,11 +128,10 @@ fn visit_url(s: &mut Cursive, url: &str) {
fn follow_link(s: &mut Cursive, line: &str) {
let text = format!("{}", line);
let re1 = Regex::new(r"^\[(.*)\|(URL:)?(.*)\]$").unwrap(); // `[Foo|URL:link]` links
- let re2 = Regex::new(r"^=>\s(\S*)\s(\w*)$").unwrap(); // `=> link Foo` links
+ let re2 = Regex::new(r"^=>\s(\S*)\s(\w*)$").unwrap(); // `=> link Foo` links
if re1.is_match(&text) {
let caps = re1.captures(&text).unwrap();
- s.pop_layer();
let url = caps.get(3).map_or("", |m| m.as_str());
let next_url = if url.starts_with("gemini://") {
url.to_owned()
@@ -138,7 +143,6 @@ fn follow_link(s: &mut Cursive, line: &str) {
visit_url(s, &next_url)
} else if re2.is_match(&text) {
let caps = re2.captures(&text).unwrap();
- s.pop_layer();
let url = caps.get(1).map_or("", |m| m.as_str());
let next_url = if url.starts_with("gemini://") {
url.to_owned()
@@ -156,7 +160,7 @@ fn follow_link(s: &mut Cursive, line: &str) {
fn is_link(line: &str) -> bool {
let text = format!("{}", line);
let re1 = Regex::new(r"^\[(.*)\|(URL:)?(.*)\]$").unwrap(); // `[Foo|URL:link]` links
- let re2 = Regex::new(r"^=>\s(\S*)\s(\w*)$").unwrap(); // `=> link Foo` links
+ let re2 = Regex::new(r"^=>\s(\S*)\s(\w*)$").unwrap(); // `=> link Foo` links
re1.is_match(&text) || re2.is_match(&text)
}
@@ -187,34 +191,39 @@ fn get_data(url: &str) -> Result<String, String> {
let mut res = vec![];
stream.read_to_end(&mut res).unwrap();
Ok(String::from_utf8_lossy(&res).to_string())
- },
- Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e))
+ }
+ Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e)),
}
- },
- Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e))
+ }
+ Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e)),
}
}
fn go_back(s: &mut Cursive) {
match get_previous_url() {
Some(url) => visit_url(s, &url),
- None => ()
+ None => (),
}
}
fn get_last_host() -> String {
let mut file = File::open("/tmp/asuka_history").expect("file not found");
let mut content = String::new();
- file.read_to_string(&mut content).expect("Unable to read file");
+ file.read_to_string(&mut content)
+ .expect("Unable to read file");
let url = content.lines().last().unwrap();
let urlp = Url::parse(url).unwrap();
urlp.host_str().unwrap().to_owned()
}
fn get_previous_url() -> Option<String> {
- let mut file = OpenOptions::new().read(true).open("/tmp/asuka_history").unwrap();
+ let mut file = OpenOptions::new()
+ .read(true)
+ .open("/tmp/asuka_history")
+ .unwrap();
let mut content = String::new();
- file.read_to_string(&mut content).expect("Unable to read file");
+ file.read_to_string(&mut content)
+ .expect("Unable to read file");
let lines_count = content.lines().count();
if lines_count > 1 {
@@ -234,5 +243,6 @@ fn append_history(url: &str) {
.unwrap();
let line = format!("{}\n", url);
- file.write_all(line.as_bytes()).expect("Unable to write file");
+ file.write_all(line.as_bytes())
+ .expect("Unable to write file");
}
---
Served by Pollux Gemini Server.
-- Response ended
-- Page fetched on Sun May 19 11:03:27 2024