# Changelog

This file lists the most important changes made in each release of
`textwrap`.

## Version 0.16.1 (2024-02-17)

This release fixes `display_width` to ignore inline-hyperlinks. The minimum
supported version of Rust is now documented to be 1.56.

* [#526](https://github.com/mgeisler/textwrap/pull/526): Ignore ANSI hyperlinks
  in `display_width`: calculations.
* [#521](https://github.com/mgeisler/textwrap/pull/521): Add `Options::width`
  setter method.
* [#520](https://github.com/mgeisler/textwrap/pull/520): Clarify that
  `WordSeparator` is an enum rather than a trait.
* [#518](https://github.com/mgeisler/textwrap/pull/518): Test with latest stable
  and nightly Rust, but check that we can build with Rust 1.56.

## Version 0.16.0 (2022-10-23)

This release marks `Options` as `non_exhaustive` and extends it to
make line endings configurable, it adds new fast paths to `fill` and
`wrap`, and it fixes crashes in `unfill` and `refill`.

* [#480](https://github.com/mgeisler/textwrap/pull/480): Mark
  `Options` as `non_exhaustive`. This will allow us to extend the
  struct in the future without breaking backwards compatibility.
* [#478](https://github.com/mgeisler/textwrap/pull/478): Add fast
  paths to `fill` and `wrap`. This makes the functions 10-25 times
  faster when the no wrapping is needed.
* [#468](https://github.com/mgeisler/textwrap/pull/468): Fix `refill`
  to add back correct line ending.
* [#467](https://github.com/mgeisler/textwrap/pull/467): Fix crashes
  in `unfill` and `refill`.
* [#458](https://github.com/mgeisler/textwrap/pull/458): Test with
  Rust 1.56 (first compiler release with support for Rust 2021).
* [#454](https://github.com/mgeisler/textwrap/pull/454): Make line
  endings configurable.
* [#448](https://github.com/mgeisler/textwrap/pull/448): Migrate to
  the Rust 2021 edition.

## 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.1 (2022-09-15)

This release was yanked since it accidentally broke backwards
compatibility with 0.15.0.

## 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 lengths 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 inference 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` struct 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
