architecture: add high-level view
This commit is contained in:
parent
dc6fb068bb
commit
ee9b637bae
51
ARCHITECTURE.md
Normal file
51
ARCHITECTURE.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
Architecture
|
||||||
|
============
|
||||||
|
|
||||||
|
This document is for people who want to get an overview of the Bebop code and
|
||||||
|
the way things work. These are high-level views, more details are given in the
|
||||||
|
respective modules' docstrings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Events
|
||||||
|
------
|
||||||
|
|
||||||
|
There are no event loop dispatching actions asynchronously, everything runs in a
|
||||||
|
single thread. The UI waits for user input and reacts on them.
|
||||||
|
|
||||||
|
In the future we may decouple the UI from the core browser to allow background
|
||||||
|
downloads and streaming content.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Rendering
|
||||||
|
---------
|
||||||
|
|
||||||
|
A core element of Bebop is what I call "metalines", which are lines of text as
|
||||||
|
they are rendered on screen, along with specific line metadata. Metalines are
|
||||||
|
rendered directly on screen, so they are not wrapped, cut or whatever: they
|
||||||
|
already represent formatted text as it will be shown. They carry information
|
||||||
|
such as line type (i.e. is this line part of a link, a title, etc), and more
|
||||||
|
specific data such as target URLs for link lines.
|
||||||
|
|
||||||
|
Rendering from the server response to showing content in the curses UI takes
|
||||||
|
several steps:
|
||||||
|
|
||||||
|
1. Parse the response from the server. If it's successful and a text MIME type
|
||||||
|
is provided, use it to parse the response content.
|
||||||
|
2. Response parsing can directly produce metalines (e.g. from `text/plain`) or
|
||||||
|
have intermediate parsing steps: a `text/gemini` document is first parsed
|
||||||
|
into a list of gemtext "elements" (paragraphs, links, etc), and converting
|
||||||
|
those elements into metalines happen in a following step. This lets Bebop
|
||||||
|
separate gemtext semantics from the way it is rendered, thus using the
|
||||||
|
desired wrapping and margins.
|
||||||
|
3. Metalines are rendered on the screen, with the colors and attributes
|
||||||
|
matching the line type.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Plugins
|
||||||
|
-------
|
||||||
|
|
||||||
|
The plugin interface is improved only when there is demand for something; for
|
||||||
|
now it only supports plugins that can handle new schemes.
|
Reference in a new issue