This repository has been archived on 2022-04-04. You can view files and clone it, but cannot push or open issues or pull requests.

120 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Wrap a line of text at a given width."><meta name="keywords" content="rust, rustlang, rust-lang, wrap"><title>wrap in textwrap - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../dark.css" disabled><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../storage.js"></script><script src="../crates.js"></script><script defer src="../main.js"></script>
<noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a class="sidebar-logo" href="../textwrap/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.png" alt="logo"></div>
</a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="index.html">textwrap</a></h2><div id="sidebar-vars" data-name="wrap" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../textwrap/index.html"><img class="rust-logo" src="../rust-logo.png" alt="logo"></a><nav class="sub"><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../settings.html" title="settings"><img width="18" height="18" alt="Change settings" src="../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><h1 class="fqn"><span class="in-band">Function <a href="index.html">textwrap</a>::<wbr><a class="fn" href="#">wrap</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../clipboard.svg" width="19" height="18" alt="Copy item path"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span><a class="srclink" href="../src/textwrap/lib.rs.html#904-987" title="goto source code">[src]</a></span></h1><div class="docblock item-decl"><pre class="rust fn"><code>pub fn wrap&lt;'a, Opt&gt;(text: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.59.0/std/primitive.str.html">str</a>, width_or_options: Opt) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.59.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.59.0/alloc/borrow/enum.Cow.html" title="enum alloc::borrow::Cow">Cow</a>&lt;'_, <a class="primitive" href="https://doc.rust-lang.org/1.59.0/std/primitive.str.html">str</a>&gt;&gt; <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Opt: <a class="trait" href="https://doc.rust-lang.org/1.59.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;<a class="struct" href="struct.Options.html" title="struct textwrap::Options">Options</a>&lt;'a&gt;&gt;,&nbsp;</span></code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Wrap a line of text at a given width.</p>
<p>The result is a vector of lines, each line is of type <a href="https://doc.rust-lang.org/1.59.0/alloc/borrow/enum.Cow.html"><code>Cow&lt;'_, str&gt;</code></a>, which means that the line will borrow from the input
<code>&amp;str</code> if possible. The lines do not have trailing whitespace,
including a final <code>'\n'</code>. Please use the <a href="fn.fill.html" title="fill"><code>fill</code></a> function if you
need a <a href="https://doc.rust-lang.org/1.59.0/alloc/string/struct.String.html" title="String"><code>String</code></a> instead.</p>
<p>The easiest way to use this function is to pass an integer for
<code>width_or_options</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">textwrap::wrap</span>;
<span class="kw">let</span> <span class="ident">lines</span> <span class="op">=</span> <span class="ident">wrap</span>(<span class="string">&quot;Memory safety without garbage collection.&quot;</span>, <span class="number">15</span>);
<span class="macro">assert_eq!</span>(<span class="ident">lines</span>, <span class="kw-2">&amp;</span>[
<span class="string">&quot;Memory safety&quot;</span>,
<span class="string">&quot;without garbage&quot;</span>,
<span class="string">&quot;collection.&quot;</span>,
]);</code></pre></div>
<p>If you need to customize the wrapping, you can pass an <a href="struct.Options.html" title="Options"><code>Options</code></a>
instead of an <code>usize</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">textwrap</span>::{<span class="ident">wrap</span>, <span class="ident">Options</span>};
<span class="kw">let</span> <span class="ident">options</span> <span class="op">=</span> <span class="ident">Options::new</span>(<span class="number">15</span>)
.<span class="ident">initial_indent</span>(<span class="string">&quot;- &quot;</span>)
.<span class="ident">subsequent_indent</span>(<span class="string">&quot; &quot;</span>);
<span class="kw">let</span> <span class="ident">lines</span> <span class="op">=</span> <span class="ident">wrap</span>(<span class="string">&quot;Memory safety without garbage collection.&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">options</span>);
<span class="macro">assert_eq!</span>(<span class="ident">lines</span>, <span class="kw-2">&amp;</span>[
<span class="string">&quot;- Memory safety&quot;</span>,
<span class="string">&quot; without&quot;</span>,
<span class="string">&quot; garbage&quot;</span>,
<span class="string">&quot; collection.&quot;</span>,
]);</code></pre></div>
<h2 id="optimal-fit-wrapping" class="section-header"><a href="#optimal-fit-wrapping">Optimal-Fit Wrapping</a></h2>
<p>By default, <code>wrap</code> will try to ensure an even right margin by
finding breaks which avoid short lines. We call this an
“optimal-fit algorithm” since the line breaks are computed by
considering all possible line breaks. The alternative is a
“first-fit algorithm” which simply accumulates words until they no
longer fit on the line.</p>
<p>As an example, using the first-fit algorithm to wrap the famous
Hamlet quote “To be, or not to be: that is the question” in a
narrow column with room for only 10 characters looks like this:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="ident">To</span> <span class="ident">be</span>, <span class="ident">or</span>
<span class="ident">not</span> <span class="ident">to</span> <span class="ident">be</span>:
<span class="ident">that</span> <span class="ident">is</span>
<span class="ident">the</span>
<span class="ident">question</span></code></pre></div>
<p>Notice how the second to last line is quite narrow because
“question” was too large to fit? The greedy first-fit algorithm
doesnt look ahead, so it has no other option than to put
“question” onto its own line.</p>
<p>With the optimal-fit wrapping algorithm, the previous lines are
shortened slightly in order to make the word “is” go into the
second last line:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="ident">To</span> <span class="ident">be</span>,
<span class="ident">or</span> <span class="ident">not</span> <span class="ident">to</span>
<span class="ident">be</span>: <span class="ident">that</span>
<span class="ident">is</span> <span class="ident">the</span>
<span class="ident">question</span></code></pre></div>
<p>Please see <a href="wrap_algorithms/enum.WrapAlgorithm.html" title="WrapAlgorithm"><code>WrapAlgorithm</code></a> for details on the choices.</p>
<h2 id="examples" class="section-header"><a href="#examples">Examples</a></h2>
<p>The returned iterator yields lines of type <code>Cow&lt;'_, str&gt;</code>. If
possible, the wrapped lines will borrow from the input string. As
an example, a hanging indentation, the first line can borrow from
the input, but the subsequent lines become owned strings:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">std::borrow::Cow</span>::{<span class="ident">Borrowed</span>, <span class="ident">Owned</span>};
<span class="kw">use</span> <span class="ident">textwrap</span>::{<span class="ident">wrap</span>, <span class="ident">Options</span>};
<span class="kw">let</span> <span class="ident">options</span> <span class="op">=</span> <span class="ident">Options::new</span>(<span class="number">15</span>).<span class="ident">subsequent_indent</span>(<span class="string">&quot;....&quot;</span>);
<span class="kw">let</span> <span class="ident">lines</span> <span class="op">=</span> <span class="ident">wrap</span>(<span class="string">&quot;Wrapping text all day long.&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">options</span>);
<span class="kw">let</span> <span class="ident">annotated</span> <span class="op">=</span> <span class="ident">lines</span>
.<span class="ident">iter</span>()
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">line</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">line</span> {
<span class="ident">Borrowed</span>(<span class="ident">text</span>) =&gt; <span class="macro">format!</span>(<span class="string">&quot;[Borrowed] {}&quot;</span>, <span class="ident">text</span>),
<span class="ident">Owned</span>(<span class="ident">text</span>) =&gt; <span class="macro">format!</span>(<span class="string">&quot;[Owned] {}&quot;</span>, <span class="ident">text</span>),
})
.<span class="ident">collect</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="kw">_</span><span class="op">&gt;</span><span class="op">&gt;</span>();
<span class="macro">assert_eq!</span>(
<span class="ident">annotated</span>,
<span class="kw-2">&amp;</span>[
<span class="string">&quot;[Borrowed] Wrapping text&quot;</span>,
<span class="string">&quot;[Owned] ....all day&quot;</span>,
<span class="string">&quot;[Owned] ....long.&quot;</span>,
]
);</code></pre></div>
<h3 id="leading-and-trailing-whitespace" class="section-header"><a href="#leading-and-trailing-whitespace">Leading and Trailing Whitespace</a></h3>
<p>As a rule, leading whitespace (indentation) is preserved and
trailing whitespace is discarded.</p>
<p>In more details, when wrapping words into lines, words are found
by splitting the input text on space characters. One or more
spaces (shown here as “␣”) are attached to the end of each word:</p>
<div class="example-wrap"><pre class="language-text"><code>&quot;Foo␣␣␣bar␣baz&quot; -&gt; [&quot;Foo␣␣␣&quot;, &quot;bar␣&quot;, &quot;baz&quot;]</code></pre></div>
<p>These words are then put into lines. The interword whitespace is
preserved, unless the lines are wrapped so that the <code>&quot;Foo␣␣␣&quot;</code>
word falls at the end of a line:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">textwrap::wrap</span>;
<span class="macro">assert_eq!</span>(<span class="ident">wrap</span>(<span class="string">&quot;Foo bar baz&quot;</span>, <span class="number">10</span>), <span class="macro">vec!</span>[<span class="string">&quot;Foo bar&quot;</span>, <span class="string">&quot;baz&quot;</span>]);
<span class="macro">assert_eq!</span>(<span class="ident">wrap</span>(<span class="string">&quot;Foo bar baz&quot;</span>, <span class="number">8</span>), <span class="macro">vec!</span>[<span class="string">&quot;Foo&quot;</span>, <span class="string">&quot;bar baz&quot;</span>]);</code></pre></div>
<p>Notice how the trailing whitespace is removed in both case: in the
first example, <code>&quot;bar␣&quot;</code> becomes <code>&quot;bar&quot;</code> and in the second case
<code>&quot;Foo␣␣␣&quot;</code> becomes <code>&quot;Foo&quot;</code>.</p>
<p>Leading whitespace is preserved when the following word fits on
the first line. To understand this, consider how words are found
in a text with leading spaces:</p>
<div class="example-wrap"><pre class="language-text"><code>&quot;␣␣foo␣bar&quot; -&gt; [&quot;␣␣&quot;, &quot;foo␣&quot;, &quot;bar&quot;]</code></pre></div>
<p>When put into lines, the indentation is preserved if <code>&quot;foo&quot;</code> fits
on the first line, otherwise you end up with an empty line:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">textwrap::wrap</span>;
<span class="macro">assert_eq!</span>(<span class="ident">wrap</span>(<span class="string">&quot; foo bar&quot;</span>, <span class="number">8</span>), <span class="macro">vec!</span>[<span class="string">&quot; foo&quot;</span>, <span class="string">&quot;bar&quot;</span>]);
<span class="macro">assert_eq!</span>(<span class="ident">wrap</span>(<span class="string">&quot; foo bar&quot;</span>, <span class="number">4</span>), <span class="macro">vec!</span>[<span class="string">&quot;&quot;</span>, <span class="string">&quot;foo&quot;</span>, <span class="string">&quot;bar&quot;</span>]);</code></pre></div>
</div></details></section><section id="search" class="content hidden"></section></div></main><div id="rustdoc-vars" data-root-path="../" data-current-crate="textwrap" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.59.0 (9d1b2106e 2022-02-23)" ></div>
</body></html>