commit 449ea6fe32441d2fd3875c5eee5d0c77800cfa7d from: Omar Polo date: Tue Jan 16 10:44:53 2024 UTC apply load-url-use-heuristic for command line arguments too This semplifies a bit the handling. humanify_url() now takes the base URL which we can then use when not using the heuristics. Command-line arguments now take an implicit base of when the heuristics are disabled, so that foo.gmi resolves to the local file even without <./>. See github issue #10. commit - bbf982974ca98df9b032cfe1b76b680e68a4969a commit + 449ea6fe32441d2fd3875c5eee5d0c77800cfa7d blob - 7dea5c7de8a8ec4bc564380c08853cc03075e62d blob + 34abcd824819232b05a0c8ce3b2a9b468f46a8bf --- include/telescope.h +++ include/telescope.h @@ -328,7 +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 write_buffer(const char *, struct tab *); -void humanify_url(const char *, char *, size_t); +void humanify_url(const char *, const char *, char *, size_t); int bookmark_page(const char *); int ui_send_net(int, uint32_t, const void *, uint16_t); blob - b4ba4de64eeb63fa0f07375eca08b6e5428fa77c blob + 3505c26ce050a82be817c9bde5ad177be56dc650 --- minibuffer.c +++ minibuffer.c @@ -22,7 +22,6 @@ #include #include -#include "defaults.h" #include "fs.h" #include "iri.h" #include "minibuffer.h" @@ -331,19 +330,13 @@ void lu_select(void) { char url[GEMINI_URL_LEN+1]; - char *base = NULL; minibuffer_hist_save_entry(); - - if (load_url_use_heuristic) - humanify_url(minibuffer_compl_text(), url, sizeof(url)); - else { - strlcpy(url, minibuffer_compl_text(), sizeof(url)); - base = current_tab->hist_cur->h; - } + humanify_url(minibuffer_compl_text(), current_tab->hist_cur->h, + url, sizeof(url)); exit_minibuffer(); - load_url_in_tab(current_tab, url, base, LU_MODE_NOCACHE); + load_url_in_tab(current_tab, url, NULL, LU_MODE_NOCACHE); } void blob - a662565490fa4ba9e2a8c21a02f7386513972e08 blob + 2da8f955d1f940939a6b3950f27800f1c3ed324b --- telescope.1 +++ telescope.1 @@ -178,6 +178,10 @@ assume it's a file:// URL, .It otherwise assume it's a Gemini URL. .El +.Pp +The setting +.Ic load-url-use-heuristic +can be used to disable the use of heuristics. .Sh CONFIGURATION FILE During the startup, .Nm @@ -302,9 +306,11 @@ URL for the new tab page. Defaults to .Dq about:new . .It Ic load-url-use-heuristic -If zero, don't use euristics for the url given to +If zero, don't use euristics to resolve the URLs. +Non-absolute URLs given as command line argument will be resolved as +file system paths, .Ic load-url -and use the current URL as base. +will resolve as relative to the current URL. Defaults to 1. .It Ic max-killed-tabs .Pq integer blob - a40e1ef6ad4e3b2f5760ba6403428b794d1668a5 blob + 523b39689816b53dd033316708ec647afbfe020c --- telescope.c +++ telescope.c @@ -55,6 +55,7 @@ static const char *opts = "Cc:hnST:v"; static int has_url; static char url[GEMINI_URL_LEN]; +static char cwd[PATH_MAX]; /* * Used to know when we're finished loading. @@ -892,7 +893,8 @@ write_buffer(const char *path, struct tab *tab) } /* - * Given a user-entered URL, apply some heuristics to use it: + * Given a user-entered URL, apply some heuristics to use it if + * load-url-use-heuristic allows it. * * - if it's a proper url use it * - if it starts with a `./' or a `/' assume its a file:// url @@ -902,20 +904,21 @@ write_buffer(const char *path, struct tab *tab) * url. */ void -humanify_url(const char *raw, char *ret, size_t len) +humanify_url(const char *raw, const char *base, char *ret, size_t len) { static struct iri iri; - char buf[PATH_MAX]; - if (iri_parse(NULL, raw, &iri) == 0) { + if (load_url_use_heuristic) + base = NULL; + + if (iri_parse(base, raw, &iri) == 0) { iri_unparse(&iri, ret, len); return; } if (!strncmp(raw, "./", 2)) { strlcpy(ret, "file://", len); - getcwd(buf, sizeof(buf)); - strlcat(ret, buf, len); + strlcat(ret, cwd, len); strlcat(ret, "/", len); strlcat(ret, raw+2, len); return; @@ -1042,6 +1045,9 @@ main(int argc, char * const *argv) if (getenv("NO_COLOR") != NULL) enable_colors = 0; + if (getcwd(cwd, sizeof(cwd)) == NULL) + err(1, "getcwd failed"); + while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1) { switch (ch) { case 'C': @@ -1089,11 +1095,6 @@ main(int argc, char * const *argv) usage(1); } - if (argc != 0) { - has_url = 1; - humanify_url(argv[0], url, sizeof(url)); - } - fs_init(); /* setup keys before reading the config */ @@ -1112,6 +1113,18 @@ main(int argc, char * const *argv) (download_path = strdup("/tmp/")) == NULL) errx(1, "strdup"); + if (argc != 0) { + char *base; + + if (asprintf(&base, "file://%s/", cwd) == -1) + err(1, "asprintf"); + + has_url = 1; + humanify_url(argv[0], base, url, sizeof(url)); + + free(base); + } + if (!safe_mode && (sessionfd = lock_session()) == -1) { if (has_url) { send_url(url);