From 153ea907a8d8cef48b86c550d099c703b327529a Mon Sep 17 00:00:00 2001 From: sgerwk Date: Sat, 25 Jul 2020 13:28:56 +0200 Subject: [PATCH] also pass the uri as %u to external handlers --- doc/mime.txt | 19 ++++++++++--------- src/mime/backend/default.c | 3 ++- src/session/download.c | 28 +++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/doc/mime.txt b/doc/mime.txt index 4ba7d080..8c6bf977 100644 --- a/doc/mime.txt +++ b/doc/mime.txt @@ -91,7 +91,8 @@ choice if you want). Attaching a program to it:: You must tell ELinks the exact command for running it (with any - options you wish). In place of the filename you must enter %. + options you wish). In place of the filename you must enter %f. Also the + uri can be used as %u. Choosing whether you want confirmation before applying it:: @@ -144,12 +145,12 @@ and value with the value you want to assign to the item. You must do so for each of the available items: program, ask and block. The value for program is a string with the exact command you want to be issued -to view the file, placing % were you would put the file name. The values for -ask and block are either 0 (no) or 1 (yes). Available contexts include unix -and unix-xwin, which mean UNIX text terminal and X respectively (others can be -os2, win32, beos, riscos, ...). The latter does not mean you are running -ELinks from X, just that the DISPLAY variable is set so that ELinks may run an -X program. +to view the file, placing %f were you would put the file name and %u the uri +(if needed). The values for ask and block are either 0 (no) or 1 (yes). +Available contexts include unix and unix-xwin, which mean UNIX text terminal +and X respectively (others can be os2, win32, beos, riscos, ...). The latter +does not mean you are running ELinks from X, just that the DISPLAY variable is +set so that ELinks may run an X program. To illustrate it, here is an example. Suppose you want to define the image_viewer handler which should be used to view images. The configuration @@ -162,8 +163,8 @@ set mime.handler.image_viewer.unix-xwin.ask = 0 set mime.handler.image_viewer.unix.block = 1 set mime.handler.image_viewer.unix-xwin.block = 0 -set mime.handler.image_viewer.unix.program = "zgv %" -set mime.handler.image_viewer.unix-xwin.program = "xli %" +set mime.handler.image_viewer.unix.program = "zgv %f" +set mime.handler.image_viewer.unix-xwin.program = "xli %f" -------------------------------------------------------------------------------- In this example the image_viewer handler uses the svgalib image viewer zgv diff --git a/src/mime/backend/default.c b/src/mime/backend/default.c index 923b073b..8e191fa7 100644 --- a/src/mime/backend/default.c +++ b/src/mime/backend/default.c @@ -74,7 +74,8 @@ static union option_info default_mime_options[] = { "program", 0, "", /* xgettext:no-c-format */ N_("External viewer for this file type. " - "'%' in this string will be substituted by a file name. " + "'%f' in this string will be substituted by a file name, " + "'%u' by its uri. " "Do _not_ put single- or double-quotes around the % sign.")), diff --git a/src/session/download.c b/src/session/download.c index 000bbe97..97552f6b 100644 --- a/src/session/download.c +++ b/src/session/download.c @@ -1028,12 +1028,13 @@ get_temp_name(struct uri *uri) static unsigned char * -subst_file(unsigned char *prog, unsigned char *file) +subst_file(unsigned char *prog, unsigned char *file, unsigned char *uri) { struct string name; /* When there is no %s in the mailcap entry, the handler program reads * data from stdin instead of a file. */ int input = 1; + char *replace, *original = "% "; if (!init_string(&name)) return NULL; @@ -1046,6 +1047,21 @@ subst_file(unsigned char *prog, unsigned char *file) prog += p; if (*prog == '%') { + prog++; + if (*prog == 'f' || *prog == ' ' || *prog == '\0') + replace = file; + else if (*prog == 'u') + replace = uri; + else if (*prog == '%') + replace = "%"; + else { + original[1] = *prog; + replace = original; + } + + if (*prog == ' ' || *prog == '\0') + prog--; + input = 0; #if defined(HAVE_CYGWIN_CONV_TO_FULL_WIN32_PATH) #ifdef MAX_PATH @@ -1054,10 +1070,10 @@ subst_file(unsigned char *prog, unsigned char *file) unsigned char new_path[1024]; #endif - cygwin_conv_to_full_win32_path(file, new_path); + cygwin_conv_to_full_win32_path(replace, new_path); add_to_string(&name, new_path); #else - add_shell_quoted_to_string(&name, file, strlen(file)); + add_shell_quoted_to_string(&name, replace, strlen(replace)); #endif prog++; } @@ -1242,7 +1258,8 @@ continue_download_do(struct terminal *term, int fd, void *data, if (type_query->external_handler) { file_download->external_handler = subst_file(type_query->external_handler, - codw_hop->file); + codw_hop->file, + type_query->uri->string); file_download->delete_ = 1; file_download->copiousoutput = type_query->copiousoutput; mem_free(codw_hop->file); @@ -1490,7 +1507,8 @@ tp_open(struct type_query *type_query) if (file) { decode_uri(file); - handler = subst_file(type_query->external_handler, file); + handler = subst_file(type_query->external_handler, + file, file); mem_free(file); }