commit c6efff9689c26914de162ab1aee8fd362335d726 from: Omar Polo date: Mon Aug 16 10:35:02 2021 UTC add some heuristics to interpret user-provided URLs 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);