mirror of
https://github.com/ratatui-org/ratatui
synced 2024-11-10 07:04:17 +00:00
docs(text): update Text and Line docs (#969)
This commit is contained in:
parent
c4ce7e8ff6
commit
88bfb5a430
2 changed files with 224 additions and 54 deletions
115
src/text/line.rs
115
src/text/line.rs
|
@ -10,28 +10,21 @@ use crate::prelude::*;
|
|||
/// text. When a [`Line`] is rendered, it is rendered as a single line of text, with each [`Span`]
|
||||
/// being rendered in order (left to right).
|
||||
///
|
||||
/// [`Line`]s can be created from [`Span`]s, [`String`]s, and [`&str`]s. They can be styled with a
|
||||
/// [`Style`], and have an [`Alignment`].
|
||||
///
|
||||
/// The line's [`Alignment`] is used by the rendering widget to determine how to align the line
|
||||
/// within the available space. If the line is longer than the available space, the alignment is
|
||||
/// ignored and the line is truncated.
|
||||
///
|
||||
/// The line's [`Style`] is used by the rendering widget to determine how to style the line. If the
|
||||
/// line is longer than the available space, the style is applied to the entire line, and the line
|
||||
/// is truncated. Each [`Span`] in the line will be styled with the [`Style`] of the line, and then
|
||||
/// with its own [`Style`].
|
||||
///
|
||||
/// `Line` implements the [`Widget`] trait, which means it can be rendered to a [`Buffer`]. Usually
|
||||
/// apps will use the [`Paragraph`] widget instead of rendering a [`Line`] directly as it provides
|
||||
/// more functionality.
|
||||
///
|
||||
/// # Constructor Methods
|
||||
///
|
||||
/// - [`Line::default`] creates a line with empty content and the default style.
|
||||
/// - [`Line::raw`] creates a line with the given content and the default style.
|
||||
/// - [`Line::styled`] creates a line with the given content and style.
|
||||
///
|
||||
/// # Conversion Methods
|
||||
///
|
||||
/// - [`Line::from`] creates a `Line` from a [`String`].
|
||||
/// - [`Line::from`] creates a `Line` from a [`&str`].
|
||||
/// - [`Line::from`] creates a `Line` from a [`Vec`] of [`Span`]s.
|
||||
/// - [`Line::from`] creates a `Line` from single [`Span`].
|
||||
/// - [`String::from`] converts a line into a [`String`].
|
||||
/// - [`Line::from_iter`] creates a line from an iterator of items that are convertible to [`Span`].
|
||||
///
|
||||
/// # Setter Methods
|
||||
///
|
||||
/// These methods are fluent setters. They return a `Line` with the property set.
|
||||
|
@ -39,6 +32,15 @@ use crate::prelude::*;
|
|||
/// - [`Line::spans`] sets the content of the line.
|
||||
/// - [`Line::style`] sets the style of the line.
|
||||
/// - [`Line::alignment`] sets the alignment of the line.
|
||||
/// - [`Line::left_aligned`] sets the alignment of the line to [`Alignment::Left`].
|
||||
/// - [`Line::centered`] sets the alignment of the line to [`Alignment::Center`].
|
||||
/// - [`Line::right_aligned`] sets the alignment of the line to [`Alignment::Right`].
|
||||
///
|
||||
/// # Iteration Methods
|
||||
///
|
||||
/// - [`Line::iter`] returns an iterator over the spans of this line.
|
||||
/// - [`Line::iter_mut`] returns a mutable iterator over the spans of this line.
|
||||
/// - [`Line::into_iter`] returns an iterator over the spans of this line.
|
||||
///
|
||||
/// # Other Methods
|
||||
///
|
||||
|
@ -56,19 +58,90 @@ use crate::prelude::*;
|
|||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ## Creating Lines
|
||||
/// [`Line`]s can be created from [`Span`]s, [`String`]s, and [`&str`]s. They can be styled with a
|
||||
/// [`Style`].
|
||||
///
|
||||
/// ```rust
|
||||
/// use ratatui::prelude::*;
|
||||
///
|
||||
/// Line::raw("unstyled");
|
||||
/// Line::styled("yellow text", Style::new().yellow());
|
||||
/// Line::from("red text").style(Style::new().red());
|
||||
/// Line::from(String::from("unstyled"));
|
||||
/// Line::from(vec![
|
||||
/// let style = Style::new().yellow();
|
||||
/// let line = Line::raw("Hello, world!").style(style);
|
||||
/// let line = Line::styled("Hello, world!", style);
|
||||
/// let line = Line::styled("Hello, world!", (Color::Yellow, Modifier::BOLD));
|
||||
///
|
||||
/// let line = Line::from("Hello, world!");
|
||||
/// let line = Line::from(String::from("Hello, world!"));
|
||||
/// let line = Line::from(vec![
|
||||
/// Span::styled("Hello", Style::new().blue()),
|
||||
/// Span::raw(" world!"),
|
||||
/// ]);
|
||||
/// ```
|
||||
///
|
||||
/// ## Styling Lines
|
||||
///
|
||||
/// The line's [`Style`] is used by the rendering widget to determine how to style the line. Each
|
||||
/// [`Span`] in the line will be styled with the [`Style`] of the line, and then with its own
|
||||
/// [`Style`]. If the line is longer than the available space, the style is applied to the entire
|
||||
/// line, and the line is truncated. `Line` also implements [`Styled`] which means you can use the
|
||||
/// methods of the [`Stylize`] trait.
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// let line = Line::from("Hello world!").style(Style::new().yellow().italic());
|
||||
/// let line = Line::from("Hello world!").style(Color::Yellow);
|
||||
/// let line = Line::from("Hello world!").style((Color::Yellow, Color::Black));
|
||||
/// let line = Line::from("Hello world!").style((Color::Yellow, Modifier::ITALIC));
|
||||
/// let line = Line::from("Hello world!").yellow().italic();
|
||||
/// ```
|
||||
///
|
||||
/// ## Aligning Lines
|
||||
///
|
||||
/// The line's [`Alignment`] is used by the rendering widget to determine how to align the line
|
||||
/// within the available space. If the line is longer than the available space, the alignment is
|
||||
/// ignored and the line is truncated.
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// let line = Line::from("Hello world!").alignment(Alignment::Right);
|
||||
/// let line = Line::from("Hello world!").centered();
|
||||
/// let line = Line::from("Hello world!").left_aligned();
|
||||
/// let line = Line::from("Hello world!").right_aligned();
|
||||
/// ```
|
||||
///
|
||||
/// ## Rendering Lines
|
||||
///
|
||||
/// `Line` implements the [`Widget`] trait, which means it can be rendered to a [`Buffer`].
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// # fn render(area: Rect, buf: &mut Buffer) {
|
||||
/// // in another widget's render method
|
||||
/// let line = Line::from("Hello world!").style(Style::new().yellow().italic());
|
||||
/// line.render(area, buf);
|
||||
/// # }
|
||||
///
|
||||
/// # fn draw(frame: &mut Frame, area: Rect) {
|
||||
/// // in a terminal.draw closure
|
||||
/// let line = Line::from("Hello world!").style(Style::new().yellow().italic());
|
||||
/// frame.render_widget(line, area);
|
||||
/// # }
|
||||
/// ```
|
||||
/// ## Rendering Lines with a Paragraph widget
|
||||
///
|
||||
/// Usually apps will use the [`Paragraph`] widget instead of rendering a [`Line`] directly as it
|
||||
/// provides more functionality.
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::{prelude::*, widgets::*};
|
||||
/// # fn render(area: Rect, buf: &mut Buffer) {
|
||||
/// let line = Line::from("Hello world!").yellow().italic();
|
||||
/// Paragraph::new(line)
|
||||
/// .wrap(Wrap { trim: true })
|
||||
/// .render(area, buf);
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`Paragraph`]: crate::widgets::Paragraph
|
||||
#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct Line<'a> {
|
||||
|
|
163
src/text/text.rs
163
src/text/text.rs
|
@ -5,30 +5,28 @@ use itertools::{Itertools, Position};
|
|||
|
||||
use crate::prelude::*;
|
||||
|
||||
/// A string split over multiple lines where each line is composed of several clusters, each with
|
||||
/// their own style.
|
||||
/// A string split over one or more lines.
|
||||
///
|
||||
/// A [`Text`], like a [`Line`], can be constructed using one of the many `From` implementations
|
||||
/// or via the [`Text::raw`] and [`Text::styled`] methods. Helpfully, [`Text`] also implements
|
||||
/// [`core::iter::Extend`] which enables the concatenation of several [`Text`] blocks.
|
||||
///
|
||||
/// The text's [`Style`] is used by the rendering widget to determine how to style the text. Each
|
||||
/// [`Line`] in the text will be styled with the [`Style`] of the text, and then with its own
|
||||
/// [`Style`]. `Text` also implements [`Styled`] which means you can use the methods of the
|
||||
/// [`Stylize`] trait.
|
||||
///
|
||||
/// The text's [`Alignment`] can be set using [`Text::alignment`]. Lines composing the text can
|
||||
/// also be individually aligned with [`Line::alignment`].
|
||||
///
|
||||
/// `Text` implements the [`Widget`] trait, which means it can be rendered to a [`Buffer`].
|
||||
/// Usually apps will use the [`Paragraph`] widget instead of rendering a `Text` directly as it
|
||||
/// provides more functionality.
|
||||
/// [`Text`] is used wherever text is displayed in the terminal and represents one or more [`Line`]s
|
||||
/// of text. When a [`Text`] is rendered, each line is rendered as a single line of text from top to
|
||||
/// bottom of the area. The text can be styled and aligned.
|
||||
///
|
||||
/// # Constructor Methods
|
||||
///
|
||||
/// - [`Text::default`] creates a `Text` with empty content and the default style.
|
||||
/// - [`Text::raw`] creates a `Text` (potentially multiple lines) with no style.
|
||||
/// - [`Text::styled`] creates a `Text` (potentially multiple lines) with a style.
|
||||
/// - [`Text::default`] creates a `Text` with empty content and the default style.
|
||||
///
|
||||
/// # Conversion Methods
|
||||
///
|
||||
/// - [`Text::from`] creates a `Text` from a `String`.
|
||||
/// - [`Text::from`] creates a `Text` from a `&str`.
|
||||
/// - [`Text::from`] creates a `Text` from a `Cow<str>`.
|
||||
/// - [`Text::from`] creates a `Text` from a [`Span`].
|
||||
/// - [`Text::from`] creates a `Text` from a [`Line`].
|
||||
/// - [`Text::from`] creates a `Text` from a `Vec<Line>`.
|
||||
/// - [`Text::from_iter`] creates a `Text` from an iterator of items that can be converted into
|
||||
/// `Line`.
|
||||
///
|
||||
/// # Setter Methods
|
||||
///
|
||||
|
@ -36,6 +34,15 @@ use crate::prelude::*;
|
|||
///
|
||||
/// - [`Text::style`] sets the style of this `Text`.
|
||||
/// - [`Text::alignment`] sets the alignment for this `Text`.
|
||||
/// - [`Text::left_aligned`] sets the alignment to [`Alignment::Left`].
|
||||
/// - [`Text::centered`] sets the alignment to [`Alignment::Center`].
|
||||
/// - [`Text::right_aligned`] sets the alignment to [`Alignment::Right`].
|
||||
///
|
||||
/// # Iteration Methods
|
||||
///
|
||||
/// - [`Text::iter`] returns an iterator over the lines of the text.
|
||||
/// - [`Text::iter_mut`] returns an iterator that allows modifying each line.
|
||||
/// - [`Text::into_iter`] returns an iterator over the lines of the text.
|
||||
///
|
||||
/// # Other Methods
|
||||
///
|
||||
|
@ -44,28 +51,118 @@ use crate::prelude::*;
|
|||
/// - [`Text::patch_style`] patches the style of this `Text`, adding modifiers from the given style.
|
||||
/// - [`Text::reset_style`] resets the style of the `Text`.
|
||||
///
|
||||
/// [`Paragraph`]: crate::widgets::Paragraph
|
||||
/// [`Widget`]: crate::widgets::Widget
|
||||
/// # Examples
|
||||
///
|
||||
/// ## Creating Text
|
||||
///
|
||||
/// A [`Text`], like a [`Line`], can be constructed using one of the many `From` implementations or
|
||||
/// via the [`Text::raw`] and [`Text::styled`] methods. Helpfully, [`Text`] also implements
|
||||
/// [`core::iter::Extend`] which enables the concatenation of several [`Text`] blocks.
|
||||
///
|
||||
/// ```rust
|
||||
/// use std::{borrow::Cow, iter};
|
||||
///
|
||||
/// use ratatui::prelude::*;
|
||||
///
|
||||
/// let style = Style::default()
|
||||
/// .fg(Color::Yellow)
|
||||
/// .add_modifier(Modifier::ITALIC);
|
||||
/// let style = Style::new().yellow().italic();
|
||||
/// let text = Text::raw("The first line\nThe second line").style(style);
|
||||
/// let text = Text::styled("The first line\nThe second line", style);
|
||||
/// let text = Text::styled(
|
||||
/// "The first line\nThe second line",
|
||||
/// (Color::Yellow, Modifier::ITALIC),
|
||||
/// );
|
||||
///
|
||||
/// // An initial two lines of `Text` built from a `&str`
|
||||
/// let mut text = Text::from("The first line\nThe second line");
|
||||
/// assert_eq!(2, text.height());
|
||||
/// let text = Text::from("The first line\nThe second line");
|
||||
/// let text = Text::from(String::from("The first line\nThe second line"));
|
||||
/// let text = Text::from(Cow::Borrowed("The first line\nThe second line"));
|
||||
/// let text = Text::from(Span::styled("The first line\nThe second line", style));
|
||||
/// let text = Text::from(Line::from("The first line"));
|
||||
/// let text = Text::from(vec![
|
||||
/// Line::from("The first line"),
|
||||
/// Line::from("The second line"),
|
||||
/// ]);
|
||||
/// let text = Text::from_iter(iter::once("The first line").chain(iter::once("The second line")));
|
||||
///
|
||||
/// // Adding two more unstyled lines
|
||||
/// text.extend(Text::raw("These are two\nmore lines!"));
|
||||
/// assert_eq!(4, text.height());
|
||||
///
|
||||
/// // Adding a final two styled lines
|
||||
/// text.extend(Text::styled("Some more lines\nnow with more style!", style));
|
||||
/// assert_eq!(6, text.height());
|
||||
/// let mut text = Text::default();
|
||||
/// text.extend(vec![
|
||||
/// Line::from("The first line"),
|
||||
/// Line::from("The second line"),
|
||||
/// ]);
|
||||
/// text.extend(Text::from("The third line\nThe fourth line"));
|
||||
/// ```
|
||||
///
|
||||
/// ## Styling Text
|
||||
///
|
||||
/// The text's [`Style`] is used by the rendering widget to determine how to style the text. Each
|
||||
/// [`Line`] in the text will be styled with the [`Style`] of the text, and then with its own
|
||||
/// [`Style`]. `Text` also implements [`Styled`] which means you can use the methods of the
|
||||
/// [`Stylize`] trait.
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// let text = Text::from("The first line\nThe second line").style(Style::new().yellow().italic());
|
||||
/// let text = Text::from("The first line\nThe second line")
|
||||
/// .yellow()
|
||||
/// .italic();
|
||||
/// let text = Text::from(vec![
|
||||
/// Line::from("The first line").yellow(),
|
||||
/// Line::from("The second line").yellow(),
|
||||
/// ])
|
||||
/// .italic();
|
||||
/// ```
|
||||
///
|
||||
/// ## Aligning Text
|
||||
/// The text's [`Alignment`] can be set using [`Text::alignment`] or the related helper methods.
|
||||
/// Lines composing the text can also be individually aligned with [`Line::alignment`].
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// let text = Text::from("The first line\nThe second line").alignment(Alignment::Right);
|
||||
/// let text = Text::from("The first line\nThe second line").right_aligned();
|
||||
/// let text = Text::from(vec![
|
||||
/// Line::from("The first line").left_aligned(),
|
||||
/// Line::from("The second line").right_aligned(),
|
||||
/// Line::from("The third line"),
|
||||
/// ])
|
||||
/// .centered();
|
||||
/// ```
|
||||
///
|
||||
/// ## Rendering Text
|
||||
/// `Text` implements the [`Widget`] trait, which means it can be rendered to a [`Buffer`] or to a
|
||||
/// [`Frame`].
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::prelude::*;
|
||||
/// // within another widget's `render` method:
|
||||
/// # fn render(area: Rect, buf: &mut Buffer) {
|
||||
/// let text = Text::from("The first line\nThe second line");
|
||||
/// text.render(area, buf);
|
||||
/// # }
|
||||
///
|
||||
/// // within a terminal.draw closure:
|
||||
/// # fn draw(frame: &mut Frame, area: Rect) {
|
||||
/// let text = Text::from("The first line\nThe second line");
|
||||
/// frame.render_widget(text, area);
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// ## Rendering Text with a Paragraph Widget
|
||||
///
|
||||
/// Usually apps will use the [`Paragraph`] widget instead of rendering a `Text` directly as it
|
||||
/// provides more functionality.
|
||||
///
|
||||
/// ```rust
|
||||
/// # use ratatui::{prelude::*, widgets::*};
|
||||
/// # fn render(area: Rect, buf: &mut Buffer) {
|
||||
/// let text = Text::from("The first line\nThe second line");
|
||||
/// let paragraph = Paragraph::new(text)
|
||||
/// .wrap(Wrap { trim: true })
|
||||
/// .scroll((1, 1))
|
||||
/// .render(area, buf);
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`Paragraph`]: crate::widgets::Paragraph
|
||||
#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct Text<'a> {
|
||||
/// The lines that make up this piece of text.
|
||||
|
|
Loading…
Reference in a new issue