575 lines
21 KiB
Markdown
575 lines
21 KiB
Markdown
|
# Changelog
|
|||
|
|
|||
|
This file lists the most important changes made in each release of
|
|||
|
`textwrap`.
|
|||
|
|
|||
|
## Version 0.15.2 (2022-10-24)
|
|||
|
|
|||
|
This release is identical to 0.15.0 and is only there to give people a
|
|||
|
way to install crates which depend on the yanked 0.15.1 release. See
|
|||
|
[#484](https://github.com/mgeisler/textwrap/issues/484) for details.
|
|||
|
|
|||
|
## Version 0.15.0 (2022-02-27)
|
|||
|
|
|||
|
This is a major feature release with two main changes:
|
|||
|
|
|||
|
* [#421](https://github.com/mgeisler/textwrap/pull/421): Use `f64`
|
|||
|
instead of `usize` for fragment widths.
|
|||
|
|
|||
|
This fixes problems with overflows in the internal computations of
|
|||
|
`wrap_optimal_fit` when fragments (words) or line lenghts had
|
|||
|
extreme values, such as `usize::MAX`.
|
|||
|
|
|||
|
* [#438](https://github.com/mgeisler/textwrap/pull/438): Simplify
|
|||
|
`Options` by removing generic type parameters.
|
|||
|
|
|||
|
This change removes the new generic parameters introduced in version
|
|||
|
0.14, as well as the original `WrapSplitter` parameter which has
|
|||
|
been present since very early versions.
|
|||
|
|
|||
|
The result is a simplification of function and struct signatures
|
|||
|
across the board. So what used to be
|
|||
|
|
|||
|
```rust
|
|||
|
let options: Options<
|
|||
|
wrap_algorithms::FirstFit,
|
|||
|
word_separators::AsciiSpace,
|
|||
|
word_splitters::HyphenSplitter,
|
|||
|
> = Options::new(80);
|
|||
|
```
|
|||
|
|
|||
|
if types are fully written out, is now simply
|
|||
|
|
|||
|
```rust
|
|||
|
let options: Options<'_> = Options::new(80);
|
|||
|
```
|
|||
|
|
|||
|
The anonymous lifetime represent the lifetime of the
|
|||
|
`initial_indent` and `subsequent_indent` strings. The change is
|
|||
|
nearly performance neutral (a 1-2% regression).
|
|||
|
|
|||
|
Smaller improvements and changes:
|
|||
|
|
|||
|
* [#404](https://github.com/mgeisler/textwrap/pull/404): Make
|
|||
|
documentation for short last-line penalty more precise.
|
|||
|
* [#405](https://github.com/mgeisler/textwrap/pull/405): Cleanup and
|
|||
|
simplify `Options` docstring.
|
|||
|
* [#411](https://github.com/mgeisler/textwrap/pull/411): Default to
|
|||
|
`OptimalFit` in interactive example.
|
|||
|
* [#415](https://github.com/mgeisler/textwrap/pull/415): Add demo
|
|||
|
program to help compute binary sizes.
|
|||
|
* [#423](https://github.com/mgeisler/textwrap/pull/423): Add fuzz
|
|||
|
tests with fully arbitrary fragments.
|
|||
|
* [#424](https://github.com/mgeisler/textwrap/pull/424): Change
|
|||
|
`wrap_optimal_fit` penalties to non-negative numbers.
|
|||
|
* [#430](https://github.com/mgeisler/textwrap/pull/430): Add
|
|||
|
`debug-words` example.
|
|||
|
* [#432](https://github.com/mgeisler/textwrap/pull/432): Use precise
|
|||
|
dependency versions in Cargo.toml.
|
|||
|
|
|||
|
## Version 0.14.2 (2021-06-27)
|
|||
|
|
|||
|
The 0.14.1 release included more changes than intended and has been
|
|||
|
yanked. The change intended for 0.14.1 is now included in 0.14.2.
|
|||
|
|
|||
|
## Version 0.14.1 (2021-06-26)
|
|||
|
|
|||
|
This release fixes a panic reported by @Makoto, thanks!
|
|||
|
|
|||
|
* [#391](https://github.com/mgeisler/textwrap/pull/391): Fix panic in
|
|||
|
`find_words` due to string access outside of a character boundary.
|
|||
|
|
|||
|
## Version 0.14.0 (2021-06-05)
|
|||
|
|
|||
|
This is a major feature release which makes Textwrap more configurable
|
|||
|
and flexible. The high-level API of `textwrap::wrap` and
|
|||
|
`textwrap::fill` remains unchanged, but low-level structs have moved
|
|||
|
around.
|
|||
|
|
|||
|
The biggest change is the introduction of new generic type parameters
|
|||
|
to the `Options` struct. These parameters lets you statically
|
|||
|
configure the wrapping algorithm, the word separator, and the word
|
|||
|
splitter. If you previously spelled out the full type for `Options`,
|
|||
|
you now need to take the extra type parameters into account. This
|
|||
|
means that
|
|||
|
|
|||
|
```rust
|
|||
|
let options: Options<HyphenSplitter> = Options::new(80);
|
|||
|
```
|
|||
|
|
|||
|
changes to
|
|||
|
|
|||
|
```rust
|
|||
|
let options: Options<
|
|||
|
wrap_algorithms::FirstFit,
|
|||
|
word_separators::AsciiSpace,
|
|||
|
word_splitters::HyphenSplitter,
|
|||
|
> = Options::new(80);
|
|||
|
```
|
|||
|
|
|||
|
This is quite a mouthful, so we suggest using type inferrence where
|
|||
|
possible. You won’t see any chance if you call `wrap` directly with a
|
|||
|
width or with an `Options` value constructed on the fly. Please open
|
|||
|
an issue if this causes problems for you!
|
|||
|
|
|||
|
### New `WordSeparator` Trait
|
|||
|
|
|||
|
* [#332](https://github.com/mgeisler/textwrap/pull/332): Add
|
|||
|
`WordSeparator` trait to allow customizing how words are found in a
|
|||
|
line of text. Until now, Textwrap would always assume that words are
|
|||
|
separated by ASCII space characters. You can now customize this as
|
|||
|
needed.
|
|||
|
|
|||
|
* [#313](https://github.com/mgeisler/textwrap/pull/313): Add support
|
|||
|
for using the Unicode line breaking algorithm to find words. This is
|
|||
|
done by adding a second implementation of the new `WordSeparator`
|
|||
|
trait. The implementation uses the unicode-linebreak crate, which is
|
|||
|
a new optional dependency.
|
|||
|
|
|||
|
With this, Textwrap can be used with East-Asian languages such as
|
|||
|
Chinese or Japanese where there are no spaces between words.
|
|||
|
Breaking a long sequence of emojis is another example where line
|
|||
|
breaks might be wanted even if there are no whitespace to be found.
|
|||
|
Feedback would be appreciated for this feature.
|
|||
|
|
|||
|
|
|||
|
### Indent
|
|||
|
|
|||
|
* [#353](https://github.com/mgeisler/textwrap/pull/353): Trim trailing
|
|||
|
whitespace from `prefix` in `indent`.
|
|||
|
|
|||
|
Before, empty lines would get no prefix added. Now, empty lines have
|
|||
|
a trimmed prefix added. This little trick makes `indent` much more
|
|||
|
useful since you can now safely indent with `"# "` without creating
|
|||
|
trailing whitespace in the output due to the trailing whitespace in
|
|||
|
your prefix.
|
|||
|
|
|||
|
* [#354](https://github.com/mgeisler/textwrap/pull/354): Make `indent`
|
|||
|
about 20% faster by preallocating the output string.
|
|||
|
|
|||
|
|
|||
|
### Documentation
|
|||
|
|
|||
|
* [#308](https://github.com/mgeisler/textwrap/pull/308): Document
|
|||
|
handling of leading and trailing whitespace when wrapping text.
|
|||
|
|
|||
|
### WebAssembly Demo
|
|||
|
|
|||
|
* [#310](https://github.com/mgeisler/textwrap/pull/310): Thanks to
|
|||
|
WebAssembly, you can now try out Textwrap directly in your browser.
|
|||
|
Please try it out: https://mgeisler.github.io/textwrap/.
|
|||
|
|
|||
|
### New Generic Parameters
|
|||
|
|
|||
|
* [#331](https://github.com/mgeisler/textwrap/pull/331): Remove outer
|
|||
|
boxing from `Options`.
|
|||
|
|
|||
|
* [#357](https://github.com/mgeisler/textwrap/pull/357): Replace
|
|||
|
`core::WrapAlgorithm` enum with a `wrap_algorithms::WrapAlgorithm`
|
|||
|
trait. This allows for arbitrary wrapping algorithms to be plugged
|
|||
|
into the library.
|
|||
|
|
|||
|
* [#358](https://github.com/mgeisler/textwrap/pull/358): Switch
|
|||
|
wrapping functions to use a slice for `line_widths`.
|
|||
|
|
|||
|
* [#368](https://github.com/mgeisler/textwrap/pull/368): Move
|
|||
|
`WordSeparator` and `WordSplitter` traits to separate modules.
|
|||
|
Before, Textwrap had several top-level structs such as
|
|||
|
`NoHyphenation` and `HyphenSplitter`. These implementations of
|
|||
|
`WordSplitter` now lives in a dedicated `word_splitters` module.
|
|||
|
Similarly, we have a new `word_separators` module for
|
|||
|
implementations of `WordSeparator`.
|
|||
|
|
|||
|
* [#369](https://github.com/mgeisler/textwrap/pull/369): Rename
|
|||
|
`Options::splitter` to `Options::word_splitter` for consistency with
|
|||
|
the other fields backed by traits.
|
|||
|
|
|||
|
## Version 0.13.4 (2021-02-23)
|
|||
|
|
|||
|
This release removes `println!` statements which was left behind in
|
|||
|
`unfill` by mistake.
|
|||
|
|
|||
|
* [#296](https://github.com/mgeisler/textwrap/pull/296): Improve house
|
|||
|
building example with more comments.
|
|||
|
* [#297](https://github.com/mgeisler/textwrap/pull/297): Remove debug
|
|||
|
prints in the new `unfill` function.
|
|||
|
|
|||
|
## Version 0.13.3 (2021-02-20)
|
|||
|
|
|||
|
This release contains a bugfix for `indent` and improved handling of
|
|||
|
emojis. We’ve also added a new function for formatting text in columns
|
|||
|
and functions for reformatting already wrapped text.
|
|||
|
|
|||
|
* [#276](https://github.com/mgeisler/textwrap/pull/276): Extend
|
|||
|
`core::display_width` to handle emojis when the unicode-width Cargo
|
|||
|
feature is disabled.
|
|||
|
* [#279](https://github.com/mgeisler/textwrap/pull/279): Make `indent`
|
|||
|
preserve existing newlines in the input string. Before,
|
|||
|
`indent("foo", "")` would return `"foo\n"` by mistake. It now
|
|||
|
returns `"foo"` instead.
|
|||
|
* [#281](https://github.com/mgeisler/textwrap/pull/281): Ensure all
|
|||
|
`Options` fields have examples.
|
|||
|
* [#282](https://github.com/mgeisler/textwrap/pull/282): Add a
|
|||
|
`wrap_columns` function.
|
|||
|
* [#294](https://github.com/mgeisler/textwrap/pull/294): Add new
|
|||
|
`unfill` and `refill` functions.
|
|||
|
|
|||
|
## Version 0.13.2 (2020-12-30)
|
|||
|
|
|||
|
This release primarily makes all dependencies optional. This makes it
|
|||
|
possible to slim down textwrap as needed.
|
|||
|
|
|||
|
* [#254](https://github.com/mgeisler/textwrap/pull/254): `impl
|
|||
|
WordSplitter` for `Box<T> where T: WordSplitter`.
|
|||
|
* [#255](https://github.com/mgeisler/textwrap/pull/255): Use command
|
|||
|
line arguments as initial text in interactive example.
|
|||
|
* [#256](https://github.com/mgeisler/textwrap/pull/256): Introduce
|
|||
|
fuzz tests for `wrap_optimal_fit` and `wrap_first_fit`.
|
|||
|
* [#260](https://github.com/mgeisler/textwrap/pull/260): Make the
|
|||
|
unicode-width dependency optional.
|
|||
|
* [#261](https://github.com/mgeisler/textwrap/pull/261): Make the
|
|||
|
smawk dependency optional.
|
|||
|
|
|||
|
## Version 0.13.1 (2020-12-10)
|
|||
|
|
|||
|
This is a bugfix release which fixes a regression in 0.13.0. The bug
|
|||
|
meant that colored text was wrapped incorrectly.
|
|||
|
|
|||
|
* [#245](https://github.com/mgeisler/textwrap/pull/245): Support
|
|||
|
deleting a word with Ctrl-Backspace in the interactive demo.
|
|||
|
* [#246](https://github.com/mgeisler/textwrap/pull/246): Show build
|
|||
|
type (debug/release) in interactive demo.
|
|||
|
* [#249](https://github.com/mgeisler/textwrap/pull/249): Correctly
|
|||
|
compute width while skipping over ANSI escape sequences.
|
|||
|
|
|||
|
## Version 0.13.0 (2020-12-05)
|
|||
|
|
|||
|
This is a major release which rewrites the core logic, adds many new
|
|||
|
features, and fixes a couple of bugs. Most programs which use
|
|||
|
`textwrap` stays the same, incompatibilities and upgrade notes are
|
|||
|
given below.
|
|||
|
|
|||
|
Clone the repository and run the following to explore the new features
|
|||
|
in an interactive demo (Linux only):
|
|||
|
|
|||
|
```sh
|
|||
|
$ cargo run --example interactive --all-features
|
|||
|
```
|
|||
|
|
|||
|
### Bug Fixes
|
|||
|
|
|||
|
#### Rewritten core wrapping algorithm
|
|||
|
|
|||
|
* [#221](https://github.com/mgeisler/textwrap/pull/221): Reformulate
|
|||
|
wrapping in terms of words with whitespace and penalties.
|
|||
|
|
|||
|
The core wrapping algorithm has been completely rewritten. This fixed
|
|||
|
bugs and simplified the code, while also making it possible to use
|
|||
|
`textwrap` outside the context of the terminal.
|
|||
|
|
|||
|
As part of this, trailing whitespace is now discarded consistently
|
|||
|
from wrapped lines. Before we would inconsistently remove whitespace
|
|||
|
at the end of wrapped lines, except for the last. Leading whitespace
|
|||
|
is still preserved.
|
|||
|
|
|||
|
### New Features
|
|||
|
|
|||
|
#### Optimal-fit wrapping
|
|||
|
|
|||
|
* [#234](https://github.com/mgeisler/textwrap/pull/234): Introduce
|
|||
|
wrapping using an optimal-fit algorithm.
|
|||
|
|
|||
|
This release adds support for new wrapping algorithm which finds a
|
|||
|
globally optimal set of line breaks, taking certain penalties into
|
|||
|
account. As an example, the old algorithm would produce
|
|||
|
|
|||
|
"To be, or"
|
|||
|
"not to be:"
|
|||
|
"that is"
|
|||
|
"the"
|
|||
|
"question"
|
|||
|
|
|||
|
Notice how the fourth line with “the” is very short. The new algorithm
|
|||
|
shortens the previous lines slightly to produce fewer short lines:
|
|||
|
|
|||
|
"To be,"
|
|||
|
"or not to"
|
|||
|
"be: that"
|
|||
|
"is the"
|
|||
|
"question"
|
|||
|
|
|||
|
Use the new `textwrap::core::WrapAlgorithm` enum to select between the
|
|||
|
new and old algorithm. By default, the new algorithm is used.
|
|||
|
|
|||
|
The optimal-fit algorithm is inspired by the line breaking algorithm
|
|||
|
used in TeX, described in the 1981 article [_Breaking Paragraphs into
|
|||
|
Lines_](http://www.eprg.org/G53DOC/pdfs/knuth-plass-breaking.pdf) by
|
|||
|
Knuth and Plass.
|
|||
|
|
|||
|
#### In-place wrapping
|
|||
|
|
|||
|
* [#226](https://github.com/mgeisler/textwrap/pull/226): Add a
|
|||
|
`fill_inplace` function.
|
|||
|
|
|||
|
When the text you want to fill is already a temporary `String`, you
|
|||
|
can now mutate it in-place with `fill_inplace`:
|
|||
|
|
|||
|
```rust
|
|||
|
let mut greeting = format!("Greetings {}, welcome to the game! You have {} lives left.",
|
|||
|
player.name, player.lives);
|
|||
|
fill_inplace(&mut greeting, line_width);
|
|||
|
```
|
|||
|
|
|||
|
This is faster than calling `fill` and it will reuse the memory
|
|||
|
already allocated for the string.
|
|||
|
|
|||
|
### Changed Features
|
|||
|
|
|||
|
#### `Wrapper` is replaced with `Options`
|
|||
|
|
|||
|
* [#213](https://github.com/mgeisler/textwrap/pull/213): Simplify API
|
|||
|
with only top-level functions.
|
|||
|
* [#215](https://github.com/mgeisler/textwrap/pull/215): Reintroducing
|
|||
|
the type parameter on `Options` (previously known as `Wrapper`).
|
|||
|
* [#219](https://github.com/mgeisler/textwrap/pull/219): Allow using
|
|||
|
trait objects with `fill` & `wrap`.
|
|||
|
* [#227](https://github.com/mgeisler/textwrap/pull/227): Replace
|
|||
|
`WrapOptions` with `Into<Options>`.
|
|||
|
|
|||
|
The `Wrapper` struct held the options (line width, indentation, etc)
|
|||
|
for wrapping text. It was also the entry point for actually wrapping
|
|||
|
the text via its methods such as `wrap`, `wrap_iter`,
|
|||
|
`into_wrap_iter`, and `fill` methods.
|
|||
|
|
|||
|
The struct has been replaced by a simpler `Options` struct which only
|
|||
|
holds options. The `Wrapper` methods are gone, their job has been
|
|||
|
taken over by the top-level `wrap` and `fill` functions. The signature
|
|||
|
of these functions have changed from
|
|||
|
|
|||
|
```rust
|
|||
|
fn fill(s: &str, width: usize) -> String;
|
|||
|
|
|||
|
fn wrap(s: &str, width: usize) -> Vec<Cow<'_, str>>;
|
|||
|
```
|
|||
|
|
|||
|
to the more general
|
|||
|
|
|||
|
```rust
|
|||
|
fn fill<'a, S, Opt>(text: &str, options: Opt) -> String
|
|||
|
where
|
|||
|
S: WordSplitter,
|
|||
|
Opt: Into<Options<'a, S>>;
|
|||
|
|
|||
|
fn wrap<'a, S, Opt>(text: &str, options: Opt) -> Vec<Cow<'_, str>>
|
|||
|
where
|
|||
|
S: WordSplitter,
|
|||
|
Opt: Into<Options<'a, S>>;
|
|||
|
```
|
|||
|
|
|||
|
The `Into<Options<'a, S>` bound allows you to pass an `usize` (which
|
|||
|
is interpreted as the line width) *and* a full `Options` object. This
|
|||
|
allows the new functions to work like the old, plus you can now fully
|
|||
|
customize the behavior of the wrapping via `Options` when needed.
|
|||
|
|
|||
|
Code that call `textwrap::wrap` or `textwrap::fill` can remain
|
|||
|
unchanged. Code that calls into `Wrapper::wrap` or `Wrapper::fill`
|
|||
|
will need to be update. This is a mechanical change, please see
|
|||
|
[#213](https://github.com/mgeisler/textwrap/pull/213) for examples.
|
|||
|
|
|||
|
Thanks to @CryptJar and @Koxiat for their support in the PRs above!
|
|||
|
|
|||
|
### Removed Features
|
|||
|
|
|||
|
* The `wrap_iter` and `into_wrap_iter` methods are gone. This means
|
|||
|
that lazy iteration is no longer supported: you always get all
|
|||
|
wrapped lines back as a `Vec`. This was done to simplify the code
|
|||
|
and to support the optimal-fit algorithm.
|
|||
|
|
|||
|
The first-fit algorithm could still be implemented in an incremental
|
|||
|
fashion. Please let us know if this is important to you.
|
|||
|
|
|||
|
### Other Changes
|
|||
|
|
|||
|
* [#206](https://github.com/mgeisler/textwrap/pull/206): Change
|
|||
|
`Wrapper.splitter` from `T: WordSplitter` to `Box<dyn
|
|||
|
WordSplitter>`.
|
|||
|
* [#216](https://github.com/mgeisler/textwrap/pull/216): Forbid the
|
|||
|
use of unsafe code.
|
|||
|
|
|||
|
## Version 0.12.1 (2020-07-03)
|
|||
|
|
|||
|
This is a bugfix release.
|
|||
|
|
|||
|
* Fixed [#176][issue-176]: Mention compile-time wrapping by linking to
|
|||
|
the [`textwrap-macros` crate].
|
|||
|
* Fixed [#193][issue-193]: Wrapping with `break_words(false)` was
|
|||
|
broken and would cause extra whitespace to be inserted when words
|
|||
|
were longer than the line width.
|
|||
|
|
|||
|
## Version 0.12.0 (2020-06-26)
|
|||
|
|
|||
|
The code has been updated to the [Rust 2018 edition][rust-2018] and
|
|||
|
each new release of `textwrap` will only support the latest stable
|
|||
|
version of Rust. Trying to support older Rust versions is a fool's
|
|||
|
errand: our dependencies keep releasing new patch versions that
|
|||
|
require newer and newer versions of Rust.
|
|||
|
|
|||
|
The `term_size` feature has been replaced by `terminal_size`. The API
|
|||
|
is unchanged, it is just the name of the Cargo feature that changed.
|
|||
|
|
|||
|
The `hyphenation` feature now only embeds the hyphenation patterns for
|
|||
|
US-English. This slims down the dependency.
|
|||
|
|
|||
|
* Fixed [#140][issue-140]: Ignore ANSI escape sequences.
|
|||
|
* Fixed [#158][issue-158]: Unintended wrapping when using external splitter.
|
|||
|
* Fixed [#177][issue-177]: Update examples to the 2018 edition.
|
|||
|
|
|||
|
## Version 0.11.0 (2018-12-09)
|
|||
|
|
|||
|
Due to our dependencies bumping their minimum supported version of
|
|||
|
Rust, the minimum version of Rust we test against is now 1.22.0.
|
|||
|
|
|||
|
* Merged [#141][issue-141]: Fix `dedent` handling of empty lines and
|
|||
|
trailing newlines. Thanks @bbqsrc!
|
|||
|
* Fixed [#151][issue-151]: Release of version with hyphenation 0.7.
|
|||
|
|
|||
|
## Version 0.10.0 (2018-04-28)
|
|||
|
|
|||
|
Due to our dependencies bumping their minimum supported version of
|
|||
|
Rust, the minimum version of Rust we test against is now 1.17.0.
|
|||
|
|
|||
|
* Fixed [#99][issue-99]: Word broken even though it would fit on line.
|
|||
|
* Fixed [#107][issue-107]: Automatic hyphenation is off by one.
|
|||
|
* Fixed [#122][issue-122]: Take newlines into account when wrapping.
|
|||
|
* Fixed [#129][issue-129]: Panic on string with em-dash.
|
|||
|
|
|||
|
## Version 0.9.0 (2017-10-05)
|
|||
|
|
|||
|
The dependency on `term_size` is now optional, and by default this
|
|||
|
feature is not enabled. This is a *breaking change* for users of
|
|||
|
`Wrapper::with_termwidth`. Enable the `term_size` feature to restore
|
|||
|
the old functionality.
|
|||
|
|
|||
|
Added a regression test for the case where `width` is set to
|
|||
|
`usize::MAX`, thanks @Fraser999! All public structs now implement
|
|||
|
`Debug`, thanks @hcpl!
|
|||
|
|
|||
|
* Fixed [#101][issue-101]: Make `term_size` an optional dependency.
|
|||
|
|
|||
|
## Version 0.8.0 (2017-09-04)
|
|||
|
|
|||
|
The `Wrapper` stuct is now generic over the type of word splitter
|
|||
|
being used. This means less boxing and a nicer API. The
|
|||
|
`Wrapper::word_splitter` method has been removed. This is a *breaking
|
|||
|
API change* if you used the method to change the word splitter.
|
|||
|
|
|||
|
The `Wrapper` struct has two new methods that will wrap the input text
|
|||
|
lazily: `Wrapper::wrap_iter` and `Wrapper::into_wrap_iter`. Use those
|
|||
|
if you will be iterating over the wrapped lines one by one.
|
|||
|
|
|||
|
* Fixed [#59][issue-59]: `wrap` could return an iterator. Thanks
|
|||
|
@hcpl!
|
|||
|
* Fixed [#81][issue-81]: Set `html_root_url`.
|
|||
|
|
|||
|
## Version 0.7.0 (2017-07-20)
|
|||
|
|
|||
|
Version 0.7.0 changes the return type of `Wrapper::wrap` from
|
|||
|
`Vec<String>` to `Vec<Cow<'a, str>>`. This means that the output lines
|
|||
|
borrow data from the input string. This is a *breaking API change* if
|
|||
|
you relied on the exact return type of `Wrapper::wrap`. Callers of the
|
|||
|
`textwrap::fill` convenience function will see no breakage.
|
|||
|
|
|||
|
The above change and other optimizations makes version 0.7.0 roughly
|
|||
|
15-30% faster than version 0.6.0.
|
|||
|
|
|||
|
The `squeeze_whitespace` option has been removed since it was
|
|||
|
complicating the above optimization. Let us know if this option is
|
|||
|
important for you so we can provide a work around.
|
|||
|
|
|||
|
* Fixed [#58][issue-58]: Add a "fast_wrap" function.
|
|||
|
* Fixed [#61][issue-61]: Documentation errors.
|
|||
|
|
|||
|
## Version 0.6.0 (2017-05-22)
|
|||
|
|
|||
|
Version 0.6.0 adds builder methods to `Wrapper` for easy one-line
|
|||
|
initialization and configuration:
|
|||
|
|
|||
|
```rust
|
|||
|
let wrapper = Wrapper::new(60).break_words(false);
|
|||
|
```
|
|||
|
|
|||
|
It also add a new `NoHyphenation` word splitter that will never split
|
|||
|
words, not even at existing hyphens.
|
|||
|
|
|||
|
* Fixed [#28][issue-28]: Support not squeezing whitespace.
|
|||
|
|
|||
|
## Version 0.5.0 (2017-05-15)
|
|||
|
|
|||
|
Version 0.5.0 has *breaking API changes*. However, this only affects
|
|||
|
code using the hyphenation feature. The feature is now optional, so
|
|||
|
you will first need to enable the `hyphenation` feature as described
|
|||
|
above. Afterwards, please change your code from
|
|||
|
```rust
|
|||
|
wrapper.corpus = Some(&corpus);
|
|||
|
```
|
|||
|
to
|
|||
|
```rust
|
|||
|
wrapper.splitter = Box::new(corpus);
|
|||
|
```
|
|||
|
|
|||
|
Other changes include optimizations, so version 0.5.0 is roughly
|
|||
|
10-15% faster than version 0.4.0.
|
|||
|
|
|||
|
* Fixed [#19][issue-19]: Add support for finding terminal size.
|
|||
|
* Fixed [#25][issue-25]: Handle words longer than `self.width`.
|
|||
|
* Fixed [#26][issue-26]: Support custom indentation.
|
|||
|
* Fixed [#36][issue-36]: Support building without `hyphenation`.
|
|||
|
* Fixed [#39][issue-39]: Respect non-breaking spaces.
|
|||
|
|
|||
|
## Version 0.4.0 (2017-01-24)
|
|||
|
|
|||
|
Documented complexities and tested these via `cargo bench`.
|
|||
|
|
|||
|
* Fixed [#13][issue-13]: Immediatedly add word if it fits.
|
|||
|
* Fixed [#14][issue-14]: Avoid splitting on initial hyphens.
|
|||
|
|
|||
|
## Version 0.3.0 (2017-01-07)
|
|||
|
|
|||
|
Added support for automatic hyphenation.
|
|||
|
|
|||
|
## Version 0.2.0 (2016-12-28)
|
|||
|
|
|||
|
Introduced `Wrapper` struct. Added support for wrapping on hyphens.
|
|||
|
|
|||
|
## Version 0.1.0 (2016-12-17)
|
|||
|
|
|||
|
First public release with support for wrapping strings on whitespace.
|
|||
|
|
|||
|
[rust-2018]: https://doc.rust-lang.org/edition-guide/rust-2018/
|
|||
|
[`textwrap-macros` crate]: https://crates.io/crates/textwrap-macros
|
|||
|
|
|||
|
[issue-13]: https://github.com/mgeisler/textwrap/issues/13
|
|||
|
[issue-14]: https://github.com/mgeisler/textwrap/issues/14
|
|||
|
[issue-19]: https://github.com/mgeisler/textwrap/issues/19
|
|||
|
[issue-25]: https://github.com/mgeisler/textwrap/issues/25
|
|||
|
[issue-26]: https://github.com/mgeisler/textwrap/issues/26
|
|||
|
[issue-28]: https://github.com/mgeisler/textwrap/issues/28
|
|||
|
[issue-36]: https://github.com/mgeisler/textwrap/issues/36
|
|||
|
[issue-39]: https://github.com/mgeisler/textwrap/issues/39
|
|||
|
[issue-58]: https://github.com/mgeisler/textwrap/issues/58
|
|||
|
[issue-59]: https://github.com/mgeisler/textwrap/issues/59
|
|||
|
[issue-61]: https://github.com/mgeisler/textwrap/issues/61
|
|||
|
[issue-81]: https://github.com/mgeisler/textwrap/issues/81
|
|||
|
[issue-99]: https://github.com/mgeisler/textwrap/issues/99
|
|||
|
[issue-101]: https://github.com/mgeisler/textwrap/issues/101
|
|||
|
[issue-107]: https://github.com/mgeisler/textwrap/issues/107
|
|||
|
[issue-122]: https://github.com/mgeisler/textwrap/issues/122
|
|||
|
[issue-129]: https://github.com/mgeisler/textwrap/issues/129
|
|||
|
[issue-140]: https://github.com/mgeisler/textwrap/issues/140
|
|||
|
[issue-141]: https://github.com/mgeisler/textwrap/issues/141
|
|||
|
[issue-151]: https://github.com/mgeisler/textwrap/issues/151
|
|||
|
[issue-158]: https://github.com/mgeisler/textwrap/issues/158
|
|||
|
[issue-176]: https://github.com/mgeisler/textwrap/issues/176
|
|||
|
[issue-177]: https://github.com/mgeisler/textwrap/issues/177
|
|||
|
[issue-193]: https://github.com/mgeisler/textwrap/issues/193
|