pub struct Run {Show 17 fields
pub text: String,
pub role: String,
pub bold: bool,
pub italic: bool,
pub underline: bool,
pub strike: bool,
pub sup: bool,
pub sub: bool,
pub src: u32,
pub sel: bool,
pub hl: Option<String>,
pub hl_color: Option<String>,
pub mark_color: Option<String>,
pub token: Option<String>,
pub size: Option<String>,
pub font: Option<String>,
pub text_color: Option<String>,
}Expand description
One maximal span of same-styled glyphs on a visual row — the unit the Swift renderer turns into a single styled attributed-string run.
Fields§
§text: StringThe run’s text, glyphs concatenated in column order.
role: StringThe glyph’s semantic role as a renderer class id: body, h1…h6,
code, link, mark, list, quote, rule.
bold: bool§italic: bool§underline: bool§strike: bool§sup: boolRaised off the baseline and drawn smaller — a footnote reference’s [1],
or an author’s ^x^. Mutually exclusive with sub; core’s
Baseline is one value, and these are its two non-default cases flattened
to the flag shape the rest of this record is spelled in.
sub: boolLowered off the baseline and drawn smaller — an author’s ~x~.
src: u32The byte offset in the source this run’s first glyph came from.
What a run means, as opposed to how it looks: a link role says a span
is drawn as a link but not where it points, and the only way back to that
is the source. A frontend drawing part of the document somewhere the caret
isn’t — a footnote’s text in a popover — pairs this with
LeafDoc::link_destination_at or LeafDoc::footnote_at to make those
runs followable.
The alternative was for a frontend to count its way along the row’s text
and ask LeafDoc::offset_for_pos, which means converting between three
units that only agree on ASCII: this is a byte offset, the run’s text is
characters, and a row’s column is a display cell (a wide CJK glyph is
two). Handing the offset over is exact, O(1), and needs none of that.
0 for the runs of the source view, whose rows are split from raw text
rather than laid out from glyphs.
sel: boolWhether this run lies inside the active selection — so the renderer can paint a selection background without re-deriving it from offsets.
hl: Option<String>The id of the host highlight covering this run, if one does — see
LeafDoc::set_highlights. A highlight splits a run the way the
selection does, so a wash begins and ends exactly on its bytes.
hl_color: Option<String>That highlight’s rendering hint (#RRGGBB, or None for the theme’s
default wash), carried beside the id so a renderer needs no lookup.
mark_color: Option<String>The colour the author named on a mark run — "red", "orange",
"yellow", "green", "blue", "purple", "brown" — or absent for a
plain ==highlight== and for every other role.
A name, unlike hl_color’s #RRGGBB, and that is
the difference between the two: a host highlight’s colour is the host’s
own choice and arrives as a value to paint, while this one is the
document’s word for it and the renderer picks the wash. It rides beside
role rather than folding into it ("mark-red") so a renderer that
knows nothing about colours still draws the run as the highlight it is.
token: Option<String>What a code run is to the language its fenced block is written in —
"punctuation", "keyword", "entity", "support", "constant",
"string", "comment", "invalid" — or absent for a run the grammar
left plain, for every run of a block in a language no grammar covers,
for inline code, and for every other role.
A class id like role, and beside it for the reason mark_color is: a
renderer that knows nothing about tokens still draws the run as the code
it is, and one that does keys a palette on the name.
size: Option<String>How large this run is set — one of CSS’s seven keywords ("xx-small",
"x-small", "small", "large", "x-large", "xx-large",
"xxx-large"), or the exact size the author asked for ("14pt",
"13.5pt") — and absent for the theme’s own size, which is every run
there was before the presentation vocabulary.
A token rather than an enum, for mark_color’s
reason and one more: a keyword says how much bigger and leaves how big
to the theme (leaf_core::SizeStep::scale has CSS’s own ratios for a
renderer that wants a default ramp), while a pt size is exactly that
many points of the sheet. A renderer reads its table first and parses
the suffix when the table has no entry.
font: Option<String>The face this run is set in — one of CSS’s four generics ("serif",
"sans-serif", "monospace", "cursive"), or a family the author
named ("Garamond") — and absent for the theme’s body face.
A generic is the theme’s to name, so serif is whichever serif this
platform’s theme has and opens everywhere. A family name is resolved
through the platform’s font registry and falls back to the body face
where it is not installed, which is the portability the author traded
away knowingly.
text_color: Option<String>The run’s foreground colour — one of the seven names
mark_color carries, or six lowercase hex digits
behind a # ("#c03030") — and absent for the theme’s text colour.
A name is two inks, one per appearance, and the theme owns both; a triple is painted as written in the light appearance and in the dark one alike, which is what “exact” means.
Not mark_color, though they share a vocabulary on
purpose: that is a highlight’s background and reaches a run through its
mark role, this is what the letters themselves are painted. A renderer
with a red for a highlight has a red for text, and both should be that
red.