aboutsummaryrefslogtreecommitdiff
path: root/filters
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-01-17 14:33:09 +0100
committerRobin Jarry <robin@jarry.cc>2023-01-26 00:20:45 +0100
commit3191ee171c435a43912264b131340af66fea8112 (patch)
tree2a68c5c4a3b9975d102cb379171548e7a8937da5 /filters
parenta8b6693f7e7bdcc8b73c3fa0baa0ef5f51993dc7 (diff)
downloadaerc-3191ee171c435a43912264b131340af66fea8112.tar.gz
aerc-3191ee171c435a43912264b131340af66fea8112.zip
filters: rewrite wrap in c
This utility introduced in commit c9524d265793 ("filters: add wrap utility written in go") allows to reflow text to view emails that have very long lines without breaking quotes, lists and indentation. For such a simple task, go produces a binary that is 2.0M bytes on disk. After stripping debugging symbols, it can be reduced to 1.2M bytes. All of this for 267 lines of source code. This is a bit ridiculous, provided people may load this binary into memory multiple times per minute. This tool is a small side-project that seems not suitable for golang. Rewrite it in C. It now only depends on a POSIX libc to run. It is safe to assume that there is one available on all *NIX systems in the world of 2023. The resulting binary is now 27K bytes (15K after stripping). To build it, a C compiler and libc headers are required. These should most likely be available since they are dependencies of the go compiler toolchain. I have tested compilation (with clang-analyzer and gcc -fanalyzer) and basic operation on FreeBSD, Fedora (glibc) and Alpine (musl libc). More tests would probably be required on MacOSX and older Linux distros. I also added test vectors to give some confidence that this works as expected. Update CI with aggressive gcc hardening flags and to run these tests with valgrind --leak-check=full. Command line options are unchanged: usage: wrap [-h] [-w INT] [-r] [-l INT] [-f FILE] Wrap text without messing up email quotes. options: -h show this help message -w INT preferred wrap margin (default 80) -r reflow all paragraphs even if no trailing space -l INT minimum percentage of letters in a line to be considered a paragaph -f FILE read from filename (default stdin) Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com> Tested-by: Maxwell G <gotmax@e.email>
Diffstat (limited to 'filters')
-rwxr-xr-xfilters/test.sh24
l---------filters/vectors/wrap-asciiart.expected1
-rw-r--r--filters/vectors/wrap-asciiart.in31
-rw-r--r--filters/vectors/wrap-flowed.expected94
-rw-r--r--filters/vectors/wrap-flowed.in135
-rw-r--r--filters/vectors/wrap-lists.expected47
-rw-r--r--filters/vectors/wrap-lists.in27
-rw-r--r--filters/vectors/wrap-quotes.expected385
-rw-r--r--filters/vectors/wrap-quotes.in16
-rw-r--r--filters/vectors/wrap-simple.expected163
-rw-r--r--filters/vectors/wrap-simple.in7
-rw-r--r--filters/vectors/wrap-unicode.expected16
-rw-r--r--filters/vectors/wrap-unicode.in5
-rw-r--r--filters/wrap.c481
-rw-r--r--filters/wrap.go267
-rw-r--r--filters/wrap_test.go212
16 files changed, 1432 insertions, 479 deletions
diff --git a/filters/test.sh b/filters/test.sh
new file mode 100755
index 00000000..65a1d4d3
--- /dev/null
+++ b/filters/test.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+set -e
+
+here=$(dirname $0)
+fail=0
+
+for vec in $here/vectors/*.in; do
+ tool=$(basename $vec | sed 's/-.*//')
+ expected=${vec%%.in}.expected
+ tmp=$(mktemp)
+ if ! $FILTERS_TEST_PREFIX $here/../$tool -f $vec > $tmp; then
+ fail=1
+ fi
+ if diff -u "$expected" "$tmp"; then
+ echo "ok $tool < $vec > $tmp"
+ else
+ echo "error $tool < $vec > $tmp"
+ fail=1
+ fi
+ rm -f -- "$tmp"
+done
+
+exit $fail
diff --git a/filters/vectors/wrap-asciiart.expected b/filters/vectors/wrap-asciiart.expected
new file mode 120000
index 00000000..5ea3f40d
--- /dev/null
+++ b/filters/vectors/wrap-asciiart.expected
@@ -0,0 +1 @@
+wrap-asciiart.in \ No newline at end of file
diff --git a/filters/vectors/wrap-asciiart.in b/filters/vectors/wrap-asciiart.in
new file mode 100644
index 00000000..9c6c9d74
--- /dev/null
+++ b/filters/vectors/wrap-asciiart.in
@@ -0,0 +1,31 @@
+# A guide to understanding flow charts (presented in flow chart form)
+
+ +-----+
+ |START|
+ +-----+
+ |
+ ________v________
+ / \ +-----+
+ / DO YOU UNDERSTAND \--------------------------------------------->|GOOD!|----------+
+ \ FLOW CHARTS? /yes +-----+ v
+ \_________________/ ^ +--------------+ 6 drinks +-------------------+
+ |no | |LET'S GO DRINK|------------->|HEY, I SHOULD TRY |
+ _________v_________ ______________________ | +--------------+ |INSTALLING FREEBSD!|
+ / \ / \ | ^ +-------------------+
+/ OKAY, YOU SEE THE \------------------>/ ... AND YOU CAN SEE \---+ |
+\ LINE LABELED "YES"? /yes \ THE ONES LABELED "NO"? /yes +--------+
+ \___________________/ \______________________/ |SCREW IT|
+ |no |no +--------+
+ | | ^
+ ________v_________ _________v__________ |
+ / \ +-----------+ / \ +------------+
+ / BUT YOU SEE THE \-->|WAIT, WHAT?| / BUT YOU JUST \------------|(THAT WASN'T|
+ \ ONES LABELED "NO"? /yes+-----------+ \ FOLLOWED THEM TWICE! /yes |A QUESTION) |
+ \__________________/ \____________________/ +------------+
+ |no |no ^
+ v | |
+ +-------+ +----------+ | |
+ |LISTEN.|--------->|I HATE YOU| +------------------------------+
+ +-------+ +----------+
+
+Source: https://xkcd.com/518/
diff --git a/filters/vectors/wrap-flowed.expected b/filters/vectors/wrap-flowed.expected
new file mode 100644
index 00000000..358b8109
--- /dev/null
+++ b/filters/vectors/wrap-flowed.expected
@@ -0,0 +1,94 @@
+Lorem ipsum dolor sit amet, vel id velit nonumy percipit, sed mutat partiendo
+imperdiet ad, ad tritani deleniti duo? Vis id dicit inermis accumsan, ut
+pertinax deterruisset his, at his quis appareat urbanitas. Pro falli invidunt
+detraxit ex, vim cu graeci oblique contentiones, ea tale etiam aliquip eos. No
+cum assum impetus verterem, tota feugait corpora ut vis. Sint harum eam cu,
+magna doming quidam te est? Usu magna nihil antiopam et, eu latine ponderum
+evertitur eos? At lucilius aliquando intellegebat mea, vis eros pertinax
+similique ut. An mei deleniti
+
+forensibus. Iusto feugait maiestatis at nec, an est causae quaestio. Est ut
+amet veritus, sea in tempor noluisse salutandi. Vis an omnis propriae, vix et
+graece virtute, an integre sententiae his. Molestie tacimates id per, ex eum
+etiam cetero? His cu altera constituam, eos ea inani dicant nonumy. Iudico
+bonorum dissentiet eu quo. Usu ne purto essent qualisque, has alii soluta
+adipisci ad, et fugit aeque omnesque mel. Fastidii facilisi inciderint usu cu,
+ne iusto deterruisset his. Diceret expetendis reprimique id est, cu sit diam
+tation accumsan, no per modus malorum. Pri scripta insolens sapientem an,
+omnesque assueverit sea ea, eam paulo nemore argumentum te. Nam id atqui
+incorrupte, cu eos quodsi ceteros.
+
+Vim ad sonet sadipscing, paulo epicuri mea ne. Mel an meliore denique omittam,
+vidit insolens splendide no pri. Novum cetero quo ea, te his odio aperiri
+hendrerit, at sonet mediocrem eam. Ea eam autem oporteat, est ut mucius
+vituperatoribus. Soleat evertitur pri an? Cu vidit labore menandri nam, sit ex
+paulo apeirian euripidis. Eos elit nominavi fabellas cu, has ne laoreet
+torquatos! Accusam adolescens duo ut, legere periculis in qui, nibh euismod
+epicurei vim id. Posse consul philosophia vis cu, ea brute delectus eum!
+Debitis conclusionemque sed te, eam graeco equidem commune at. Eu duo laudem
+animal, fugit scripserit ne eos. Ius delicata referrentur at? Vim id vidit
+feugiat comprehensam? At error expetendis vel, vim habeo perfecto complectitur
+ex. Ex vim possit persecuti! Unum referrentur instructior cu eum, alia legendos
+incorrupte cu per, quo elitr veritus nominavi eu!
+
+> > Mei malis choro dolores ne, eu erat vocibus denique has? Sed ea ullum
+> > deleniti, nam tritani aliquando complectitur ea! Mea no facer tempor
+> > alienum, fugit laoreet gloriatur eos cu. Ne mollis ceteros eum, eos an
+> > quodsi corpora. Modo ferri porro eu vis, putent dictas eloquentiam eos id.
+> > Ei eum odio possim definiebas, eum noster doctus ea. Exerci nemore
+> > gloriatur et vim! In torquatos sadipscing ius, ius ut debet dicant
+> > senserit. Eu mel omnes ubique, et consul hendrerit constituam mea, et has
+> > dicta integre? Cu eam suas libris? Nisl autem facilis duo ea, meis latine
+> > intellegam quo an. Zril nonumes officiis te sed, pri harum luptatum
+> > disputationi ex. Ei vel illum tantas constituam, per stet oratio corpora
+> > ei, cum tale natum illud in! Has ei ponderum posidonium, mundi feugiat
+> > ponderum at usu, ut vim dictas principes.
+> >
+>
+> Tantas fuisset adversarium eos ei, quas dolorum albucius sea ne. Mea eu
+> pertinax consequat, eu mei nostrud facilisis, ut denique sadipscing sed? Eu
+> fugit elitr pericula per, nemore disputando his et. Ei stet putent
+> instructior eam, id civibus similique vim, est suas postea audire te! Error
+> cetero et sed. Eu quis animal pertinax mei, an nec omittam hendrerit? Ut
+> melius utroque laboramus qui?
+
+Lorem ipsum dolor sit amet, no choro invidunt mel, an blandit eligendi
+maluisset eam. Ne eam splendide omittantur. Eu vix ferri appareat sententiae,
+eum falli menandri ne. Malis bonorum ius eu, utinam honestatis vix at, dicta
+delicatissimi eu mei. Ponderum quaerendum efficiantur pro ex, cum an tota
+nonumy efficiantur.
+
+- Ea insolens quaerendum mea. An pro viris quidam liberavisse, lorem facer
+ erroribus ad mel. At sea graece concludaturque, duo in impedit accumsan
+ consequat. Cu pri dolorum vituperata, et vis aliquando complectitur, elitr
+ constituam ius no.
+
+- No detraxit ocurreret sed. Mundi omnes solet qui no, nam ex viderer
+ constituto. Et quo scripta aliquam gloriatur. At audiam dolorem ius, malis
+ omnes sensibus sit ut, eum quod euripidis ad. At nec verear senserit,
+ diceret honestatis et vel, quis conceptam et nec. Eam probo option ea.
+
+- Ius summo dolore te, in quo choro tritani atomorum? Esse putant nec te?
+ Consul iuvaret debitis vix ei. Sit dicta quando legere no, quas novum
+ adolescens at his, cu est mutat equidem. Ea mea tation bonorum, mel
+ complectitur deterruisset id. Vim ut dicunt tamquam, et his illud invenire.
+
+- Mei at quas ceteros tibique? Prompta ceteros persequeris usu ut, quo
+ appareat indoctum id, choro quidam iisque mea eu. Ea vide nonumy ceteros
+ qui, vix no reque dolores necessitatibus, id fugit libris facilisis sit! Ne
+ ocurreret honestatis nam. Ex reque maluisset per, eam facer ludus dicam ad.
+ Eam modus impedit intellegat ei! Per no libris utamur nostrum, cu sed mollis
+ accusamus.
+
+- Nam at nibh meis singulis, augue aliquando liberavisse eos ea. Audire
+ facilis perpetua mel ea. Vel te oportere indoctum volutpat, omittam eligendi
+ patrioque per an. Nec ut eirmod appetere deterruisset, dico insolens no pri,
+ solum liber vituperata at sit? Sea id ipsum fugit viris.
+
+
+
+- Sea bonorum instructior consectetuer in. Eum ex impedit volutpat. Pro an
+ stet definiebas necessitatibus. Aperiam facilis his et! Ei vim labitur
+ petentium, illum contentiones duo in? Id sed sale scriptorem. Sed et tollit
+ albucius?
+
diff --git a/filters/vectors/wrap-flowed.in b/filters/vectors/wrap-flowed.in
new file mode 100644
index 00000000..8c4d78af
--- /dev/null
+++ b/filters/vectors/wrap-flowed.in
@@ -0,0 +1,135 @@
+Lorem ipsum dolor sit amet, vel id velit nonumy
+percipit, sed mutat partiendo imperdiet ad, ad
+tritani deleniti duo? Vis id dicit inermis
+accumsan, ut pertinax deterruisset his, at his
+quis appareat urbanitas. Pro falli invidunt
+detraxit ex, vim cu graeci oblique contentiones,
+ea tale etiam aliquip eos. No cum assum impetus
+verterem, tota feugait corpora ut vis. Sint harum
+eam cu, magna doming quidam te est? Usu magna
+nihil antiopam et, eu latine ponderum evertitur
+eos? At lucilius aliquando intellegebat mea, vis
+eros pertinax similique ut. An mei deleniti
+
+forensibus. Iusto feugait maiestatis at nec, an
+est causae quaestio. Est ut amet veritus, sea in
+tempor noluisse salutandi. Vis an omnis propriae,
+vix et graece virtute, an integre sententiae his.
+Molestie tacimates id per, ex eum etiam cetero?
+His cu altera constituam, eos ea inani dicant
+nonumy. Iudico bonorum dissentiet eu quo. Usu ne
+purto essent qualisque, has alii soluta adipisci
+ad, et fugit aeque omnesque mel. Fastidii facilisi
+inciderint usu cu, ne iusto deterruisset his.
+Diceret expetendis reprimique id est, cu sit diam
+tation accumsan, no per modus malorum. Pri scripta
+insolens sapientem an, omnesque assueverit sea ea,
+eam paulo nemore argumentum te. Nam id atqui
+incorrupte, cu eos quodsi ceteros.
+
+Vim ad sonet sadipscing, paulo epicuri mea ne. Mel
+an meliore denique omittam, vidit insolens
+splendide no pri. Novum cetero quo ea, te his odio
+aperiri hendrerit, at sonet mediocrem eam. Ea eam
+autem oporteat, est ut mucius vituperatoribus.
+Soleat evertitur pri an? Cu vidit labore menandri
+nam, sit ex paulo apeirian euripidis. Eos elit
+nominavi fabellas cu, has ne laoreet torquatos!
+Accusam adolescens duo ut, legere periculis in
+qui, nibh euismod epicurei vim id. Posse consul
+philosophia vis cu, ea brute delectus eum! Debitis
+conclusionemque sed te, eam graeco equidem commune
+at. Eu duo laudem animal, fugit scripserit ne eos.
+Ius delicata referrentur at? Vim id vidit feugiat
+comprehensam? At error expetendis vel, vim habeo
+perfecto complectitur ex. Ex vim possit persecuti!
+Unum referrentur instructior cu eum, alia legendos
+incorrupte cu per, quo elitr veritus nominavi eu!
+
+> > Mei malis choro dolores ne, eu erat vocibus
+> > denique has? Sed ea ullum deleniti, nam tritani
+> > aliquando complectitur ea! Mea no facer tempor
+> > alienum, fugit laoreet gloriatur eos cu. Ne mollis
+> > ceteros eum, eos an quodsi corpora. Modo ferri
+> > porro eu vis, putent dictas eloquentiam eos id. Ei
+> > eum odio possim definiebas, eum noster doctus ea.
+> > Exerci nemore gloriatur et vim! In torquatos
+> > sadipscing ius, ius ut debet dicant senserit. Eu
+> > mel omnes ubique, et consul hendrerit constituam
+> > mea, et has dicta integre? Cu eam suas libris?
+> > Nisl autem facilis duo ea, meis latine intellegam
+> > quo an. Zril nonumes officiis te sed, pri harum
+> > luptatum disputationi ex. Ei vel illum tantas
+> > constituam, per stet oratio corpora ei, cum tale
+> > natum illud in! Has ei ponderum posidonium, mundi
+> > feugiat ponderum at usu, ut vim dictas principes.
+> >
+>
+> Tantas fuisset adversarium eos ei, quas dolorum
+> albucius sea ne. Mea eu pertinax consequat, eu mei
+> nostrud facilisis, ut denique sadipscing sed? Eu
+> fugit elitr pericula per, nemore disputando his
+> et. Ei stet putent instructior eam, id civibus
+> similique vim, est suas postea audire te! Error
+> cetero et sed. Eu quis animal pertinax mei, an nec
+> omittam hendrerit? Ut melius utroque laboramus
+> qui?
+
+Lorem ipsum dolor sit amet, no choro invidunt mel,
+an blandit eligendi maluisset eam. Ne eam
+splendide omittantur. Eu vix ferri appareat
+sententiae, eum falli menandri ne. Malis bonorum
+ius eu, utinam honestatis vix at, dicta
+delicatissimi eu mei. Ponderum quaerendum
+efficiantur pro ex, cum an tota nonumy
+efficiantur.
+
+- Ea insolens quaerendum mea. An pro viris quidam
+ liberavisse, lorem facer erroribus ad mel. At
+ sea graece concludaturque, duo in impedit
+ accumsan consequat. Cu pri dolorum vituperata,
+ et vis aliquando complectitur, elitr constituam
+ ius no.
+
+- No detraxit ocurreret sed. Mundi omnes solet
+ qui no, nam ex viderer constituto. Et quo
+ scripta aliquam gloriatur. At audiam dolorem
+ ius, malis omnes sensibus sit ut, eum quod
+ euripidis ad. At nec verear senserit, diceret
+ honestatis et vel, quis conceptam et nec. Eam
+ probo option ea.
+
+- Ius summo dolore te, in quo choro tritani
+ atomorum? Esse putant nec te? Consul iuvaret
+ debitis vix ei. Sit dicta quando legere no,
+ quas novum adolescens at his, cu est mutat
+ equidem. Ea mea tation bonorum, mel
+ complectitur deterruisset id. Vim ut dicunt
+ tamquam, et his illud invenire.
+
+- Mei at quas ceteros tibique? Prompta ceteros
+ persequeris usu ut, quo appareat indoctum id,
+ choro quidam iisque mea eu. Ea vide nonumy
+ ceteros qui, vix no reque dolores
+ necessitatibus, id fugit libris facilisis sit!
+ Ne ocurreret honestatis nam. Ex reque maluisset
+ per, eam facer ludus dicam ad. Eam modus
+ impedit intellegat ei! Per no libris utamur
+ nostrum, cu sed mollis accusamus.
+
+- Nam at nibh meis singulis, augue aliquando
+ liberavisse eos ea. Audire facilis perpetua mel
+ ea. Vel te oportere indoctum volutpat, omittam
+ eligendi patrioque per an. Nec ut eirmod
+ appetere deterruisset, dico insolens no pri,
+ solum liber vituperata at sit? Sea id ipsum
+ fugit viris.
+
+
+
+- Sea bonorum instructior consectetuer in. Eum ex
+ impedit volutpat. Pro an stet definiebas
+ necessitatibus. Aperiam facilis his et! Ei vim
+ labitur petentium, illum contentiones duo in?
+ Id sed sale scriptorem. Sed et tollit albucius?
+
diff --git a/filters/vectors/wrap-lists.expected b/filters/vectors/wrap-lists.expected
new file mode 100644
index 00000000..50f34aeb
--- /dev/null
+++ b/filters/vectors/wrap-lists.expected
@@ -0,0 +1,47 @@
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
+ facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
+ fames ac ante ipsum primis in faucibus.
+
+ * Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus
+ orci luctus et ultrices posuere cubilia curae;
+
+ * Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada
+ nisi. Aliquam blandit non ipsum quis dignissim.
+
+- Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec
+ nisl dolor. Vestibulum lacinia dolor diam.
+
+a) Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor
+ ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id
+ dolor eu arcu tempus fermentum in quis lectus.
+b) Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum.
+ Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+c) Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla
+ risus, eget gravida lectus. Aenean vitae vulputate turpis.
+
+1. Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Etiam
+ mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+
+2. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+ Etiam venenatis id est et ornare.
+
+i. Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in
+ faucibus orci luctus et ultrices posuere cubilia curae;
+
+ii. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus
+ arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum
+ et malesuada fames ac ante ipsum primis in faucibus.
+
+iii. Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus
+ nec nisl dolor. Vestibulum lacinia dolor diam.
+
+IV. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
+ dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+
+V. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor
+ ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id
+ dolor eu arcu tempus fermentum in quis lectus.
+
+VI. Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed
+ fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
diff --git a/filters/vectors/wrap-lists.in b/filters/vectors/wrap-lists.in
new file mode 100644
index 00000000..38a15c3b
--- /dev/null
+++ b/filters/vectors/wrap-lists.in
@@ -0,0 +1,27 @@
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+ * Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
+
+ * Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada nisi. Aliquam blandit non ipsum quis dignissim.
+
+- Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor. Vestibulum lacinia dolor diam.
+
+a) Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus.
+b) Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+c) Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
+
+1. Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+
+2. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
+
+i. Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
+
+ii. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+iii. Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor. Vestibulum lacinia dolor diam.
+
+IV. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+
+V. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus.
+
+VI. Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
diff --git a/filters/vectors/wrap-quotes.expected b/filters/vectors/wrap-quotes.expected
new file mode 100644
index 00000000..d76c7918
--- /dev/null
+++ b/filters/vectors/wrap-quotes.expected
@@ -0,0 +1,385 @@
+Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci
+luctus et ultrices posuere cubilia curae; Vestibulum dui tortor, fermentum
+vitae elit nec, vulputate malesuada nisi.
+
+> > Aliquam blandit non ipsum quis dignissim. Vivamus rhoncus augue magna, a
+> > maximus augue ultrices imperdiet. Vivamus nec nisl dolor.
+> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
+> facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
+> fames ac ante ipsum primis in faucibus.
+
+Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In laoreet sodales
+velit, vitae porttitor ligula varius et. Donec non nibh mi.
+
+>>> Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis
+>> lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
+>> dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+> Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Donec sed
+> enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget
+> gravida lectus. Aenean vitae vulputate turpis.
+
+Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices
+porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id
+est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis
+metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis
+sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam ve
+nenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus
+lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non
+mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare.
+
+>> - Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+>> Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
+>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
+>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
+>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Eti
+am venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
+augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
+fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
+condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
+mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
+ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
+urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
+ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
+Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
+ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
+venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
+maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
+non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
+consectetur. Etiam venenatis id est et ornare.
+
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tavu
diff --git a/filters/vectors/wrap-quotes.in b/filters/vectors/wrap-quotes.in
new file mode 100644
index 00000000..83189298
--- /dev/null
+++ b/filters/vectors/wrap-quotes.in
@@ -0,0 +1,16 @@
+Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada nisi.
+
+> > Aliquam blandit non ipsum quis dignissim. Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor.
+> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi.
+
+>>> Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
+>> Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+> Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
+
+Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
+
+>> - Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
+
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tavu
diff --git a/filters/vectors/wrap-simple.expected b/filters/vectors/wrap-simple.expected
new file mode 100644
index 00000000..af68ad50
--- /dev/null
+++ b/filters/vectors/wrap-simple.expected
@@ -0,0 +1,163 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
+facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
+fames ac ante ipsum primis in faucibus. Pellentesque vitae maximus odio.
+Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
+cubilia curae; Vestibulum dui tortor, fermentum vitae elit nec, vulputate
+malesuada nisi. Aliquam blandit non ipsum quis dignissim.
+
+ Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec
+ nisl dolor. Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In
+ laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi.
+ Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis
+ lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
+ dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+
+Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla
+risus, eget gravida lectus. Aenean vitae vulputate turpis. Nullam maximus
+ligula eget leo porttitor, sed viverra urna aliquam. Etiam mi mauris, lacinia
+iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem
+feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna.
+Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
+
+Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute
+deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo
+vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex.
+Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit
+intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit
+comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea
+ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque
+propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit
+temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo,
+pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset
+per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda
+intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit
+ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At
+est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro.
+Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus
+electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae.
+Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id
+vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo
+convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum
+vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his
+veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id
+tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc
+appetere postulant id, sit eu sint integre discere, pri alienum officiis te!
+Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te
+ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret
+eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque
+abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu
+ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea
+ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam
+repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper
+eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem
+minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis
+posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in
+fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis
+invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus.
+Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His
+putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis
+maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait
+splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat
+liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei
+recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu.
+Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus
+neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius
+quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant
+labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his.
+Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum
+reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit
+adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case
+aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis,
+cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne
+oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam
+quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem
+vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea
+vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming
+malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius?
+Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex
+petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex.
+Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat
+in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal
+imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem
+pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum.
+Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque
+disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit
+inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi
+pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer,
+enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis,
+mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer
+nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh
+maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum?
+Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei!
+Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at.
+Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute
+deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo
+vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex.
+Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit
+intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit
+comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea
+ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque
+propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit
+temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo,
+pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset
+per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda
+intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit
+ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At
+est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro.
+Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus
+electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae.
+Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id
+vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo
+convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum
+vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his
+veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id
+tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc
+appetere postulant id, sit eu sint integre discere, pri alienum officiis te!
+Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te
+ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret
+eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque
+abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu
+ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea
+ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam
+repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper
+eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem
+minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis
+posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in
+fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis
+invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus.
+Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His
+putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis
+maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait
+splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat
+liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei
+recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu.
+Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus
+neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius
+quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant
+labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his.
+Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum
+reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit
+adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case
+aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis,
+cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne
+oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam
+quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem
+vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea
+vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming
+malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius?
+Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex
+petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex.
+Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat
+in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal
+imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem
+pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum.
+Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque
+disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit
+inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi
+pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer,
+enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis,
+mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer
+nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh
+maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum?
+Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei!
+Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at.
diff --git a/filters/vectors/wrap-simple.in b/filters/vectors/wrap-simple.in
new file mode 100644
index 00000000..454748ea
--- /dev/null
+++ b/filters/vectors/wrap-simple.in
@@ -0,0 +1,7 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada nisi. Aliquam blandit non ipsum quis dignissim.
+
+ Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor. Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
+
+Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis. Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
+
+Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex. Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo, pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro. Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae. Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc appetere postulant id, sit eu sint integre discere, pri alienum officiis te! Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus. Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu. Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his. Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis, cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius? Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex. Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum. Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer, enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis, mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum? Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei! Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at. Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex. Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo, pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro. Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae. Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc appetere postulant id, sit eu sint integre discere, pri alienum officiis te! Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus. Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu. Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his. Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis, cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius? Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex. Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum. Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer, enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis, mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum? Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei! Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at.
diff --git a/filters/vectors/wrap-unicode.expected b/filters/vectors/wrap-unicode.expected
new file mode 100644
index 00000000..cff4e86c
--- /dev/null
+++ b/filters/vectors/wrap-unicode.expected
@@ -0,0 +1,16 @@
+Λορεμ ιπσθμ δολορ σιτ αμετ, ρεβθμ φαλλι γραεcισ θτ θσθ, θσθ ομνισ μοδθσ
+ατομορθμ ει, δθο εραντ πραεσεντ νο. Εξ εθμ μολεστιαε ιντελλεγαμ, σεα λαβιτθρ
+αλιενθμ τε. Θσθ αν τεμπορ φορενσιβθσ, σιτ διcτα διcερετ ποσιδονιθμ ατ. Σενσεριτ
+δισσεντιθντ ει μελ, φεθγιατ πλαcερατ περ cθ. Εα σιτ μοδθσ νονθμυ μελιορε,
+ιντεγρε θλλαμcορπερ νε cθμ. Εα νεc σαεπε μανδαμθσ, qθισ vολθπτθα cονσθλατθ νο
+vελ. Ηισ cθ νεμορε ποσσιμ.
+
+Αν προ φαcερ αργθμεντθμ, ατ μαλορθμ ιμπερδιετ ιντελλεγαμ θσθ, αδ πρι λθcιλιθσ
+σcριπσεριτ. Θσθ ιν σολθμ διcατ δεμοcριτθμ, σιμθλ σcριπσεριτ εθ μει, vιξ εξ
+ειρμοδ αccθσατα. Qθι ιμπεδιτ cοπιοσαε ιμπερδιετ εα, αφφερτ ορνατθσ ηισ εθ,
+αεqθε τολλιτ cονσεcτετθερ νε προ! Ιπσθμ σεντεντιαε ετ προ, αθτεμ σθαvιτατε
+cονστιτθαμ εξ qθι? Ταντασ λεγερε qθι ιδ?
+
+Θσθ νισλ νιηιλ ηενδρεριτ τε! Ιπσθμ νθσqθαμ ιθσ εξ? Ηισ αν ιπσθμ λατινε
+δισσεντιθντ. Vιμ αλιqθιδ τεμποριβθσ vολθπτατιβθσ αδ, αδ πρι δομινγ απεριρι
+δισπθτατιονι. Vιμ σθμμο αφφερτ εα, νονθμυ ποσσιτ φαβθλασ ατ εστ.
diff --git a/filters/vectors/wrap-unicode.in b/filters/vectors/wrap-unicode.in
new file mode 100644
index 00000000..e085ec7e
--- /dev/null
+++ b/filters/vectors/wrap-unicode.in
@@ -0,0 +1,5 @@
+Λορεμ ιπσθμ δολορ σιτ αμετ, ρεβθμ φαλλι γραεcισ θτ θσθ, θσθ ομνισ μοδθσ ατομορθμ ει, δθο εραντ πραεσεντ νο. Εξ εθμ μολεστιαε ιντελλεγαμ, σεα λαβιτθρ αλιενθμ τε. Θσθ αν τεμπορ φορενσιβθσ, σιτ διcτα διcερετ ποσιδονιθμ ατ. Σενσεριτ δισσεντιθντ ει μελ, φεθγιατ πλαcερατ περ cθ. Εα σιτ μοδθσ νονθμυ μελιορε, ιντεγρε θλλαμcορπερ νε cθμ. Εα νεc σαεπε μανδαμθσ, qθισ vολθπτθα cονσθλατθ νο vελ. Ηισ cθ νεμορε ποσσιμ.
+
+Αν προ φαcερ αργθμεντθμ, ατ μαλορθμ ιμπερδιετ ιντελλεγαμ θσθ, αδ πρι λθcιλιθσ σcριπσεριτ. Θσθ ιν σολθμ διcατ δεμοcριτθμ, σιμθλ σcριπσεριτ εθ μει, vιξ εξ ειρμοδ αccθσατα. Qθι ιμπεδιτ cοπιοσαε ιμπερδιετ εα, αφφερτ ορνατθσ ηισ εθ, αεqθε τολλιτ cονσεcτετθερ νε προ! Ιπσθμ σεντεντιαε ετ προ, αθτεμ σθαvιτατε cονστιτθαμ εξ qθι? Ταντασ λεγερε qθι ιδ?
+
+Θσθ νισλ νιηιλ ηενδρεριτ τε! Ιπσθμ νθσqθαμ ιθσ εξ? Ηισ αν ιπσθμ λατινε δισσεντιθντ. Vιμ αλιqθιδ τεμποριβθσ vολθπτατιβθσ αδ, αδ πρι δομινγ απεριρι δισπθτατιονι. Vιμ σθμμο αφφερτ εα, νονθμυ ποσσιτ φαβθλασ ατ εστ.
diff --git a/filters/wrap.c b/filters/wrap.c
new file mode 100644
index 00000000..ba084c35
--- /dev/null
+++ b/filters/wrap.c
@@ -0,0 +1,481 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright (c) 2023 Robin Jarry */
+
+#define _XOPEN_SOURCE
+#include <errno.h>
+#include <getopt.h>
+#include <locale.h>
+#include <regex.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+static void usage(void)
+{
+ puts("usage: wrap [-h] [-w INT] [-r] [-l INT] [-f FILE]");
+ puts("");
+ puts("Wrap text without messing up email quotes.");
+ puts("");
+ puts("options:");
+ puts(" -h show this help message");
+ puts(" -w INT preferred wrap margin (default 80)");
+ puts(" -r reflow all paragraphs even if no trailing space");
+ puts(" -l INT minimum percentage of letters in a line to be");
+ puts(" considered a paragaph");
+ puts(" -f FILE read from filename (default stdin)");
+}
+
+static size_t margin = 80;
+static long prose_ratio = 50;
+static bool reflow;
+static FILE *in_file;
+
+int parse_args(int argc, char **argv)
+{
+ const char *filename = NULL;
+ char c;
+
+ while ((c = getopt(argc, argv, "hrw:l:f:")) != -1) {
+ errno = 0;
+ switch (c) {
+ case 'r':
+ reflow = true;
+ break;
+ case 'l':
+ prose_ratio = strtol(optarg, NULL, 10);
+ if (errno) {
+ perror("error: invalid ratio value");
+ return 1;
+ }
+ if (prose_ratio <= 0 || prose_ratio >= 100) {
+ fprintf(stderr, "error: ratio must be ]0,100[\n");
+ return 1;
+ }
+ break;
+ case 'w':
+ margin = strtol(optarg, NULL, 10);
+ if (errno) {
+ perror("error: invalid width value");
+ return 1;
+ }
+ if (margin < 1) {
+ fprintf(stderr, "error: width must be positive\n");
+ return 1;
+ }
+ break;
+ case 'f':
+ filename = optarg;
+ break;
+ default:
+ usage();
+ return 1;
+ }
+ }
+ if (optind < argc) {
+ fprintf(stderr, "%s: unexpected argument -- '%s'\n",
+ argv[0], argv[optind]);
+ usage();
+ return 1;
+ }
+ if (filename == NULL || !strcmp(filename, "-")) {
+ in_file = stdin;
+ } else {
+ in_file = fopen(filename, "r");
+ if (!in_file) {
+ perror("error: cannot open file");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static bool is_empty(const wchar_t *s)
+{
+ while (*s != L'\0') {
+ if (!iswspace(*s++))
+ return false;
+ }
+ return true;
+}
+
+__attribute__((malloc,returns_nonnull))
+static void *xmalloc(size_t s)
+{
+ void *ptr = malloc(s);
+ if (ptr == NULL) {
+ perror("fatal: cannot allocate buffer");
+ abort();
+ }
+ return ptr;
+}
+
+__attribute__((malloc,returns_nonnull))
+static void *xrealloc(void *ptr, size_t s)
+{
+ ptr = realloc(ptr, s);
+ if (ptr == NULL) {
+ perror("fatal: cannot reallocate buffer");
+ abort();
+ }
+ return ptr;
+}
+
+struct paragraph {
+ /* email quote prefix, if any */
+ wchar_t *quotes;
+ /* list item indent, if any */
+ wchar_t *indent;
+ /* actual text of this paragraph */
+ wchar_t *text;
+ /* percentage of letters in text */
+ int prose_ratio;
+ /* text ends with a space */
+ bool flowed;
+ /* paragraph is a list item */
+ bool list_item;
+};
+
+static void free_paragraph(struct paragraph *p)
+{
+ if (!p)
+ return;
+ free(p->quotes);
+ free(p->indent);
+ free(p->text);
+ free(p);
+}
+
+static wchar_t *read_part(const wchar_t *in, size_t len)
+{
+ wchar_t *out = xmalloc((len + 1) * sizeof(wchar_t));
+ wcsncpy(out, in, len);
+ out[len] = L'\0';
+ return out;
+}
+
+static size_t list_item_offset(const wchar_t *buf)
+{
+ size_t i = 0;
+ wchar_t c;
+
+ if (buf[i] == L'-' || buf[i] == '*' || buf[i] == '.') {
+ /* bullet list */
+ i++;
+ } else if (iswdigit(buf[i])) {
+ /* numbered list */
+ i++;
+ if (iswdigit(buf[i])) {
+ i++;
+ }
+ } else if (iswalpha(buf[i])) {
+ /* lettered list */
+ c = towlower(buf[i]);
+ i++;
+ if (c == L'i' || c == L'v') {
+ /* roman i. ii. iii. iv. ... */
+ c = towlower(buf[i]);
+ while (i < 4 && (c == L'i' || c == L'v')) {
+ c = towlower(buf[++i]);
+ }
+ }
+ } else {
+ return 0;
+ }
+ if (iswdigit(buf[0]) || iswalpha(buf[0])) {
+ if (buf[i] == L')' || buf[i] == L'/' || buf[i] == L'.') {
+ i++;
+ } else {
+ return 0;
+ }
+ }
+ if (buf[i] == L' ') {
+ i++;
+ } else {
+ return 0;
+ }
+
+ return i;
+}
+
+static struct paragraph *parse_line(const wchar_t *buf)
+{
+ size_t i, q, t, e, letters, indent_len, text_len;
+ bool list_item, flowed;
+ struct paragraph *p;
+
+ /*
+ * Find relevant positions in the line:
+ *
+ * '> > > > 2) blah blah blah blah '
+ * ^ ^ ^ ^
+ * 0 q t e
+ * <------><------------->
+ * quotes indent
+ * <-------------------------------->
+ * text
+ */
+
+ /* detect the end of quotes prefix if any */
+ q = 0;
+ while (buf[q] == L'>') {
+ q++;
+ if (buf[q] == L' ') {
+ q++;
+ }
+ }
+ /* detect list item prefix & indent */
+ t = q;
+ while (iswspace(buf[t])) {
+ t++;
+ }
+ i = list_item_offset(&buf[t]);
+ list_item = i != 0;
+ t += i;
+ while (iswspace(buf[t])) {
+ t++;
+ }
+ indent_len = t - q;
+ /* compute prose ratio */
+ e = t;
+ letters = 0;
+ while (buf[e] != L'\0') {
+ if (iswalpha(buf[e++])) {
+ letters++;
+ }
+ }
+ /* strip trailing whitespace */
+ flowed = false;
+ while (e > q && iswspace(buf[e - 1])) {
+ e--;
+ flowed = true;
+ }
+ text_len = e - q;
+
+ p = xmalloc(sizeof(*p));
+ memset(p, 0, sizeof(*p));
+ p->quotes = read_part(buf, q);
+ p->indent = xmalloc((indent_len + 1) * sizeof(wchar_t));
+ for (i = 0; i < indent_len; i++)
+ p->indent[i] = L' ';
+ p->indent[i] = L'\0';
+ p->text = read_part(&buf[q], text_len);
+ p->flowed = flowed;
+ p->list_item = list_item;
+ p->prose_ratio = 100 * letters / (text_len ? text_len : 1);
+
+ return p;
+}
+
+static bool is_continuation(
+ const struct paragraph *p, const struct paragraph *next
+) {
+ if (next->list_item)
+ /* new list items always start a new paragraph */
+ return false;
+ if (next->prose_ratio < prose_ratio || p->prose_ratio < prose_ratio)
+ /* does not look like prose, maybe ascii art */
+ return false;
+ if (wcscmp(next->quotes, p->quotes) != 0)
+ /* quote prefix has changed */
+ return false;
+ if (wcscmp(next->indent, p->indent) != 0)
+ /* list item indent has changed */
+ return false;
+ if (is_empty(next->text))
+ /* empty or whitespace only line */
+ return false;
+ if (wcscmp(p->text, L"--") == 0)
+ /* never join anything with signature start */
+ return false;
+ if (p->flowed)
+ /* current paragraph has trailing space, indicating
+ * format=flowed */
+ return true;
+ if (reflow)
+ /* user forced paragraph reflow on the command line */
+ return true;
+ return false;
+}
+
+static void join_paragraph(
+ struct paragraph *p, const struct paragraph *next
+) {
+ const wchar_t *append = next->text;
+ const wchar_t *separator = L" ";
+ size_t len, extra_len;
+ wchar_t *text;
+
+ /* trim leading whitespace of the next paragraph before joining */
+ while (*append != L'\0' && iswspace(*append))
+ append++;
+
+ len = wcslen(p->text);
+ if (len == 0) {
+ separator = L"";
+ }
+ extra_len = wcslen(separator) + wcslen(append) + 1;
+
+ text = xrealloc(p->text, (len + extra_len) * sizeof(wchar_t));
+ swprintf(&text[len], extra_len, L"%ls%ls", separator, append);
+
+ p->text = text;
+ p->prose_ratio = (p->prose_ratio + next->prose_ratio) / 2;
+ p->flowed = next->flowed;
+}
+
+/*
+ * BUFSIZ has different values depending on the libc implementation.
+ * Use a self defined value to have consistent behaviour accross all platforms.
+ */
+#define BUFFER_SIZE 8192
+
+/*
+ * Write a paragraph, wrapping at words boundaries.
+ *
+ * Only try to do word wrapping on things that look like prose. When the text
+ * contains too many non-letter characters, print it as-is.
+ */
+static void write_paragraph(struct paragraph *p)
+{
+ size_t quotes_width = wcswidth(p->quotes, wcslen(p->quotes));
+ size_t remain = wcswidth(p->text, wcslen(p->text));
+ const wchar_t *indent = L"";
+ wchar_t *text = p->text;
+ bool more = true;
+ wchar_t *line;
+ size_t width;
+
+ while (more) {
+ width = quotes_width + wcswidth(indent, wcslen(indent));
+
+ if (width + remain <= margin || p->prose_ratio < prose_ratio) {
+ /* whole paragraph fits on a single line */
+ line = text;
+ more = false;
+ } else {
+ /* find split point, preferably before margin */
+ int split = -1;
+ int w = 0;
+ for (int i = 0; text[i] != L'\0'; i++) {
+ w += wcwidth(text[i]);
+ if (width + w > margin && split != -1) {
+ break;
+ }
+ if (iswspace(text[i])) {
+ split = i;
+ }
+ }
+ if (split == -1) {
+ /* no space found to split, print a long line */
+ line = text;
+ more = false;
+ } else {
+ text[split] = L'\0';
+ line = text;
+ split++;
+ /* find start of next word */
+ while (iswspace(text[split])) {
+ split++;
+ }
+ if (text[split] != L'\0') {
+ text = &text[split];
+ remain -= split;
+ } else {
+ /* only trailing whitespace, we're done */
+ more = false;
+ }
+ }
+ }
+ wprintf(L"%ls%ls%ls\n", p->quotes, indent, line);
+ indent = p->indent;
+ }
+}
+
+#define SPACES_PER_TAB 8
+
+/*
+ * Trim LF CR CRLF LFCR and replace tabs with spaces.
+ */
+static void sanitize_line(const wchar_t *in, wchar_t *out)
+{
+ /* No bounds checking needed. This function is only used with
+ * 'buf' and 'line' buffers from main. 'out' is large enough no
+ * matter what is present in 'in'. */
+ while (*in != L'\0' && *in != L'\n' && *in != L'\r') {
+ if (*in == L'\t') {
+ /* tabs cause indentation/alignment issues
+ * replace them with 8 spaces */
+ in++;
+ for (int i = 0; i < SPACES_PER_TAB; i++)
+ *out++ = L' ';
+ } else {
+ *out++ = *in++;
+ }
+ }
+ *out = L'\0';
+}
+
+int main(int argc, char **argv)
+{
+ /* line needs to be 8 times larger than buf since every read character
+ * may be a tab (very unlikely, but it could happen). */
+ static wchar_t buf[BUFFER_SIZE], line[BUFFER_SIZE * SPACES_PER_TAB];
+ struct paragraph *cur = NULL, *next;
+ bool is_patch = false;
+ regmatch_t groups[2];
+ char *subject;
+ regex_t re;
+ int err;
+
+ err = parse_args(argc, argv);
+ if (err)
+ goto end;
+
+ regcomp(&re, "\\<PATCH\\>", REG_EXTENDED);
+ subject = getenv("AERC_SUBJECT");
+ if (subject && !regexec(&re, subject, 2, groups, 0))
+ is_patch = true;
+ regfree(&re);
+
+ /* aerc will always send UTF-8 text, force locale here */
+ if (!setlocale(LC_CTYPE, "C.UTF-8")) {
+ err = 1;
+ perror("error: failed to set locale");
+ goto end;
+ }
+ fwide(in_file, true);
+ fwide(stdout, true);
+
+ while (fgetws(buf, BUFFER_SIZE, in_file)) {
+ if (is_patch) {
+ /* never reflow patches */
+ fputws(buf, stdout);
+ continue;
+ }
+ sanitize_line(buf, line);
+ next = parse_line(line);
+ if (!cur) {
+ cur = next;
+ } else if (is_continuation(cur, next)) {
+ join_paragraph(cur, next);
+ free_paragraph(next);
+ } else {
+ write_paragraph(cur);
+ free_paragraph(cur);
+ cur = next;
+ }
+ }
+ if (cur) {
+ write_paragraph(cur);
+ }
+
+end:
+ free_paragraph(cur);
+ if (in_file) {
+ fclose(in_file);
+ }
+ return err;
+}
diff --git a/filters/wrap.go b/filters/wrap.go
deleted file mode 100644
index ea5186d4..00000000
--- a/filters/wrap.go
+++ /dev/null
@@ -1,267 +0,0 @@
-package main
-
-import (
- "bufio"
- "errors"
- "flag"
- "fmt"
- "io"
- "os"
- "regexp"
- "strings"
-
- "github.com/mattn/go-runewidth"
-)
-
-type paragraph struct {
- // email quote prefix, if any
- quotes string
- // list item indent, if any
- leader string
- // actual text of this paragraph
- text string
- // percentage of letters in text
- proseRatio int
- // text ends with a space
- flowed bool
- // paragraph is a list item
- listItem bool
-}
-
-func main() {
- var err error
- var width int
- var reflow bool
- var file string
- var proseRatio int
- var input *os.File
-
- fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
- fs.IntVar(&width, "w", 80, "preferred wrap margin")
- fs.BoolVar(&reflow, "r", false,
- "reflow all paragraphs even if no trailing space")
- fs.IntVar(&proseRatio, "l", 50,
- "minimum percentage of letters in a line to be considered a paragaph")
- fs.StringVar(&file, "f", "", "read from file instead of stdin")
- _ = fs.Parse(os.Args[1:])
-
- if file != "" {
- input, err = os.OpenFile(file, os.O_RDONLY, 0o644)
- if err != nil {
- goto end
- }
- } else {
- input = os.Stdin
- }
-
- err = wrap(input, os.Stdout, width, reflow, proseRatio)
-
-end:
- if err != nil && !errors.Is(err, io.EOF) {
- fmt.Fprintf(os.Stderr, "error: %s\n", err)
- os.Exit(1)
- }
-}
-
-func wrap(
- in io.Reader, out io.Writer, width int, reflow bool, proseRatio int,
-) error {
- var para *paragraph = nil
- var line string
- var err error
-
- if patchSubjectRe.MatchString(os.Getenv("AERC_SUBJECT")) {
- // never reflow patches
- _, err = io.Copy(out, in)
- } else {
- reader := bufio.NewReader(in)
- line, err = reader.ReadString('\n')
- for ; err == nil; line, err = reader.ReadString('\n') {
- next := parse(line)
- switch {
- case para == nil:
- para = next
- case para.isContinuation(next, reflow, proseRatio):
- para.join(next)
- default:
- para.write(out, width, proseRatio)
- para = next
- }
- }
- if para != nil {
- para.write(out, width, proseRatio)
- }
- }
-
- return err
-}
-
-// Parse a line of text into a paragraph structure
-func parse(line string) *paragraph {
- p := new(paragraph)
- q := 0
- t := 0
- line = strings.TrimRight(line, "\r\n")
- // tabs cause a whole lot of troubles, replace them with 8 spaces
- line = strings.ReplaceAll(line, "\t", " ")
-
- // Use integer offsets to find relevant positions in the line
- //
- // > > > 2) blah blah blah blah
- // ^--------+-----^
- // q | t
- // end of quotes | start of text
- // |
- // list item leader
-
- // detect the end of quotes prefix if any
- for q < len(line) && line[q] == '>' {
- q += 1
- if q < len(line) && line[q] == ' ' {
- q += 1
- }
- }
-
- // detect list item leader
- loc := listItemRe.FindStringIndex(line[q:])
- if loc != nil {
- // start of list item
- p.listItem = true
- } else {
- // maybe list item continuation
- loc = leadingSpaceRe.FindStringIndex(line[q:])
- }
- if loc != nil {
- t = q + loc[1]
- } else {
- // no list at all
- t = q
- }
-
- // check if there is trailing whitespace, indicating format=flowed
- loc = trailingSpaceRe.FindStringIndex(line[t:])
- if loc != nil {
- p.flowed = true
- // trim whitespace
- line = line[:t+loc[0]]
- }
-
- p.quotes = line[:q]
- p.leader = strings.Repeat(" ", runewidth.StringWidth(line[q:t]))
- p.text = line[q:]
-
- // compute the ratio of letters in the actual text
- onlyLetters := strings.TrimLeft(line[q:], " ")
- totalLen := runewidth.StringWidth(onlyLetters)
- if totalLen == 0 {
- // to avoid division by zero
- totalLen = 1
- }
- onlyLetters = notLetterRe.ReplaceAllLiteralString(onlyLetters, "")
- p.proseRatio = 100 * runewidth.StringWidth(onlyLetters) / totalLen
-
- return p
-}
-
-// Return true if a paragraph is a continuation of the current one.
-func (p *paragraph) isContinuation(
- next *paragraph, reflow bool, proseRatio int,
-) bool {
- switch {
- case next.listItem:
- // new list items always start a new paragraph
- return false
- case next.proseRatio < proseRatio || p.proseRatio < proseRatio:
- // does not look like prose, maybe ascii art
- return false
- case next.quotes != p.quotes || next.leader != p.leader:
- // quote level and/or list item leader have changed
- return false
- case len(strings.Trim(next.text, " ")) == 0:
- // empty line
- return false
- case p.flowed:
- // current paragraph has trailing space, indicating
- // format=flowed
- return true
- case reflow:
- // user forced paragraph reflow on the command line
- return true
- default:
- return false
- }
-}
-
-// Join next paragraph into current one.
-func (p *paragraph) join(next *paragraph) {
- if p.text == "" {
- p.text = next.text
- } else {
- p.text = p.text + " " + strings.Trim(next.text, " ")
- }
- p.proseRatio = (p.proseRatio + next.proseRatio) / 2
- p.flowed = next.flowed
-}
-
-// Write a paragraph, wrapping at words boundaries.
-//
-// Only try to do word wrapping on things that look like prose. When the text
-// contains too many non-letter characters, print it as-is.
-func (p *paragraph) write(out io.Writer, margin int, proseRatio int) {
- leader := ""
- more := true
- quotesWidth := runewidth.StringWidth(p.quotes)
- for more {
- var line string
- width := quotesWidth + runewidth.StringWidth(leader)
- remain := runewidth.StringWidth(p.text)
- if width+remain <= margin || p.proseRatio < proseRatio {
- // whole paragraph fits on a single line
- line = p.text
- p.text = ""
- more = false
- } else {
- // find split point, preferably before margin
- split := -1
- w := 0
- for i, r := range p.text {
- w += runewidth.RuneWidth(r)
- if width+w > margin && split != -1 {
- break
- }
- if r == ' ' {
- split = i
- }
- }
- if split == -1 {
- // no space found to split, print a long line
- line = p.text
- p.text = ""
- more = false
- } else {
- line = p.text[:split]
- // find start of next word
- for split < len(p.text) && p.text[split] == ' ' {
- split++
- }
- if split < len(p.text) {
- p.text = p.text[split:]
- } else {
- // only trailing whitespace, we're done
- p.text = ""
- more = false
- }
- }
- }
- fmt.Fprintf(out, "%s%s%s\n", p.quotes, leader, line)
- leader = p.leader
- }
-}
-
-var (
- patchSubjectRe = regexp.MustCompile(`\bPATCH\b`)
- listItemRe = regexp.MustCompile(`^\s*([\-\*\.]|[a-z\d]{1,2}[\)\]\.])\s+`)
- leadingSpaceRe = regexp.MustCompile(`^\s+`)
- trailingSpaceRe = regexp.MustCompile(`\s+$`)
- notLetterRe = regexp.MustCompile(`[^\pL]`)
-)
diff --git a/filters/wrap_test.go b/filters/wrap_test.go
deleted file mode 100644
index f8d82cbe..00000000
--- a/filters/wrap_test.go
+++ /dev/null
@@ -1,212 +0,0 @@
-package main
-
-import (
- "bytes"
- "errors"
- "io"
- "testing"
-)
-
-type vector struct {
- name string
- in string
- out string
- width int
- reflow bool
- ratio int
-}
-
-var vectors = []vector{
- {
- name: "simple",
- in: `long line that exceeds margin by many words
-`,
- width: 30,
- reflow: false,
- ratio: 50,
- out: `long line that exceeds margin
-by many words
-`,
- },
- {
- name: "two-paragraphs",
- in: `this is one long paragraph
-this is another long one
-`,
- width: 20,
- reflow: false,
- ratio: 50,
- out: `this is one long
-paragraph
-this is another
-long one
-`,
- },
- {
- name: "reflow",
- in: `this is one long paragraph
-this is another long one
-`,
- width: 20,
- reflow: true,
- ratio: 50,
- out: `this is one long
-paragraph this is
-another long one
-`,
- },
- {
- name: "quotes",
- in: `Let's play with quotes:
-
->> Hi there how are you doing?
-> Great thanks
-
-How rude.
-
->> Fantastic. Let's go wrap some words.
-`,
- width: 20,
- reflow: false,
- ratio: 50,
- out: `Let's play with
-quotes:
-
->> Hi there how are
->> you doing?
-> Great thanks
-
-How rude.
-
->> Fantastic. Let's
->> go wrap some
->> words.
-`,
- },
- {
- name: "ascii-art",
- in: `This is a nice drawing, isn't it?
-
-+-------------------+
-| foobaz |
-+-------------------+
- |
- |
-+-------------------+
-| foobar |
-+-------------------+
-`,
- width: 15,
- ratio: 50,
- reflow: true,
- out: `This is a nice
-drawing, isn't
-it?
-
-+-------------------+
-| foobaz |
-+-------------------+
- |
- |
-+-------------------+
-| foobar |
-+-------------------+
-`,
- },
- {
- name: "list-items",
- in: `Shopping list:
-
- - milk
- - chocolate
- - cookies (please, with nuts)
-`,
- width: 20,
- reflow: false,
- ratio: 50,
- out: `Shopping list:
-
- - milk
- - chocolate
- - cookies
- (please, with
- nuts)
-`,
- },
- {
- name: "list-items-reflow",
- in: `Shopping list:
-
- * milk
- * chocolate
- * cookies
- (please,
- with nuts)
-`,
- width: 100,
- reflow: true,
- ratio: 30,
- out: `Shopping list:
-
- * milk
- * chocolate
- * cookies (please, with nuts)
-`,
- },
- {
- name: "long-url",
- in: `Please follow this ugly link:
-http://foobaz.org/xapapzolmkdmldfk-fldskjflsk-cisjoij/onoes.jsp?xxx=2&yyy=3
-`,
- width: 20,
- reflow: true,
- ratio: 50,
- out: `Please follow this
-ugly link:
-http://foobaz.org/xapapzolmkdmldfk-fldskjflsk-cisjoij/onoes.jsp?xxx=2&yyy=3
-`,
- },
- {
- name: "format=flowed",
- in: "Oh, \nI'm \nso \nhip \nI \nuse \nformat=flowed.\n",
- width: 30,
- reflow: false,
- ratio: 50,
- out: "Oh, I'm so hip I use\nformat=flowed.\n",
- },
- {
- name: "non-ascii",
- in: `Lorem ççççç ççççç ççç ççççç çç ççç ççççç çççççççç ççç çç ççççç ççççççççççç ççççç
-
-Lorem жжжжж жжжжж жжж жжжжж жж жжж жжжжж жжжжжжжж жжж жж жжжжж жжжжжжжжжжж жжжжж жжжжжжжж
-`,
- width: 40,
- reflow: false,
- ratio: 50,
- out: `Lorem ççççç ççççç ççç ççççç çç ççç
-ççççç çççççççç ççç çç ççççç ççççççççççç
-ççççç
-
-Lorem жжжжж жжжжж жжж жжжжж жж жжж
-жжжжж жжжжжжжж жжж жж жжжжж жжжжжжжжжжж
-жжжжж жжжжжжжж
-`,
- },
-}
-
-func TestWrap(t *testing.T) {
- for _, vec := range vectors {
- t.Run(vec.name, func(t *testing.T) {
- r := bytes.NewReader([]byte(vec.in))
- var buf bytes.Buffer
- err := wrap(r, &buf, vec.width, vec.reflow, vec.ratio)
- if err != nil && !errors.Is(err, io.EOF) {
- t.Fatalf("[%s]: %v", vec.name, err)
- }
- if buf.String() != vec.out {
- t.Errorf("[%s] invalid format:\n%q\nexpected\n%q",
- vec.name, buf.String(), vec.out)
- }
- })
- }
-}