Struct textwrap::Wrapper [] [src]

pub struct Wrapper<'a, S: WordSplitter> {
    pub width: usize,
    pub initial_indent: &'a str,
    pub subsequent_indent: &'a str,
    pub break_words: bool,
    pub splitter: S,
}

A Wrapper holds settings for wrapping and filling text. Use it when the convenience wrap_iter, wrap and fill functions are not flexible enough.

The algorithm used by the WrapIter iterator (returned from the wrap_iter method) works by doing successive partial scans over words in the input string (where each single scan yields a single line) so that the overall time and memory complexity is O(n) where n is the length of the input string.

Fields

The width in columns at which the text will be wrapped.

Indentation used for the first line of output.

Indentation used for subsequent lines of output.

Allow long words to be broken if they cannot fit on a line. When set to false, some lines may be longer than self.width.

The method for splitting words. If the hyphenation feature is enabled, you can use a hyphenation::language::Corpus here to get language-aware hyphenation.

Methods

impl<'a> Wrapper<'a, HyphenSplitter>
[src]

[src]

Create a new Wrapper for wrapping at the specified width. By default, we allow words longer than width to be broken. A HyphenSplitter will be used by default for splitting words. See the WordSplitter trait for other options.

[src]

Create a new Wrapper for wrapping text at the current terminal width. If the terminal width cannot be determined (typically because the standard input and output is not connected to a terminal), a width of 80 characters will be used. Other settings use the same defaults as Wrapper::new.

Equivalent to:

use textwrap::{Wrapper, termwidth};

let wrapper = Wrapper::new(termwidth());

impl<'w, 'a: 'w, S: WordSplitter> Wrapper<'a, S>
[src]

[src]

Use the given WordSplitter to create a new Wrapper for wrapping at the specified width. By default, we allow words longer than width to be broken.

[src]

Change self.initial_indent. The initial indentation is used on the very first line of output.

Examples

Classic paragraph indentation can be achieved by specifying an initial indentation and wrapping each paragraph by itself:

use textwrap::Wrapper;

let wrapper = Wrapper::new(15).initial_indent("    ");

[src]

Change self.subsequent_indent. The subsequent indentation is used on lines following the first line of output.

Examples

Combining initial and subsequent indentation lets you format a single paragraph as a bullet list:

use textwrap::Wrapper;

let wrapper = Wrapper::new(15)
    .initial_indent("* ")
    .subsequent_indent("  ");

[src]

Change self.break_words. This controls if words longer than self.width can be broken, or if they will be left sticking out into the right margin.

[src]

Fill a line of text at self.width characters. Strings are wrapped based on their displayed width, not their size in bytes.

The result is a string with newlines between each line. Use the wrap method if you need access to the individual lines.

Complexities

This method simply joins the lines produced by wrap_iter. As such, it inherits the O(n) time and memory complexity where n is the input string length.

Examples

use textwrap::Wrapper;

let wrapper = Wrapper::new(15);
assert_eq!(wrapper.fill("Memory safety without garbage collection."),
           "Memory safety\nwithout garbage\ncollection.");

[src]

Wrap a line of text at self.width characters. Strings are wrapped based on their displayed width, not their size in bytes.

Complexities

This method simply collects the lines produced by wrap_iter. As such, it inherits the O(n) overall time and memory complexity where n is the input string length.

Examples

use textwrap::Wrapper;

let wrap15 = Wrapper::new(15);
assert_eq!(wrap15.wrap("Concurrency without data races."),
           vec!["Concurrency",
                "without data",
                "races."]);

let wrap20 = Wrapper::new(20);
assert_eq!(wrap20.wrap("Concurrency without data races."),
           vec!["Concurrency without",
                "data races."]);

Notice that newlines in the input are preserved. This means that they force a line break, regardless of how long the current line is:

use textwrap::Wrapper;

let wrapper = Wrapper::new(40);
assert_eq!(wrapper.wrap("First line.\nSecond line."),
           vec!["First line.", "Second line."]);

Important traits for WrapIter<'w, 'a, S>
[src]

Lazily wrap a line of text at self.width characters. Strings are wrapped based on their displayed width, not their size in bytes.

The WordSplitter stored in self.splitter is used whenever when a word is too large to fit on the current line. By changing the field, different hyphenation strategies can be implemented.

Complexities

This method returns a WrapIter iterator which borrows this Wrapper. The algorithm used has a linear complexity, so getting the next line from the iterator will take O(w) time, where w is the wrapping width. Fully processing the iterator will take O(n) time for an input string of length n.

When no indentation is used, each line returned is a slice of the input string and the memory overhead is thus constant. Otherwise new memory is allocated for each line returned.

Examples

use std::borrow::Cow;
use textwrap::Wrapper;

let wrap20 = Wrapper::new(20);
let mut wrap20_iter = wrap20.wrap_iter("Zero-cost abstractions.");
assert_eq!(wrap20_iter.next(), Some(Cow::from("Zero-cost")));
assert_eq!(wrap20_iter.next(), Some(Cow::from("abstractions.")));
assert_eq!(wrap20_iter.next(), None);

let wrap25 = Wrapper::new(25);
let mut wrap25_iter = wrap25.wrap_iter("Zero-cost abstractions.");
assert_eq!(wrap25_iter.next(), Some(Cow::from("Zero-cost abstractions.")));
assert_eq!(wrap25_iter.next(), None);

Important traits for IntoWrapIter<'a, S>
[src]

Lazily wrap a line of text at self.width characters. Strings are wrapped based on their displayed width, not their size in bytes.

The WordSplitter stored in self.splitter is used whenever when a word is too large to fit on the current line. By changing the field, different hyphenation strategies can be implemented.

Complexities

This method consumes the Wrapper and returns a IntoWrapIter iterator. Fully processing the iterator has the same O(n) time complexity as wrap_iter, where n is the length of the input string.

Examples

use std::borrow::Cow;
use textwrap::Wrapper;

let wrap20 = Wrapper::new(20);
let mut wrap20_iter = wrap20.into_wrap_iter("Zero-cost abstractions.");
assert_eq!(wrap20_iter.next(), Some(Cow::from("Zero-cost")));
assert_eq!(wrap20_iter.next(), Some(Cow::from("abstractions.")));
assert_eq!(wrap20_iter.next(), None);

Trait Implementations

impl<'a, S: Clone + WordSplitter> Clone for Wrapper<'a, S>
[src]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

impl<'a, S: Debug + WordSplitter> Debug for Wrapper<'a, S>
[src]

[src]

Formats the value using the given formatter. Read more

Auto Trait Implementations

impl<'a, S> Send for Wrapper<'a, S> where
    S: Send

impl<'a, S> Sync for Wrapper<'a, S> where
    S: Sync