A quick update to Rogallo, with changes concentrating on giving the user more control over the content of a rendered page.
Despite the fact that the Gemini Protocol and gemtext are all about things being minimal, some capsules can deliver pretty busy content. Personally, I rather like it, and I'm generally impressed at how creative some people are with these tools. On the other hand, I've noticed that some people don't always appreciate the use of emojis or ANSI escape sequences to provide colour. So, with this in mind, I've added a couple of features to help control the content.
The first is a command to toggle emoji removal. If you're finding the emojis in a page too distracting, use the command to toggle them off and on (bound to F6 by default).
The setting is sticky too, so if you're so inclined, you can turn emojis off and they'll stay off.
There's a similar command related to the handling of ANSI escape sequences. While some applications let you toggle this at the capsule level (AstroBotany is one example where it's part of the game's settings), not all do. So I've added a command to toggle this (bound to Shift+F6 by default).
With both these commands, if this sort of view isn't to your taste:
You can quickly and easily turn it into this:
I think I prefer the richer view, but I can see the utility of the more austere view.
Somewhat related to the above, I've also added the ability to configure the main "icons" that get used inside the rendered content. So if you don't like the choice of ⪢ for links within a capsule, ↗ for links outwith a capsule, or • for a list item bullet, you can change them in the configuration file.
Rogallov0.10.0 is now available. This release has a number of changes, including some new features, some changes to the user interface, and a couple of quality-of-life improvements.
While, personally, I prefer Rogallo's default behaviour (I work in an environment where I can resize a window, and I'm capable of doing it), I can appreciate that someone might want to cap it. So for folk who prefer this, they can now make Rogallo look like this (with maximum_document_width set to 80):
For the moment this can only be set via the configuration file. At some point I might make this more of a dynamic thing. I can imagine this being something handy, or at least fun, to change up as you're viewing different content.
The same feedback "suggested" that the link jumping facility that Rogallo has should have a timeout that clears the buildup of the number being looked for. This seemed like a reasonable thing to ask for. So, before, if you typed 1, a link with a label of 1 would be selected. If you did nothing for a while, and then typed 2, a link with the label of 12 would be highlighted. With the new timeout (set to 1 second by default, configurable in the configuration file), if you type 1 and then 2 more than a second later, first link 1 will be selected, then link 2 will be selected. On the other hand, if you type 1 then 2 within a second, 12 will be selected.
Setting the timeout to 0 disables this and Rogallo's link jumping facility will work as it did before.
With this new feature, if you send input text to a capsule and it rejects it for some reason, the input will be held on to. If you then visit the same URI again, the input dialog will be pre-populated with what you attempted to send a moment ago. This gives you the opportunity to edit anything wrong with the submission and try again.
Added all application commands to the command line¶
If you prefer to use Rogallo's command line more than the command palette, I've now ensured that all bindable application commands can be accessed via the command line. There's a difference in their form, to stay in keeping with the command line. So whereas in the command palette you'd run GoHome by typing go home, in the command line it becomes a !-prefixed snake-case command: !go_home.
All possible commands are listed in the help screen if it's brought up while the command line has focus.
Rogallo now has two new commands for quickly navigating within the current capsule path. GoToParent will navigate up a level in the path of the current URI, and GoToRoot will go to the root of the capsule.
The icon for links is now used to show if a link is already in the location history (and so has been visited before), or not:
Here you can see that Account settings isn't in the visit history, but the other two links are. I was going to do the whole link, but I've never been a fan of how web browsers do this, so I've gone with just the icon. I've also made it subtle but still noticeable. So far, I'm much preferring this; I don't need it blasting out the difference, I just need it to be enough for me to notice1.
Until now the "history" and "bookmarks" shortcut keys advertised in the footer brought up the sidebar-based management widgets. This made sense when that's all I had in Rogallo. For a while now though I've had palette-based search tools for both history and bookmarks. Normally I want to search for and select a bookmark or history item way more than I want to manage those lists. So I've relegated the sidebar-based tools to a secondary position and placed the palette-based search tools up front.
This also means that the default bindings have changed a bit. As always, you can discover the bindings with rogallo
bindings.
I know I've nodded towards this before, but I think I'm getting close to making a v1.0.0 release. I want to daily-drive for a few more days, and I'd also like to expand the website. I'd also like to build a Gemini/Gemtext-based site for Rogallo -- it'd be pretty weird if I only documented it in http(s)space. I won't let those wishes become blockers for moving to calling Rogallo "stable", but it would be nice to have.
I do recognise that there's an a11y issue here with the subtle difference; there's some work to be done at some point to allow for a high-contrast theme that will resolve this sort of issue. ↩
I've released v0.9.0 of Rogallo. The first big change in this release is the addition of syntax highlighting to pre-formatted text.
Much like in Markdown, Gemtext also supports pre-formatted text bounded by code fences. Gemtext supports the concept of "alt-text" for such text, like this:
Until now Rogallo would simply show the text as-is (with some styling to make it stand out from normal paragraphs). From this release, if there is alt-text for the pre-formatted block, and if it's the name of a supported language, the content will have syntax highlighting applied.
Another significant change is to the user input dialog. As mentioned in an earlier post, the Gemini protocol imposes limits on how much text can be submitted to a capsule. As documented, the limit is for a resulting URI of 1024 bytes1. To save someone typing out a long entry, only to have it lost2, I've added a count of how much input is left available (calculated from the size of the URI that would result):
To help ensure that the user doesn't submit too much, I've also added an error display if you go over the limit, which also refuses to submit the input.
With these in place it should be a lot harder to run into an unexpected loss of input.
One final tweak is a small change to the optional link stripe system I recently added. While playing around with some other themes, I noticed that the styling didn't show up well, or at all, in many of them. So I've changed it a little so it now shows in all available themes. I'm still not convinced it's quite right -- I'll play some more. But at least now it's visible in all cases.
Right away I'm now thinking it might be a good idea to re-populate the input dialog in such a situation. I'll have to remember to make that a TODO issue. ↩
I've bumped Gemtext to v1.0.0. I've gone from "this is test code" to "this is stable code" mostly because the library is so simple and I'm unlikely to add any radically new features to it1.
This bump also has one small addition: I've added an alt_text property to the PreFormatted class. This exists to capture and make available any text that comes after the pre-formatted text marker. For example, this text:
Rogallov0.8.0 is now available. This release includes a small bug fix, a big change to how external links and unhandled MIME types are dealt with, and a further improvement to link navigation.
First the big change: hand-off of unhandled content and trust. Until now, if Rogallo was met with a URI it didn't know how to handle, or met with a MIME type it isn't designed to deal with, it would simply hand it off to the browser in your environment. This is generally handy as it means that, when you're browsing gemtext content, if you meet a link that takes you to a conventional website, the link will (normally) be opened in your browser.
There are, of course, any number of schemes that form part of a URI. While Rogallo might commonly be handing off http and https URIs, there's no reason why it can't be handing off a finger or a mailto or whatever. Or, potentially, something a wee bit more dodgy like a javascript URI. While some web browsers don't allow that sort of thing by default (Safari, for example, blocks it unless configured otherwise), others might, and this could result in a nasty surprise.
So now Rogallo has a confirmation step that lets you allow a scheme this once, this and every subsequent time, or just cancel out.
By default the trusted schemes (the ones you say "always" on) are saved in a trusted_schemes file in the data directory.
Similar to the above: if, via a URI that Rogallo can handle, it meets a MIME type it can't handle, it will also pass it off to your operating system. I've added similar protection there too.
In this case any MIME types marked as trusted are dropped into a trusted_mime_types file in the data directory.
ℹ️ Note
If such a MIME type is allowed, it is passed off to your operating system to handle. If you'd like to tell Rogallo to try and internally handle a MIME type, you can set that by configuring the displayable content types.
I feel these changes help remove any possible footguns previously caused by unquestionably handing off URIs to the wider environment.
Another change I've made is to add even more link navigation. This sort of follows on from yesterday's release where I added labelled jumps to links. Again, the usual method of moving between links is to use Tab and Shift+Tab. The problem with those keys is they navigate you through all widgets in the UI that can receive focus. So, if you keep tapping Tab, you'll navigate out of the viewer and into the next available widget, once you reach the last link.
With this release I've added some extra keys which can be used to constantly cycle around the links while you're inside the viewer. These are:
Left, Shift+Up, L to go backwards through the links.
Right, Shift+Down, l to go forwards through the links.
While these might not be to everyone's taste (I'm already getting very used to using Left and Right), they do add another set of options for link navigation.
The final change is a simple bug fix, where the command line history simply wasn't being saved and loaded correctly. From now on it should save correctly and allow navigation of the history using the cursor keys.
With these changes in place, I feel I'm actually getting close to bumping up to a v1.0.0 release. While there are still things I want to add (there are currently a handful of TODO items in the issues), I see these as nice-to-have items that I want to do later on, rather than as must-have items that preclude considering Rogallo a viable daily-driver.
Rogallov0.7.0 is now available. The main changes in this release revolve around the display and navigation of links.
The aim of Rogallo, as a "TUI" application, is that it is usable purely with the keyboard, and also very usable with the mouse too. So far I think I've managed to hit that mark, but I felt that things weren't quite as smooth as they could be when it came to navigating links.
Links, like any other UI element in the application that can receive "focus", can be navigated to using Tab and Shift+Tab. This is fine if there's just a handful of links in a page, but more than that and having to repeatedly press tab gets a bit boring. Meanwhile, if you have a mouse or other pointing device to hand, it's easy to scroll and click. I wanted to try and have a similar keyboard-based speedup available.
So now, by default, all links on a page get a numeric label:
To jump to a link, while the viewer has focus, simply type the number. When you do so, the corresponding link will be focused, then you just need to hit Enter to follow the link.
The input system is written to "wrap around", as it were. So if you type 1 the link with a label of 1 will be focused. If you then type 2, and if there's a link with a label of 12, it will be focused. If there are fewer than 12 links, the input chain resets, and 2 will be focused. The idea being: as you keep typing numbers, they concatenate until there's no matching link and then it starts fresh.
I was quite keen on having the labels over to the right, so they didn't disturb the layout of the main body of text, but there's a small downside with this: if you have a lot of links next to each other it's not always obvious which link and which label go together. While getting close to your desired link should be good enough (you can then still hit Tab to get to your chosen link), I felt something else could be done to give some help. So I added an option to turn on alternating background stripes for links.
If all of this seems a bit too cluttered, especially if you're the sort of person who is mouse-first or mouse-heavy with the terminal, there's still the option to turn off both the labels and the stripes and have Rogallo look like it did before.
I think this covers pretty much all the possible link navigation needs I can imagine anyone having.
As well as the above, other small changes in v0.7.0 include:
Fixed a cosmetic issue with the truncation of the current location shown in the viewer panel, if the location is longer than the available space is wide.
The suggestions provided in the command line now include hosts found in the "known hosts" trust store. So if you are trying to remember a location you visited long ago, and you never bookmarked it and it's fallen out of the location history, it's still there as a reminder/hint/completion.
Also added the same to the history search palette.
I've also done more work on the website. The configuration section now covers pretty much everything you can modify that changes how Rogallo works. I still want to add more to the site -- mostly concentrating on explaining some key features -- but I felt that anyone using Rogallo right now would be most interested in how they can tailor it to their own taste.
Wasatv0.6.0 is now available. This is another quick update that fixes a small typing issue and also adds a handy new method I've been meaning to add to GeminiURI.
The typing issue is a simple enough one. The __init__ method for GeminiURI can take either a string or another GeminiURI as its argument. However, the type was actually specified as str | Self. In Rogallo, I want to have a sub-class of GeminiURI for one particular purpose, which will be passed an instance of GeminiURI. Something like this:
classKnownHost(GeminiURI):"""A known host."""
From this, I want to be able to do:
[KnownHost(host)forhostinself.known_hosts]
where known_hosts is typed as list[GeminiURI]. At this point, the type checker complains:
Argument 1 to "KnownHost" has incompatible type "GeminiURI"; expected "str | KnownHost" [arg-type]
The error is correct, because the use of Self is saying "this needs to be an instance of my class". There's no reason why it needs to work this way, so I've relaxed the type to str | GeminiURI. In my example above, KnownHost is a subclass of GeminiURI, so the type checker will be happy again.
The new method I've added is GeminiURI.with_default_scheme. This is a class method that acts as a more relaxed "constructor" for a GeminiURI. Again, in Rogallo, there are a few places where I'm taking some input, assuming it's going to be a gemini:// URI, checking if it's missing the scheme prefix, and then prefixing the string with gemini:// before creating a GeminiURI1. This means that Rogallo contains a few instances of this sort of code:
if...:# ...we should treat some text as a URI but it isn't prefixed with "gemini://"uri=GeminiURI(f"{GEMINI_PREFIX}{text}")
It's a small difference, but from now on I'll be able to:
uri=GeminiURI.with_default_scheme(text)
This removes the need to check if there's a scheme already and it saves me having to import GEMINI_PREFIX, etc.
GeminiURI will deliberately raise an exception if the scheme isn't gemini. ↩
With v0.5.0 I've added a method for getting the list of currently-trusted hosts, and also added a public property to the client class for getting access to the trust store object.
Generally these shouldn't be required, shouldn't be something you'd normally want to work with; I've added them because I thought it might be another useful way of populating the suggested completions facility in the command line inside Rogallo. The idea being: if you're trying to remember the name of a capsule you've visited before, and it might have fallen out of the location history, its trust status might still be recorded so it can complete from there.