Glossary¶
The framework’s terms, each with its current name and a plain definition. When Phase 2 of the comprehensibility rework renames one, the old name is kept here as “was X” so a reader coming from older code or docs can find it.
page — what a handler returns: one or more frames sharing a page number.
frame — one screenful, 24 rows of 40 cells; a page too long for one has several, keyed
atoz.footer (the prompt row) —
render_footer(items, FOOTER_WIDTH)composes it;FOOTER_WIDTH(wasROOM) is the cells it has. AFooterItemcarries aPriority:ESSENTIAL/PRIMARY/SECONDARY, andALIAS(wasREDUNDANT) for a key already shown under another name.RowWriter.end_background()(wasplain()) closes a coloured background so what follows sits on black.attribute (was
Control) — a teletext spacing attribute: a colour or character-set code that takes a cell of its own and shows as a blank.controls.Attribute;is_attribute_code(wasis_control_code) tells one from a character. Not to be confused withencoding.ScreenControl, the C0 cursor and screen controls.span (was
Run) — a stretch of cells on one row sharing a background colour, asRowWriterlays a coloured band.canvas.Span. The composition layer keeps its ownRunfor a different job, which is why this one moved.outsized letters —
lettering.placedraws a string in double or quadruple size;rows_needed(wasrows_for) andcells_needed(wascells_for) say how many rows and cells it will take before it is drawn.mosaic font — a bitmap face measured in blocks, drawn as lettering. The shipped faces are read by
font.read_fontfrom the framework’s own text format;yaff.read_yaffreads the YAFF format instead, so a face from a collection such as the hoard of bitfonts can be loaded without vendoring it.part — a piece of a page’s body between the rules: a menu, some lines, a picture, a form.
layout.Part. A part says which frames it appears on:OnOneFrame(wasOnce),OnEveryFrame(wasEvery),Flow(wasFlowing, and what a bare drawable means), orFrameBreak(wasBreak).sequence part (was
Formatter/RowFormatter) — a part that lays out a homogeneous sequence of entries: a menu, a listing, a table of figures. Subclassformatting.SequencePart, orRowSequencePartfor one whose entries are written left-to-right along their rows. Itsgap(wasseparation) is the blank rows between entries, itschoose_hint(wasselecting_hint) the footer item shown when the entries can be chosen.Figuresnames its two columns’ widthslabel_widthandfigure_width(werelabelandfigure).entry — one item in a sequence a sequence part lays out, such as a line of a menu.
formatting.Entry.Linestakes its lines asentries, passed first and without a keyword (was thesaid=keyword).PageLayout.item_noun(wasitem) is what the service calls one, so a heading can read “3 posts”.Custom (was
Drawn) — a part of a stated height a page draws itself, cell by cell: a picture, a grid, a masthead.layout.Custom(rows, draw).place — what a custom part does:
place(canvas, room) -> Placed, drawing as much as fits and saying what is left.Space(wasRoom) is what the frame has left;Placed(wasPlacement) carries the rows used, aClaim(wasOffer) of the keys claimed, and aremainder(wasrest). Two claims merge withClaim.merged_with(wasOffer.and_then).furniture — the fixed structure a page is drawn into, around its parts: a
Header,Rules and aFooter(wasPrompt).layout.Furnishing,DEFAULT_FURNITURE. A furnishing is told aFrameContext(wasSummary); its edge isEdge.TOP/Edge.BOTTOM(wasEdge.FOOT).route — a pattern bound to a handler, carrying the page’s name and keywords.
PageRoute.app.route(name)(waspage_info) is the declared route by name,app.routes()(waspages()) all of them, andapp.match(address)(wasroute(address)) what a page number matched.router — collects the routes a module of handlers declares with
@router.page, spread into a service asSextile(pages=[*router, ...]).PageRouter(replaced the free@pagedecorator androutes_in).app.add_keyword(wasalias) gives a page a second page number under a word;app.add_converter(wasconverter) teaches the patterns a new field type.readership pages — the framework’s own history pages:
Sextile.recent_page(waslately_read),popular_page(wasmost_read) andcallers_page(waswho_has_called), each built from the visit log.pattern — the page-number template a route matches: literal digits and named fields, such as
82{post_id:int}.address — a page number a reader is at, resolved from a pattern.
PageAddress.keyword — a word a reader keys in place of a number,
*MAIN#for*1#; set by a route’skeywords=.choices vs moves — choices are keys that lead somewhere, such as a menu’s digits; moves are keys that page or step within where the reader already is,
W/A/S/Dand#.#and frame moves —keys.HASH(wasCONVENTIONAL_NEXT_FRAME) is the#a viewdata reader presses to turn to the next frame of a page.frame_moves(has_previous, has_next)(wasmoving(back, on)) gives the keys a page of several frames answers;with_arrow_choices(wasarrows_lead_where) copies each choice onto the arrow that points like its letter.sequence, neighbours — the pages either side of this one in a run a menu offered, so a reader can step along without going back.
request.neighboursis aNeighbours(previous, next)(wasArrival(preceding, following)).next_page (was
follows) — where#leads once a page’s frames have run out, so a title frame or the last frame of a guide answers the key a viewdata reader tries first. OnPageLayoutandPage.shortcut — a key present on every frame that leads to a fixed address.
layout.Shortcut:label(wassays) is how the footer names it,with_arrow(wasarrow) whether the matching cursor key leads there too.DEFAULT_HOME (was
_DEFAULT_HOME) — the sentinel aPageLayoutor a one-call page uses forhomewhen none is given:0leads to the service’s index. Distinct fromhome=None, which offers no way home.DefaultHomeis its type. Public becausesextile.pagesshares it withsextile.layout.home vs index — home is where a caller arrives when the line opens (
Sextile(home=...), page 1 by default; a service opening on a title frame sets its own). Index is where the0key goes from every frame (Sextile(index=...), the same as home unless set apart). The footer wordindexis the label for that key.CallNext (was
Next) — the middleware continuation: a piece of middleware isasync (request, build: CallNext) -> Page | Noneand callsbuild(request)to reach the rest of the chain. Starlette’scall_next; renamed offNextto stop it colliding with the*#Nextcommand.PageRequest — the request a handler answers. Kept
PageRequest, not renamed toRequest: thePage*family (PageRoute,PageRouter,PageAddress,PageFrame,PageLayout) is consistent, and the prefix keeps it clear of httpx’sRequestin an app that imports both. Decided in Phase 2, not to be re-litigated.fetch (was
ask) —Sextile.fetch(target)builds a request for a page and answers it in process, for a test, a renderer or a tool with no socket. “fetch” is what a browser calls it; there is no HTTP verb to borrow.idle timeout — an idle caller is released with
on_timed_out(request, frame_index): the request is the page they were on,frame_indexwhich frame of it. There was aPartingdataclass here; since it held only the frame it was dropped for a bareint.session wire moments —
viewdata.hangup.hangup_bytes(wasparting.parting_bytes) repositions the cursor when the line drops, so a reader talking to their modem again has somewhere to type;Session.hangup()(wasparting()) returns it.viewdata.idle_warning.idle_warning_bytes(wascountdown.countdown_bytes) draws the bar that warns an idle caller before they are released.session vs service state — session state is one caller’s own, lasting as long as the line is up (
request.session, was a string-keyed mapping); service state is shared across callers for the life of the service (request.state). Both are keyed byStateKey: session state is writable, so a page may keep this caller’s own state; service state is a read-only view of what the lifespan opened, since a change would reach every caller at once.connect (was
calling) —sextile.testing.connect(app)opens a service, rings it up and closes it, yielding aCaller. The caller presses keys withcaller.press(...)(waskey) and readscaller.screen(wasshown).form — rows of a frame a reader types into, a field with furniture around it.
forms.Form,forms.Field.TypeAhead(wasSuggest) is a field with the best few matches beneath it, changing as the reader types;FieldSet(wasFields) is a form of several fields at once. A fieldaccepts(wastakes) the keys a reader may type into it. Itson_submit(wascomplete),footnote(wasnote),submit_label(wassends) andfooter_items(wasadvice) each say what they are; the handler types areSubmitHandler(wasComplete) andFootnote(wasNote). AFormsubclass overridesfooter_items()(wasnamed()) and readstop_row(wasat), the row the layout placed it on.command line — the
sextilecommand and a service’s own are Click groups.standard_commands(wasadd_standard_subcommands) returns the sharedrenderandservecommands a service adds to its group;form_optionsandlistening_options(wereadd_form_argumentsandadd_listening_arguments) add their options to a command;load_applicationresolves amodule:name. Click routes to each command, so the oldrun_standarddispatcher is gone.line breaking — how
wrapping.wrap_textandwrap_withinlay the slack across the lines they break text into, chosen byBreaking(was thebalanced=boolean):GREEDYfills each line in turn,PARAGRAPHbalances with the last line free (the default, for body text),DISPLAYbalances with the last line counted (for a centred string, so a short title breaks into two even lines rather than a full one and an orphan).alignment — where something sits across the frame, chosen by
composition.Align(START,CENTRE,END), re-exported at top level. One axis-neutral enum for everything placed: aCompositionrun, aTile, and aLinespart’salign(AlignreplacedTextAlignat 0.5.0). Centre and end reuse the frame’s own centring, an odd spare cell going one fewer on the left.tile — a rectangle of pre-solved teletext cells placed once, attributes included, from a solver such as sextants or a teletext-art editor.
viewdata.tiles.Tile, built withTile.from_bytes/from_rows, placed withCanvas.place(tile, row=, column=)or as a page part (parts=[tile]). UnlikeRowWriter.mosaic, which inserts and charges its own attributes, a tile is placed cell-for-cell and pays for nothing — the solver already spent them.