mediocre-caddy-plugins
Plugins to the Caddy webserver which I've developed for myself.
Build
A Caddy binary with these plugins included can be built using the xcaddy tool:
xcaddy build --with dev.mediocregopher.com/mediocre-caddy-plugins.git
If you want just a specific plugin you can choose it using its module path:
xcaddy build \
--with dev.mediocregopher.com/mediocre-caddy-plugins.git/http/handlers/templates/functions
It's also possible to build Caddy manually using a custom main.go
file, see
the example from the caddy repo.
Plugins
The following plugins are implemented in this module.
http.handlers.gemtext
This HTTP handler will translate gemtext documents into HTML
documents. It requires at least one argument, template
, to which is passed an
HTML template file that gemtext documents will be rendered into.
Only responses with a Content-Type
of text/gemini
will be modified by this
module.
Example usage:
http://gemtext.localhost {
root example/static
gemtext {
root example/tpl
template render_gemtext.html
}
file_server
}
Parameters
template
Path to the template which will be used to render the HTML page, relative to the
root
.
The template will be rendered with these extra data fields:
-
.Title
: The Title of the gemini document, determined based on the first primary header (single#
prefix) found. This will be an empty string if no primary header is found. -
.Body
: A string containing all rendered HTML DOM elements.
heading_template
Path to a template which will be used for rendering headings. If not given then headings will be rendered with appropriate HTML header tags.
The template will be rendered with these extra data fields:
-
.Level
: Which level of heading is being rendered, 1, 2, or 3. -
.Text
: The text of the heading.
link_template
Path to a template which will be used for rendering links. If not given then links will be rendered using an anchor tag wrapped in a paragraph tag.
The template will be rendered with these extra data fields:
.URL
: The URL the link points to..Label
: The label attached to the link. If the original link had no label then this will be equivalent to.URL
.
root
The root path from which to load templaet files. Default is {http.vars.root}
if set, or current working directory otherwise.
delimiters
The template action delimiters. Defaults to:
delimiters "{{" "}}"
http.handlers.templates.functions.gemtext_function
This extension to templates
allows for rendering a gemtext string
as a roughly equivalent set of HTML tags. It is similar to the markdown template
function in its usage. It can be enabled by being included in the
templates.extensions
set.
templates {
extensions {
gemtext_function {
# All parameters are optional
gateway_url "https://some.gateway/x/"
}
}
}
See the template.localhost
virtual host in ./example/Caddyfile
, and the
associated ./example/tpl/render_gemtext.html
template file, for an example of
how to use this directive.
Parameters
Optional parameters to the gemtext_function
extension include:
gateway_url
If given then any gemini://
URLs encountered as links within
the document will be appended to this URL, having their gemini://
scheme
stripped off first.
e.g. if gateway_url
is https://some.gateway/x/
then the following line:
=> gemini://geminiprotocol.net Check it out!
becomes
<a href="https://some.gateway/x/geminiprotocol.net">Check it out!</a>
Template function
Within a template being rendered the gemtext
function will be available and
can be passed any string. The function will return a struct with the following
fields:
-
Body
: The result of converting each line of the input string into an equivalent line of HTML. This will not include any wrapping HTML tags like<div>
or<body>
. -
Title
: A suggested title, based on the first# Header
line found in the gemtext input.
Development
A nix-based development environment is provided with the correct versions of all development dependencies. It can be activated by doing:
nix-shell
The ./cmd/mediocre-caddy
binary package can be used to run a Caddy instance
with all plugins provided by this package pre-installed.
The Caddyfile ./example/Caddyfile
can be used to spin up a Caddy instance with
various virtual-hosts predefined with useful configurations for testing. See
that file for a description of the available virtual hosts.
go run ./cmd/mediocre-caddy run --config ./example/Caddyfile