#+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.