#+TITLE: bwrap
#+OPTIONS: num:nil
* About
Bwrap is a fast, lightweight, embedded environment-friendly library
for wrapping text. While Bwrap offers great flexibility in wrapping
text, neither resource consumption nor performance compromises:
1. No heap allocation happens by default.
2. The time/space complexity is /O(n)/ by default, or /O(n(p+a))/ if
there is appending/prepending. (/n/, /p/, /a/ is the number of
input bytes, prepended bytes, and appended bytes respectively)
For the sake of readability, we (*b*)etter *wrap* our text.
* Benchmark
Below are the performance comparisons among several text-wrapping
libraries in different dimensions:
*Time:*
*Memory:*
Note:
1. The benchmark is reproduciable, details about benchmark samples or
methods are elaborated in
[[https://github.com/micl2e2/bench-wrap-libs][bench-wrap-libs]].
2. The data above is obtained on an i5-3337u/8G machine
and is for reference only. It is possible to have a slightly
different result on a different machine or with different idle
system resource.
* Features
=use_std=: Use Rust standard library(libstd) for automatic memory
management.
* Examples(=use_std= feature)
** Multiple languages
Bwrap suuport multiple languages, it categorizes languages into two
categories: *space-sensitive* and *space-insensitive*. The former is
for the languages that depend on ASCII SPACE to delimit words, such as
English, Ukrainian, Greek and so on. The latter is for the languages
that are space-insensitive, such as Chinese, Japanese, Thai and so on.
*** English, Ukrainian, Greek, etc.
**** English
Original:
#+begin_src
one two three four five six seven eight nine ten one two three four five six seven eight nine ten one two three four five six seven eight nine ten
#+end_src
*Wrapped*:
#+begin_src
one two three four five six seven eight nine ten
one two three four five six seven eight nine ten
one two three four five six seven eight nine ten
#+end_src
Source code:
#+begin_src rust
let line = "one two three four five six seven eight nine ten one two three four five six seven eight nine ten one two three four five six seven eight nine ten";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap!(line, 50));
#+end_src
**** Ukrainian
Original:
#+begin_src
один два три чотири п'ять шість сім вісім дев'ять десять один два три чотири п'ять шість сім вісім дев'ять десять один два три чотири п'ять шість сім вісім дев'ять десять
#+end_src
*Wrapped*:
#+begin_src
один два три чотири п'ять шість сім вісім дев'ять десять
один два три чотири п'ять шість сім вісім дев'ять десять
один два три чотири п'ять шість сім вісім дев'ять десять
#+end_src
Source code:
#+begin_src rust
let line = "один два три чотири п'ять шість сім вісім дев'ять десять один два три чотири п'ять шість сім вісім дев'ять десять один два три чотири п'ять шість сім вісім дев'ять десять";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap!(line, 60));
#+end_src
**** Greek
Original:
#+begin_src
ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα
#+end_src
*Wrapped*:
#+begin_src
ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα
ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα
ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα
#+end_src
Source code:
#+begin_src rust
let line = "ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap!(line, 51));
#+end_src
*** Chinese, Japanese, Thai, etc.
**** Chinese
Original:
#+begin_src
一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十
#+end_src
*Wrapped*:
#+begin_src
一二三四五六七八九十
一二三四五六七八九十
一二三四五六七八九十
#+end_src
Source code:
#+begin_src rust
let line = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap_maybrk!(line, 20));
#+end_src
**** Japanese
Original:
#+begin_src
ありがとうございますありがとうございますありがとうございます
#+end_src
*Wrapped*:
#+begin_src
ありがとうございます
ありがとうございます
ありがとうございます
#+end_src
Source code:
#+begin_src rust
let line = "ありがとうございますありがとうございますありがとうございます";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap_maybrk!(line, 20));
#+end_src
**** Thai
Original:
#+begin_src
หนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบหนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบหนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบ
#+end_src
*Wrapped*:
#+begin_src
หนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบ
หนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบ
หนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบ
#+end_src
Source code:
#+begin_src rust
let line = "หนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบหนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบหนึ่งสองสามสี่ห้าหกเจ็ดแปดเก้าสิบ";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap_maybrk!(line, 25));
#+end_src
** Append/prepend
Bwrap can append or prepend whatever string to newly added newline
character. With this feature, one can effectively achieve indentation,
line trailing notation or similar.
*** Indentation
Original:
#+begin_src
Here is our schedule:
- Do A, and do B, and do C, and do D, and do E, and do F
- Do G, and do H, and do I, and do J, and do K, and do L
#+end_src
*Wrapped*:
#+begin_src
Here is our schedule:
- Do A, and do B, and do C, and do
D, and do E, and do F
- Do G, and do H, and do I, and do
J, and do K, and do L
#+end_src
Source code:
#+begin_src rust
let line = "Here is our schedule:\n- Do A, and do B, and do C, and do D, and do E, and do F\n- Do G, and do H, and do I, and do J, and do K, and do L";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap_nobrk!(line, 35, " "));
#+end_src
*** Trailing notation
Original:
#+begin_src
VGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlLCBwbGVhc2UgZGVsZXRlIGFmdGVyIHJlYWQK
#+end_src
*Wrapped*:
#+begin_src
VGhpcyBpcy |
BhIHNlY3Jl |
dCBtZXNzYW |
dlLCBwbGVh |
c2UgZGVsZX |
RlIGFmdGVy |
IHJlYWQK
#+end_src
Source code:
#+begin_src rust
let line = "VGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlLCBwbGVhc2UgZGVsZXRlIGFmdGVyIHJlYWQK";
println!("ORIGINAL:\n\n{}\n", line);
println!("WRAPPED:\n\n{}", bwrap::wrap_maybrk!(line, 10, " |"));
#+end_src
* License
Bwrap can be licensed under either [[https://github.com/micl2e2/bwrap/blob/master/LICENSE-MIT][MIT License]] or [[https://github.com/micl2e2/bwrap/blob/master/LICENSE-GPL][GNU General
Public License Version 3.0]]. The choice is up to the recipient.