Commit Diff


commit - 69f32f5683dd763deaf6704db810fe5ab82fa5bd
commit + c6efff9689c26914de162ab1aee8fd362335d726
blob - 0c1616c92912ba90abe1c57a6cc4b027ddc46e44
blob + 11fbb3ea7c49748676cf2de36f142f2c6172dcb5
--- cmd.c
+++ cmd.c
@@ -547,8 +547,6 @@ cmd_load_url(struct buffer *buffer)
 	enter_minibuffer(sensible_self_insert, lu_select, exit_minibuffer,
 	    &lu_history, NULL, NULL);
 	strlcpy(ministate.prompt, "Load URL: ", sizeof(ministate.prompt));
-	strlcpy(ministate.buf, "gemini://", sizeof(ministate.buf));
-	cmd_move_end_of_line(&ministate.buffer);
 }
 
 void
blob - ec8779a1d316069a5d20451ba8150655023d4aff
blob + 25df1a9c74f194f0b1c8b304b1e3c1aaea927a4d
--- minibuffer.c
+++ minibuffer.c
@@ -221,9 +221,13 @@ ir_select_gopher(void)
 void
 lu_select(void)
 {
+	char url[GEMINI_URL_LEN+1];
+
 	exit_minibuffer();
 	minibuffer_hist_save_entry();
-	load_url_in_tab(current_tab, ministate.buf, NULL, 0);
+
+	humanify_url(ministate.buf, url, sizeof(url));
+	load_url_in_tab(current_tab, url, NULL, 0);
 }
 
 void
blob - 4ace49219df34292458b764ca6f14b75c635749d
blob + b4b3140046095bfc4e400d990e2bd8a7f0cf3d57
--- telescope.c
+++ telescope.c
@@ -929,7 +929,47 @@ add_to_bookmarks(const char *str)
 	ui_send_fs(IMSG_BOOKMARK_PAGE, 0,
 	    str, strlen(str)+1);
 }
+
+/*
+ *  Given a user-entered URL, apply some heuristics to use it:
+ *
+ *  - if it's a proper url use it
+ *  - if it starts with a `./' or a `/' assume its a file:// url
+ *  - assume it's a gemini:// url
+ *
+ *  `ret' (of which len is the size) will be filled with the resulting
+ *  url.
+ */
+void
+humanify_url(const char *raw, char *ret, size_t len)
+{
+	struct phos_uri	uri;
+	char		buf[PATH_MAX];
 
+	if (phos_parse_absolute_uri(raw, &uri)) {
+		strlcpy(ret, raw, len);
+		return;
+	}
+
+	if (has_prefix(raw, "./")) {
+		strlcpy(ret, "file://", len);
+		getcwd(buf, sizeof(buf));
+		strlcat(ret, buf, len);
+		strlcat(ret, "/", len);
+		strlcat(ret, raw+2, len);
+		return;
+	}
+
+	if (*raw == '/') {
+		strlcpy(ret, "file://", len);
+		strlcat(ret, raw, len);
+		return;
+	}
+
+	strlcpy(ret, "gemini://", len);
+	strlcat(ret, raw, len);
+}
+
 static pid_t
 start_child(enum telescope_process p, const char *argv0, int fd)
 {
@@ -1002,8 +1042,7 @@ main(int argc, char * const *argv)
 	int		 proc = -1;
 	int		 sessionfd;
 	int		 status;
-	char		 path[PATH_MAX];
-	const char	*url = NEW_TAB_URL;
+	char		 path[PATH_MAX], url[GEMINI_URL_LEN+1];
 	const char	*argv0;
 
 	argv0 = argv[0];
@@ -1068,7 +1107,7 @@ main(int argc, char * const *argv)
 
 	if (argc != 0) {
 		has_url = 1;
-		url = argv[0];
+		humanify_url(argv[0], url, sizeof(url));
 	}
 
 	/* setup keys before reading the config */
blob - a11df120af6df0245b79aa4a40723dd9a031bbaa
blob + ffbff0e490391c6f58a3e547e73b66863c2d13eb
--- telescope.h
+++ telescope.h
@@ -328,6 +328,7 @@ void		 load_url_in_tab(struct tab *, const char *, con
 int		 load_previous_page(struct tab*);
 int		 load_next_page(struct tab*);
 void		 add_to_bookmarks(const char*);
+void		 humanify_url(const char *, char *, size_t);
 int		 ui_send_net(int, uint32_t, const void *, uint16_t);
 int		 ui_send_fs(int, uint32_t, const void *, uint16_t);