URI method map support in Chawan
Chawan can be used to map unrecognized protocols to known protocols using the
urimethodmap
format.
The main use case for this is implementing handlers to protocols unknown to Chawan through a protocol that the browser does understand.
Search path
The search path for urimethodmap files can be overridden using the
configuration variable external.urimethodmap
.
The default search path for urimethodmap files is:
$HOME/.urimethodmap:$HOME/.w3m/urimethodmap:/etc/urimethodmap:/usr/local/etc/urimethodmap
Format
The urimethodmap format is taken 1:1 from w3m, with only some modifications to the interpretation of templates.
A rough attempt at the formal description of this:
URIMethodMap-File = *URIMethodMap-line
URIMethodMap-Line = Comment / URIMethodMap-Entry
URIMethodMap-Entry = Protocol *WHITESPACE Template *WHITESPACE CR
Protocol = 1*CHAR COLON
Template = [see below]
Comment = *WHITESPACE CR / "#" *CHAR CR
Note that an ASCII colon sign (:) must be present after the protocol name. However, the whitespace may be omitted.
Examples:
# This is ok:
protocol: /cgi-bin/interpret-protocol?%s
# This is ok too:
protocol:/cgi-bin/interpret-protocol?%s
# Spaces and tabs are both allowed, so this is also ok:
protocol: /cgi-bin/interpret-protocol?%s
# However, this is incorrect, because the colon sign is missing:
protocol /cgi-bin/interpret-protocol?%s
The redirection template is the target URL. If the string %s
is contained
in the template, it will be replaced by the target URL.
Note: Chawan used to URL-encode the substituted URL in the past, but this is no longer the case.
For compatibility with w3m, templates starting with /cgi-bin/
and
file:/cgi-bin/
are special-cased and the starting string is replaced with
cgi-bin:
. So for example, the template /cgi-bin/w3mdict.cgi
is the same as
cgi-bin:w3mdict.cgi
(and so is file:/cgi-bin/w3mdict.cgi
).
Example:
# The following are the same in Chawan
protocol: /cgi-bin/interpret-protocol?%s
protocol: file:/cgi-bin/interpret-protocol?%s
# Note: this last entry does not work in w3m.
protocol: cgi-bin:interpret-protocol?%s
Note however that absolute paths to cgi scripts are NOT special cased, so
e.g. file:///usr/local/libexec/w3m/cgi-bin/w3mdict.cgi
will simply open
w3mdict.cgi in the file viewer. (Unlike in w3m, where it could run
w3mdict.cgi
depending on the user's configuration.)
Examples
In config.toml
# Following sets the urimethodmap search path to the path relative to the
# configuration file. So if your configuration file is in
# ~/.config/chawan/config.toml, Chawan will use ~/.config/chawan/urimethodmap.
# in the same directory.
[external]
urimethodmap = "urimethodmap"
In urimethodmap
magnet.cgi
# Use the `magnet.cgi` CGI shell script to pass magnet links to Transmission.
magnet: /cgi-bin/magnet.cgi?%s
magnet.cgi
can be found in the bonus/
directory. You can also write a
local CGI wrapper to pass the links to your BitTorrent client of choice.
dict
In w3m, urimethodmap is commonly (ab)used to define shorthands for CGI scripts.
This works in Chawan too; for an example, you could define a tl:
shorthand
like this:
# (trans.cgi is a script you can find and study in the bonus/ directory.)
tl: /cgi-bin/trans.cgi?%s
Then, you could open the translation of any word using tl:word
.
Note however that Chawan has a more powerful facility for substitution shorthands like this in the form of omni-rules. So if you want to redirect to an on-line dictionary site with tl:word instead of providing a local CGI interface, it is probably easier to just use omni-rules instead of urimethodmap + local CGI redirection.
Rule of thumb: if you find yourself writing local CGI scripts that just
send a Location:
header, maybe consider just using an omni-rule.