Commit Diff


commit - 8f0d39751ffcf89f3dc934a6e012cd7706eb60e1
commit + 325528b9291af890d8395c034513d0d6595a1e0d
blob - 3a3bcc78bed2efbfd039e00d8987355f614ec851 (mode 644)
blob + /dev/null
--- site/Makefile
+++ /dev/null
@@ -1,74 +0,0 @@
-RSYNC =		openrsync --rsync-path=openrsync
-
-MANPAGES =	../telescope.1
-
-PAGES =		index.gmi \
-		telescope.1.txt \
-		gallery.gmi \
-		log.gmi
-
-TITLE_index.gmi =	Home
-TITLE_telescope.1.txt =	Manpage
-TITLE_gallery.gmi =	Gallery
-TITLE_log.gmi =		ChangeLog
-
-REPOLOGY_BANNER =	https://repology.org/badge/vertical-allrepos/telescope.svg
-REPOLOGY_URL =		https://repology.org/project/telescope/versions
-
-SUBST =	./subst CURRV=0.9.1 CURRKEY=0.9 NEXTKEY=0.10 \
-	CURRSIGN=RWSmshjFM8Q0IDYUd4I/8G2q9Y0DUaZLac4enOtQh5rzsIcVF+ePXCy7 \
-	REPOLOGY_BANNER=${REPOLOGY_BANNER} \
-	REPOLOGY_URL=${REPOLOGY_URL}
-
-SUBST_GEM =	${SUBST} MANEXT=txt  EXT=gmi
-SUBST_WWW =	${SUBST} MANEXT=html EXT=html
-
-.PHONY: all dirs manpages serve-www serve-gemini upload clean titles
-
-all: dirs manpages pages
-	cp logo.png gemini/
-	cp mandoc.css style.css www/
-	cp logo.png www/
-	cp -R gallery gemini
-	cp -R gallery www
-	convert logo.png -resize 200x200 www/logo.small.png
-
-dirs:
-	mkdir -p gemini www
-
-manpages:
-.for m in ${MANPAGES}
-	man -O style=mandoc.css -Thtml -l $m > www/${m:T}.html
-	man -O width=64 -Tutf8 -l $m | col -b > gemini/${m:T}.txt
-.endfor
-
-pages:
-.for p in ${PAGES}
-. if "$p" != "telescope.1.txt"
-	grep -v '^<' $p | ${SUBST_GEM} > gemini/$p
-
-	${SUBST_WWW} TITLE=${TITLE_${p}:Q} header.html > www/$p
-	${MAKE} titles | ./menu.pl "${p:.gmi=.html}" >> www/$p
-	${SUBST_WWW} $p | ./gem2html >> www/$p
-	cat footer.html >> www/$p
-	cd www && mv $p ${p:.gmi=.html}
-. endif
-.endfor
-
-serve-www:
-	python3 -m http.server --directory www 8888
-
-serve-gemini:
-	gemexp -p 1966 gemini
-
-upload:
-	${RSYNC} --del -a gemini/ antartica:/var/gemini/telescope.omarpolo.com
-	${RSYNC} --del -a www/ antartica:/var/www/telescope.omarpolo.com
-
-clean:
-	rm -rf gemini www
-
-titles:
-.for p in ${PAGES}
-	@printf "%s %s\n" "${p:R}.html" ${TITLE_${p}:Q}
-.endfor
blob - 0b1a491b5687a2f04fc2899785ab32d9ad570866 (mode 644)
blob + /dev/null
--- site/footer.html
+++ /dev/null
@@ -1,10 +0,0 @@
-        <footer>
-            <p>
-                This site over
-                <a href="gemini://telescope.omarpolo.com">
-                  <code>gemini://</code>
-                </a>
-            </p>
-        </footer>
-    </body>
-</html>
blob - 89fb8ab14c872a5df65936844e1edcaea7b7fa12 (mode 644)
blob + /dev/null
Binary files site/gallery/contrib-brutalist.png and /dev/null differ
blob - 1549b03c690f36ecb7c77c0938fb980fe678d65d (mode 644)
blob + /dev/null
Binary files site/gallery/kitty-contrib-dark-about-help.png and /dev/null differ
blob - a44d14bd763eebb52c0d47638b4a998d956df306 (mode 644)
blob + /dev/null
Binary files site/gallery/kitty-contrib-dark-swiper.png and /dev/null differ
blob - 4e1cb100372535dcd95b9f717e6d8b8328422eb2 (mode 644)
blob + /dev/null
Binary files site/gallery/kitty-contrib-dark.png and /dev/null differ
blob - e5958044ad89e1d7d9eb8b0e55b644a18fe3502b (mode 644)
blob + /dev/null
Binary files site/gallery/kitty-default-look.png and /dev/null differ
blob - c63bf46995a5c8e4dc471e31dd44c5df108a84fd (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-contrib-brutalist.png and /dev/null differ
blob - 74f8053fcf0236f06cf7956afe92b6caec0e4ffe (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-kitty-contrib-dark-about-help.png and /dev/null differ
blob - f556f8b86978133bf9579057aa06a2531a7f0656 (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-kitty-contrib-dark-swiper.png and /dev/null differ
blob - 89bac118f433f36ff675794cdc87e20a1b95c42b (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-kitty-contrib-dark.png and /dev/null differ
blob - 0028874e763764ad86d4827d60f9f3bb6bc5afd0 (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-kitty-default-look.png and /dev/null differ
blob - ccbaa33ff0abed8d25690f2d9fe258f242719c37 (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-xterm-contrib-light-about-help.png and /dev/null differ
blob - 19fe6e1650f0493f3ac9bf7e518f8cf82bfc8001 (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-xterm-contrib-light-swiper.png and /dev/null differ
blob - 128c2cf1614d880aa24be63a02858842d139cf21 (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-xterm-contrib-light.png and /dev/null differ
blob - bb07a0326da32b32da013602907a115a0105e75b (mode 644)
blob + /dev/null
Binary files site/gallery/thumb-xterm-default-look.png and /dev/null differ
blob - e20c6a4430e07e61f70520b7b10d52a238da02c4 (mode 644)
blob + /dev/null
Binary files site/gallery/xterm-contrib-light-about-help.png and /dev/null differ
blob - 0085be332c87b9bd5ae99bef33514dda54e35d44 (mode 644)
blob + /dev/null
Binary files site/gallery/xterm-contrib-light-swiper.png and /dev/null differ
blob - 4e4f074603420ea4e4441d9b33eb42c9524b1884 (mode 644)
blob + /dev/null
Binary files site/gallery/xterm-contrib-light.png and /dev/null differ
blob - 01bb23f91ff1e62d3abe622de5a3ad166932a51d (mode 644)
blob + /dev/null
Binary files site/gallery/xterm-default-look.png and /dev/null differ
blob - 66e06dc172e2cd00cee7c3b9b4fb5bfc6cf5e877 (mode 644)
blob + /dev/null
--- site/gallery.gmi
+++ /dev/null
@@ -1,15 +0,0 @@
-<main class="gallery">
-=> gallery/xterm-default-look.png		default look on bright terminal
-=> gallery/kitty-default-look.png		default look on dark terminal
-
-=> gallery/xterm-contrib-light.png		the contrib/light theme
-=> gallery/kitty-contrib-dark.png		the contrib/dark theme
-
-=> gallery/xterm-contrib-light-swiper.png	swiper with the contrib/light theme
-=> gallery/kitty-contrib-dark-swiper.png	swiper with the contrib/dark theme
-
-=> gallery/xterm-contrib-light-about-help.png	about:help with the contrib/light theme
-=> gallery/kitty-contrib-dark-about-help.png	about:help with the contrib/dark theme
-
-=> gallery/contrib-brutalist.png		Brutalist theme
-</main>
blob - b6c8b70e8bb9be4afb7a39648555fe81cdb833b9 (mode 755)
blob + /dev/null
--- site/gem2html
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/env perl
-#
-# Copyright (c) 2022 Omar Polo <op@omarpolo.com>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-use v5.10;
-use strict;
-use warnings;
-
-my $in_pre = 0;
-my $in_list = 0;
-
-while (<>) {
-	chomp;
-	if ($in_pre && m/^```/) {
-		$in_pre = 0;
-		say "</pre>";
-	} elsif (!$in_pre && m/^```/) {
-		if ($in_list) {
-			$in_list = 0;
-			say "</ul>";
-		}
-		$in_pre = 1;
-		print "<pre>";
-	} elsif ($in_pre) {
-		say san($_);
-	} elsif (m/^</) {
-		say;
-	} elsif ($in_list && m/^$/) {
-		say "</ul>";
-		$in_list = 0;
-	} elsif (m/^\*\s+(.*)/) { # NB: at least one space
-		if (!$in_list) {
-			$in_list = "item";
-			say "<ul>";
-		} elsif ($in_list eq "link") {
-			$in_list = "item";
-			say "</ul>";
-			say "<ul>";
-		}
-		output("li", $1);
-	} elsif (m/^=>\s*([^\s]*)\s*(.*)$/) {
-		my $href = $1;
-		my $alt = $2 || $1;
-
-		# special case: images
-		if ($1 =~ /\.(png|jpg|svg)$/) {
-			if ($in_list) {
-				say "</ul>";
-				$in_list = 0;
-			}
-			print "<figure>";
-			print "<a href='$href'>";
-			print "<img src='$href' alt='$alt' />";
-			print "</a>";
-			print "<figcaption>$alt</figcaption>";
-			print "</figure>\n";
-			next;
-		}
-
-		if (!$in_list) {
-			$in_list = "link";
-			say "<ul class='link-list'>";
-		} elsif ($in_list eq "item") {
-			$in_list = "link";
-			say "</ul>";
-			say "<ul class='link-list'>";
-		}
-		$_ = $alt;
-		say "<li><a href='$href'>". san() ."</a></li>";
-	} elsif (m/^###\s*(.*)$/) {
-		output("h3", $1);
-	} elsif (m/^##\s*(.*)$/) {
-		output("h2", $1);
-	} elsif (m/^#\s*(.*)$/) {
-		output("h1", $1);
-	} elsif (m/^>\s*(.*)$/) {
-		output("blockquote", $1);
-	} else {
-		output("p", $_);
-	}
-}
-
-say "</ul>" if $in_list;
-say "</pre>" if $in_pre;
-
-sub san {
-	s/&/\&amp;/g;
-	s/</\&lt;/g;
-	s/>/\&gt;/g;
-	return $_;
-}
-
-sub output {
-	my ($tn, $content) = @_;
-
-	if (!$in_list && $tn eq "li") {
-		$in_list = 1;
-		say "<ul>";
-	}
-
-	if ($in_list && $tn ne "li") {
-		$in_list = 0;
-		say "</ul>";
-	}
-
-	if ($tn eq "p" && $content eq "") {
-		return;
-	}
-
-	$_ = $content;
-	say "<$tn>". san() ."</$tn>";
-}
blob - 7a59d27fc1b4d5d758b240672c3ac74a29ac4652 (mode 644)
blob + /dev/null
--- site/header.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype html>
-<html lang="en">
-    <head>
-        <title>TITLE | telescope</title>
-        <meta charset="utf8" />
-        <meta name="viewport" content="width=device-width, initial-scale=1" />
-        <link rel="stylesheet" href="style.css" />
-    </head>
-    <body>
blob - 9986ef5d70a1766eb2576d16b7143054ad6c8dad (mode 644)
blob + /dev/null
--- site/index.gmi
+++ /dev/null
@@ -1,98 +0,0 @@
-<div class="banner">
-``` Ascii art of the word “Telescope” and “vCURRV”
- _______         __
-|_     _|.-----.|  |.-----.-----.----.-----.-----.-----.
-  |   |  |  -__||  ||  -__|__ --|  __|  _  |  _  |  -__|
-  |___|  |_____||__||_____|_____|____|_____|   __|_____|
-                                           |__| vCURRV
-```
-</div>
-
-> Telescope is a w3m-like browser for Gemini.
-
-<section class="with-image">
-<img src="logo.small.png" alt="the teleoscope logo: a telescope on a tripode with a city and the earth seen from space in the background, with some stars behind" title='Telescope logo -- by freezr'>
-<div>
-
-Telescope is written entirely for fun, as a hobbystic project in my free time.  As such, it lacks a ton of features you’ll find in more mature Gemini browsers, but it also has some unique ones.
-
-=> telescope.1.MANEXT				Documentation
-=> ircs://irc.libera.chat:6697/telescope	Join the official IRC channel
-
-
-The UI is strongly inspired from Emacs and W3M, so you’ll find some familiar concepts, such as the minibuffer or the tabline, and the default keybindigs also reflect this, but care has been taken to add keys familiar for vi and CUA users too.
-
-=> gemini://omg.pebcak.club/~freezr/gemlog/2022-09-02-telescope-logo.gmi The awesome logo was made by freezr!
-</div>
-</section>
-
-<p><a href="https://asciinema.org/a/426862" target="_blank"><img src="https://asciinema.org/a/426862.svg" /></a></p>
-=> https://asciinema.org/a/426862	Asciinema record
-
-## Install
-
-<p class='repology'><a href='REPOLOGY_URL'><img src='REPOLOGY_BANNER' alt='distro that provide a telescope package' /></a></p>
-=> REPOLOGY_URL Some distros provide a package — thanks to the maintainers!
-
-Source code is available for download:
-
-=> https://ftp.omarpolo.com/telescope-CURRV.tar.gz telescope-CURRV.tar.gz
-
-=> https://git.omarpolo.com/?index_page=&path=telescope.git&action=summary git repository
-=> https://codeberg.org/telescope-browser/telescope/	Codeberg mirror
-=> https://github.com/telescope-browser/telescope	GitHub mirror
-
-Telescope depends are ncursesw, libtls or libretls, yacc/bison and pkg-config.  libgrapheme is also needed, although there's a bundled copy.
-
-Once all the dependencies are installed, building is as easy as:
-
-```Example of how to compile from source
-$ curl -O https://ftp.omarpolo.com/telescope-CURRV.tar.gz
-$ tar xzvf telescope-CURRV.tar.gz
-$ cd telescope-CURRV
-$ ./configure
-$ make
-$ sudo make install	# eventually
-```
-
-A telescope-CURRV.tar.gz.sha256 file containing the checksums is available.  However, that only checks for accidental corruption: you can use signify (telescope-CURRV.tar.gz.sha256.sig and the public key telescope-CURRKEY.pub).  The hash of the current and next signify public key is also included in the telescope-CURRV.tar.gz.
-
-=> https://ftp.omarpolo.com/telescope-CURRV.tar.gz.sha256	telescope-CURRV.tar.gz.sha256
-=> https://ftp.omarpolo.com/telescope-CURRV.tar.gz.sha256.sig	telescope-CURRV.tar.gz.sha256.sig
-=> https://ftp.omarpolo.com/telescope-CURRKEY.pub		telescope-CURRKEY.pub
-=> https://ftp.omarpolo.com/telescope-NEXTKEY.pub		telescope-NEXTKEY.pub
-
-```Example of how to verify the signature with signify
-$ signify -C -p telescope-CURRKEY.pub -x telescope-CURRV.tar.gz.sha256.sig
-Signature Verified
-telescope-CURRV.tar.gz: OK
-```
-
-telescope-CURRKEY.pub is:
-
-```
-CURRSIGN
-```
-
-and is available inside the tarball in the keys/ directory, along with all the previous and public key for the next release as well.
-
-Starting from Telescope 0.9, git tags are signed with the following ssh key:
-
-```
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ0nD5I8BNVJknT87gnpLIJWK0fXTayDktQOlS38CGj4 op@omarpolo.com
-```
-
-
-## Changelog
-
-=> log.EXT Changelog for all versions
-
-0.9.1 “Cielo Super Acceso” — Bugfix Release, May 26, 2024
-
-### Bug Fixes
-
-* add a check in the configure to detect LibreSSL and OpenSSL mixings
-* fix parallel build with the bundled libgrapheme, by Thomas Adam
-* fix handling of missing TLS close_notify, also by Thomas Adam
-* update links to new gemcap, still by Thomas Adam :)
-* remove pkg-config handling in the configure, unused since 0.9
blob - 58afe22f7daed82a582b621ef2ffa3036563c1c6 (mode 644)
blob + /dev/null
--- site/log.gmi
+++ /dev/null
@@ -1,321 +0,0 @@
-# logs
-
-Changelog for all versions of telescope.
-
-## 2024/05/26 0.9.1 "Cielo Super Acceso"
-
-Signify public key for this release: RWRkrb76bmCHNKaMnALGf2UgKgq0d/O/ULTeGq36Dos7MGm79CXoZLWN
-
-### Bug Fixes
-
-* add a check in the configure to detect LibreSSL and OpenSSL mixings
-* fix parallel build with the bundled libgrapheme, by Thomas Adam
-* fix handling of missing TLS close_notify, also by Thomas Adam
-* update links to new gemcap, still by Thomas Adam :)
-* remove pkg-config handling in the configure, unused since 0.9
-
-
-## 2024/02/23 0.9 "Cielo Super Acceso"
-
-This release is named after a song by Verdena (again!)
-
-Signify public key for this release: RWRkrb76bmCHNKaMnALGf2UgKgq0d/O/ULTeGq36Dos7MGm79CXoZLWN
-
-### New features
-
-* Initial client certificate support.
-* Use libgrapheme for text reflowing: improves the word-wrapping for languages that don't use latin characters.
-* New commands for quick navigation: `up', `root' and `home' bound to "g u", "g r" and "g h" respectively.
-* Added a `search' command to quickly consult a search engine, as well as the `default-search-engine' option.
-* Added `load-url-use-heuristic' configuration option.
-* Added `default-protocol' configuration option.
-* Added telescope-identity(1) to create, delete and manage client certificates.
-
-### Improvements
-
-* Implemented a new URI parser: this will allow in the future to support IRIs too.
-* Allow configuration options to be booleans ("true" and "false") and change a few options where it made sense.  The old settings with 0 and 1 will continue to work for some time.
-* Removed the dependency on libevent: Telescope now uses a custom built-in event loop.
-* Rework the history management: the code is cleaner and requires less memory.
-* Reduced the amount of memory needed for rendering the pages by roughly 50%.
-* Landlock sandboxing is enabled again on Linux.
-* Update data/emoji.txt to UNICODE 15.0.
-
-### Bug Fixes
-
-* Fixed wrapping of link lines.
-* Fixed `bookmark-page' bogus error message.
-* Fixed caching of finger pages too.
-* Save to the persistent history finger:// and gopher:// URLs as well.
-* Fixed handling of gopher selectors with spaces and other "funny" characters.
-* Improved handling of connect(2) failures, as well as error reporting.
-* Changed the default colours for patch/diff to magenta and cyan.
-* Updated the link to the official gemini project capsule in about:new.
-* Corrected and extended about:license.
-
-### Breaking changes
-
-* Removed the -C/--colours flag: telescope is not a colour picker.
-
-
-## 2022/05/25 0.8.1 "Le Scarpe Volanti" bugfix release
-
-fix build on macos.  Reported by sikmir, thanks!
-
-
-## 2022/05/25 0.8 "Le Scarpe Volanti"
-
-The 0.8 release is named after "Le Scarpe Volanti" a song by Verdena.
-
-Note: landlock is currently disabled on linux due to the fs/ui merge.
-
-### New Features
-
-* save and restore scroll position
-* new command reply-last-input; idea from a conversation with thfr@, thanks!
-* allow push urls to an already opened telescope session
-* autocompletions for load-url and load-current-url
-* new command write-buffer (with alias w)
-* new command mini-kill-whole-line for the minibuffer
-* split the minibuffer input into words and try to match out of order
-
-### Improvements
-
-* move aliases at the top of the completions
-* add alias `open' for load-url; suggested by Florian, thanks!
-* update emoji-data.txt to 14.0.0
-* persist the list of visited URLs to the disk
-* fix builds out-of-tree
-* correctly mark variables in the manpage so it's possible to jump to them
-* rework completions selection: the selected entry is *always* the one used.  if nothing is selected, the minibuffer content is used instead.
-* merge the ui and fs processes
-* rate-limit the update of the download pane
-
-### Bug Fixes
-
-* fix parsing of invalid link lines
-* initialize each tab' loadingev timer event
-* fix the build on recent version of musl
-
-
-## 2022/01/15 0.7.1 "Via Paolo Fabbri 43" bugfix release
-
-fix use after free when loading an about:* page from about:about.  Reported by Brian Callahan, thanks!
-
-
-## 2022/01/13 0.7 "Via Paolo Fabbri 43"
-
-The 0.7 release is named after "Via Paolo Fabbri 43", a song by
-Francesco Guccini.
-
-Note: the format of the session file was extended. Old session file will
-be opened fine, but older telescope version won't be able to correctly
-handle session files generated after v0.7.
-
-### New features
-
-* caching: telescope will keep a in-memory copy of the visited page for some time to speed up history navigation. See also the new command `cache-info'.
-* persistent tab history: telescope will remember the full history for each tab across sessions.
-* re-open closed tabs (even across sessions!) The `u' key is now bound to `tab-undo-close' by default.
-* allow to customise the space after the end of the buffer. By default telescope now renders a vi-like tilde fringe "~", but it's fully customisable using the new `line.fringe' style identifier. See also the new setting `fringe-ignore-offset'.
-
-### Improvements
-
-* ask before quitting telescope.
-* execute-extended-command: execute the selected command on RET.
-* bump default fill-column to 120.
-* bind `del' (backspace) to previous-page. Suggested by Florian, thanks!
-* add --colours as --color alias. Suggested by Florian.
-
-### Bug fixes
-
-* fixed crash on --colors. Reported by Florian, thanks!
-* don't push the current url to the history *twice* at startup.
-
-### Breaking changes
-
-* variable `set-title' renamed to `update-title'. The old name will still be supported for a while to ease backwards compatibility.
-
-
-## 2021/11/29 0.6.1 "Piccola storia ignobile" bugfix release
-
-handle gracefully when landlock is disabled at runtime.  Reported and tested by Nikolay Korotkiy, thanks!
-
-
-## 2021/11/29 0.6 "Piccola storia ignobile"
-
-### New Features
-
-* added a pane that lists all the downloads (current or not)
-* download-path is customizable
-* sandbox/safe mode: telescope won't write anything to the file system.
-* XDG-style directories if ~/.telescope does not exists; idea and implementation by Andrea Feletto, thanks!  (there's a script also by him in contrib to migrate the setup)
-
-### Improvements
-
-* prefill the save prompt with the file name
-* use landlock on linux if available
-* add HOSTCC and HOSTCFLAGS variables for the configure script to allow cross-compiling (`pagebundler' needs to be built with the host compiler no matter what.)  Prompted and tested by Nikolay Korotkiy, thanks!
-
-### Bug Fixes
-
-* fix diff syntax highlighting with more than one header involved
-* [gemini] fix item line detection: a space is required after the `*' character
-* handle empty replies (i.e. no header.)  Found thanks to ondollo' capsule :)
-* fixed a crash on macOs, by Nikolay Korotkiy (sikmir on github). Thanks!
-* mention that telescope expects an UTF-8 environment in the CAVEATS section of the manpage
-
-
-## 2021/09/13 0.5.2 “Le Nuvole” bugfix release
-
-### Bugfixes
-
-* some very long pages can cause (rarely) telescope to render a blank page
-* allow creating files in ~/Downloads on OpenBSD
-* reset download byte counter
-
-
-## 2021/08/28 0.5.1 “Le Nuvole” bugfix release
-
-Telescope used to trim the initial “/” in gopher requests: this is not correct and while some servers are forgiving, other (rightfully) aren't.
-
-
-## 2021/08/27 0.5 "Le nuvole"
-
-### New features
-
-* support for the finger protocol
-* support for the gopher protocol (only item types 0, 1 and 7 for the moment)
-* highlight diff/patches
-* typing the protocol of a URI is not needed anymore: added some heuristics to assume file:// URLs and fall back to gemini:// as default
-* open local files and directories
-* add an autosave timer to persist the session once in a while
-* scroll completions with M-v/C-v (mini-scroll-up/mini-scroll-down)
-* variable `tab-bar-show' controls the visibility of the tab bar
-
-### Improvements
-
-* new heuristics to extract a title for pages without headings: use the domain name or the "tilde username"
-* about:new updated with some gopher links too
-* reload doesn't push the current url to the history anymore
-* push-button-new-tab opens a new tab *right after* the current one, not as the last
-* improved the crash detection
-* M-[ and M-] are bind to tab-move-to/tab-move
-
-### Bugfixes
-
-* fixed some crashes caused by cursor movements on empty pages
-* correctly parse multiple attributes
-
-
-## 2021/07/24 0.4.1 “La faccia della luna” buildfix release
-
-fixed the distributed tarball
-
-
-## 2021/07/24 0.4 “La faccia della luna”
-
-### New Features
-
-* completions in the minibuffer: this allowed various new commands to be implemented (swiper M-/, link-select M-l, toc t and tab-select M-t)
-* emojify links: when a link starts with an emoji followed by a space, use that emoji as link prefix.  This is similar to what Lagrange does.
-* tabs lazy loading: don’t load all tabs on startup; instead, load them only when selected.
-* add inc/dec-fill-column (C-c {, C-c })
-* push-button (RET) also toggle preformatted blocks
-* various new settings (hide-pre-blocks, hide-pre-content, hide-pre-closing-line)
-* load an alternate config file per-term
-* add suspend-telescope available as C-z
-* built-in about:* pages can be overridden by creating ~/.telescope/pages/about_*.gmi
-* added reload-page, available as ‘r’ or ‘<f5>’
-* M-prior/next (i.e. alt-pageup/down) binded to tab-previous and next. Currently doesn't seem to be supported by any terminal emulator I tried though.
-
-### Improvements
-
-* the net and fs process are now re-exec'd to gain a completely new random address space.  All the messages between the processes are completely asynchronous.
-* various new “intuitive” bindings: C-t for tab-new, C-w for tab-close, [ and ] for tab navigation, B and F for history navigation.
-* keep the scroll position after resize
-* invalid certificates that are accepted (but not saved) are remembered for the current session (i.e. don't ask at every page)
-* deal with BOMs
-* the side window (“*Help*”) is focusable with C-x o (other-window)
-* pretty-print help lines in side window
-* telescope now uses a lockfile to prevent multiple instances
-* don’t flash the screen when entering in the minibuffer
-* <home> and <end> moves to the beginning/end of the line
-* handle unknown protocols gracefully
-* keep the current tab from the last session on startup
-* drop trailing spaces when formatting a page
-* added about:crash with information on how to report crashes
-* tabs are now separated by a vertical line
-* make some newlines optional in the config file
-
-### Bug Fixes
-
-* fix the bogus certificate mismatch error when navigating back from a proxied page to a normal gemini page
-* don't crash when there's a redirect immediately after an accepted certificate mismatch
-* fixed styling of empty lines inside a pre block
-* print the trailing face until the right column
-* allow editing old minibuffer history entries
-* push-button-new-tab (M-enter) now works on relative URLs too
-
-### Breaking changes
-
-* up and down arrow in the minibuffer are bound to previous-completion and next-completion instead of previous/next-history-item
-* the default styling changed.  The old “brutalist” theme was dropped in favour of a more eye-catching one.  If you like the old style, load contrib/brutalist.config to restore it
-* select the *next* tab instead of the previous when closing the current one.
-
-
-## 2021/07/16 0.3.1 “Spaceman” bugfix release
-
-This bugfix release includes a fix for libevent2 that, in some cases, could lead to a crash.  Prompted and tested by Andrea Feletto, thanks!
-
-
-## 2021/06/26 0.3  "Spaceman"
-
-### New features
-
-* new tab url customizable
-* fill-column customizable
-* new about:* pages: about:blank, about:about and about:help
-* olivetti-mode (enabled by default)
-* 256 colors support: all the colors and properties can be customized (but honour NO_COLOR)
-* added protocol proxy support: allows to use the duckling-proxy
-* added next-heading and prevous-heading bound to ‘C-c n’ and ‘C-c p’
-
-### Improvements
-
-* connect(2) asynchronously on non-OpenBSD systems: I’m having problems using asr_run on linux, but at least the connect(2) can be done asynchronously, improving the load time with multiple tabs opened.
-* telescope can be customized using a configuration file!
-* “humanized” byte progress: when downloading a file, shows the human-readable size instead of the raw number of bytes
-* don’t jump to the beginnig/end of buffer during a previous/next link when there are none
-* bind ‘>’ to ‘load-url’: it’s more intuitive than ‘C-x C-f’, idea stolen from tinmop (thanks for the idea cage!)
-* default to a blue foreground for link lines
-
-### Bufixes
-
-* ignore SIGPIPE: prevents telescope from dying when connecting to non-tls or non-gemini servers (found by trying to connect to a bogus gemini://gemini.nytpu.com, the correct url is gemini://nytpu.com)
-* fixed the end-of-buffer (M->) glitch
-* use the first level 2 or 3 heading as tab title if there are no level 1 heading (due to an error it would use the *last* heading)
-
-
-## 2021/06/12 0.2
-
-* save certificates per (host, port) tuple, not only per-host
-* allow saving the new certificate after a mismatch
-* make scroll-down/up scroll by the right number of lines
-* unbreaked forward-char
-* display a “!” when a non-focused tab finishes to load
-* use the headers to give the tab a title
-* allow to save the page when it can’t be rendered
-* fixed tab width
-
-## 2021/04/25 0.1.1
-
-### Bugfixes
-
-* fix compilation if !HAVE_ASR_RUN
-* handle URIs which port is not 1965
-
-
-## 2021/04/24 0.1
-
-first public release
blob - dbabac25d29106050d1314a2bd147b32e4013c8b (mode 644)
blob + /dev/null
Binary files site/logo.png and /dev/null differ
blob - 6bfce467d643df97843c961798ba94e767ec4c72 (mode 644)
blob + /dev/null
--- site/mandoc.css
+++ /dev/null
@@ -1,368 +0,0 @@
-/* $OpenBSD: mandoc.css,v 1.39 2022/07/06 14:27:55 schwarze Exp $ */
-/*
- * Standard style sheet for mandoc(1) -Thtml and man.cgi(8).
- *
- * Written by Ingo Schwarze <schwarze@openbsd.org>.
- * I place this file into the public domain.
- * Permission to use, copy, modify, and distribute it for any purpose
- * with or without fee is hereby granted, without any conditions.
- */
-
-/* Global defaults. */
-
-html {		max-width: 65em;
-		--bg: #FFFFFF;
-		--fg: #000000; }
-body {		background: var(--bg);
-		color: var(--fg);
-		font-family: Helvetica,Arial,sans-serif; }
-h1, h2 {	font-size: 110%; }
-table {		margin-top: 0em;
-		margin-bottom: 0em;
-		border-collapse: collapse; }
-/* Some browsers set border-color in a browser style for tbody,
- * but not for table, resulting in inconsistent border styling. */
-tbody {		border-color: inherit; }
-tr {		border-color: inherit; }
-td {		vertical-align: top;
-		padding-left: 0.2em;
-		padding-right: 0.2em;
-		border-color: inherit; }
-ul, ol, dl {	margin-top: 0em;
-		margin-bottom: 0em; }
-li, dt {	margin-top: 1em; }
-pre {		font-family: inherit; }
-
-.permalink {	border-bottom: thin dotted;
-		color: inherit;
-		font: inherit;
-		text-decoration: inherit; }
-* {		clear: both }
-
-/* Search form and search results. */
-
-fieldset {	border: thin solid silver;
-		border-radius: 1em;
-		text-align: center; }
-input[name=expr] {
-		width: 25%; }
-
-table.results {	margin-top: 1em;
-		margin-left: 2em;
-		font-size: smaller; }
-
-/* Header and footer lines. */
-
-div[role=doc-pageheader] {
-		display: flex;
-		border-bottom: 1px dotted #808080;
-		margin-bottom: 1em;
-		font-size: smaller; }
-.head-ltitle {	flex: 1; }
-.head-vol {	flex: 0 1 auto;
-		text-align: center; }
-.head-rtitle {	flex: 1;
-		text-align: right; }
-
-div[role=doc-pagefooter] {
-		display: flex;
-		justify-content: space-between;
-		border-top: 1px dotted #808080;
-		margin-top: 1em;
-		font-size: smaller; }
-.foot-left {	flex: 1; }
-.foot-date {	flex: 0 1 auto;
-		text-align: center; }
-.foot-os {	flex: 1;
-		text-align: right; }
-
-/* Sections and paragraphs. */
-
-main {		margin-left: 3.8em; }
-.Nd { }
-section.Sh { }
-h2.Sh {		margin-top: 1.2em;
-		margin-bottom: 0.6em;
-		margin-left: -3.2em; }
-section.Ss { }
-h3.Ss {		margin-top: 1.2em;
-		margin-bottom: 0.6em;
-		margin-left: -1.2em;
-		font-size: 105%; }
-.Pp {		margin: 0.6em 0em; }
-.Sx { }
-.Xr { }
-
-/* Displays and lists. */
-
-.Bd { }
-.Bd-indent {	margin-left: 3.8em; }
-
-.Bl-bullet {	list-style-type: disc;
-		padding-left: 1em; }
-.Bl-bullet > li { }
-.Bl-dash {	list-style-type: none;
-		padding-left: 0em; }
-.Bl-dash > li:before {
-		content: "\2014  "; }
-.Bl-item {	list-style-type: none;
-		padding-left: 0em; }
-.Bl-item > li { }
-.Bl-compact > li {
-		margin-top: 0em; }
-
-.Bl-enum {	padding-left: 2em; }
-.Bl-enum > li { }
-.Bl-compact > li {
-		margin-top: 0em; }
-
-.Bl-diag { }
-.Bl-diag > dt {
-		font-style: normal;
-		font-weight: bold; }
-.Bl-diag > dd {
-		margin-left: 0em; }
-.Bl-hang { }
-.Bl-hang > dt { }
-.Bl-hang > dd {
-		margin-left: 5.5em; }
-.Bl-inset { }
-.Bl-inset > dt { }
-.Bl-inset > dd {
-		margin-left: 0em; }
-.Bl-ohang { }
-.Bl-ohang > dt { }
-.Bl-ohang > dd {
-		margin-left: 0em; }
-.Bl-tag {	margin-top: 0.6em;
-		margin-left: 5.5em; }
-.Bl-tag > dt {
-		float: left;
-		margin-top: 0em;
-		margin-left: -5.5em;
-		padding-right: 0.5em;
-		vertical-align: top; }
-.Bl-tag > dd {
-		clear: right;
-		column-count: 1;  /* Force block formatting context. */
-		width: 100%;
-		margin-top: 0em;
-		margin-left: 0em;
-		margin-bottom: 0.6em;
-		vertical-align: top; }
-.Bl-compact {	margin-top: 0em; }
-.Bl-compact > dd {
-		margin-bottom: 0em; }
-.Bl-compact > dt {
-		margin-top: 0em; }
-
-.Bl-column { }
-.Bl-column > tbody > tr { }
-.Bl-column > tbody > tr > td {
-		margin-top: 1em; }
-.Bl-compact > tbody > tr > td {
-		margin-top: 0em; }
-
-.Rs {		font-style: normal;
-		font-weight: normal; }
-.RsA { }
-.RsB {		font-style: italic;
-		font-weight: normal; }
-.RsC { }
-.RsD { }
-.RsI {		font-style: italic;
-		font-weight: normal; }
-.RsJ {		font-style: italic;
-		font-weight: normal; }
-.RsN { }
-.RsO { }
-.RsP { }
-.RsQ { }
-.RsR { }
-.RsT {		text-decoration: underline; }
-.RsU { }
-.RsV { }
-
-.eqn { }
-.tbl td {	vertical-align: middle; }
-
-.HP {		margin-left: 3.8em;
-		text-indent: -3.8em; }
-
-/* Semantic markup for command line utilities. */
-
-table.Nm { }
-code.Nm {	font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Fl {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Cm {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Ar {		font-style: italic;
-		font-weight: normal; }
-.Op {		display: inline flow; }
-.Ic {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Ev {		font-style: normal;
-		font-weight: normal;
-		font-family: monospace; }
-.Pa {		font-style: italic;
-		font-weight: normal; }
-
-/* Semantic markup for function libraries. */
-
-.Lb { }
-code.In {	font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-a.In { }
-.Fd {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Ft {		font-style: italic;
-		font-weight: normal; }
-.Fn {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Fa {		font-style: italic;
-		font-weight: normal; }
-.Vt {		font-style: italic;
-		font-weight: normal; }
-.Va {		font-style: italic;
-		font-weight: normal; }
-.Dv {		font-style: normal;
-		font-weight: normal;
-		font-family: monospace; }
-.Er {		font-style: normal;
-		font-weight: normal;
-		font-family: monospace; }
-
-/* Various semantic markup. */
-
-.An { }
-.Lk { }
-.Mt { }
-.Cd {		font-style: normal;
-		font-weight: bold;
-		font-family: inherit; }
-.Ad {		font-style: italic;
-		font-weight: normal; }
-.Ms {		font-style: normal;
-		font-weight: bold; }
-.St { }
-.Ux { }
-
-/* Physical markup. */
-
-.Bf {		display: inline flow; }
-.No {		font-style: normal;
-		font-weight: normal; }
-.Em {		font-style: italic;
-		font-weight: normal; }
-.Sy {		font-style: normal;
-		font-weight: bold; }
-.Li {		font-style: normal;
-		font-weight: normal;
-		font-family: monospace; }
-
-/* Tooltip support. */
-
-h2.Sh, h3.Ss {	position: relative; }
-.An, .Ar, .Cd, .Cm, .Dv, .Em, .Er, .Ev, .Fa, .Fd, .Fl, .Fn, .Ft,
-.Ic, code.In, .Lb, .Lk, .Ms, .Mt, .Nd, code.Nm, .Pa, .Rs,
-.St, .Sx, .Sy, .Va, .Vt, .Xr {
-		display: inline flow;
-		position: relative; }
-
-.An::before {	content: "An"; }
-.Ar::before {	content: "Ar"; }
-.Cd::before {	content: "Cd"; }
-.Cm::before {	content: "Cm"; }
-.Dv::before {	content: "Dv"; }
-.Em::before {	content: "Em"; }
-.Er::before {	content: "Er"; }
-.Ev::before {	content: "Ev"; }
-.Fa::before {	content: "Fa"; }
-.Fd::before {	content: "Fd"; }
-.Fl::before {	content: "Fl"; }
-.Fn::before {	content: "Fn"; }
-.Ft::before {	content: "Ft"; }
-.Ic::before {	content: "Ic"; }
-code.In::before { content: "In"; }
-.Lb::before {	content: "Lb"; }
-.Lk::before {	content: "Lk"; }
-.Ms::before {	content: "Ms"; }
-.Mt::before {	content: "Mt"; }
-.Nd::before {	content: "Nd"; }
-code.Nm::before { content: "Nm"; }
-.Pa::before {	content: "Pa"; }
-.Rs::before {	content: "Rs"; }
-h2.Sh::before {	content: "Sh"; }
-h3.Ss::before {	content: "Ss"; }
-.St::before {	content: "St"; }
-.Sx::before {	content: "Sx"; }
-.Sy::before {	content: "Sy"; }
-.Va::before {	content: "Va"; }
-.Vt::before {	content: "Vt"; }
-.Xr::before {	content: "Xr"; }
-
-.An::before, .Ar::before, .Cd::before, .Cm::before,
-.Dv::before, .Em::before, .Er::before, .Ev::before,
-.Fa::before, .Fd::before, .Fl::before, .Fn::before, .Ft::before,
-.Ic::before, code.In::before, .Lb::before, .Lk::before,
-.Ms::before, .Mt::before, .Nd::before, code.Nm::before,
-.Pa::before, .Rs::before,
-h2.Sh::before, h3.Ss::before, .St::before, .Sx::before, .Sy::before,
-.Va::before, .Vt::before, .Xr::before {
-		opacity: 0;
-		transition: .15s ease opacity;
-		pointer-events: none;
-		position: absolute;
-		bottom: 100%;
-		box-shadow: 0 0 .35em var(--fg);
-		padding: .15em .25em;
-		white-space: nowrap;
-		font-family: Helvetica,Arial,sans-serif;
-		font-style: normal;
-		font-weight: bold;
-		background: var(--bg);
-		color: var(--fg); }
-.An:hover::before, .Ar:hover::before, .Cd:hover::before, .Cm:hover::before,
-.Dv:hover::before, .Em:hover::before, .Er:hover::before, .Ev:hover::before,
-.Fa:hover::before, .Fd:hover::before, .Fl:hover::before, .Fn:hover::before,
-.Ft:hover::before, .Ic:hover::before, code.In:hover::before,
-.Lb:hover::before, .Lk:hover::before, .Ms:hover::before, .Mt:hover::before,
-.Nd:hover::before, code.Nm:hover::before, .Pa:hover::before,
-.Rs:hover::before, h2.Sh:hover::before, h3.Ss:hover::before, .St:hover::before,
-.Sx:hover::before, .Sy:hover::before, .Va:hover::before, .Vt:hover::before,
-.Xr:hover::before {
-		opacity: 1;
-		pointer-events: inherit; }
-
-/* Overrides to avoid excessive margins on small devices. */
-
-@media (max-width: 37.5em) {
-main {		margin-left: 0.5em; }
-h2.Sh, h3.Ss {	margin-left: 0em; }
-.Bd-indent {	margin-left: 2em; }
-.Bl-hang > dd {
-		margin-left: 2em; }
-.Bl-tag {	margin-left: 2em; }
-.Bl-tag > dt {
-		margin-left: -2em; }
-.HP {		margin-left: 2em;
-		text-indent: -2em; }
-}
-
-/* Overrides for a dark color scheme for accessibility. */
-
-@media (prefers-color-scheme: dark) {
-html {		--bg: #1E1F21;
-		--fg: #EEEFF1; }
-:link {		color: #BAD7FF; }
-:visited {	color: #F6BAFF; }
-}
blob - dd06bc51a0deff1384a56013dfafbfebe9ea4f11 (mode 755)
blob + /dev/null
--- site/menu.pl
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env perl
-
-use v5.10;
-use strict;
-use warnings;
-
-my $page = shift or die 'missing page';
-my @pages = ();
-
-while (<>) {
-	chomp;
-	@pages = (@pages, $_);
-}
-
-say "<nav>";
-my $did = 0;
-for (@pages) {
-	if (!$did) {
-		$did = 1;
-	} else {
-		print "| ";
-	}
-
-	my ($href, $text) = m/^([^\s]*)\s*(.*)$/;
-	if ($href eq $page) {
-		print "<strong>$text</strong> ";
-	} else {
-		print "<a href='$href'>$text</a> ";
-	}
-}
-
-say "</nav>";
blob - c4f375d1422033f65e993b4deab8887d659675d8 (mode 644)
blob + /dev/null
--- site/style.css
+++ /dev/null
@@ -1,182 +0,0 @@
-body {
-  font-family: monospace;
-  font-size: 14px;
-  max-width: 780px;
-  margin: 0 auto;
-  padding: 20px;
-}
-
-.banner {
-    display: flex;
-    flex-direction: row;
-    justify-content: center;
-}
-
-.banner pre {
-    background-color: transparent;
-}
-
-h1::before {
-  content: "# ";
-}
-
-h2 {
-  margin-top: 40px;
-}
-
-h2::before {
-  content: "## ";
-}
-
-h3::before {
-  content: "### ";
-}
-
-.gallery {
-  display: flex;
-  flex-direction: row;
-  flex-wrap: wrap;
-  justify-content: space-around;
-}
-
-.gallery figure {
-    width: 40%;
-    margin: 1rem;
-}
-
-img {
-    max-width: 100%;
-    height: auto;
-}
-
-.repology {
-    text-align: center;
-}
-
-@media only screen and (min-width: 768px) {
-    .repology {
-        text-align: unset;
-        float: right;
-    }
-}
-
-blockquote {
-  margin: 0;
-  padding: 0;
-}
-
-blockquote::before {
-  content: "> ";
-}
-
-blockquote p {
-  font-style: italic;
-  display: inline;
-}
-
-p.link::before {
-  content: "→ ";
-}
-
-strong::before { content: "*" }
-strong::after  { content: "*" }
-
-hr {
-  border: 0;
-  height: 1px;
-  background-color: #222;
-  width: 100%;
-  display: block;
-  margin: 2em auto;
-}
-
-img {
-  margin: 10px;
-  display: inline-block;
-}
-
-section.with-image {
-  margin-top: 1rem;
-}
-
-@media only screen and (min-width: 768px) {
-  section.with-image {
-    display: flex;
-    flex-direction: row;
-  }
-}
-
-section.with-image img {
-  object-fit: contain;
-}
-
-section.with-image div {
-  overflow: auto;
-}
-
-pre {
-  overflow: auto;
-  padding: 1rem;
-  background-color: #f0f0f0;
-  border-radius: 3px;
-}
-
-pre.banner {
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-}
-
-code, kbd {
-  color: #9d109d;
-}
-
-ul.link-list {
-  list-style: disclosure-closed;
-}
-
-footer {
-  margin-top: 4rem;
-  font-size: 0.8rem;
-  border-top: 1px solid;
-}
-
-@media (prefers-color-scheme: dark) {
-  body {
-    background-color: #222;
-    color: white;
-  }
-
-  a {
-    color: aqua;
-  }
-
-  hr {
-    background-color: #ddd;
-  }
-
-  pre {
-    background-color: #353535;
-  }
-
-  code, kbd {
-    color: #ff4cff;
-  }
-
-  img {
-    opacity: 0.8;
-    transition: opacity .2s ease-in-out;
-  }
-
-  img:hover {
-    opacity: 1;
-  }
-}
-
-@media (max-width: 400px) {
-  pre.banner { font-size: 9px; }
-}
-
-@media (max-width: 500px) {
-  pre.banner { font-size: 10px; }
-}
blob - e2506f108b914844d1ebee9c0ec1d7f8c494cb00 (mode 755)
blob + /dev/null
--- site/subst
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env perl
-#
-# Copyright (c) 2022 Omar Polo <op@omarpolo.com>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# subst -- filter that replaces key=values pairs
-#
-# usage: subst key1=val1 [... keyn=valn] [files...]
-#
-# Use `--' before the first file if it may contain an = in its name.
-# If no files are given, read and substitute from standard input.
-
-use v5.10;
-use strict;
-use warnings;
-
-my @args = ();
-
-while (1) {
-	$_ = shift;
-	last if !$_;
-
-	if ($_ eq '--') {
-		last;
-	} elsif ($_ !~ m/=/) {
-		unshift @ARGV, $_;
-		last;
-	}
-
-	my ($match, $repl) = m/^([^\s]*)=(.*)$/;
-	push @args, "-e", "s!$match!$repl!g";
-}
-
-# OK, shelling out to sed is a bit lame...
-exec "sed", @args, @ARGV;