xnano.markdown
xnano.markdown
¶
xnano.markdown
Load Markdown from text or a file, render one frame, or page through it interactively.
The interactive viewer is a pager, not a one-shot render: it windows the
rendered lines to the viewport and moves that window in response to the
keyboard (arrows, j/k, PageUp/PageDown, space,
Home/End, g/G) and the mouse wheel, with q to quit.
A document taller than the screen can therefore be scrolled, which a
plain render cannot do.
Inline images paint as compact, never-upscaled half-block thumbnails.
Hovering (or pressing i / clicking) expands the active image toward
native cell resolution for a clearer look without paying full-size
decode cost for every picture on every frame.
Classes:
-
MarkdownViewport–Block-aware Markdown windowed to a scroll offset.
Functions:
-
load_markdown_source–Load UTF-8 markdown text and optional base path.
-
is_markdown_path–Return whether
pathexists and has a supported Markdown suffix. -
run_markdown–Load and page through a Markdown document interactively.
-
render_markdown–Render a Markdown document and return its frame.
MarkdownViewport
dataclass
¶
MarkdownViewport(
content: str | Text | list[str | Text] = "",
foreground: ColorLike | None = None,
background: ColorLike | None = None,
modifiers: tuple[CharacterModifier, ...] = (),
horizontal_align: Alignment | None = None,
vertical_align: VerticalAlignment | None = None,
wrap: bool = True,
input: bool = False,
placeholder: str | Text | None = None,
cursor: int | None = None,
multiline: bool = False,
rows: int | None = None,
ansi: bool = False,
markdown: bool = False,
language: str | None = None,
passthrough: Sequence[str] = (),
mask: str | None = None,
max_length: int | None = None,
read_only: bool = False,
tab_size: int = 4,
focusable: bool = False,
fill: bool = False,
base_path: Path | None = None,
images: bool = True,
links: bool = True,
offset: int = 0,
reserved_rows: int = _STATUS_ROWS,
image_rows: int = _THUMB_MAX_ROWS,
thumb_max_cols: int = _THUMB_MAX_COLS,
thumb_max_rows: int = _THUMB_MAX_ROWS,
expand_max_cols: int = _EXPAND_MAX_COLS,
expand_max_rows: int = _EXPAND_MAX_ROWS,
*,
visible: bool = True,
z: int = 0,
fit_content: bool = True
)
Bases: Markdown
Block-aware Markdown windowed to a scroll offset.
The document is parsed into an ordered run of text and image blocks
(see markdown_blocks); each frame composes only the blocks that
fall inside [offset : offset + viewport]. Text blocks paint their
visible line slice and image blocks paint through the real
:class:~xnano.components.image.Image component, so a picture or
GIF renders inline rather than being dropped.
Images default to compact, never-upscaled thumbnails with a one-line
caption. Hovering the pointer over a thumbnail (or pinning with a
click / i) expands that one image toward native cell resolution
for a clearer view — only the active image pays the larger compose
cost.
Attributes:
-
offset(int) –First document row shown at the top of the view.
-
reserved_rows(int) –Rows the owning viewer reserves below the body.
-
image_rows(int) –Fallback thumbnail height when dimensions are unknown.
-
thumb_max_cols(int) –Collapse-mode column budget for image bodies.
-
thumb_max_rows(int) –Collapse-mode row budget for image bodies.
-
expand_max_cols(int) –Expanded-mode column budget for image bodies.
-
expand_max_rows(int) –Expanded-mode row budget for image bodies.
Methods:
-
viewport_height–Return the visible row count for the current terminal size.
-
total_rows–Return the document height in rows across all blocks.
-
max_offset–Return the largest useful offset — the last full page of rows.
-
page_rows–Return the offset delta for a page-sized jump (one row overlap).
-
scroll_percentage–Return how far the view has scrolled, from 0 to 100.
-
scroll_by–Move the view by
deltarows, clamped to the document. -
scroll_to_top–Move the view to the first row.
-
scroll_to_bottom–Move the view to the last page.
-
has_expandable_image–Return whether the document contains at least one local image.
-
active_image_key–Return the pinned or hovered image key, if any.
-
update_pointer–Update hover from body-local cell coordinates.
-
clear_pointer–Clear hover state.
-
toggle_pin_at–Pin or unpin the image under body-local coordinates.
-
toggle_expand–Toggle expand on the hovered, pinned, or first visible image.
-
compose–Compose the blocks currently inside the viewport.
-
component_post_init–Force markdown mode, then run
Textsetup. -
get_frame–Optional frame/panel chrome around composed content.
-
get_size–Return the preferred cell size of this component.
-
before_render–Called before rendering; returns the effective render area.
-
after_render–Record the multi-line editor caret so the terminal cursor tracks it.
-
compose_extra_small–Compose content when the viewport is extra small (< 40 cols).
-
compose_small–Compose content when the viewport is small (40–79 cols).
-
compose_medium–Compose content when the viewport is medium (80–119 cols).
-
compose_large–Compose content when the viewport is large (120–159 cols).
-
compose_extra_large–Compose content when the viewport is extra large (>= 160 cols).
-
handle_keyboard–Edit this text when it has focus.
-
handle_paste–Insert pasted text at the caret of a multi-line editor.
-
get_terminal_node–Return composed content for terminal compatibility.
offset
class-attribute
instance-attribute
¶
offset: int = 0
First document row shown at the top of the view.
reserved_rows
class-attribute
instance-attribute
¶
reserved_rows: int = _STATUS_ROWS
Rows the owning viewer reserves below the body (its status line).
image_rows
class-attribute
instance-attribute
¶
image_rows: int = _THUMB_MAX_ROWS
Fallback thumbnail rows when image dimensions cannot be read.
thumb_max_cols
class-attribute
instance-attribute
¶
thumb_max_cols: int = _THUMB_MAX_COLS
Maximum columns for collapsed image thumbnails.
thumb_max_rows
class-attribute
instance-attribute
¶
thumb_max_rows: int = _THUMB_MAX_ROWS
Maximum body rows for collapsed image thumbnails.
expand_max_cols
class-attribute
instance-attribute
¶
expand_max_cols: int = _EXPAND_MAX_COLS
Maximum columns for the hover/pin expanded preview.
expand_max_rows
class-attribute
instance-attribute
¶
expand_max_rows: int = _EXPAND_MAX_ROWS
Maximum body rows for the hover/pin expanded preview.
visible
class-attribute
instance-attribute
¶
visible: bool = dataclasses.field(
default=True, kw_only=True
)
Whether this component paints at all.
z
class-attribute
instance-attribute
¶
z: int = dataclasses.field(default=0, kw_only=True)
Stacking order among sibling content.
fit_content
class-attribute
instance-attribute
¶
fit_content: bool = dataclasses.field(
default=True, kw_only=True
)
When True, paint at natural size inside a larger slot.
content
class-attribute
instance-attribute
¶
Plain string, nested Text, or a list of either.
foreground
class-attribute
instance-attribute
¶
foreground: ColorLike | None = None
Foreground color (deprecated alias: color).
background
class-attribute
instance-attribute
¶
background: ColorLike | None = None
Background color.
modifiers
class-attribute
instance-attribute
¶
modifiers: tuple[CharacterModifier, ...] = ()
Character modifiers such as bold or underline.
horizontal_align
class-attribute
instance-attribute
¶
horizontal_align: Alignment | None = None
Horizontal alignment at the paragraph level.
vertical_align
class-attribute
instance-attribute
¶
vertical_align: VerticalAlignment | None = None
Vertical alignment within the painted area.
input
class-attribute
instance-attribute
¶
input: bool = False
When True on a leaf, the component is an editable field.
placeholder
class-attribute
instance-attribute
¶
Shown when input is empty and unfocused.
cursor
class-attribute
instance-attribute
¶
cursor: int | None = None
Caret index for single-line input; None means end of string.
multiline
class-attribute
instance-attribute
¶
multiline: bool = False
When True with input, editing uses CoreTextEditor.
rows
class-attribute
instance-attribute
¶
rows: int | None = None
Preferred visible height (lines) for a multiline input.
ansi
class-attribute
instance-attribute
¶
ansi: bool = False
Parse ANSI SGR sequences in leaf content.
markdown
class-attribute
instance-attribute
¶
markdown: bool = False
Parse leaf content as markdown.
language
class-attribute
instance-attribute
¶
language: str | None = None
Pygments lexer name for syntax highlighting only.
passthrough
class-attribute
instance-attribute
¶
Key bindings this input never captures while focused.
mask
class-attribute
instance-attribute
¶
mask: str | None = None
Display-only mask character(s); real value is preserved.
max_length
class-attribute
instance-attribute
¶
max_length: int | None = None
Maximum plain-string length; longer input is clamped.
read_only
class-attribute
instance-attribute
¶
read_only: bool = False
Reject edits while remaining focusable.
tab_size
class-attribute
instance-attribute
¶
tab_size: int = 4
Tab width applied to multiline tab insertion and paste.
focusable
class-attribute
instance-attribute
¶
focusable: bool = False
Whether this component participates in field focus.
fill
class-attribute
instance-attribute
¶
fill: bool = False
Whether background fills the whole slot rather than only the
text glyphs. When True short lines still paint the background across
the full cell width (no manual right-padding required).
owns_cursor
property
¶
owns_cursor: bool
Whether this Text paints its own caret (multi-line editor).
cursor_position
property
¶
Absolute caret cell for the terminal cursor, set during paint.
Reported only for a focused multi-line editor (a single-line input
paints its own ▌ caret inline). None otherwise, which hides
the hardware cursor.
base_path
class-attribute
instance-attribute
¶
base_path: Path | None = None
Root path for resolving relative image and link targets.
images
class-attribute
instance-attribute
¶
images: bool = True
Whether image constructs may be emitted when supported.
links
class-attribute
instance-attribute
¶
links: bool = True
Whether link constructs may be emitted when supported.
viewport_height
¶
viewport_height() -> int
Return the visible row count for the current terminal size.
Source code in xnano/markdown.py
total_rows
¶
total_rows() -> int
Return the document height in rows across all blocks.
Source code in xnano/markdown.py
scroll_to_top
¶
scroll_to_bottom
¶
update_pointer
¶
Update hover from body-local cell coordinates.
Parameters:
-
x(int) –Column within the body field.
-
y(int) –Row within the body field (0 = top of the viewport).
Returns:
-
bool–Truewhen the hovered image identity changed.
Source code in xnano/markdown.py
clear_pointer
¶
clear_pointer() -> bool
toggle_pin_at
¶
Pin or unpin the image under body-local coordinates.
Parameters:
Returns:
-
bool–Truewhen pin state changed.
Source code in xnano/markdown.py
toggle_expand
¶
toggle_expand() -> bool
Toggle expand on the hovered, pinned, or first visible image.
Returns:
-
bool–Truewhen pin state changed.
Source code in xnano/markdown.py
compose
¶
compose(ctx: 'ComponentRenderContext[Any]') -> Any
Compose the blocks currently inside the viewport.
Source code in xnano/markdown.py
730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 | |
component_post_init
¶
get_size
¶
get_size(ctx: ComponentRenderContext[StateT]) -> Size
before_render
¶
before_render(
ctx: ComponentRenderContext[StateT], area: "Area"
) -> "Area"
after_render
¶
Record the multi-line editor caret so the terminal cursor tracks it.
Source code in xnano/components/text.py
compose_extra_small
¶
compose_extra_small(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is extra small (< 40 cols).
Optional responsive counterpart to :meth:compose. When
overridden, it is used instead of compose while the window
is in this size tier. Overriding any compose_* variant opts the
component into breakpoint dispatch; a component that overrides none
pays no per-frame cost.
Source code in xnano/components/component.py
compose_small
¶
compose_small(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is small (40–79 cols).
See :meth:compose_extra_small.
compose_medium
¶
compose_medium(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is medium (80–119 cols).
See :meth:compose_extra_small.
compose_large
¶
compose_large(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is large (120–159 cols).
See :meth:compose_extra_small.
compose_extra_large
¶
compose_extra_large(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is extra large (>= 160 cols).
See :meth:compose_extra_small.
Source code in xnano/components/component.py
handle_keyboard
¶
handle_keyboard(keyboard: 'KeyboardEventData') -> bool
Edit this text when it has focus.
Passthrough bindings remain available to hooks. Read-only inputs reject
edits, and max_length limits inserted content.
Parameters:
-
keyboard('KeyboardEventData') –The keyboard event payload.
Returns:
-
bool–Truewhen the key was consumed as text editing.
Source code in xnano/components/text.py
handle_paste
¶
Insert pasted text at the caret of a multi-line editor.
Parameters:
-
text(str) –The pasted clipboard text.
Returns:
-
bool–Truewhen the paste was consumed by the native editor.
Source code in xnano/components/text.py
get_terminal_node
¶
get_terminal_node(
ctx: ComponentRenderContext[Any],
) -> TextBlock | Native | Panel | None
Return composed content for terminal compatibility.
Parameters:
-
ctx(ComponentRenderContext[Any]) –Render-time scope for this paint.
Returns:
Source code in xnano/components/text.py
load_markdown_source
¶
Load UTF-8 markdown text and optional base path.
Parameters:
Returns:
-
str–(text, base_path)wherebase_pathis the parent directory -
Path | None–when
sourcewas a path.
Source code in xnano/markdown.py
is_markdown_path
¶
Return whether path exists and has a supported Markdown suffix.
Source code in xnano/markdown.py
run_markdown
¶
Load and page through a Markdown document interactively.
Uses Terminal.run when a live terminal is available so the
document can be scrolled; otherwise renders a single frame.
Parameters:
-
source(str | bytes | Path) –Path, literal markdown, or bytes.
-
terminal(Any | None, default:None) –Optional terminal instance to reuse.
Source code in xnano/markdown.py
render_markdown
¶
Render a Markdown document and return its frame.
Parameters:
-
source(str | bytes | Path) –Path, literal markdown, or bytes.
-
terminal(Any | None, default:None) –Optional terminal instance to reuse.
Returns:
-
'Frame'–The immutable frame produced by the terminal.