about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/text
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/text')
-rw-r--r--nixpkgs/pkgs/tools/text/a2ps/default.nix46
-rw-r--r--nixpkgs/pkgs/tools/text/abbreviate/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/agrep/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/aha/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/align/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/amber/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/anew/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/anewer/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/angle-grinder/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/ansifilter/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/text/ascii/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/asciigraph/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/autocorrect/Cargo.lock2457
-rw-r--r--nixpkgs/pkgs/tools/text/autocorrect/default.nix36
-rwxr-xr-xnixpkgs/pkgs/tools/text/autocorrect/update.sh15
-rw-r--r--nixpkgs/pkgs/tools/text/base16384/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/bashblog/0001-Setting-markdown_bin.patch25
-rw-r--r--nixpkgs/pkgs/tools/text/bashblog/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/book-summary/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/boxes/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/text/catdoc/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/catdocx/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/cconv/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/chars/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/choose/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/chroma/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/chroma/src.json11
-rw-r--r--nixpkgs/pkgs/tools/text/cidrgrep/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/clima/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/cmigemo/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/cmigemo/no-http-tool-check.patch23
-rw-r--r--nixpkgs/pkgs/tools/text/codesearch/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/colordiff/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/text/coloursum/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/comrak/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/convertlit/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/copyright-update/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/cringify/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/crowdin-cli/default.nix51
-rw-r--r--nixpkgs/pkgs/tools/text/csvdiff/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/csview/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/csvkit/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/csvquote/csvquote-path.patch14
-rw-r--r--nixpkgs/pkgs/tools/text/csvquote/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/text/d2/default.nix55
-rw-r--r--nixpkgs/pkgs/tools/text/dadadodo/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/dcs/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/text/dfmt/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/diction/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/diffr/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/diffsitter/default.nix80
-rw-r--r--nixpkgs/pkgs/tools/text/diffstat/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/difftastic/Cargo.lock1109
-rw-r--r--nixpkgs/pkgs/tools/text/difftastic/default.nix50
-rw-r--r--nixpkgs/pkgs/tools/text/diffutils/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/dirdiff/default.nix64
-rw-r--r--nixpkgs/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch32
-rw-r--r--nixpkgs/pkgs/tools/text/discount/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/text/discount/fix-configure-path.patch12
-rw-r--r--nixpkgs/pkgs/tools/text/djot-js/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/text/dos2unix/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/dt/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/each/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/ebook-tools/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/enca/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/enscript/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/text/epub2txt2/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/epubcheck/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/text/esh/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/fanficfare/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/fastmod/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/frangipanni/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/frawk/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/text/frogmouth/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/text/fst/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/gawk/default.nix87
-rw-r--r--nixpkgs/pkgs/tools/text/gawk/gawk-with-extensions.nix13
-rw-r--r--nixpkgs/pkgs/tools/text/gawk/gawkextlib.nix150
-rw-r--r--nixpkgs/pkgs/tools/text/gawk/setup-hook.sh6
-rw-r--r--nixpkgs/pkgs/tools/text/gist/default.nix17
-rw-r--r--nixpkgs/pkgs/tools/text/gjo/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/glogg/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/gnugrep/default.nix79
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch33
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-1000156.patch211
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6951.patch28
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6952.patch28
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13636.patch108
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch38
-rw-r--r--nixpkgs/pkgs/tools/text/gnupatch/default.nix59
-rw-r--r--nixpkgs/pkgs/tools/text/gnused/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/text/goawk/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch10
-rw-r--r--nixpkgs/pkgs/tools/text/gpt2tc/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/grin/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/grip-search/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/groff/default.nix136
-rw-r--r--nixpkgs/pkgs/tools/text/groff/site.tmac13
-rw-r--r--nixpkgs/pkgs/tools/text/gtranslator/default.nix75
-rw-r--r--nixpkgs/pkgs/tools/text/gtree/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/gucci/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/hck/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/hcledit/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/highlight/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/html-tidy/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/text/html2text/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/huniq/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/text/hyx/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/icdiff/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/igrep/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/invoice2data/default.nix63
-rw-r--r--nixpkgs/pkgs/tools/text/ispell/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/jbofihe/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/jen/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/jotdown/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/jsawk/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/jumanpp/0001-Exclude-all-tests-from-the-build.patch177
-rw-r--r--nixpkgs/pkgs/tools/text/jumanpp/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/text/justify/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/kakasi/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/text/kdiff3/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/text/kytea/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/kytea/gcc-O3.patch13
-rw-r--r--nixpkgs/pkgs/tools/text/l2md/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/languagetool-rust/default.nix85
-rw-r--r--nixpkgs/pkgs/tools/text/languagetool/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/ledger2beancount/default.nix57
-rw-r--r--nixpkgs/pkgs/tools/text/link-grammar/default.nix67
-rw-r--r--nixpkgs/pkgs/tools/text/ltex-ls/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/lv/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/mairix/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/mairix/mmap.patch161
-rw-r--r--nixpkgs/pkgs/tools/text/mark/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/markdownlint-cli/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/markdownlint-cli2/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/markscribe/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/math-review/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/mawk/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/mb2md/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-admonish/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-cmdrun/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-d2/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-emojicodes/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-epub/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-graphviz/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-i18n-helpers/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-katex/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-kroki-preprocessor/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-linkcheck/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-man/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-mermaid/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-open-on-gh/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-pagetoc/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-pdf/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-plantuml/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook-toc/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/mdbook/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/mdcat/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/mdhtml/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/mecab/base.nix19
-rw-r--r--nixpkgs/pkgs/tools/text/mecab/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/text/mecab/ipadic.nix19
-rw-r--r--nixpkgs/pkgs/tools/text/mecab/nodic.nix8
-rw-r--r--nixpkgs/pkgs/tools/text/miller/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/mir-qualia/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/text/mmdoc/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/text/morsel/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/mpage/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/mrkd/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/data/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/libbtree/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/libfacet/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/libmtquery/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/libmtsupport/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/text/multitran/mtutils/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/mw/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/namazu/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/nerdfix/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/nkf/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/nltk_data/default.nix56
-rw-r--r--nixpkgs/pkgs/tools/text/num-utils/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/numdiff/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/odt2txt/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/opencc/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/ov/default.nix71
-rw-r--r--nixpkgs/pkgs/tools/text/papeer/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/paperoni/Cargo.lock3014
-rw-r--r--nixpkgs/pkgs/tools/text/paperoni/default.nix51
-rwxr-xr-xnixpkgs/pkgs/tools/text/papertrail/Gemfile4
-rw-r--r--nixpkgs/pkgs/tools/text/papertrail/Gemfile.lock17
-rw-r--r--nixpkgs/pkgs/tools/text/papertrail/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/papertrail/gemset.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/par/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/patchutils/0.3.3.nix7
-rw-r--r--nixpkgs/pkgs/tools/text/patchutils/0.4.2.nix8
-rw-r--r--nixpkgs/pkgs/tools/text/patchutils/default.nix6
-rw-r--r--nixpkgs/pkgs/tools/text/patchutils/drop-comments.patch84
-rw-r--r--nixpkgs/pkgs/tools/text/patchutils/generic.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/pbgopy/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/peco/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/percollate/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/text/pinyin-tool/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/platinum-searcher/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/pn/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/podiff/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/text/poedit/default.nix51
-rw-r--r--nixpkgs/pkgs/tools/text/pomsky/Cargo.lock1649
-rw-r--r--nixpkgs/pkgs/tools/text/pomsky/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/popfile/default.nix60
-rw-r--r--nixpkgs/pkgs/tools/text/proselint/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/qgrep/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/text/qprint/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/rare-regex/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/text/readability-cli/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/reckon/Gemfile2
-rw-r--r--nixpkgs/pkgs/tools/text/reckon/Gemfile.lock21
-rw-r--r--nixpkgs/pkgs/tools/text/reckon/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/reckon/gemset.nix53
-rw-r--r--nixpkgs/pkgs/tools/text/recode/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/repgrep/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/text/replace/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/text/replace/malloc.patch13
-rw-r--r--nixpkgs/pkgs/tools/text/reveal-md/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/rgxg/default.nix18
-rw-r--r--nixpkgs/pkgs/tools/text/riffdiff/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/ripgrep-all/default.nix63
-rw-r--r--nixpkgs/pkgs/tools/text/ripgrep/default.nix56
-rw-r--r--nixpkgs/pkgs/tools/text/rnr/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/rosie/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/rpl/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/rpl/remove-argparse-manpage.diff27
-rw-r--r--nixpkgs/pkgs/tools/text/rsbkb/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile2
-rw-r--r--nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile.lock24
-rw-r--r--nixpkgs/pkgs/tools/text/ruby-zoom/default.nix18
-rw-r--r--nixpkgs/pkgs/tools/text/ruby-zoom/gemset.nix64
-rw-r--r--nixpkgs/pkgs/tools/text/runiq/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/text/ruplacer/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/rust-petname/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/text/sad/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/schema2ldif/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/text/scraper/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/sd/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/seehecht/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/jade/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/linuxdoc-tools/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/openjade/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/openjade/msggen.patch34
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/opensp/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/opensp/fix-register-storage-class.patch11
-rw-r--r--nixpkgs/pkgs/tools/text/sgml/opensp/setup-hook.sh22
-rw-r--r--nixpkgs/pkgs/tools/text/sgrep/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/text/shab/default.nix73
-rw-r--r--nixpkgs/pkgs/tools/text/shfmt/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/shocco/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/sift/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/text/silver-searcher/bash-completion.patch5
-rw-r--r--nixpkgs/pkgs/tools/text/silver-searcher/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/text/smu/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/snippetpixie/default.nix89
-rw-r--r--nixpkgs/pkgs/tools/text/sorted-grep/default.nix56
-rw-r--r--nixpkgs/pkgs/tools/text/source-highlight/default.nix63
-rw-r--r--nixpkgs/pkgs/tools/text/subedit/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/text/tab/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/teip/default.nix51
-rw-r--r--nixpkgs/pkgs/tools/text/termbook/Cargo.lock2900
-rw-r--r--nixpkgs/pkgs/tools/text/termbook/default.nix60
-rw-r--r--nixpkgs/pkgs/tools/text/tesh/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/text/textpieces/default.nix79
-rw-r--r--nixpkgs/pkgs/tools/text/tidy-viewer/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/tml/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/to-html/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/topfew-rs/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/text/topfew/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/transifex-client/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/text/tuc/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/text/tv/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/text/txt2tags/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/text/u2ps/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/ugrep/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/text/unfurl/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/uni2ascii/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/uniscribe/Gemfile3
-rw-r--r--nixpkgs/pkgs/tools/text/uniscribe/Gemfile.lock37
-rw-r--r--nixpkgs/pkgs/tools/text/uniscribe/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/uniscribe/gemset.nix1766
-rw-r--r--nixpkgs/pkgs/tools/text/unoconv/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/unrtf/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/untex/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/uwc/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/vale/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/text/validator-nu/default.nix68
-rw-r--r--nixpkgs/pkgs/tools/text/vgrep/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/text/wdiff/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/wgetpaste/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/wrap/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/write-good/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/xidel/default.nix95
-rw-r--r--nixpkgs/pkgs/tools/text/xml/basex/basex.svg81
-rw-r--r--nixpkgs/pkgs/tools/text/xml/basex/default.nix68
-rw-r--r--nixpkgs/pkgs/tools/text/xml/html-xml-utils/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/text/xml/jing-trang/default.nix55
-rw-r--r--nixpkgs/pkgs/tools/text/xml/jing-trang/no-git-during-build.patch47
-rw-r--r--nixpkgs/pkgs/tools/text/xml/rnv/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/text/xml/rxp/default.nix18
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xml2/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xmlformat/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xmloscopy/default.nix53
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xmlstarlet/default.nix40
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xmlstarlet/fix-incompatible-function-pointer.patch11
-rw-r--r--nixpkgs/pkgs/tools/text/xml/xq/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/text/xpaste/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/xsv/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/xurls/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/text/yaml-merge/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/text/yx/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/zet/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/text/zim-tools/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/text/zoekt/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/text/zstxtns-utils/default.nix39
320 files changed, 24485 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/tools/text/a2ps/default.nix b/nixpkgs/pkgs/tools/text/a2ps/default.nix
new file mode 100644
index 000000000000..dd4b7b2ca979
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/a2ps/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, fetchurl
+, autoconf
+, bison
+, file
+, perl
+, pkg-config
+, boehmgc
+, gperf
+, libpaper
+}:
+
+stdenv.mkDerivation rec {
+  pname = "a2ps";
+  version = "4.15.5";
+
+  src = fetchurl {
+    url = "mirror://gnu/a2ps/a2ps-${version}.tar.gz";
+    hash = "sha256-gbsbQQTnwmOXYkUe3JeG2vPf6ziErfx9xqydII8w2n8=";
+  };
+
+  postPatch = ''
+    substituteInPlace afm/make_fonts_map.sh --replace "/bin/rm" "rm"
+    substituteInPlace tests/defs.in --replace "/bin/rm" "rm"
+  '';
+
+  nativeBuildInputs = [ autoconf bison file perl pkg-config ];
+  buildInputs = [ boehmgc gperf libpaper ];
+
+  strictDeps = true;
+
+  meta = with lib; {
+    description = "An Anything to PostScript converter and pretty-printer";
+    longDescription = ''
+      GNU a2ps converts files into PostScript for printing or viewing. It uses a nice default format,
+      usually two pages on each physical page, borders surrounding pages, headers with useful information
+      (page number, printing date, file name or supplied header), line numbering, symbol substitution as
+      well as pretty printing for a wide range of programming languages.
+    '';
+    homepage = "https://www.gnu.org/software/a2ps/";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.bennofs ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/abbreviate/default.nix b/nixpkgs/pkgs/tools/text/abbreviate/default.nix
new file mode 100644
index 000000000000..aedf4d173006
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/abbreviate/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+}:
+
+buildGoModule rec {
+  pname = "abbreviate";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "dnnrly";
+    repo = "abbreviate";
+    rev = "v${version}";
+    hash = "sha256-foGg+o+BbPsfpph+XHIfyPaknQD1N1rcZW58kgZ5HYM=";
+  };
+
+  vendorHash = "sha256-9z3M3FEjllNpae+5EcLVkF1rAtOQzUQGebJeU7QsmTA=";
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  ldflags = [ "-s" "-w" ];
+
+  postInstall = ''
+    installShellCompletion --cmd abbreviate \
+      --bash <($out/bin/abbreviate completion bash) \
+      --fish <($out/bin/abbreviate completion fish) \
+      --zsh <($out/bin/abbreviate completion zsh)
+  '';
+
+  meta = with lib; {
+    description = "Shorten your strings using common abbreviations";
+    homepage = "https://github.com/dnnrly/abbreviate";
+    changelog = "https://github.com/dnnrly/abbreviate/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/agrep/default.nix b/nixpkgs/pkgs/tools/text/agrep/default.nix
new file mode 100644
index 000000000000..9fe158b426ae
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/agrep/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "agrep";
+  version = "3.41.5";
+
+  src = fetchFromGitHub {
+    owner = "Wikinaut";
+    repo = "agrep";
+    # This repository has numbered versions, but not Git tags.
+    rev = "eef20411d605d9d17ead07a0ade75046f2728e21";
+    sha256 = "14addnwspdf2mxpqyrw8b84bb2257y43g5ccy4ipgrr91fmxq2sk";
+  };
+
+  # Related: https://github.com/Wikinaut/agrep/pull/11
+  prePatch = lib.optionalString (stdenv.hostPlatform.isMusl || stdenv.isDarwin) ''
+    sed -i '1i#include <sys/stat.h>' checkfil.c newmgrep.c recursiv.c
+  '';
+  installPhase = ''
+    install -Dm 555 agrep -t "$out/bin"
+    install -Dm 444 docs/* -t "$out/doc"
+  '';
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  meta = with lib; {
+    description = "Approximate grep for fast fuzzy string searching";
+    homepage = "https://www.tgries.de/agrep/";
+    license = licenses.isc;
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/aha/default.nix b/nixpkgs/pkgs/tools/text/aha/default.nix
new file mode 100644
index 000000000000..4ac07cef7eed
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/aha/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "aha";
+  version = "0.5.1";
+
+  src = fetchFromGitHub {
+    sha256 = "1gywad0rvvz3c5balz8cxsnx0562hj2ngzqyr8zsy2mb4pn0lpgv";
+    rev = version;
+    repo = "aha";
+    owner = "theZiz";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "ANSI HTML Adapter";
+    longDescription = ''
+      aha takes ANSI SGR-coloured input and produces W3C-conformant HTML code.
+    '';
+    homepage = "https://github.com/theZiz/aha";
+    license = with licenses; [ lgpl2Plus mpl11 ];
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/align/default.nix b/nixpkgs/pkgs/tools/text/align/default.nix
new file mode 100644
index 000000000000..e3287b762e34
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/align/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "align";
+  version = "1.1.3";
+
+  src = fetchFromGitHub {
+    owner = "Guitarbum722";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "17gs3417633z71kc6l5zqg4b3rjhpn2v8qs8rnfrk4nbwzz4nrq3";
+  };
+
+  vendorHash = null;
+
+  meta = with lib; {
+    homepage = "https://github.com/Guitarbum722/align";
+    description = "A general purpose application and library for aligning text";
+    maintainers = with maintainers; [ hrhino ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/amber/default.nix b/nixpkgs/pkgs/tools/text/amber/default.nix
new file mode 100644
index 000000000000..1cd9e74f1943
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/amber/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform
+, libiconv, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "amber";
+  version = "0.5.9";
+
+  src = fetchFromGitHub {
+    owner = "dalance";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-mmgJCD7kJjvpxyagsoe5CSzqIEZcIiYMAMP3axRphv4=";
+  };
+
+  cargoSha256 = "sha256-opRinhTmhZxpAwHNiVOLXL8boQf09Y1NXrWQ6HWQYQ0=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Security ];
+
+  meta = with lib; {
+    description = "A code search-and-replace tool";
+    homepage = "https://github.com/dalance/amber";
+    license = with licenses; [ mit ];
+    maintainers = [ maintainers.bdesham ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/anew/default.nix b/nixpkgs/pkgs/tools/text/anew/default.nix
new file mode 100644
index 000000000000..2312d1dc69bf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/anew/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "anew";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "tomnomnom";
+    repo = "anew";
+    rev = "v${version}";
+    hash = "sha256-NQSs99/2GPOtXkO7k+ar16G4Ecu4CPGMd/CTwEhcyto=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A tool for adding new lines to files, skipping duplicates";
+    homepage = "https://github.com/tomnomnom/anew";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/anewer/default.nix b/nixpkgs/pkgs/tools/text/anewer/default.nix
new file mode 100644
index 000000000000..e41b12cee447
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/anewer/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "anewer";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "ysf";
+    repo = pname;
+    rev = version;
+    sha256 = "181mi674354bddnq894yyq587w7skjh35vn61i41vfi6lqz5dy3d";
+  };
+
+  cargoSha256 = "sha256-LJ0l5CZM5NqdbCZe4ELkYf9EkKyBxL/LrNmFy+JS6gM=";
+
+  meta = with lib; {
+    description = "Append lines from stdin to a file if they don't already exist in the file";
+    homepage = "https://github.com/ysf/anewer";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/angle-grinder/default.nix b/nixpkgs/pkgs/tools/text/angle-grinder/default.nix
new file mode 100644
index 000000000000..dd34316803e1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/angle-grinder/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "angle-grinder";
+  version = "0.19.2";
+
+  src = fetchFromGitHub {
+    owner = "rcoh";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-/OYIG4s0hH/bkAPxt/x5qHopDIoMN9AJLQ8Sx8USgsM=";
+  };
+
+  cargoHash = "sha256-pOW2jFQxaf2zQWL5+URvHVeCAvSI0u8iALPO5fCoqmI=";
+
+  meta = with lib; {
+    description = "Slice and dice logs on the command line";
+    homepage = "https://github.com/rcoh/angle-grinder";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bbigras ];
+    mainProgram = "agrind";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ansifilter/default.nix b/nixpkgs/pkgs/tools/text/ansifilter/default.nix
new file mode 100644
index 000000000000..3a4751c63f9f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ansifilter/default.nix
@@ -0,0 +1,36 @@
+{ fetchurl, lib, stdenv, pkg-config, boost, lua }:
+
+stdenv.mkDerivation rec {
+  pname = "ansifilter";
+  version = "2.20";
+
+  src = fetchurl {
+    url = "http://www.andre-simon.de/zip/ansifilter-${version}.tar.bz2";
+    hash = "sha256-Neydcaf05WATN5N8dzSzKm40bA8FT00xY3aCPP5nkGc=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ boost lua ];
+
+  postPatch = ''
+    # avoid timestamp non-determinism with '-n'
+    substituteInPlace makefile --replace 'gzip -9f' 'gzip -9nf'
+  '';
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+    "conf_dir=/etc/ansifilter"
+  ];
+
+  meta = with lib; {
+    description = "Tool to convert ANSI to other formats";
+    longDescription = ''
+      Tool to remove ANSI or convert them to another format
+      (HTML, TeX, LaTeX, RTF, Pango or BBCode)
+    '';
+    homepage = "http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.Adjective-Object ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ascii/default.nix b/nixpkgs/pkgs/tools/text/ascii/default.nix
new file mode 100644
index 000000000000..f596c8d330d2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ascii/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "ascii";
+  version = "3.18";
+
+  src = fetchurl {
+    url = "http://www.catb.org/~esr/ascii/${pname}-${version}.tar.gz";
+    sha256 = "0b87vy06s8s3a8q70pqavsbk4m4ff034sdml2xxa6qfsykaj513j";
+  };
+
+  prePatch = ''
+    sed -i -e "s|^PREFIX = .*|PREFIX = $out|" Makefile
+  '';
+
+  preInstall = ''
+    mkdir -vp "$out/bin" "$out/share/man/man1"
+  '';
+
+  meta = with lib; {
+    description = "Interactive ASCII name and synonym chart";
+    homepage = "http://www.catb.org/~esr/ascii/";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/asciigraph/default.nix b/nixpkgs/pkgs/tools/text/asciigraph/default.nix
new file mode 100644
index 000000000000..17c25874f54d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/asciigraph/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "asciigraph";
+  version = "0.5.6";
+
+  src = fetchFromGitHub {
+    owner = "guptarohit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ZmH0+UXPUyO90ZI6YsKiTd6Nf8dgZAgm7Qx8PVUkHAU=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/guptarohit/asciigraph";
+    description = "Lightweight ASCII line graph ╭┈╯ command line app";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/autocorrect/Cargo.lock b/nixpkgs/pkgs/tools/text/autocorrect/Cargo.lock
new file mode 100644
index 000000000000..82fb056857c2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/autocorrect/Cargo.lock
@@ -0,0 +1,2457 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anstream"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "autocorrect"
+version = "2.8.5"
+dependencies = [
+ "autocorrect-derive 0.3.0",
+ "criterion",
+ "diff",
+ "ignore",
+ "indoc",
+ "lazy_static",
+ "owo-colors",
+ "pest",
+ "pest_derive",
+ "pretty_assertions",
+ "regex",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serde_yaml",
+]
+
+[[package]]
+name = "autocorrect"
+version = "2.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2aa23c243abf88a533e514d8e5455e668daa3a8ca93061d8eb7f22014d7ad1a"
+dependencies = [
+ "autocorrect-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diff",
+ "ignore",
+ "lazy_static",
+ "owo-colors",
+ "pest",
+ "pest_derive",
+ "regex",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serde_yaml",
+]
+
+[[package]]
+name = "autocorrect-cli"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5",
+ "clap",
+ "ignore",
+ "lazy_static",
+ "log",
+ "num_cpus",
+ "owo-colors",
+ "reqwest",
+ "self_update",
+ "sudo",
+ "threadpool",
+ "tokio",
+ "walkdir",
+]
+
+[[package]]
+name = "autocorrect-derive"
+version = "0.3.0"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "autocorrect-derive"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b80889323facc446add06be71b9c4c000acd083b12563d9c914b86424bf2f17a"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "autocorrect-java"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5",
+ "jni",
+]
+
+[[package]]
+name = "autocorrect-node"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5",
+ "autocorrect-cli",
+ "napi",
+ "napi-build",
+ "napi-derive",
+]
+
+[[package]]
+name = "autocorrect-py"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5",
+ "pyo3",
+]
+
+[[package]]
+name = "autocorrect-rb"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "magnus",
+]
+
+[[package]]
+name = "autocorrect-wasm"
+version = "2.8.5"
+dependencies = [
+ "autocorrect 2.8.5",
+ "serde",
+ "serde_json",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+
+[[package]]
+name = "bindgen"
+version = "0.66.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
+dependencies = [
+ "bitflags 2.4.0",
+ "cexpr",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bstr"
+version = "1.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "ciborium"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clang-sys"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "clap"
+version = "4.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "combine"
+version = "4.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "console"
+version = "0.15.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "is-terminal",
+ "itertools",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset 0.9.0",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "ctor"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f34ba9a9bcb8645379e9de8cb3ecfcf4d1c85ba66d90deb3259206fa5aa193b"
+dependencies = [
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "diff"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "errno"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
+
+[[package]]
+name = "filetime"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "globset"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "fnv",
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap 1.9.3",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "hyper"
+version = "0.14.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.4.9",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
+dependencies = [
+ "futures-util",
+ "http",
+ "hyper",
+ "rustls",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "ignore"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
+dependencies = [
+ "globset",
+ "lazy_static",
+ "log",
+ "memchr",
+ "regex",
+ "same-file",
+ "thread_local",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.0",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix",
+ "regex",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "ipnet"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+dependencies = [
+ "hermit-abi",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "jni"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
+dependencies = [
+ "cesu8",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "js-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.148"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "magnus"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc87660cd7daa49fddbfd524c836de54d5c927d520cd163f43700c5087c57d6c"
+dependencies = [
+ "magnus-macros",
+ "rb-sys",
+ "rb-sys-env",
+]
+
+[[package]]
+name = "magnus-macros"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206cb23bfeea05180c97522ef6a3e52a4eb17b0ed2f30ee3ca9c4f994d2378ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "napi"
+version = "2.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd063c93b900149304e3ba96ce5bf210cd4f81ef5eb80ded0d100df3e85a3ac0"
+dependencies = [
+ "bitflags 2.4.0",
+ "ctor",
+ "napi-derive",
+ "napi-sys",
+ "once_cell",
+ "tokio",
+]
+
+[[package]]
+name = "napi-build"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e"
+
+[[package]]
+name = "napi-derive"
+version = "2.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da1c6a8fa84d549aa8708fcd062372bf8ec6e849de39016ab921067d21bde367"
+dependencies = [
+ "cfg-if",
+ "convert_case",
+ "napi-derive-backend",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "napi-derive-backend"
+version = "1.0.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20bbc7c69168d06a848f925ec5f0e0997f98e8c8d4f2cc30157f0da51c009e17"
+dependencies = [
+ "convert_case",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "semver",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "napi-sys"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "166b5ef52a3ab5575047a9fe8d4a030cdd0f63c96f071cd6907674453b07bae3"
+dependencies = [
+ "libloading",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "owo-colors"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "pest"
+version = "2.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33"
+dependencies = [
+ "memchr",
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "plotters"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "pretty_assertions"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
+dependencies = [
+ "diff",
+ "yansi",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "268be0c73583c183f2b14052337465768c07726936a260f480f0857cb95ba543"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset 0.6.5",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28fcd1e73f06ec85bf3280c48c67e731d8290ad3d730f8be9dc07946923005c8"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f6cb136e222e49115b3c51c32792886defbfb0adead26a688142b346a0b9ffc"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94144a1266e236b1c932682136dc35a9dee8d3589728f68130c7c3861ef96b28"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8df9be978a2d2f0cdebabb03206ed73b11314701a5bfe71b0d753b81997777f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "rb-sys"
+version = "0.9.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a57240b308b155b09dce81e32829966a99f52d1088b45957e4283e526c5317a1"
+dependencies = [
+ "rb-sys-build",
+]
+
+[[package]]
+name = "rb-sys-build"
+version = "0.9.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f24ce877a4c5d07f06f6aa6fec3ac95e4b357b9f73b0f5445d8cbb7266d410e8"
+dependencies = [
+ "bindgen",
+ "lazy_static",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "shell-words",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "rb-sys-env"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+
+[[package]]
+name = "reqwest"
+version = "0.11.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-rustls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "webpki-roots",
+ "winreg",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustix"
+version = "0.38.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662"
+dependencies = [
+ "bitflags 2.4.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustls"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
+dependencies = [
+ "base64",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "self_update"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88c865d17fb512577be02a09fd2fd96c31c7e46fe649205d84feefd8b2a332da"
+dependencies = [
+ "either",
+ "flate2",
+ "hyper",
+ "indicatif",
+ "log",
+ "quick-xml",
+ "regex",
+ "reqwest",
+ "semver",
+ "serde_json",
+ "tar",
+ "tempfile",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
+
+[[package]]
+name = "serde"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574"
+dependencies = [
+ "indexmap 2.0.0",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "shell-words"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
+
+[[package]]
+name = "shlex"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "sudo"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a88e74edf206f281aff2820aa2066c781331044c770626dcafe19491f214e05"
+dependencies = [
+ "libc",
+ "log",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9caece70c63bfba29ec2fed841a09851b14a235c60010fa4de58089b6c025668"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tar"
+version = "0.4.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+dependencies = [
+ "filetime",
+ "libc",
+ "xattr",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+
+[[package]]
+name = "tempfile"
+version = "3.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "threadpool"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
+dependencies = [
+ "num_cpus",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "socket2 0.5.4",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+dependencies = [
+ "rustls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+dependencies = [
+ "cfg-if",
+ "serde",
+ "serde_json",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.33",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "winreg"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "xattr"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
diff --git a/nixpkgs/pkgs/tools/text/autocorrect/default.nix b/nixpkgs/pkgs/tools/text/autocorrect/default.nix
new file mode 100644
index 000000000000..fa1214762b29
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/autocorrect/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, rustPlatform, fetchFromGitHub, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "autocorrect";
+  version = "2.8.5";
+
+  src = fetchFromGitHub {
+    owner = "huacnlee";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-j59yCGGV6yiT6o+VKM1FPh87T4QG0qAeKgcKIAqpx+8=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+  };
+
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+
+  buildInputs = lib.optional stdenv.isDarwin Security;
+
+  cargoBuildFlags = [ "-p" "autocorrect-cli" ];
+  cargoTestFlags = [ "-p" "autocorrect-cli" ];
+
+  passthru.updateScript = ./update.sh;
+
+  meta = with lib; {
+    description = "A linter and formatter for help you improve copywriting, to correct spaces, punctuations between CJK (Chinese, Japanese, Korean)";
+    homepage = "https://huacnlee.github.io/autocorrect";
+    changelog = "https://github.com/huacnlee/autocorrect/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/autocorrect/update.sh b/nixpkgs/pkgs/tools/text/autocorrect/update.sh
new file mode 100755
index 000000000000..64af26872631
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/autocorrect/update.sh
@@ -0,0 +1,15 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p coreutils curl jq common-updater-scripts cargo
+# shellcheck shell=bash
+
+set -euo pipefail
+
+version=$(curl -s https://api.github.com/repos/huacnlee/autocorrect/releases/latest | jq -r .tag_name)
+update-source-version autocorrect "${version#v}"
+
+tmp=$(mktemp -d)
+trap 'rm -rf -- "${tmp}"' EXIT
+
+git clone --depth 1 --branch "${version}" https://github.com/huacnlee/autocorrect.git "${tmp}/autocorrect"
+cargo generate-lockfile --manifest-path "${tmp}/autocorrect/Cargo.toml"
+cp "${tmp}/autocorrect/Cargo.lock" "$(dirname "$0")/Cargo.lock"
diff --git a/nixpkgs/pkgs/tools/text/base16384/default.nix b/nixpkgs/pkgs/tools/text/base16384/default.nix
new file mode 100644
index 000000000000..c9937fa5cd69
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/base16384/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+}:
+
+stdenv.mkDerivation rec {
+  pname = "base16384";
+  version = "2.2.5";
+
+  src = fetchFromGitHub {
+    owner = "fumiama";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-S9DA9C+6OJcSLJTSLRo9rolJO9yVQ0FOE7uwbvmJiGk=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  meta = with lib; {
+    description = "Encode binary files to printable utf16be";
+    homepage = "https://github.com/fumiama/base16384";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ aleksana ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/bashblog/0001-Setting-markdown_bin.patch b/nixpkgs/pkgs/tools/text/bashblog/0001-Setting-markdown_bin.patch
new file mode 100644
index 000000000000..7e6c78dd9dcb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/bashblog/0001-Setting-markdown_bin.patch
@@ -0,0 +1,25 @@
+From 1990ac93c9dbf3ada0eb2f045ef1aa95bbef7018 Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@tutanota.com>
+Date: Thu, 21 Apr 2022 07:40:30 -0600
+Subject: [PATCH] Setting markdown_bin
+
+---
+ bb.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/bb.sh b/bb.sh
+index 9d8e645..40fb54d 100755
+--- a/bb.sh
++++ b/bb.sh
+@@ -160,7 +160,7 @@ global_variables() {
+ 
+     # Markdown location. Trying to autodetect by default.
+     # The invocation must support the signature 'markdown_bin in.md > out.html'
+-    [[ -f Markdown.pl ]] && markdown_bin=./Markdown.pl || markdown_bin=$(which Markdown.pl 2>/dev/null || which markdown 2>/dev/null)
++    markdown_bin=@markdown_path@
+ }
+ 
+ # Check for the validity of some variables
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/tools/text/bashblog/default.nix b/nixpkgs/pkgs/tools/text/bashblog/default.nix
new file mode 100644
index 000000000000..0080ed0f7e1c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/bashblog/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, makeWrapper
+, substituteAll
+, perlPackages
+# Flags to enable processors
+# Currently, Markdown.pl does not work
+, usePandoc ? true
+, pandoc }:
+
+let
+  inherit (perlPackages) TextMarkdown;
+  # As bashblog supports various markdown processors
+  # we can set flags to enable a certain processor
+  markdownpl_path = "${perlPackages.TextMarkdown}/bin/Markdown.pl";
+  pandoc_path = "${pandoc}/bin/pandoc";
+
+in stdenv.mkDerivation {
+  pname = "bashblog";
+  version = "unstable-2022-03-26";
+
+  src = fetchFromGitHub {
+    owner = "cfenollosa";
+    repo = "bashblog";
+    rev = "c3d4cc1d905560ecfefce911c319469f7a7ff8a8";
+    sha256 = "sha256-THlP/JuaZzDq9QctidwLRiUVFxRhGNhRKleWbQiqsgg=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  buildInputs = [ TextMarkdown ]
+    ++ lib.optionals usePandoc [ pandoc ];
+
+  patches = [
+    (substituteAll {
+      src = ./0001-Setting-markdown_bin.patch;
+      markdown_path = if usePandoc then pandoc_path else markdownpl_path;
+    })
+  ];
+
+  postPatch = ''
+    patchShebangs bb.sh
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    install -Dm755 bb.sh $out/bin/bashblog
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A single Bash script to create blogs";
+    homepage = "https://github.com/cfenollosa/bashblog";
+    license = licenses.gpl3Only;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/book-summary/default.nix b/nixpkgs/pkgs/tools/text/book-summary/default.nix
new file mode 100644
index 000000000000..a1bbe710273c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/book-summary/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, rustPlatform
+, fetchCrate
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "book-summary";
+  version = "0.2.1";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-dxM6bqgHp4IaG03NriHvoT3al2u5Sz/I5ajlgzpjG1c=";
+  };
+
+  cargoHash = "sha256-QwydecdQaxvh6vWZvO30zgvvgUT6T5dvGRSmcuTUJmc=";
+
+  meta = with lib; {
+    description = "Book auto-summary for gitbook and mdBook";
+    homepage = "https://github.com/dvogt23/book-summary";
+    license = licenses.mit;
+    maintainers = with teams; iog.members;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/boxes/default.nix b/nixpkgs/pkgs/tools/text/boxes/default.nix
new file mode 100644
index 000000000000..f39349b2fbf0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/boxes/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchFromGitHub, bison, flex }:
+
+stdenv.mkDerivation rec {
+  pname = "boxes";
+  version = "1.3";
+
+  src = fetchFromGitHub {
+    owner = "ascii-boxes";
+    repo = "boxes";
+    rev = "v${version}";
+    sha256 = "0b12rsynrmkldlwcb62drk33kk0aqwbj10mq5y5x3hjf626gjwsi";
+  };
+
+  # Building instructions:
+  # https://boxes.thomasjensen.com/build.html#building-on-linux--unix
+  nativeBuildInputs = [ bison flex ];
+
+  dontConfigure = true;
+
+  # Makefile references a system wide config file in '/usr/share'. Instead, we
+  # move it within the store by default.
+  preBuild = ''
+    substituteInPlace Makefile \
+      --replace "GLOBALCONF = /usr/share/boxes" \
+                "GLOBALCONF=${placeholder "out"}/share/boxes/boxes-config"
+  '';
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  installPhase = ''
+    install -Dm755 -t $out/bin src/boxes
+    install -Dm644 -t $out/share/boxes boxes-config
+    install -Dm644 -t $out/share/man/man1 doc/boxes.1
+  '';
+
+  meta = with lib; {
+    description = "Command line ASCII boxes unlimited!";
+    longDescription = ''
+      Boxes is a command line filter program that draws ASCII art boxes around
+      your input text.
+    '';
+    homepage = "https://boxes.thomasjensen.com";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ waiting-for-dev ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/catdoc/default.nix b/nixpkgs/pkgs/tools/text/catdoc/default.nix
new file mode 100644
index 000000000000..db57243efdc2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/catdoc/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  pname = "catdoc";
+  version = "0.95";
+
+  src = fetchurl {
+    url = "http://ftp.wagner.pp.ru/pub/catdoc/${pname}-${version}.tar.gz";
+    sha256 = "514a84180352b6bf367c1d2499819dfa82b60d8c45777432fa643a5ed7d80796";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/c/catdoc/1:0.95-4.1/debian/patches/05-CVE-2017-11110.patch";
+      sha256 = "1ljnwvssvzig94hwx8843b88p252ww2lbxh8zybcwr3kwwlcymx7";
+    })
+  ];
+
+  # Remove INSTALL file to avoid `make` misinterpreting it as an up-to-date
+  # target on case-insensitive filesystems e.g. Darwin
+  preInstall = ''
+    rm -v INSTALL
+  '';
+
+  configureFlags = [ "--disable-wordview" ];
+
+  meta = with lib; {
+    description = "MS-Word/Excel/PowerPoint to text converter";
+    platforms = platforms.all;
+    license = licenses.gpl2;
+    maintainers = with maintainers; [];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/catdocx/default.nix b/nixpkgs/pkgs/tools/text/catdocx/default.nix
new file mode 100644
index 000000000000..c762e15c80e2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/catdocx/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, unzip, catdoc }:
+
+stdenv.mkDerivation {
+  pname = "catdocx";
+  version = "unstable-2017-01-02";
+
+  src = fetchFromGitHub {
+    owner = "jncraton";
+    repo = "catdocx";
+    rev = "04fa0416ec1f116d4996685e219f0856d99767cb";
+    sha256 = "1sxiqhkvdqn300ygfgxdry2dj2cqzjhkzw13c6349gg5vxfypcjh";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/libexec $out/bin
+    cp catdocx.sh $out/libexec
+    chmod +x $out/libexec/catdocx.sh
+    wrapProgram $out/libexec/catdocx.sh --prefix PATH : "${lib.makeBinPath [ unzip catdoc ]}"
+    ln -s $out/libexec/catdocx.sh $out/bin/catdocx
+  '';
+
+  meta = with lib; {
+    description = "Extracts plain text from docx files";
+    homepage = "https://github.com/jncraton/catdocx";
+    license = with licenses; [ bsd3 ];
+    maintainers = [ maintainers.michalrus ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/cconv/default.nix b/nixpkgs/pkgs/tools/text/cconv/default.nix
new file mode 100644
index 000000000000..de8405aed43b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/cconv/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "cconv";
+  version = "0.6.3";
+
+  src = fetchFromGitHub {
+    owner = "xiaoyjy";
+    repo = "cconv";
+    rev = "v${version}";
+    sha256 = "RAFl/+I+usUfeG/l17F3ltThK7G4+TekyQGwzQIgeH8=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ libiconv ];
+
+  meta = with lib; {
+    description = "A iconv based simplified-traditional chinese conversion tool";
+    homepage = "https://github.com/xiaoyjy/cconv";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = [ maintainers.redfish64 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/chars/default.nix b/nixpkgs/pkgs/tools/text/chars/default.nix
new file mode 100644
index 000000000000..74083feb68f5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/chars/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, fetchFromGitHub
+, rustPlatform
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "chars";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "antifuchs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-mBtwdPzIc6RgEFTyReStFlhS4UhhRWjBTKT6gD3tzpQ=";
+  };
+
+  cargoHash = "sha256-wqyExG4haco6jg1zpbouz3xMR7sjiVIAC16PnDU2tc8=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  meta = with lib; {
+    description = "Commandline tool to display information about unicode characters";
+    homepage = "https://github.com/antifuchs/chars";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bbigras ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/choose/default.nix b/nixpkgs/pkgs/tools/text/choose/default.nix
new file mode 100644
index 000000000000..f40fcd1e3b6d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/choose/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "choose";
+  version = "1.3.4";
+
+  src = fetchFromGitHub {
+    owner = "theryangeary";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yW1quDyQn2xhrlhhPj9DKq7g8LlYKvEKDFj3xSagRTU=";
+  };
+
+  cargoSha256 = "sha256-0INC0LFzlnFnt5pCiU4xePxU8a6GiU1L8bg7zcuFl2k=";
+
+  meta = with lib; {
+    description = "A human-friendly and fast alternative to cut and (sometimes) awk";
+    homepage = "https://github.com/theryangeary/choose";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ sohalt ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/chroma/default.nix b/nixpkgs/pkgs/tools/text/chroma/default.nix
new file mode 100644
index 000000000000..af5241de7a05
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/chroma/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+let
+  srcInfo = lib.importJSON ./src.json;
+in
+
+buildGoModule rec {
+  pname = "chroma";
+  version = "2.8.0";
+
+  # To update:
+  # nix-prefetch-git --rev v${version} https://github.com/alecthomas/chroma.git > src.json
+  src = fetchFromGitHub {
+    owner  = "alecthomas";
+    repo   = pname;
+    rev    = "v${version}";
+    inherit (srcInfo) sha256;
+  };
+
+  vendorHash = "sha256-Bol5yMvNYuoVnSjEgf3h6X4CeUooy2Hpdy3SCaNXXOE=";
+
+  modRoot = "./cmd/chroma";
+
+  # substitute version info as done in goreleaser builds
+  ldflags = [
+    "-X" "main.version=${version}"
+    "-X" "main.commit=${srcInfo.rev}"
+    "-X" "main.date=${srcInfo.date}"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/alecthomas/chroma";
+    description = "A general purpose syntax highlighter in pure Go";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/chroma/src.json b/nixpkgs/pkgs/tools/text/chroma/src.json
new file mode 100644
index 000000000000..8bba14faf188
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/chroma/src.json
@@ -0,0 +1,11 @@
+{
+  "url": "https://github.com/alecthomas/chroma.git",
+  "rev": "e8acfc274c22a76fd38030d2977a2246cd4322b3",
+  "date": "2023-06-30T08:43:39+10:00",
+  "path": "/nix/store/57y15g11dmdy2s6vxrjzl03s03j509gy-chroma",
+  "sha256": "0fdgpi5r0k42qzdn4lxh81ww1zcn9mwfildwrqf1s7crsqmr9dc5",
+  "fetchLFS": false,
+  "fetchSubmodules": false,
+  "deepClone": false,
+  "leaveDotGit": false
+}
diff --git a/nixpkgs/pkgs/tools/text/cidrgrep/default.nix b/nixpkgs/pkgs/tools/text/cidrgrep/default.nix
new file mode 100644
index 000000000000..0117374dadef
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/cidrgrep/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule {
+  pname = "cidrgrep";
+  version = "unstable-2020-11-17";
+
+  src = fetchFromGitHub {
+    owner = "tomdoherty";
+    repo = "cidrgrep";
+    rev = "8ad5af533e8dc33ea18ff19b7c6a41550748fe0e";
+    hash = "sha256-Bp1cST6/8ppvpgNxjUpwL498C9vTJmoWOKLJgmWqfEs=";
+  };
+
+  vendorHash = null;
+
+  postInstall = ''
+    mv $out/bin/cmd $out/bin/cidrgrep
+  '';
+
+  meta = {
+    description = "Like grep but for IPv4 CIDRs";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ das_j ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/clima/default.nix b/nixpkgs/pkgs/tools/text/clima/default.nix
new file mode 100644
index 000000000000..cfa39590a714
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/clima/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "clima";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "Canop";
+    repo = "clima";
+    rev = "v${version}";
+    hash = "sha256-CRnAxhkuCTyHR4uQofA51Dm3+YKqm3iwBkFNkbLTv1A=";
+  };
+
+  cargoHash = "sha256-jKY+Ta6lqMBUlqSViKk3W0CiO8oU+ucmleKDYRA54HQ=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  meta = with lib; {
+    description = "A minimal viewer for Termimad";
+    homepage = "https://github.com/Canop/clima";
+    changelog = "https://github.com/Canop/clima/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "clima";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/cmigemo/default.nix b/nixpkgs/pkgs/tools/text/cmigemo/default.nix
new file mode 100644
index 000000000000..179db9c337dd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/cmigemo/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchFromGitHub
+, iconv, nkf, perl, which
+, skk-dicts
+}:
+
+stdenv.mkDerivation {
+  pname = "cmigemo";
+  version = "1.3e";
+
+  src = fetchFromGitHub {
+    owner = "koron";
+    repo = "cmigemo";
+    rev = "e0f6145f61e0b7058c3006f344e58571d9fdd83a";
+    sha256 = "00a6kdmxp16b8x0p04ws050y39qspd1bqlfq74bkirc55b77a2m1";
+  };
+
+  nativeBuildInputs = [ iconv nkf perl which ];
+
+  postUnpack = ''
+    cp ${skk-dicts}/share/SKK-JISYO.L source/dict/
+  '';
+
+  patches = [ ./no-http-tool-check.patch ];
+
+  makeFlags = [ "INSTALL=install" ];
+
+  buildFlags = [ (if stdenv.isDarwin then "osx-all" else "gcc-all") ];
+
+  installTargets = [ (if stdenv.isDarwin then "osx-install" else "gcc-install") ];
+
+  meta = with lib; {
+    description = "A tool that supports Japanese incremental search with Romaji";
+    homepage = "https://www.kaoriya.net/software/cmigemo";
+    license = licenses.mit;
+    maintainers = [ maintainers.cohei ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/cmigemo/no-http-tool-check.patch b/nixpkgs/pkgs/tools/text/cmigemo/no-http-tool-check.patch
new file mode 100644
index 000000000000..518bfa0e6171
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/cmigemo/no-http-tool-check.patch
@@ -0,0 +1,23 @@
+diff --git a/configure b/configure
+index 4480261..2fb9b34 100755
+--- a/configure
++++ b/configure
+@@ -28,18 +28,6 @@ do
+   esac
+ done
+ 
+-# Check HTTP access tool
+-if CHECK_COMMAND curl ; then
+-  PROGRAM_HTTP="curl -O"
+-elif CHECK_COMMAND wget ; then
+-  PROGRAM_HTTP="wget"
+-elif CHECK_COMMAND fetch ; then
+-  PROGRAM_HTTP="fetch"
+-else
+-  echo "ERROR: Require one of HTTP access tools (curl, wget or fetch)."
+-  exit 1
+-fi
+-
+ # Check encoding filter
+ if CHECK_COMMAND qkc ; then
+   PROGRAM_ENCODEFILTER="qkc -q -u"
diff --git a/nixpkgs/pkgs/tools/text/codesearch/default.nix b/nixpkgs/pkgs/tools/text/codesearch/default.nix
new file mode 100644
index 000000000000..7a948388e09c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/codesearch/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "codesearch";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "codesearch";
+    rev = "v${version}";
+    sha256 = "sha256-i03w8PZ31j5EutUZaamZsHz+z4qgX4prePbj5DLA78s=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "Fast, indexed regexp search over large file trees";
+    homepage = "https://github.com/google/codesearch";
+    license = [ licenses.bsd3 ];
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/colordiff/default.nix b/nixpkgs/pkgs/tools/text/colordiff/default.nix
new file mode 100644
index 000000000000..4146429e2839
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/colordiff/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchFromGitHub, docbook_xml_dtd_412, docbook_xsl, perl, w3m-batch, xmlto, diffutils }:
+
+stdenv.mkDerivation rec {
+  pname = "colordiff";
+  version = "1.0.21";
+
+  src = fetchFromGitHub {
+    owner = "daveewart";
+    repo = "colordiff";
+    rev = "v${version}";
+    sha256 = "sha256-TNOw6dqsT0dOIddRoGwEF85CaQF8ICMFUi+GiG5WWpk=";
+  };
+
+  nativeBuildInputs = [ docbook_xml_dtd_412 docbook_xsl perl w3m-batch xmlto ];
+
+  buildInputs = [ perl ];
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace 'TMPDIR=colordiff-''${VERSION}' ""
+
+    substituteInPlace colordiff.pl \
+      --replace '= "diff";' '= "${diffutils}/bin/diff";'
+  '';
+
+  installFlags = [
+    "INSTALL_DIR=/bin"
+    "MAN_DIR=/share/man/man1"
+    "DESTDIR=${placeholder "out"}"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for 'diff' that produces the same output but with pretty 'syntax' highlighting";
+    homepage = "https://www.colordiff.org/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/coloursum/default.nix b/nixpkgs/pkgs/tools/text/coloursum/default.nix
new file mode 100644
index 000000000000..93ebf6c309e4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/coloursum/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "coloursum";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ticky";
+    repo = "coloursum";
+    rev = "v${version}";
+    hash = "sha256-zA2JhSnlFccSY01WMGsgF4AmrF/3BRUCcSMfoEbEPgA=";
+  };
+
+  cargoHash = "sha256-dhcTpff4h37MHNbLoYUZiolSclSGcFrMJ3kKLCZAVAw=";
+
+  buildInputs = lib.optional stdenv.isDarwin Security;
+
+  meta = with lib; {
+    description = "Colourise your checksum output";
+    homepage = "https://github.com/ticky/coloursum";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/comrak/default.nix b/nixpkgs/pkgs/tools/text/comrak/default.nix
new file mode 100644
index 000000000000..2254bb7e2c27
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/comrak/default.nix
@@ -0,0 +1,23 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "comrak";
+  version = "0.19.0";
+
+  src = fetchFromGitHub {
+    owner = "kivikakk";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-eyLgAVo4U0a1JByJsoWOnKGhDcaOhul145KeOOkmHq8=";
+  };
+
+  cargoSha256 = "sha256-Q9VmiC07UxstwRPertTteeHX34zTo58a2wPkQtSwUPU=";
+
+  meta = with lib; {
+    description = "A CommonMark-compatible GitHub Flavored Markdown parser and formatter";
+    homepage = "https://github.com/kivikakk/comrak";
+    changelog = "https://github.com/kivikakk/comrak/blob/${version}/changelog.txt";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/convertlit/default.nix b/nixpkgs/pkgs/tools/text/convertlit/default.nix
new file mode 100644
index 000000000000..4225934d2d4e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/convertlit/default.nix
@@ -0,0 +1,37 @@
+{lib, stdenv, fetchzip, libtommath}:
+
+stdenv.mkDerivation rec {
+  pname = "convertlit";
+  version = "1.8";
+
+  src = fetchzip {
+    url = "http://www.convertlit.com/convertlit${lib.replaceStrings ["."] [""] version}src.zip";
+    sha256 = "182nsin7qscgbw2h92m0zadh3h8q410h5cza6v486yjfvla3dxjx";
+    stripRoot = false;
+  };
+
+  buildInputs = [libtommath];
+
+  hardeningDisable = [ "format" ];
+
+  buildPhase = ''
+    cd lib
+    make
+    cd ../clit18
+    substituteInPlace Makefile \
+      --replace ../libtommath-0.30/libtommath.a -ltommath
+    make
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp clit $out/bin
+  '';
+
+  meta = {
+    homepage = "http://www.convertlit.com/";
+    description = "A tool for converting Microsoft Reader ebooks to more open formats";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/copyright-update/default.nix b/nixpkgs/pkgs/tools/text/copyright-update/default.nix
new file mode 100644
index 000000000000..e0318c20a0e6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/copyright-update/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "copyright-update";
+  version = "2016.1018";
+
+  src = fetchFromGitHub {
+    name = "${pname}-${version}-src";
+    owner = "jaalto";
+    repo = "project--copyright-update";
+    rev = "release/${version}";
+    sha256 = "1kj6jlgyxrgvrpv7fcgbibfqqa83xljp17v6sas42dlb105h6sgd";
+  };
+
+  buildInputs = [ perl ];
+
+  installFlags = [ "INSTALL=install" "prefix=$(out)" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jaalto/project--copyright-update";
+    description = "Updates the copyright information in a set of files";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.rycee ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/cringify/default.nix b/nixpkgs/pkgs/tools/text/cringify/default.nix
new file mode 100644
index 000000000000..6230f6575c3f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/cringify/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "cringify";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "sansyrox";
+    repo = "cringify";
+    rev = "dd753818f8dd4b343be9370d2c29a6be070ad791";
+    hash = "sha256-6hSgOk9DzDfGtZX1vt6AQsKSLdPdqy2Mz3UtK6d2AuA=";
+  };
+
+  cargoHash = "sha256-w6lqPyUCaXZBQ1EmMyj0sVnEHugMD6JugIIK0rEa19Y=";
+
+  postPatch = ''
+    # Upstream forgot to update the version value
+    substituteInPlace src/main.rs --replace '0.1.0' ${version}
+  '';
+
+  # No tests are present in the repository
+  doCheck = false;
+
+  meta = {
+    description = "Annoy your friends with the cringified text";
+    homepage = "https://github.com/sansyrox/cringify";
+    license = lib.licenses.mit;
+    mainProgram = "cringify";
+    maintainers = with lib.maintainers; [ tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/crowdin-cli/default.nix b/nixpkgs/pkgs/tools/text/crowdin-cli/default.nix
new file mode 100644
index 000000000000..a94cf3d51e63
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/crowdin-cli/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, fetchurl
+, gawk
+, git
+, gnugrep
+, installShellFiles
+, jre
+, makeWrapper
+, crowdin-cli
+, testers
+, unzip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "crowdin-cli";
+  version = "3.15.0";
+
+  src = fetchurl {
+    url = "https://github.com/crowdin/${pname}/releases/download/${version}/${pname}.zip";
+    hash = "sha256-ky+JNRay9VNscCXeGiSOIZlLKEcKv95TW/Kx2UtD1hA=";
+  };
+
+  nativeBuildInputs = [ installShellFiles makeWrapper unzip ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D crowdin-cli.jar $out/lib/crowdin-cli.jar
+
+    installShellCompletion --cmd crowdin --bash ./crowdin_completion
+
+    makeWrapper ${jre}/bin/java $out/bin/crowdin \
+      --argv0 crowdin \
+      --add-flags "-jar $out/lib/crowdin-cli.jar" \
+      --prefix PATH : ${lib.makeBinPath [ gawk gnugrep git ]}
+
+    runHook postInstall
+  '';
+
+  passthru.tests.version = testers.testVersion { package = crowdin-cli; };
+
+  meta = with lib; {
+    mainProgram = "crowdin";
+    homepage = "https://github.com/crowdin/crowdin-cli/";
+    description = "A command-line client for the Crowdin API";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.mit;
+    maintainers = with maintainers; [ DamienCassou ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/csvdiff/default.nix b/nixpkgs/pkgs/tools/text/csvdiff/default.nix
new file mode 100644
index 000000000000..236993b2dd25
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/csvdiff/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "csvdiff";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "aswinkarthik";
+    repo = "csvdiff";
+    rev = "v${version}";
+    hash = "sha256-66R5XxrNQ1YMMQicw0VCF/XzRo//5Gqdjlher/uMoTE=";
+  };
+
+  vendorHash = "sha256-rhOjBMCyfirEI/apL3ObHfKZeuNPGSt84R9lwCbRIpg=";
+
+  meta = with lib; {
+    homepage = "https://aswinkarthik.github.io/csvdiff/";
+    description = "A fast diff tool for comparing csv files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ turion ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/csview/default.nix b/nixpkgs/pkgs/tools/text/csview/default.nix
new file mode 100644
index 000000000000..0b69465ccfb9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/csview/default.nix
@@ -0,0 +1,22 @@
+{ fetchFromGitHub, lib, rustPlatform }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "csview";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "wfxr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-pv0zCtVHTjzkXK5EZhu6jviMJF0p9dvAuYcA6khiIos=";
+  };
+
+  cargoSha256 = "sha256-uMBwEbxI8hjoFMlH+oquHvKdyLUC9bnO5uMFHkyZjgY=";
+
+  meta = with lib; {
+    description = "A high performance csv viewer with cjk/emoji support";
+    homepage = "https://github.com/wfxr/csview";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/csvkit/default.nix b/nixpkgs/pkgs/tools/text/csvkit/default.nix
new file mode 100644
index 000000000000..cfebb5674327
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/csvkit/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, python3
+, fetchPypi
+}:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: {
+      sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec {
+        version = "1.4.46";
+        src = fetchPypi {
+          pname = "SQLAlchemy";
+          inherit version;
+          hash = "sha256-aRO4JH2KKS74MVFipRkx4rQM6RaB8bbxj2lwRSAMSjA=";
+        };
+        disabledTestPaths = [
+           "test/aaa_profiling"
+           "test/ext/mypy"
+        ];
+      });
+    };
+  };
+in
+python.pkgs.buildPythonApplication rec {
+  pname = "csvkit";
+  version = "1.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vt23t49rIq2+1urVrV3kv7Md0sVfMhGyorO2VSkEkiM=";
+  };
+
+  propagatedBuildInputs = with python.pkgs; [
+    agate
+    agate-excel
+    agate-dbf
+    agate-sql
+    setuptools # csvsql imports pkg_resources
+  ];
+
+  nativeCheckInputs = with python.pkgs; [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "csvkit"
+  ];
+
+  disabledTests = [
+    # Test is comparing CLI output
+    "test_decimal_format"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/wireservice/csvkit/blob/${version}/CHANGELOG.rst";
+    description = "A suite of command-line tools for converting to and working with CSV";
+    homepage = "https://github.com/wireservice/csvkit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/csvquote/csvquote-path.patch b/nixpkgs/pkgs/tools/text/csvquote/csvquote-path.patch
new file mode 100644
index 000000000000..a3f87055f238
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/csvquote/csvquote-path.patch
@@ -0,0 +1,14 @@
+--- a/csvheader
++++ b/csvheader
+@@ -29,10 +29,6 @@ while getopts "d:tq:r:" arg; do
+     esac
+ done
+ 
+-CSVQUOTE=`which csvquote` || CSVQUOTE="./csvquote"
+-if [ ! -f $CSVQUOTE ]; then
+-    echo "csvquote program not found. exiting"
+-    exit 1
+-fi
++CSVQUOTE=@out@/bin/csvquote
+ 
+ $CSVQUOTE $@ | head -n 1 | tr "$DEL" '\n' | nl -ba | $CSVQUOTE -u -d "$DEL" -q "$QUO" -r "$REC"
diff --git a/nixpkgs/pkgs/tools/text/csvquote/default.nix b/nixpkgs/pkgs/tools/text/csvquote/default.nix
new file mode 100644
index 000000000000..e4bf9b5a3377
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/csvquote/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, patsh
+}:
+
+stdenv.mkDerivation rec {
+  pname = "csvquote";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "dbro";
+    repo = "csvquote";
+    rev = "v${version}";
+    hash = "sha256-847JAoDEfA9K4LB8z9cqSw+GTImqmITBylB/4odLDb0=";
+  };
+
+  patches = [
+    # patch csvheader to use csvquote from the derivation
+    ./csvquote-path.patch
+  ];
+
+  nativeBuildInputs = [
+    patsh
+  ];
+
+  makeFlags = [
+    "BINDIR=$(out)/bin"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/bin"
+  '';
+
+  postInstall = ''
+    substituteAllInPlace $out/bin/csvheader
+    patsh $out/bin/csvheader -fs ${builtins.storeDir}
+  '';
+
+  meta = with lib; {
+    description = "Enables common unix utilities like cut, awk, wc, head to work correctly with csv data containing delimiters and newlines";
+    homepage = "https://github.com/dbro/csvquote";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/d2/default.nix b/nixpkgs/pkgs/tools/text/d2/default.nix
new file mode 100644
index 000000000000..bca032d6ddf9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/d2/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+, git
+, testers
+, d2
+}:
+
+buildGoModule rec {
+  pname = "d2";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "terrastruct";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-bp45tkV7f6rGDAmhle/e3cHIqa7nPakANvk4QxetLts=";
+  };
+
+  vendorHash = "sha256-QMptNFCoJouI555WkA+4TJhaEzQgJJmca3jVpM3neeI=";
+
+  excludedPackages = [ "./e2etests" ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X oss.terrastruct.com/d2/lib/version.Version=v${version}"
+  ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall = ''
+    installManPage ci/release/template/man/d2.1
+  '';
+
+  nativeCheckInputs = [ git ];
+
+  preCheck = ''
+    # See https://github.com/terrastruct/d2/blob/master/docs/CONTRIBUTING.md#running-tests.
+    export TESTDATA_ACCEPT=1
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = d2;
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "A modern diagram scripting language that turns text to diagrams";
+    homepage = "https://d2lang.com";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ dit7ya kashw2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dadadodo/default.nix b/nixpkgs/pkgs/tools/text/dadadodo/default.nix
new file mode 100644
index 000000000000..a70a7efda72e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dadadodo/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "dadadodo";
+  version = "1.04";
+
+  src = fetchurl {
+    url = "https://www.jwz.org/dadadodo/${pname}-${version}.tar.gz";
+    sha256 = "1pzwp3mim58afjrc92yx65mmgr1c834s1v6z4f4gyihwjn8bn3if";
+  };
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp dadadodo $out/bin
+  '';
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    description = "Markov chain-based text generator";
+    homepage = "http://www.jwz.org/dadadodo";
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dcs/default.nix b/nixpkgs/pkgs/tools/text/dcs/default.nix
new file mode 100644
index 000000000000..0f438e4ff571
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dcs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, yuicompressor
+, zopfli
+, stdenv
+}:
+buildGoModule {
+  pname = "dcs";
+  version = "unstable-2021-04-07";
+
+  src = fetchFromGitHub {
+    owner = "Debian";
+    repo = "dcs";
+    rev = "da46accc4d55e9bfde1a6852ac5a9e730fcbbb2c";
+    hash = "sha256-N+6BXlKn1YTlh0ZdPNWa0nuJNcQtlUIc9TocM8cbzQk=";
+  };
+
+  vendorHash = "sha256-l2mziuisx0HzuP88rS5M+Wha6lu8P036wJYZlmzjWfs=";
+
+  # Depends on dcs binaries
+  doCheck = false;
+
+  nativeBuildInputs = [
+    yuicompressor
+    zopfli
+  ];
+
+  postBuild = ''
+    make -C static -j$NIX_BUILD_CORES
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/dcs
+    cp -r cmd/dcs-web/templates $out/share/dcs
+    cp -r static $out/share/dcs
+  '';
+
+  meta = with lib; {
+    description = "Debian Code Search";
+    homepage = "https://github.com/Debian/dcs";
+    license = licenses.bsd3;
+    maintainers = [ ];
+    broken = stdenv.isAarch64
+      || stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/dcs.x86_64-darwin
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dfmt/default.nix b/nixpkgs/pkgs/tools/text/dfmt/default.nix
new file mode 100644
index 000000000000..f09ce0b45256
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dfmt/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, python3
+, fetchPypi
+}:
+
+let
+  inherit (python3.pkgs)
+    buildPythonApplication
+    pythonOlder;
+in
+buildPythonApplication rec {
+  pname = "dfmt";
+  version = "1.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7af6360ca8d556f1cfe82b97f03b8d1ea5a9d6de1fa3018290c844b6566d9d6e";
+  };
+
+  meta = with lib; {
+    description = "Format paragraphs, comments and doc strings";
+    homepage = "https://github.com/dmerejkowsky/dfmt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cole-h ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/diction/default.nix b/nixpkgs/pkgs/tools/text/diction/default.nix
new file mode 100644
index 000000000000..be486cccf549
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/diction/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "diction";
+  version = "1.13";
+
+  src = fetchurl {
+    url = "http://www.moria.de/~michael/diction/${pname}-${version}.tar.gz";
+    sha256 = "08fi971b8qa4xycxbgb42i6b5ms3qx9zpp5hwpbxy2vypfs0wph9";
+  };
+
+  meta = {
+    description = "GNU style and diction utilities";
+    longDescription = ''
+      Diction and style are two old standard Unix commands. Diction identifies
+      wordy and commonly misused phrases. Style analyses surface
+      characteristics of a document, including sentence length and other
+      readability measures.
+    '';
+    license = lib.licenses.gpl3Plus;
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/diffr/default.nix b/nixpkgs/pkgs/tools/text/diffr/default.nix
new file mode 100644
index 000000000000..ee12b39c3ec3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/diffr/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "diffr";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "mookid";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ylZE2NtTXbGqsxE72ylEQCacTyxBO+/WgvEpoXd5OZI=";
+  };
+
+  cargoHash = "sha256-RmQu55OnKfeuDGcJrfjhMKnxDatdowkvh3Kh4N8I8Sg=";
+
+  buildInputs = (lib.optional stdenv.isDarwin Security);
+
+  preCheck = ''
+    export DIFFR_TESTS_BINARY_PATH=$releaseDir/diffr
+  '';
+
+  meta = with lib; {
+    description = "Yet another diff highlighting tool";
+    homepage = "https://github.com/mookid/diffr";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/diffsitter/default.nix b/nixpkgs/pkgs/tools/text/diffsitter/default.nix
new file mode 100644
index 000000000000..e46286bc0e81
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/diffsitter/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, fetchFromGitHub
+, linkFarm
+, makeWrapper
+, rustPlatform
+, tree-sitter
+}:
+
+let
+  # based on https://github.com/NixOS/nixpkgs/blob/aa07b78b9606daf1145a37f6299c6066939df075/pkgs/development/tools/parsing/tree-sitter/default.nix#L85-L104
+  withPlugins = grammarFn:
+    let
+      grammars = grammarFn tree-sitter.builtGrammars;
+    in
+    linkFarm "grammars"
+      (map
+        (drv:
+          let
+            name = lib.strings.getName drv;
+          in
+          {
+            name =
+              "lib" +
+              (lib.strings.removeSuffix "-grammar" name)
+              + ".so";
+            path = "${drv}/parser";
+          }
+        )
+        grammars);
+
+  libPath = withPlugins (_: tree-sitter.allGrammars);
+in
+rustPlatform.buildRustPackage rec {
+  pname = "diffsitter";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "afnanenayet";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-8nKZ8zcZSSF7Qd36kA9IQjio+TIhlQWRgMqKrsdInj4=";
+    fetchSubmodules = false;
+  };
+
+  cargoHash = "sha256-LEBAMb9tROpjrWEfucw+2ZaytnoyJE477IH3MyeUGEA=";
+
+  buildNoDefaultFeatures = true;
+  buildFeatures = [
+    "dynamic-grammar-libs"
+  ];
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  postInstall = ''
+    # completions are not yet implemented
+    # so we can safely remove this without installing the completions
+    rm $out/bin/diffsitter_completions
+
+    wrapProgram "$out/bin/diffsitter" \
+      --prefix LD_LIBRARY_PATH : "${libPath}"
+  '';
+
+  doCheck = false;
+  # failures:
+  #     tests::diff_hunks_snapshot::_medium_cpp_cpp_false_expects
+  #     tests::diff_hunks_snapshot::_medium_cpp_cpp_true_expects
+  #     tests::diff_hunks_snapshot::_medium_rust_rs_false_expects
+  #     tests::diff_hunks_snapshot::_medium_rust_rs_true_expects
+  #     tests::diff_hunks_snapshot::_short_python_py_true_expects
+  #     tests::diff_hunks_snapshot::_short_rust_rs_true_expects
+
+  meta = with lib; {
+    homepage = "https://github.com/afnanenayet/diffsitter";
+    description = "A tree-sitter based AST difftool to get meaningful semantic diffs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bbigras ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/diffstat/default.nix b/nixpkgs/pkgs/tools/text/diffstat/default.nix
new file mode 100644
index 000000000000..15baee3c39d1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/diffstat/default.nix
@@ -0,0 +1,27 @@
+{ fetchurl, lib, stdenv }:
+
+stdenv.mkDerivation rec {
+  pname = "diffstat";
+  version = "1.65";
+
+  src = fetchurl {
+    urls = [
+      "ftp://ftp.invisible-island.net/diffstat/diffstat-${version}.tgz"
+      "https://invisible-mirror.net/archives/diffstat/diffstat-${version}.tgz"
+    ];
+    sha256 = "sha256-jPJ0JJJt682FkhdVw5FVWSiCRL0QP2LXQNxrg7VXooo=";
+  };
+
+  meta = with lib; {
+    description = "Read output of diff and display a histogram of the changes";
+    longDescription = ''
+      diffstat reads the output of diff and displays a histogram of the
+      insertions, deletions, and modifications per-file. It is useful for
+      reviewing large, complex patch files.
+    '';
+    homepage = "https://invisible-island.net/diffstat/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/difftastic/Cargo.lock b/nixpkgs/pkgs/tools/text/difftastic/Cargo.lock
new file mode 100644
index 000000000000..f381f2979312
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/difftastic/Cargo.lock
@@ -0,0 +1,1109 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "assert_cmd"
+version = "2.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5c2ca00549910ec251e3bd15f87aeeb206c9456b9a77b43ff6c97c54042a472"
+dependencies = [
+ "bstr",
+ "doc-comment",
+ "predicates",
+ "predicates-core",
+ "predicates-tree",
+ "wait-timeout",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
+
+[[package]]
+name = "bytecount"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72feb31ffc86498dacdbd0fcebb56138e7177a8cc5cea4516031d15ae85a742e"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clap"
+version = "3.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_lex",
+ "indexmap",
+ "lazy_static",
+ "strsim",
+ "termcolor",
+ "terminal_size",
+ "textwrap",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "const_format"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0936ffe6d0c8d6a51b3b0a73b2acbe925d786f346cf45bfddc8341d79fb7dc8a"
+dependencies = [
+ "const_format_proc_macros",
+]
+
+[[package]]
+name = "const_format_proc_macros"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossterm"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a84cda67535339806297f1b331d6dd6320470d2a0fe65381e79ee9e156dd3d13"
+dependencies = [
+ "bitflags",
+ "crossterm_winapi",
+ "libc",
+ "mio",
+ "parking_lot",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "ctor"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
+dependencies = [
+ "quote",
+ "syn 1.0.95",
+]
+
+[[package]]
+name = "diff"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
+
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
+[[package]]
+name = "difftastic"
+version = "0.52.0"
+dependencies = [
+ "assert_cmd",
+ "bumpalo",
+ "cc",
+ "clap",
+ "const_format",
+ "crossterm",
+ "glob",
+ "hashbrown 0.12.3",
+ "humansize",
+ "itertools 0.11.0",
+ "lazy_static",
+ "libc",
+ "libmimalloc-sys",
+ "line-numbers",
+ "log",
+ "mimalloc",
+ "owo-colors",
+ "predicates",
+ "pretty_assertions",
+ "pretty_env_logger",
+ "radix-heap",
+ "rayon",
+ "regex",
+ "rustc-hash",
+ "serde",
+ "serde_json",
+ "strsim",
+ "strum",
+ "tree-sitter",
+ "tree_magic_mini",
+ "typed-arena",
+ "unicode-width",
+ "version_check",
+ "walkdir",
+ "wu-diff",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "env_logger"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+dependencies = [
+ "atty",
+ "humantime",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e"
+
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "humansize"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
+dependencies = [
+ "libm",
+]
+
+[[package]]
+name = "humantime"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
+dependencies = [
+ "quick-error",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.11.2",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+
+[[package]]
+name = "libm"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
+
+[[package]]
+name = "libmimalloc-sys"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7705fc40f6ed493f73584abbb324e74f96b358ff60dfe5659a0f8fc12c590a69"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "line-numbers"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793a75315eb63b8699158825bdea85d63eeb850e7543cb834abef3c7b5b53780"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mimalloc"
+version = "0.1.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0dfa131390c2f6bdb3242f65ff271fcdaca5ff7b6c08f28398be7f2280e3926"
+dependencies = [
+ "libmimalloc-sys",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "mio"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "normalize-line-endings"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "os_str_bytes"
+version = "6.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435"
+
+[[package]]
+name = "output_vt100"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "owo-colors"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys",
+]
+
+[[package]]
+name = "petgraph"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51b305cc4569dd4e8765bab46261f67ef5d4d11a4b6e745100ee5dad8948b46c"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
+]
+
+[[package]]
+name = "predicates"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
+dependencies = [
+ "difflib",
+ "float-cmp",
+ "itertools 0.10.3",
+ "normalize-line-endings",
+ "predicates-core",
+ "regex",
+]
+
+[[package]]
+name = "predicates-core"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
+
+[[package]]
+name = "predicates-tree"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
+dependencies = [
+ "predicates-core",
+ "termtree",
+]
+
+[[package]]
+name = "pretty_assertions"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755"
+dependencies = [
+ "ctor",
+ "diff",
+ "output_vt100",
+ "yansi",
+]
+
+[[package]]
+name = "pretty_env_logger"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d"
+dependencies = [
+ "env_logger",
+ "log",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
+[[package]]
+name = "quote"
+version = "1.0.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radix-heap"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ffec9df464013295b499298811e6a3de31bf8128092135826517db12dee601"
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustversion"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.176"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.176"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.27",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "strum"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+dependencies = [
+ "strum_macros",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6069ca09d878a33f883cc06aaa9718ede171841d3832450354410b718b097232"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn 2.0.27",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "termtree"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
+
+[[package]]
+name = "textwrap"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
+dependencies = [
+ "terminal_size",
+]
+
+[[package]]
+name = "tree-sitter"
+version = "0.20.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4423c784fe11398ca91e505cdc71356b07b1a924fc8735cfab5333afe3e18bc"
+dependencies = [
+ "cc",
+ "regex",
+]
+
+[[package]]
+name = "tree_magic_mini"
+version = "3.0.2"
+source = "git+https://github.com/Wilfred/tree_magic?branch=fix-panic-for-empty-strings#13dd6dda15c7062bd8f7dd5bc9bb5b16ce9ee613"
+dependencies = [
+ "bytecount",
+ "fnv",
+ "lazy_static",
+ "nom",
+ "once_cell",
+ "petgraph",
+]
+
+[[package]]
+name = "typed-arena"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wait-timeout"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+
+[[package]]
+name = "wu-diff"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e3e6735fcde06432870db8dc9d7e3ab1b93727c14eaef329969426299f28893"
+
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
diff --git a/nixpkgs/pkgs/tools/text/difftastic/default.nix b/nixpkgs/pkgs/tools/text/difftastic/default.nix
new file mode 100644
index 000000000000..1db60b38a8de
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/difftastic/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchpatch
+, rustPlatform
+, fetchFromGitHub
+, testers
+, difftastic
+}:
+
+let
+  mimallocPatch = fetchpatch {
+    name = "fix-build-on-older-macos-releases.patch";
+    url = "https://github.com/microsoft/mimalloc/commit/40e0507a5959ee218f308d33aec212c3ebeef3bb.patch";
+    sha256 = "sha256-DK0LqsVXXiEVQSQCxZ5jyZMg0UJJx9a/WxzCroYSHZc=";
+  };
+in
+
+rustPlatform.buildRustPackage rec {
+  pname = "difftastic";
+  version = "0.52.0";
+
+  src = fetchFromGitHub {
+    owner = "wilfred";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ve5oUvclHGgw56UEIuEQ0tSdzad94MfL6qzc2hoB0dw=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "tree_magic_mini-3.0.2" = "sha256-iIX/DeDbquObDPOx/pctVFN4R8GSkD9bPNkNgOLdUJs=";
+    };
+  };
+
+  postPatch = ''
+    patch -d $cargoDepsCopy/libmimalloc-sys-0.1.24/c_src/mimalloc \
+      -p1 < ${mimallocPatch}
+  '';
+
+  passthru.tests.version = testers.testVersion { package = difftastic; };
+
+  meta = with lib; {
+    description = "A syntax-aware diff";
+    homepage = "https://github.com/Wilfred/difftastic";
+    changelog = "https://github.com/Wilfred/difftastic/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ethancedwards8 figsoda ];
+    mainProgram = "difft";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/diffutils/default.nix b/nixpkgs/pkgs/tools/text/diffutils/default.nix
new file mode 100644
index 000000000000..35e0fb5e6b96
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/diffutils/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, xz, coreutils ? null }:
+
+# Note: this package is used for bootstrapping fetchurl, and thus
+# cannot use fetchpatch! All mutable patches (generated by GitHub or
+# cgit) that are needed here should be included directly in Nixpkgs as
+# files.
+
+stdenv.mkDerivation rec {
+  pname = "diffutils";
+  version = "3.10";
+
+  src = fetchurl {
+    url = "mirror://gnu/diffutils/diffutils-${version}.tar.xz";
+    hash = "sha256-kOXpPMck5OvhLt6A3xY0Bjx6hVaSaFkZv+YLVWyb0J4=";
+  };
+
+  outputs = [ "out" "info" ];
+
+  nativeBuildInputs = [ (lib.getBin xz) ];
+  /* If no explicit coreutils is given, use the one from stdenv. */
+  buildInputs = [ coreutils ];
+
+  # Disable stack-related gnulib tests on x86_64-darwin because they have problems running under
+  # Rosetta 2: test-c-stack hangs, test-sigsegv-catch-stackoverflow fails.
+  postPatch = if (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) then ''
+    sed -i -E 's:test-c-stack2?\.sh::g' gnulib-tests/Makefile.in
+    sed -i -E 's:test-sigsegv-catch-stackoverflow[12]::g' gnulib-tests/Makefile.in
+  '' else null;
+
+  configureFlags =
+    # "pr" need not be on the PATH as a run-time dep, so we need to tell
+    # configure where it is. Covers the cross and native case alike.
+    lib.optional (coreutils != null) "PR_PROGRAM=${coreutils}/bin/pr"
+    ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "gl_cv_func_getopt_gnu=yes";
+
+  doCheck = !(stdenv.buildPlatform.isAarch64 && stdenv.buildPlatform.isMusl);
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/diffutils/diffutils.html";
+    description = "Commands for showing the differences between files (diff, cmp, etc.)";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ das_j ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dirdiff/default.nix b/nixpkgs/pkgs/tools/text/dirdiff/default.nix
new file mode 100644
index 000000000000..437743e66ef6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dirdiff/default.nix
@@ -0,0 +1,64 @@
+{ copyDesktopItems, fetchurl, lib, makeDesktopItem, stdenv, tcl, tk }:
+
+stdenv.mkDerivation rec {
+  pname = "dirdiff";
+  version = "2.1";
+
+  src = fetchurl {
+    url = "mirror://samba/paulus/${pname}-${version}.tar.gz";
+    sha256 = "0lljd8av68j70733yshzzhxjr1lm0vgmbqsm8f02g03qsma3cdyb";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems ];
+  buildInputs = [ tcl tk ];
+
+  # Some light path patching.
+  patches = [ ./dirdiff-2.1-vars.patch ];
+  postPatch = ''
+    for file in dirdiff Makefile; do
+      substituteInPlace "$file" \
+          --subst-var out \
+          --subst-var-by tcl ${tcl} \
+          --subst-var-by tk ${tk}
+    done
+  '';
+
+  env = {
+    NIX_CFLAGS_COMPILE = "-DUSE_INTERP_RESULT";
+    NIX_LDFLAGS = "-ltcl";
+  };
+
+  # If we don't create the directories ourselves, then 'make install' creates
+  # files named 'bin' and 'lib'.
+  preInstall = ''
+    mkdir -p $out/bin $out/lib
+  '';
+
+  installFlags = [
+    "BINDIR=${placeholder "out"}/bin"
+    "LIBDIR=${placeholder "out"}/lib"
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "dirdiff";
+      exec = "dirdiff";
+      desktopName = "Dirdiff";
+      genericName = "Directory Diff Viewer";
+      comment = "Diff and merge directory trees";
+      categories = [ "Development" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "Graphical directory tree diff and merge tool";
+    longDescription = ''
+      Dirdiff is a graphical tool for displaying the differences between
+      directory trees and for merging changes from one tree into another.
+    '';
+    homepage = "https://www.samba.org/ftp/paulus/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ khumba ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch b/nixpkgs/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch
new file mode 100644
index 000000000000..4e7aa025754a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch
@@ -0,0 +1,32 @@
+diff '--color=auto' -ru dirdiff-2.1/dirdiff dirdiff-2.1-patched/dirdiff
+--- dirdiff-2.1/dirdiff	2005-04-20 03:09:53.000000000 -0700
++++ dirdiff-2.1-patched/dirdiff	2021-02-14 22:54:09.837692023 -0800
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ # Tcl ignores the next line \
+-exec wish "$0" -- "${1+$@}"
++exec @tk@/bin/wish "$0" -- "${1+$@}"
+ 
+ # Copyright (C) 1999-2004 Paul Mackerras.  All rights reserved.
+ # This program is free software; it may be used, copied, modified
+@@ -17,7 +17,7 @@
+ set TclExe [info nameofexecutable]
+ set compound_ok [expr {$tcl_version >= 8.4}]
+ 
+-set nofilecmp [catch {load libfilecmp.so.0.0}]
++set nofilecmp [catch {load @out@/lib/libfilecmp.so.0.0}]
+ set rcsflag {}
+ set diffbflag {}
+ set diffBflag {}
+diff '--color=auto' -ru dirdiff-2.1/Makefile dirdiff-2.1-patched/Makefile
+--- dirdiff-2.1/Makefile	2005-04-19 03:22:01.000000000 -0700
++++ dirdiff-2.1-patched/Makefile	2021-02-14 22:54:58.575400923 -0800
+@@ -7,7 +7,7 @@
+ INSTALL=install
+ 
+ # You may need to change the -I arguments depending on your system
+-CFLAGS=-O3 -I/usr/include/tcl8.3/ -I/usr/include/tcl
++CFLAGS=-O3 -I@tcl@/include
+ 
+ all:	libfilecmp.so.0.0
+ 
diff --git a/nixpkgs/pkgs/tools/text/discount/default.nix b/nixpkgs/pkgs/tools/text/discount/default.nix
new file mode 100644
index 000000000000..7cfdb018ef75
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/discount/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  version = "2.2.7b";
+  pname = "discount";
+
+  src = fetchFromGitHub {
+    owner = "Orc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-S6OVKYulhvEPRqNXBsvZ7m2W4cbdnrpZKPAo3SfD+9s=";
+  };
+
+  patches = [ ./fix-configure-path.patch ];
+  configureScript = "./configure.sh";
+  configureFlags = [
+    "--shared"
+    "--debian-glitch" # use deterministic mangling
+    "--pkg-config"
+    "--h1-title"
+  ];
+
+  enableParallelBuilding = true;
+  installTargets = [ "install.everything" ];
+
+  doCheck = true;
+
+  postFixup = lib.optionalString stdenv.isDarwin ''
+    install_name_tool -id "$out/lib/libmarkdown.dylib" "$out/lib/libmarkdown.dylib"
+    for exe in $out/bin/*; do
+      install_name_tool -change libmarkdown.dylib "$out/lib/libmarkdown.dylib" "$exe"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Implementation of Markdown markup language in C";
+    homepage = "http://www.pell.portland.or.us/~orc/Code/discount/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ shell ];
+    mainProgram = "markdown";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/discount/fix-configure-path.patch b/nixpkgs/pkgs/tools/text/discount/fix-configure-path.patch
new file mode 100644
index 000000000000..045b369b4b69
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/discount/fix-configure-path.patch
@@ -0,0 +1,12 @@
+diff -rupN discount-2.1.6-original/configure.inc discount-2.1.6/configure.inc
+--- discount-2.1.6-original/configure.inc	2014-10-10 15:34:24.158325345 +0100
++++ discount-2.1.6/configure.inc	2014-10-10 15:34:33.553325321 +0100
+@@ -32,7 +32,7 @@
+ # this preamble code is executed when this file is sourced and it picks
+ # interesting things off the command line.
+ #
+-ac_default_path="/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin"
++ac_default_path=$PATH
+ 
+ ac_standard="--src=DIR		where the source lives (.)
+ --prefix=DIR		where to install the final product (/usr/local)
diff --git a/nixpkgs/pkgs/tools/text/djot-js/default.nix b/nixpkgs/pkgs/tools/text/djot-js/default.nix
new file mode 100644
index 000000000000..bd8b742cc184
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/djot-js/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+, fetchpatch
+, installShellFiles
+}:
+
+buildNpmPackage rec {
+  pname = "djot-js";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "jgm";
+    repo = "djot.js";
+    rev = "@djot/djot@${version}";
+    hash = "sha256-W/ZQXJXvFEIgj5PeI+jvw4nIkNP4qa1NyQCOv0unIuA=";
+  };
+
+  npmDepsHash = "sha256-x/Oc39S6XwZ/ZsS/lmMU9OkHLlKuUxETYmD8pdHAIg8=";
+
+  patches = [
+    # djot.js v0.2.3 doesn't include package-lock.json in the repository
+    # remove at next release
+    (fetchpatch {
+      name = "add-package-lock-json-and-yarn-lock-to-repository.patch";
+      url = "https://github.com/jgm/djot.js/commit/15ed52755b2968932d4a9a80805b9ea6183fe539.patch";
+      hash = "sha256-saNmU7z4IOOG3ptXMFDSNci5uu0d2GiVZ/FAlaNccTc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  postInstall = ''
+    installManPage doc/djot.1
+  '';
+
+  meta = with lib; {
+    description = "JavaScript implementation of djot";
+    homepage = "https://github.com/jgm/djot.js";
+    changelog = "https://github.com/jgm/djot.js/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "djot";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dos2unix/default.nix b/nixpkgs/pkgs/tools/text/dos2unix/default.nix
new file mode 100644
index 000000000000..5505893b4ec6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dos2unix/default.nix
@@ -0,0 +1,23 @@
+{lib, stdenv, fetchurl, perl, gettext }:
+
+stdenv.mkDerivation rec {
+  pname = "dos2unix";
+  version = "7.5.1";
+
+  src = fetchurl {
+    url = "https://waterlan.home.xs4all.nl/dos2unix/${pname}-${version}.tar.gz";
+    sha256 = "sha256-2gd4i7LgKbDWP2Rx0Wb2hSis2Nos8UgjoYjoqdXB/BU=";
+  };
+
+  nativeBuildInputs = [ perl gettext ];
+  makeFlags = [ "prefix=${placeholder "out"}" ];
+
+  meta = with lib; {
+    description = "Convert text files with DOS or Mac line breaks to Unix line breaks and vice versa";
+    homepage = "https://waterlan.home.xs4all.nl/dos2unix.html";
+    changelog = "https://sourceforge.net/p/dos2unix/dos2unix/ci/dos2unix-${version}/tree/dos2unix/NEWS.txt?format=raw";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ c0bw3b ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/dt/default.nix b/nixpkgs/pkgs/tools/text/dt/default.nix
new file mode 100644
index 000000000000..bc4c0dd9938e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/dt/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, testers
+, zig_0_11
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "dt";
+  version = "1.2.4";
+
+  src = fetchFromGitHub {
+    owner = "so-dang-cool";
+    repo = "dt";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-u9MI6mrP+QXr3VDgmXW7GRkHKCiDoA9HlznTEGNsck4=";
+  };
+
+  nativeBuildInputs = [ zig_0_11.hook ];
+
+  passthru.tests.version = testers.testVersion { package = finalAttrs.finalPackage; };
+
+  meta = {
+    homepage = "https://dt.plumbing";
+    description = "Duct tape for your unix pipes";
+    longDescription = ''
+      dt is a utility and programming language. The utility is intended for
+      ergonomic in-the-shell execution. The language is straightforward (in
+      the most literal sense) with a minimal syntax that allows for
+      high-level, higher-order programming.
+
+      It's meant to supplement (not replace!) other tools like awk, sed,
+      xargs, and shell built-ins. Something like the Perl one-liners popular
+      yesteryear, but hopefully easier to read and reason through.
+
+      In short, dt is intended to be generally useful, with zero pretense of
+      elegance.
+    '';
+    changelog = "https://github.com/so-dang-cool/dt/releases/tag/v${finalAttrs.version}";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ booniepepper ];
+    platforms = lib.platforms.unix;
+    mainProgram = "dt";
+  };
+})
diff --git a/nixpkgs/pkgs/tools/text/each/default.nix b/nixpkgs/pkgs/tools/text/each/default.nix
new file mode 100644
index 000000000000..02974030b269
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/each/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "each";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "arraypad";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-5Aa/uHWrU4bpWd28Uddnuhmi6guHy09W9AU8sAfea6I=";
+  };
+
+  cargoSha256 = "sha256-sH9rraPNAIlW2KQVaZfYa10c1HHQpDgedY1+9e94RLE=";
+
+  meta = with lib; {
+    description = " A better way of working with structured data on the command line";
+    homepage = "https://github.com/arraypad/each";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ebook-tools/default.nix b/nixpkgs/pkgs/tools/text/ebook-tools/default.nix
new file mode 100644
index 000000000000..5efdb69fe453
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ebook-tools/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchurl, cmake, pkg-config, libxml2, libzip }:
+
+stdenv.mkDerivation rec {
+  pname = "ebook-tools";
+  version = "0.2.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/ebook-tools/ebook-tools-${version}.tar.gz";
+    sha256 = "1bi7wsz3p5slb43kj7lgb3r6lb91lvb6ldi556k4y50ix6b5khyb";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ libxml2 libzip ];
+
+  meta = with lib; {
+    homepage = "http://ebook-tools.sourceforge.net";
+    description = "Tools and library for dealing with various ebook file formats";
+    maintainers = [ ];
+    platforms = platforms.all;
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/enca/default.nix b/nixpkgs/pkgs/tools/text/enca/default.nix
new file mode 100644
index 000000000000..7015bd4453cb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/enca/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, libiconv, recode }:
+
+stdenv.mkDerivation rec {
+  pname = "enca";
+  version = "1.19";
+
+  src = fetchurl {
+    url = "https://dl.cihar.com/enca/${pname}-${version}.tar.xz";
+    sha256 = "1f78jmrggv3jymql8imm5m9yc8nqjw5l99mpwki2245l8357wj1s";
+  };
+
+  buildInputs = [ recode libiconv ];
+
+  meta = with lib; {
+    description = "Detects the encoding of text files and reencodes them";
+
+    longDescription = ''
+        Enca detects the encoding of text files, on the basis of knowledge
+        of their language. It can also convert them to other encodings,
+        allowing you to recode files without knowing their current encoding.
+        It supports most of Central and East European languages, and a few
+        Unicode variants, independently on language.
+    '';
+
+    license = licenses.gpl2;
+
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/enscript/default.nix b/nixpkgs/pkgs/tools/text/enscript/default.nix
new file mode 100644
index 000000000000..1299ef78679c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/enscript/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, gettext }:
+
+stdenv.mkDerivation rec {
+  pname = "enscript";
+  version = "1.6.6";
+
+  src = fetchurl {
+    url = "mirror://gnu/enscript/enscript-${version}.tar.gz";
+    sha256 = "1fy0ymvzrrvs889zanxcaxjfcxarm2d3k43c9frmbl1ld7dblmkd";
+  };
+
+  preBuild =
+    ''
+      # Fix building on Darwin with GCC.
+      substituteInPlace compat/regex.c --replace \
+         __private_extern__  '__attribute__ ((visibility ("hidden")))'
+    '';
+
+  buildInputs = [ gettext ];
+
+  doCheck = true;
+
+  meta = {
+    description = "Converter from ASCII to PostScript, HTML, or RTF";
+
+    longDescription =
+      '' GNU Enscript converts ASCII files to PostScript, HTML, or RTF and
+         stores generated output to a file or sends it directly to the
+         printer.  It includes features for `pretty-printing'
+         (language-sensitive code highlighting) in several programming
+         languages.
+
+         Enscript can be easily extended to handle different output media and
+         it has many options that can be used to customize printouts.
+      '';
+
+    license = lib.licenses.gpl3Plus;
+
+    homepage = "https://www.gnu.org/software/enscript/";
+
+    maintainers = [ ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/epub2txt2/default.nix b/nixpkgs/pkgs/tools/text/epub2txt2/default.nix
new file mode 100644
index 000000000000..c8645fc5fe2a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/epub2txt2/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "epub2txt2";
+  version = "2.06";
+
+  src = fetchFromGitHub {
+    owner = "kevinboone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-zzcig5XNh9TqUHginsfoC47WrKavqi6k6ezir+OOMJk=";
+  };
+
+  makeFlags = [ "CC:=$(CC)" "PREFIX:=$(out)" ];
+
+  meta = {
+    description = "A simple command-line utility for Linux, for extracting text from EPUB documents.";
+    homepage = "https://github.com/kevinboone/epub2txt2";
+    license = lib.licenses.gpl3Only;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.leonid ];
+    mainProgram = "epub2txt";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/epubcheck/default.nix b/nixpkgs/pkgs/tools/text/epubcheck/default.nix
new file mode 100644
index 000000000000..fd84abb0ef06
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/epubcheck/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchzip
+, jre, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "epubcheck";
+  version = "5.1.0";
+
+  src = fetchzip {
+    url = "https://github.com/w3c/epubcheck/releases/download/v${version}/epubcheck-${version}.zip";
+    sha256 = "sha256-gskQ02lGka3nBHSDXO3TpKSQzaoaJUQY9AvWG7L+1YM=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/lib
+    cp -r lib/* $out/lib
+
+    mkdir -p $out/libexec/epubcheck
+    cp epubcheck.jar $out/libexec/epubcheck
+
+    classpath=$out/libexec/epubcheck/epubcheck.jar
+    for jar in $out/lib/*.jar; do
+      classpath="$classpath:$jar"
+    done
+
+    mkdir -p $out/bin
+    makeWrapper ${jre}/bin/java $out/bin/epubcheck \
+      --add-flags "-classpath $classpath com.adobe.epubcheck.tool.Checker"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/w3c/epubcheck";
+    description = "Validation tool for EPUB";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = with licenses; [ asl20 bsd3 mpl10 w3c ];
+    platforms = platforms.all;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/esh/default.nix b/nixpkgs/pkgs/tools/text/esh/default.nix
new file mode 100644
index 000000000000..a1d6db2a7c2d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/esh/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchFromGitHub, asciidoctor, gawk, gnused, runtimeShell }:
+
+stdenv.mkDerivation rec {
+  pname = "esh";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "jirutka";
+    repo = "esh";
+    rev = "v${version}";
+    sha256 = "1ddaji5nplf1dyvgkrhqjy8m5djaycqcfhjv30yprj1avjymlj6w";
+  };
+
+  nativeBuildInputs = [ asciidoctor ];
+
+  buildInputs = [ gawk gnused ];
+
+  makeFlags = [ "prefix=$(out)" "DESTDIR=" ];
+
+  postPatch = ''
+    patchShebangs .
+    substituteInPlace esh \
+        --replace '"/bin/sh"' '"${runtimeShell}"' \
+        --replace '"awk"' '"${gawk}/bin/awk"' \
+        --replace 'sed' '${gnused}/bin/sed'
+    substituteInPlace tests/test-dump.exp \
+        --replace '#!/bin/sh' '#!${runtimeShell}'
+  '';
+
+  doCheck = true;
+  checkTarget = "test";
+
+  meta = with lib; {
+    description = "Simple templating engine based on shell";
+    homepage = "https://github.com/jirutka/esh";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mnacamura ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/fanficfare/default.nix b/nixpkgs/pkgs/tools/text/fanficfare/default.nix
new file mode 100644
index 000000000000..7d27a45b56fd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/fanficfare/default.nix
@@ -0,0 +1,30 @@
+{ lib, python3Packages, fetchPypi }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "FanFicFare";
+  version = "4.25.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ky6N/AcfoXJahW7tw++WtnpTnpRv4ZUraMTWjVXDjEE=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    beautifulsoup4
+    chardet
+    cloudscraper
+    html5lib
+    html2text
+    requests-file
+  ];
+
+  doCheck = false; # no tests exist
+
+  meta = with lib; {
+    description = "Tool for making eBooks from fanfiction web sites";
+    homepage = "https://github.com/JimmXinu/FanFicFare";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dwarfmaster ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/fastmod/default.nix b/nixpkgs/pkgs/tools/text/fastmod/default.nix
new file mode 100644
index 000000000000..a9f1b79c474a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/fastmod/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, fetchFromGitHub
+, rustPlatform
+, libiconv
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "fastmod";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "facebookincubator";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-j5+6ijJ04/Non7AUSN35OhfZ04MiPUDU4V1HLwZaM9k=";
+  };
+
+  cargoSha256 = "sha256-RNTnP3RKRZXo3+L54y/8nBunGbsxVY72sbl+ZrqfeMI=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Security ];
+
+  meta = with lib; {
+    description = "A utility that makes sweeping changes to large, shared code bases";
+    homepage = "https://github.com/facebookincubator/fastmod";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jduan ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/frangipanni/default.nix b/nixpkgs/pkgs/tools/text/frangipanni/default.nix
new file mode 100644
index 000000000000..bb144b8f43e1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/frangipanni/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "frangipanni";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "birchb1024";
+    repo = "frangipanni";
+    rev = "v${version}";
+    sha256 = "sha256-jIXyqwZWfCBSDTTodHTct4V5rjYv7h4Vcw7cXOFk17w=";
+  };
+
+  vendorHash = "sha256-TSN5M/UCTtfoTf1hDCfrJMCFdSwL/NVXssgt4aefom8=";
+
+  meta = with lib; {
+    description = "Convert lines of text into a tree structure";
+    homepage = "https://github.com/birchb1024/frangipanni";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/frawk/default.nix b/nixpkgs/pkgs/tools/text/frawk/default.nix
new file mode 100644
index 000000000000..1f975823fa1d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/frawk/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, rustPlatform
+, fetchCrate
+, libxml2
+, ncurses
+, zlib
+, features ? [ "default" ]
+, llvmPackages_12
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "frawk";
+  version = "0.4.8";
+
+  src = fetchCrate {
+    inherit pname version;
+    sha256 = "sha256-wPnMJDx3aF1Slx5pjLfii366pgNU3FJBdznQLuUboYA=";
+  };
+
+  cargoSha256 = "sha256-Xk+iH90Nb2koCdGmVSiRl8Nq26LlFdJBuKmvcbgnkgs=";
+
+  buildInputs = [ libxml2 ncurses zlib ];
+
+  buildNoDefaultFeatures = true;
+  buildFeatures = features;
+
+  preBuild = lib.optionalString (lib.elem "default" features || lib.elem "llvm_backend" features) ''
+    export LLVM_SYS_120_PREFIX=${llvmPackages_12.llvm.dev}
+  '' + lib.optionalString (lib.elem "default" features || lib.elem "unstable" features) ''
+    export RUSTC_BOOTSTRAP=1
+  '';
+
+  # depends on cpu instructions that may not be available on builders
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A small programming language for writing short programs processing textual data";
+    homepage = "https://github.com/ezrosent/frawk";
+    changelog = "https://github.com/ezrosent/frawk/releases/tag/v${version}";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/frogmouth/default.nix b/nixpkgs/pkgs/tools/text/frogmouth/default.nix
new file mode 100644
index 000000000000..e4347989aa1b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/frogmouth/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, python3
+, fetchFromGitHub
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "frogmouth";
+  version = "0.9.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = "frogmouth";
+    rev = "v${version}";
+    hash = "sha256-TMCeIwMEoNDQV9iue4XrdYQMmwofXDvdMMLTZKILQ9Q=";
+  };
+
+  # Per <https://github.com/srstevenson/xdg-base-dirs/tree/6.0.0#xdg-base-dirs>, the package is
+  # renamed from `xdg` to `xdg_base_dirs`, but upstream isn't amenable to performing that rename.
+  # See <https://github.com/Textualize/frogmouth/pull/59>. So this is a minimal fix.
+  postUnpack = ''
+    sed -i -e "s,from xdg import,from xdg_base_dirs import," $sourceRoot/frogmouth/data/{config,data_directory}.py
+  '';
+
+  nativeBuildInputs = [
+    python3.pkgs.poetry-core
+    python3.pkgs.pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    httpx
+    textual
+    typing-extensions
+    xdg-base-dirs
+  ];
+
+  pythonRelaxDeps = [
+    "httpx"
+    "textual"
+    "xdg-base-dirs"
+  ];
+
+  pythonImportsCheck = [ "frogmouth" ];
+
+  meta = with lib; {
+    description = "A Markdown browser for your terminal";
+    homepage = "https://github.com/Textualize/frogmouth";
+    changelog = "https://github.com/Textualize/frogmouth/blob/${src.rev}/ChangeLog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/fst/default.nix b/nixpkgs/pkgs/tools/text/fst/default.nix
new file mode 100644
index 000000000000..d08d29376b74
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/fst/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, rustPlatform
+, fetchCrate
+, stdenv
+, libiconv
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "fst";
+  version = "0.4.3";
+
+  src = fetchCrate {
+    inherit version;
+    crateName = "fst-bin";
+    sha256 = "sha256-x2rvLMOhatMWU2u5GAdpYy2uuwZLi3apoE6aaTF+M1g=";
+  };
+
+  cargoHash = "sha256-yTbEaw+BbjVks3j7/b75kGoUjVftLaVYvYIdI/bbfdk=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    csv="$(mktemp)"
+    fst="$(mktemp)"
+    printf "abc,1\nabcd,1" > "$csv"
+    $out/bin/fst map "$csv" "$fst" --force
+    $out/bin/fst fuzzy "$fst" 'abc'
+    $out/bin/fst --help > /dev/null
+  '';
+
+  meta = with lib; {
+    description = "Represent large sets and maps compactly with finite state transducers";
+    homepage = "https://github.com/BurntSushi/fst";
+    license = with licenses; [ unlicense /* or */ mit ];
+    maintainers = with maintainers; [ rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gawk/default.nix b/nixpkgs/pkgs/tools/text/gawk/default.nix
new file mode 100644
index 000000000000..d85880e82e15
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gawk/default.nix
@@ -0,0 +1,87 @@
+{ lib, stdenv, fetchurl
+# TODO: links -lsigsegv but loses the reference for some reason
+, withSigsegv ? (false && stdenv.hostPlatform.system != "x86_64-cygwin"), libsigsegv
+, interactive ? false, readline
+, autoreconfHook # no-pma fix
+
+/* Test suite broke on:
+       stdenv.isCygwin # XXX: `test-dup2' segfaults on Cygwin 6.1
+    || stdenv.isDarwin # XXX: `locale' segfaults
+    || stdenv.isSunOS  # XXX: `_backsmalls1' fails, locale stuff?
+    || stdenv.isFreeBSD
+*/
+, doCheck ? (interactive && stdenv.isLinux), glibcLocales ? null
+, locale ? null
+}:
+
+assert (doCheck && stdenv.isLinux) -> glibcLocales != null;
+
+stdenv.mkDerivation rec {
+  pname = "gawk" + lib.optionalString interactive "-interactive";
+  version = "5.2.2";
+
+  src = fetchurl {
+    url = "mirror://gnu/gawk/gawk-${version}.tar.xz";
+    hash = "sha256-PB/OFEa0y+4c0nO9fsZLyH2J9hU3RxzT4F4zqWWiUOk=";
+  };
+
+  # PIE is incompatible with the "persistent malloc" ("pma") feature.
+  # While build system attempts to pass -no-pie to gcc. nixpkgs' `ld`
+  # wrapped still passes `-pie` flag to linker and breaks linkage.
+  # Let's disable "pie" until `ld` is fixed to do the right thing.
+  hardeningDisable = [ "pie" ];
+
+  # When we do build separate interactive version, it makes sense to always include man.
+  outputs = [ "out" "info" ]
+    ++ lib.optional (!interactive) "man";
+
+  # no-pma fix
+  nativeBuildInputs = [ autoreconfHook ]
+    ++ lib.optional (doCheck && stdenv.isLinux) glibcLocales;
+
+  buildInputs = lib.optional withSigsegv libsigsegv
+    ++ lib.optional interactive readline
+    ++ lib.optional stdenv.isDarwin locale;
+
+  configureFlags = [
+    (if withSigsegv then "--with-libsigsegv-prefix=${libsigsegv}" else "--without-libsigsegv")
+    (if interactive then "--with-readline=${readline.dev}" else "--without-readline")
+  ];
+
+  makeFlags = [
+    "AR=${stdenv.cc.targetPrefix}ar"
+  ];
+
+  inherit doCheck;
+
+  postInstall = ''
+    rm "$out"/bin/gawk-*
+    ln -s gawk.1 "''${!outputMan}"/share/man/man1/awk.1
+  '';
+
+  passthru = {
+    libsigsegv = if withSigsegv then libsigsegv else null; # for stdenv bootstrap
+  };
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/gawk/";
+    description = "GNU implementation of the Awk programming language";
+    longDescription = ''
+      Many computer users need to manipulate text files: extract and then
+      operate on data from parts of certain lines while discarding the rest,
+      make changes in various text files wherever certain patterns appear,
+      and so on.  To write a program to do these things in a language such as
+      C or Pascal is a time-consuming inconvenience that may take many lines
+      of code.  The job is easy with awk, especially the GNU implementation:
+      Gawk.
+
+      The awk utility interprets a special-purpose programming language that
+      makes it possible to handle many data-reformatting jobs with just a few
+      lines of code.
+    '';
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix ++ platforms.windows;
+    maintainers = [ ];
+    mainProgram = "gawk";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gawk/gawk-with-extensions.nix b/nixpkgs/pkgs/tools/text/gawk/gawk-with-extensions.nix
new file mode 100644
index 000000000000..1b82d798d330
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gawk/gawk-with-extensions.nix
@@ -0,0 +1,13 @@
+{ runCommand, gawk, extensions, makeWrapper }:
+
+runCommand "gawk-with-extensions" {
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ gawk ] ++ extensions;
+} ''
+  mkdir -p $out/bin
+  for i in ${gawk}/bin/*; do
+    name="$(basename "$i")"
+    makeWrapper $i $out/bin/$name \
+      --prefix AWKLIBPATH : "${gawk}/lib/gawk:''${AWKLIBPATH:-}"
+  done
+''
diff --git a/nixpkgs/pkgs/tools/text/gawk/gawkextlib.nix b/nixpkgs/pkgs/tools/text/gawk/gawkextlib.nix
new file mode 100644
index 000000000000..9a25407d7116
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gawk/gawkextlib.nix
@@ -0,0 +1,150 @@
+{ lib, stdenv, recurseIntoAttrs, fetchgit, pkg-config, autoreconfHook
+, autoconf, automake, libiconv, libtool, texinfo, gettext, gawk, rapidjson, gd
+, libharu, lmdb, gmp, glibcLocales, mpfr, more, postgresql, hiredis
+, expat, tre }:
+
+let
+  buildExtension = lib.makeOverridable
+    ({ name, gawkextlib, extraBuildInputs ? [ ], doCheck ? true }:
+      let is_extension = gawkextlib != null;
+      in stdenv.mkDerivation rec {
+        pname = "gawkextlib-${name}";
+        version = "unstable-2022-10-20";
+
+        src = fetchgit {
+          url = "git://git.code.sf.net/p/gawkextlib/code";
+          rev = "f6c75b4ac1e0cd8d70c2f6c7a8d58b4d94cfde97";
+          sha256 = "sha256-0p3CrQ3TBl7UcveZytK/9rkAzn69RRM2GwY2eCeqlkg=";
+        };
+
+        postPatch = ''
+          cd ${name}
+        '';
+
+        nativeBuildInputs = [
+          autoconf
+          automake
+          libtool
+          autoreconfHook
+          pkg-config
+          texinfo
+          gettext
+        ];
+
+        buildInputs = [ gawk ] ++ extraBuildInputs;
+        propagatedBuildInputs = lib.optional is_extension gawkextlib;
+
+        setupHook = if is_extension then ./setup-hook.sh else null;
+        inherit gawk;
+
+        inherit doCheck;
+        nativeCheckInputs = [ more ];
+
+        meta = with lib; {
+          homepage = "https://sourceforge.net/projects/gawkextlib/";
+          description = "Dynamically loaded extension libraries for GNU AWK";
+          longDescription = ''
+            The gawkextlib project provides several extension libraries for
+            gawk (GNU AWK), as well as libgawkextlib containing some APIs that
+            are useful for building gawk extension libraries. These libraries
+            enable gawk to process XML data, interact with a PostgreSQL
+            database, use the GD graphics library, and perform unlimited
+            precision MPFR calculations.
+          '';
+          license = licenses.gpl3Plus;
+          platforms = platforms.unix;
+          maintainers = with maintainers; [ tomberek ];
+        };
+      });
+  gawkextlib = buildExtension {
+    gawkextlib = null;
+    name = "lib";
+  };
+  libs = {
+    abort = buildExtension {
+      inherit gawkextlib;
+      name = "abort";
+    };
+    aregex = buildExtension {
+      inherit gawkextlib;
+      name = "aregex";
+      extraBuildInputs = [ tre ];
+    };
+    csv = buildExtension {
+      inherit gawkextlib;
+      name = "csv";
+    };
+    errno = buildExtension {
+      inherit gawkextlib;
+      name = "errno";
+    };
+    gd = buildExtension {
+      inherit gawkextlib;
+      name = "gd";
+      extraBuildInputs = [ gd ];
+    };
+    # Build has been broken: https://github.com/NixOS/nixpkgs/issues/191072
+    # haru = buildExtension {
+    #   inherit gawkextlib;
+    #   name = "haru";
+    #   extraBuildInputs = [ libharu ];
+    # };
+    json = buildExtension {
+      inherit gawkextlib;
+      name = "json";
+      extraBuildInputs = [ rapidjson ];
+    };
+    lmdb = buildExtension {
+      inherit gawkextlib;
+      name = "lmdb";
+      extraBuildInputs = [ lmdb ];
+      #  mdb_env_open(env, /dev/null)
+      #! No such device
+      #  mdb_env_open(env, /dev/null)
+      #! Operation not supported by device
+      doCheck = !stdenv.isDarwin;
+    };
+    mbs = buildExtension {
+      inherit gawkextlib;
+      name = "mbs";
+      extraBuildInputs = [ glibcLocales ];
+      #! "spät": length: 5, mbs_length: 6, wcswidth: 4
+      doCheck = !stdenv.isDarwin;
+    };
+    mpfr = buildExtension {
+      inherit gawkextlib;
+      name = "mpfr";
+      extraBuildInputs = [ gmp mpfr ];
+    };
+    nl_langinfo = buildExtension {
+      inherit gawkextlib;
+      name = "nl_langinfo";
+    };
+    pgsql = buildExtension {
+      inherit gawkextlib;
+      name = "pgsql";
+      extraBuildInputs = [ postgresql ];
+    };
+    redis = buildExtension {
+      inherit gawkextlib;
+      name = "redis";
+      extraBuildInputs = [ hiredis ];
+    };
+    select = buildExtension {
+      inherit gawkextlib;
+      name = "select";
+    };
+    timex = buildExtension {
+      inherit gawkextlib;
+      name = "timex";
+    };
+    xml = buildExtension {
+      inherit gawkextlib;
+      name = "xml";
+      extraBuildInputs = [ expat libiconv ];
+    };
+  };
+in recurseIntoAttrs (libs // {
+  inherit gawkextlib buildExtension;
+  full = builtins.attrValues libs;
+})
diff --git a/nixpkgs/pkgs/tools/text/gawk/setup-hook.sh b/nixpkgs/pkgs/tools/text/gawk/setup-hook.sh
new file mode 100644
index 000000000000..d568cb8c7dd9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gawk/setup-hook.sh
@@ -0,0 +1,6 @@
+local oldOpts="-u"
+shopt -qo nounset || oldOpts="+u"
+set +u
+. @gawk@/etc/profile.d/gawk.sh
+gawklibpath_append @out@/lib/gawk
+set "$oldOpts"
diff --git a/nixpkgs/pkgs/tools/text/gist/default.nix b/nixpkgs/pkgs/tools/text/gist/default.nix
new file mode 100644
index 000000000000..d2676b379970
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gist/default.nix
@@ -0,0 +1,17 @@
+{ buildRubyGem, lib, ruby }:
+
+buildRubyGem rec {
+  inherit ruby;
+  name = "${gemName}-${version}";
+  gemName = "gist";
+  version = "6.0.0";
+  source.sha256 = "0qnd1jqd7b04871v4l73grcmi7c0pivm8nsfrqvwivm4n4b3c2hd";
+
+  meta = with lib; {
+    description = "Upload code to https://gist.github.com (or github enterprise)";
+    homepage = "http://defunkt.io/gist/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+    platforms = ruby.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gjo/default.nix b/nixpkgs/pkgs/tools/text/gjo/default.nix
new file mode 100644
index 000000000000..99d988797bfc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gjo/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "gjo";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "skanehira";
+    repo = "gjo";
+    rev = version;
+    hash = "sha256-vEk5MZqwAMgqMLjwRJwnbx8nVyF3U2iUz0S3L0GmCh4=";
+  };
+
+  vendorHash = null;
+
+  meta = with lib; {
+    description = "Small utility to create JSON objects";
+    homepage = "https://github.com/skanehira/gjo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/glogg/default.nix b/nixpkgs/pkgs/tools/text/glogg/default.nix
new file mode 100644
index 000000000000..855490df4ab4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/glogg/default.nix
@@ -0,0 +1,40 @@
+{ mkDerivation, lib, stdenv, fetchFromGitHub, qmake, boost }:
+
+mkDerivation rec {
+  pname = "glogg";
+  version = "1.1.4";
+
+  src = fetchFromGitHub {
+    owner = "nickbnf";
+    repo = "glogg";
+    rev = "v${version}";
+    sha256 = "0hf1c2m8n88frmxmyn0ndr8129p7iky49nq565sw1asaydm5z6pb";
+  };
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace glogg.pro \
+      --replace "boost_program_options-mt" "boost_program_options"
+  '';
+
+  nativeBuildInputs = [ qmake ];
+  buildInputs = [ boost ];
+
+  qmakeFlags = [ "VERSION=${version}" ];
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    mkdir -p $out/Applications
+    mv $out/bin/glogg.app $out/Applications/glogg.app
+    rm -fr $out/{bin,share}
+  '';
+
+  meta = with lib; {
+    description = "The fast, smart log explorer";
+    longDescription = ''
+      A multi-platform GUI application to browse and search through long or complex log files. It is designed with programmers and system administrators in mind. glogg can be seen as a graphical, interactive combination of grep and less.
+    '';
+    homepage = "https://glogg.bonnefon.org/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ c0bw3b ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gnugrep/default.nix b/nixpkgs/pkgs/tools/text/gnugrep/default.nix
new file mode 100644
index 000000000000..7559ef890ad2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnugrep/default.nix
@@ -0,0 +1,79 @@
+{ lib, stdenv, glibcLocales, fetchurl, pcre2, libiconv, perl }:
+
+# Note: this package is used for bootstrapping fetchurl, and thus
+# cannot use fetchpatch! All mutable patches (generated by GitHub or
+# cgit) that are needed here should be included directly in Nixpkgs as
+# files.
+
+let version = "3.11"; in
+
+stdenv.mkDerivation {
+  pname = "gnugrep";
+  inherit version;
+
+  src = fetchurl {
+    url = "mirror://gnu/grep/grep-${version}.tar.xz";
+    hash = "sha256-HbKu3eidDepCsW2VKPiUyNFdrk4ZC1muzHj1qVEnbqs=";
+  };
+
+  # Some gnulib tests fail
+  # - on Musl: https://github.com/NixOS/nixpkgs/pull/228714
+  # - on x86_64-darwin: https://github.com/NixOS/nixpkgs/pull/228714#issuecomment-1576826330
+  postPatch = if stdenv.hostPlatform.isMusl || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) then ''
+    sed -i 's:gnulib-tests::g' Makefile.in
+  '' else null;
+
+  nativeCheckInputs = [ perl glibcLocales ];
+  outputs = [ "out" "info" ]; # the man pages are rather small
+
+  buildInputs = [ pcre2 libiconv ];
+
+  # cygwin: FAIL: multibyte-white-space
+  # freebsd: FAIL mb-non-UTF8-performance
+  # x86_64-darwin: fails 'stack-overflow' tests on Rosetta 2 emulator
+  doCheck = !stdenv.isCygwin && !stdenv.isFreeBSD && !(stdenv.isDarwin && stdenv.hostPlatform.isx86_64);
+
+  # On macOS, force use of mkdir -p, since Grep's fallback
+  # (./install-sh) is broken.
+  preConfigure = ''
+    export MKDIR_P="mkdir -p"
+  '';
+
+  enableParallelBuilding = true;
+
+  # Fix reference to sh in bootstrap-tools, and invoke grep via
+  # absolute path rather than looking at argv[0].
+  postInstall =
+    ''
+      rm $out/bin/egrep $out/bin/fgrep
+      echo "#! /bin/sh" > $out/bin/egrep
+      echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep
+      echo "#! /bin/sh" > $out/bin/fgrep
+      echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep
+      chmod +x $out/bin/egrep $out/bin/fgrep
+    '';
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/grep/";
+    description = "GNU implementation of the Unix grep command";
+
+    longDescription = ''
+      The grep command searches one or more input files for lines
+      containing a match to a specified pattern.  By default, grep
+      prints the matching lines.
+    '';
+
+    license = licenses.gpl3Plus;
+
+    maintainers = [
+      maintainers.das_j
+      maintainers.m00wl
+    ];
+    platforms = platforms.all;
+    mainProgram = "grep";
+  };
+
+  passthru = {
+    inherit pcre2;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch b/nixpkgs/pkgs/tools/text/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch
new file mode 100644
index 000000000000..98c9aa877a72
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch
@@ -0,0 +1,33 @@
+From b5a91a01e5d0897facdd0f49d64b76b0f02b43e1 Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Fri, 6 Apr 2018 11:34:51 +0200
+Subject: Allow input files to be missing for ed-style patches
+
+* src/pch.c (do_ed_script): Allow input files to be missing so that new
+files will be created as with non-ed-style patches.
+---
+ src/pch.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/pch.c b/src/pch.c
+index bc6278c..0c5cc26 100644
+--- a/src/pch.c
++++ b/src/pch.c
+@@ -2394,9 +2394,11 @@ do_ed_script (char const *inname, char const *outname,
+ 
+     if (! dry_run && ! skip_rest_of_patch) {
+ 	int exclusive = *outname_needs_removal ? 0 : O_EXCL;
+-	assert (! inerrno);
+-	*outname_needs_removal = true;
+-	copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
++	if (inerrno != ENOENT)
++	  {
++	    *outname_needs_removal = true;
++	    copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
++	  }
+ 	sprintf (buf, "%s %s%s", editor_program,
+ 		 verbosity == VERBOSE ? "" : "- ",
+ 		 outname);
+-- 
+cgit v1.0-41-gc330
+
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-1000156.patch b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-1000156.patch
new file mode 100644
index 000000000000..36f33dea2b90
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-1000156.patch
@@ -0,0 +1,211 @@
+From 123eaff0d5d1aebe128295959435b9ca5909c26d Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Fri, 6 Apr 2018 12:14:49 +0200
+Subject: Fix arbitrary command execution in ed-style patches
+ (CVE-2018-1000156)
+
+* src/pch.c (do_ed_script): Write ed script to a temporary file instead
+of piping it to ed: this will cause ed to abort on invalid commands
+instead of rejecting them and carrying on.
+* tests/ed-style: New test case.
+* tests/Makefile.am (TESTS): Add test case.
+---
+ src/pch.c         | 91 ++++++++++++++++++++++++++++++++++++++++---------------
+ tests/Makefile.am |  1 +
+ tests/ed-style    | 41 +++++++++++++++++++++++++
+ 3 files changed, 108 insertions(+), 25 deletions(-)
+ create mode 100644 tests/ed-style
+
+diff --git a/src/pch.c b/src/pch.c
+index 0c5cc26..4fd5a05 100644
+--- a/src/pch.c
++++ b/src/pch.c
+@@ -33,6 +33,7 @@
+ # include <io.h>
+ #endif
+ #include <safe.h>
++#include <sys/wait.h>
+ 
+ #define INITHUNKMAX 125			/* initial dynamic allocation size */
+ 
+@@ -2389,24 +2390,28 @@ do_ed_script (char const *inname, char const *outname,
+     static char const editor_program[] = EDITOR_PROGRAM;
+ 
+     file_offset beginning_of_this_line;
+-    FILE *pipefp = 0;
+     size_t chars_read;
++    FILE *tmpfp = 0;
++    char const *tmpname;
++    int tmpfd;
++    pid_t pid;
++
++    if (! dry_run && ! skip_rest_of_patch)
++      {
++	/* Write ed script to a temporary file.  This causes ed to abort on
++	   invalid commands such as when line numbers or ranges exceed the
++	   number of available lines.  When ed reads from a pipe, it rejects
++	   invalid commands and treats the next line as a new command, which
++	   can lead to arbitrary command execution.  */
++
++	tmpfd = make_tempfile (&tmpname, 'e', NULL, O_RDWR | O_BINARY, 0);
++	if (tmpfd == -1)
++	  pfatal ("Can't create temporary file %s", quotearg (tmpname));
++	tmpfp = fdopen (tmpfd, "w+b");
++	if (! tmpfp)
++	  pfatal ("Can't open stream for file %s", quotearg (tmpname));
++      }
+ 
+-    if (! dry_run && ! skip_rest_of_patch) {
+-	int exclusive = *outname_needs_removal ? 0 : O_EXCL;
+-	if (inerrno != ENOENT)
+-	  {
+-	    *outname_needs_removal = true;
+-	    copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
+-	  }
+-	sprintf (buf, "%s %s%s", editor_program,
+-		 verbosity == VERBOSE ? "" : "- ",
+-		 outname);
+-	fflush (stdout);
+-	pipefp = popen(buf, binary_transput ? "wb" : "w");
+-	if (!pipefp)
+-	  pfatal ("Can't open pipe to %s", quotearg (buf));
+-    }
+     for (;;) {
+ 	char ed_command_letter;
+ 	beginning_of_this_line = file_tell (pfp);
+@@ -2417,14 +2422,14 @@ do_ed_script (char const *inname, char const *outname,
+ 	}
+ 	ed_command_letter = get_ed_command_letter (buf);
+ 	if (ed_command_letter) {
+-	    if (pipefp)
+-		if (! fwrite (buf, sizeof *buf, chars_read, pipefp))
++	    if (tmpfp)
++		if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
+ 		    write_fatal ();
+ 	    if (ed_command_letter != 'd' && ed_command_letter != 's') {
+ 	        p_pass_comments_through = true;
+ 		while ((chars_read = get_line ()) != 0) {
+-		    if (pipefp)
+-			if (! fwrite (buf, sizeof *buf, chars_read, pipefp))
++		    if (tmpfp)
++			if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
+ 			    write_fatal ();
+ 		    if (chars_read == 2  &&  strEQ (buf, ".\n"))
+ 			break;
+@@ -2437,13 +2442,49 @@ do_ed_script (char const *inname, char const *outname,
+ 	    break;
+ 	}
+     }
+-    if (!pipefp)
++    if (!tmpfp)
+       return;
+-    if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, pipefp) == 0
+-	|| fflush (pipefp) != 0)
++    if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) == 0
++	|| fflush (tmpfp) != 0)
+       write_fatal ();
+-    if (pclose (pipefp) != 0)
+-      fatal ("%s FAILED", editor_program);
++
++    if (lseek (tmpfd, 0, SEEK_SET) == -1)
++      pfatal ("Can't rewind to the beginning of file %s", quotearg (tmpname));
++
++    if (! dry_run && ! skip_rest_of_patch) {
++	int exclusive = *outname_needs_removal ? 0 : O_EXCL;
++	*outname_needs_removal = true;
++	if (inerrno != ENOENT)
++	  {
++	    *outname_needs_removal = true;
++	    copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
++	  }
++	sprintf (buf, "%s %s%s", editor_program,
++		 verbosity == VERBOSE ? "" : "- ",
++		 outname);
++	fflush (stdout);
++
++	pid = fork();
++	if (pid == -1)
++	  pfatal ("Can't fork");
++	else if (pid == 0)
++	  {
++	    dup2 (tmpfd, 0);
++	    execl ("/bin/sh", "sh", "-c", buf, (char *) 0);
++	    _exit (2);
++	  }
++	else
++	  {
++	    int wstatus;
++	    if (waitpid (pid, &wstatus, 0) == -1
++	        || ! WIFEXITED (wstatus)
++		|| WEXITSTATUS (wstatus) != 0)
++	      fatal ("%s FAILED", editor_program);
++	  }
++    }
++
++    fclose (tmpfp);
++    safe_unlink (tmpname);
+ 
+     if (ofp)
+       {
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 6b6df63..16f8693 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -32,6 +32,7 @@ TESTS = \
+ 	crlf-handling \
+ 	dash-o-append \
+ 	deep-directories \
++	ed-style \
+ 	empty-files \
+ 	false-match \
+ 	fifo \
+diff --git a/tests/ed-style b/tests/ed-style
+new file mode 100644
+index 0000000..d8c0689
+--- /dev/null
++++ b/tests/ed-style
+@@ -0,0 +1,41 @@
++# Copyright (C) 2018 Free Software Foundation, Inc.
++#
++# Copying and distribution of this file, with or without modification,
++# in any medium, are permitted without royalty provided the copyright
++# notice and this notice are preserved.
++
++. $srcdir/test-lib.sh
++
++require cat
++use_local_patch
++use_tmpdir
++
++# ==============================================================
++
++cat > ed1.diff <<EOF
++0a
++foo
++.
++EOF
++
++check 'patch -e foo -i ed1.diff' <<EOF
++EOF
++
++check 'cat foo' <<EOF
++foo
++EOF
++
++cat > ed2.diff <<EOF
++1337a
++r !echo bar
++,p
++EOF
++
++check 'patch -e foo -i ed2.diff 2> /dev/null || echo "Status: $?"' <<EOF
++?
++Status: 2
++EOF
++
++check 'cat foo' <<EOF
++foo
++EOF
+-- 
+cgit v1.0-41-gc330
+
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6951.patch b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6951.patch
new file mode 100644
index 000000000000..22d5f061c332
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6951.patch
@@ -0,0 +1,28 @@
+From f290f48a621867084884bfff87f8093c15195e6a Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Mon, 12 Feb 2018 16:48:24 +0100
+Subject: Fix segfault with mangled rename patch
+
+http://savannah.gnu.org/bugs/?53132
+* src/pch.c (intuit_diff_type): Ensure that two filenames are specified
+for renames and copies (fix the existing check).
+---
+ src/pch.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/pch.c b/src/pch.c
+index ff9ed2c..bc6278c 100644
+--- a/src/pch.c
++++ b/src/pch.c
+@@ -974,7 +974,8 @@ intuit_diff_type (bool need_header, mode_t *p_file_type)
+     if ((pch_rename () || pch_copy ())
+ 	&& ! inname
+ 	&& ! ((i == OLD || i == NEW) &&
+-	      p_name[! reverse] &&
++	      p_name[reverse] && p_name[! reverse] &&
++	      name_is_valid (p_name[reverse]) &&
+ 	      name_is_valid (p_name[! reverse])))
+       {
+ 	say ("Cannot %s file without two valid file names\n", pch_rename () ? "rename" : "copy");
+-- 
+cgit v1.0-41-gc330
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6952.patch b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6952.patch
new file mode 100644
index 000000000000..2da323c69844
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2018-6952.patch
@@ -0,0 +1,28 @@
+From 9c986353e420ead6e706262bf204d6e03322c300 Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Fri, 17 Aug 2018 13:35:40 +0200
+Subject: Fix swapping fake lines in pch_swap
+
+* src/pch.c (pch_swap): Fix swapping p_bfake and p_efake when there is a
+blank line in the middle of a context-diff hunk: that empty line stays
+in the middle of the hunk and isn't swapped.
+
+Fixes: https://savannah.gnu.org/bugs/index.php?53133
+---
+ src/pch.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/pch.c b/src/pch.c
+index e92bc64..a500ad9 100644
+--- a/src/pch.c
++++ b/src/pch.c
+@@ -2122,7 +2122,7 @@ pch_swap (void)
+     }
+     if (p_efake >= 0) {			/* fix non-freeable ptr range */
+ 	if (p_efake <= i)
+-	    n = p_end - i + 1;
++	    n = p_end - p_ptrn_lines;
+ 	else
+ 	    n = -i;
+ 	p_efake += n;
+-- 
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13636.patch b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13636.patch
new file mode 100644
index 000000000000..e62c3d41753c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13636.patch
@@ -0,0 +1,108 @@
+From dce4683cbbe107a95f1f0d45fabc304acfb5d71a Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Mon, 15 Jul 2019 16:21:48 +0200
+Subject: Don't follow symlinks unless --follow-symlinks is given
+
+* src/inp.c (plan_a, plan_b), src/util.c (copy_to_fd, copy_file,
+append_to_file): Unless the --follow-symlinks option is given, open files with
+the O_NOFOLLOW flag to avoid following symlinks.  So far, we were only doing
+that consistently for input files.
+* src/util.c (create_backup): When creating empty backup files, (re)create them
+with O_CREAT | O_EXCL to avoid following symlinks in that case as well.
+---
+ src/inp.c  | 12 ++++++++++--
+ src/util.c | 14 +++++++++++---
+ 2 files changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/src/inp.c b/src/inp.c
+index 32d0919..22d7473 100644
+--- a/src/inp.c
++++ b/src/inp.c
+@@ -238,8 +238,13 @@ plan_a (char const *filename)
+     {
+       if (S_ISREG (instat.st_mode))
+         {
+-	  int ifd = safe_open (filename, O_RDONLY|binary_transput, 0);
++	  int flags = O_RDONLY | binary_transput;
+ 	  size_t buffered = 0, n;
++	  int ifd;
++
++	  if (! follow_symlinks)
++	    flags |= O_NOFOLLOW;
++	  ifd = safe_open (filename, flags, 0);
+ 	  if (ifd < 0)
+ 	    pfatal ("can't open file %s", quotearg (filename));
+ 
+@@ -340,6 +345,7 @@ plan_a (char const *filename)
+ static void
+ plan_b (char const *filename)
+ {
++  int flags = O_RDONLY | binary_transput;
+   int ifd;
+   FILE *ifp;
+   int c;
+@@ -353,7 +359,9 @@ plan_b (char const *filename)
+ 
+   if (instat.st_size == 0)
+     filename = NULL_DEVICE;
+-  if ((ifd = safe_open (filename, O_RDONLY | binary_transput, 0)) < 0
++  if (! follow_symlinks)
++    flags |= O_NOFOLLOW;
++  if ((ifd = safe_open (filename, flags, 0)) < 0
+       || ! (ifp = fdopen (ifd, binary_transput ? "rb" : "r")))
+     pfatal ("Can't open file %s", quotearg (filename));
+   if (TMPINNAME_needs_removal)
+diff --git a/src/util.c b/src/util.c
+index 1cc08ba..fb38307 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -388,7 +388,7 @@ create_backup (char const *to, const struct stat *to_st, bool leave_original)
+ 
+ 	  try_makedirs_errno = ENOENT;
+ 	  safe_unlink (bakname);
+-	  while ((fd = safe_open (bakname, O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0)
++	  while ((fd = safe_open (bakname, O_CREAT | O_EXCL | O_WRONLY | O_TRUNC, 0666)) < 0)
+ 	    {
+ 	      if (errno != try_makedirs_errno)
+ 		pfatal ("Can't create file %s", quotearg (bakname));
+@@ -579,10 +579,13 @@ create_file (char const *file, int open_flags, mode_t mode,
+ static void
+ copy_to_fd (const char *from, int tofd)
+ {
++  int from_flags = O_RDONLY | O_BINARY;
+   int fromfd;
+   ssize_t i;
+ 
+-  if ((fromfd = safe_open (from, O_RDONLY | O_BINARY, 0)) < 0)
++  if (! follow_symlinks)
++    from_flags |= O_NOFOLLOW;
++  if ((fromfd = safe_open (from, from_flags, 0)) < 0)
+     pfatal ("Can't reopen file %s", quotearg (from));
+   while ((i = read (fromfd, buf, bufsize)) != 0)
+     {
+@@ -625,6 +628,8 @@ copy_file (char const *from, char const *to, struct stat *tost,
+   else
+     {
+       assert (S_ISREG (mode));
++      if (! follow_symlinks)
++	to_flags |= O_NOFOLLOW;
+       tofd = create_file (to, O_WRONLY | O_BINARY | to_flags, mode,
+ 			  to_dir_known_to_exist);
+       copy_to_fd (from, tofd);
+@@ -640,9 +645,12 @@ copy_file (char const *from, char const *to, struct stat *tost,
+ void
+ append_to_file (char const *from, char const *to)
+ {
++  int to_flags = O_WRONLY | O_APPEND | O_BINARY;
+   int tofd;
+ 
+-  if ((tofd = safe_open (to, O_WRONLY | O_BINARY | O_APPEND, 0)) < 0)
++  if (! follow_symlinks)
++    to_flags |= O_NOFOLLOW;
++  if ((tofd = safe_open (to, to_flags, 0)) < 0)
+     pfatal ("Can't reopen file %s", quotearg (to));
+   copy_to_fd (from, tofd);
+   if (close (tofd) != 0)
+-- 
+cgit v1.0-41-gc330
+
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch
new file mode 100644
index 000000000000..38caff628aaf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch
@@ -0,0 +1,38 @@
+From 3fcd042d26d70856e826a42b5f93dc4854d80bf0 Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruen@gnu.org>
+Date: Fri, 6 Apr 2018 19:36:15 +0200
+Subject: Invoke ed directly instead of using the shell
+
+* src/pch.c (do_ed_script): Invoke ed directly instead of using a shell
+command to avoid quoting vulnerabilities.
+---
+ src/pch.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/src/pch.c b/src/pch.c
+index 4fd5a05..16e001a 100644
+--- a/src/pch.c
++++ b/src/pch.c
+@@ -2459,9 +2459,6 @@ do_ed_script (char const *inname, char const *outname,
+ 	    *outname_needs_removal = true;
+ 	    copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
+ 	  }
+-	sprintf (buf, "%s %s%s", editor_program,
+-		 verbosity == VERBOSE ? "" : "- ",
+-		 outname);
+ 	fflush (stdout);
+ 
+ 	pid = fork();
+@@ -2470,7 +2467,8 @@ do_ed_script (char const *inname, char const *outname,
+ 	else if (pid == 0)
+ 	  {
+ 	    dup2 (tmpfd, 0);
+-	    execl ("/bin/sh", "sh", "-c", buf, (char *) 0);
++	    assert (outname[0] != '!' && outname[0] != '-');
++	    execlp (editor_program, editor_program, "-", outname, (char  *) NULL);
+ 	    _exit (2);
+ 	  }
+ 	else
+-- 
+cgit v1.0-41-gc330
+
diff --git a/nixpkgs/pkgs/tools/text/gnupatch/default.nix b/nixpkgs/pkgs/tools/text/gnupatch/default.nix
new file mode 100644
index 000000000000..f4cb20202f0b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnupatch/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv, fetchurl
+, ed, autoreconfHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "patch";
+  version = "2.7.6";
+
+  src = fetchurl {
+    url = "mirror://gnu/patch/patch-${version}.tar.xz";
+    sha256 = "1zfqy4rdcy279vwn2z1kbv19dcfw25d2aqy9nzvdkq5bjzd0nqdc";
+  };
+
+  patches = [
+    # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=f290f48a621867084884bfff87f8093c15195e6a
+    ./CVE-2018-6951.patch
+
+    # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=b5a91a01e5d0897facdd0f49d64b76b0f02b43e1
+    ./Allow_input_files_to_be_missing_for_ed-style_patches.patch
+
+    # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=123eaff0d5d1aebe128295959435b9ca5909c26d
+    ./CVE-2018-1000156.patch
+
+    # https://git.savannah.gnu.org/cgit/patch.git/commit/?id=9c986353e420ead6e706262bf204d6e03322c300
+    ./CVE-2018-6952.patch
+
+    # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=dce4683cbbe107a95f1f0d45fabc304acfb5d71a
+    ./CVE-2019-13636.patch
+
+    # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=3fcd042d26d70856e826a42b5f93dc4854d80bf0
+    ./CVE-2019-13638-and-CVE-2018-20969.patch
+  ];
+
+  nativeBuildInputs = [ autoreconfHook ];
+
+  configureFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    "ac_cv_func_strnlen_working=yes"
+  ];
+
+  doCheck = stdenv.hostPlatform.libc != "musl"; # not cross;
+  nativeCheckInputs = [ed];
+
+  meta = {
+    description = "GNU Patch, a program to apply differences to files";
+
+    longDescription =
+      '' GNU Patch takes a patch file containing a difference listing
+         produced by the diff program and applies those differences to one or
+         more original files, producing patched versions.
+      '';
+
+    homepage = "https://savannah.gnu.org/projects/patch";
+
+    license = lib.licenses.gpl3Plus;
+
+    maintainers = [ ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gnused/default.nix b/nixpkgs/pkgs/tools/text/gnused/default.nix
new file mode 100644
index 000000000000..f493e4f358d6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gnused/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchurl, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "gnused";
+  version = "4.9";
+
+  src = fetchurl {
+    url = "mirror://gnu/sed/sed-${version}.tar.xz";
+    sha256 = "sha256-biJrcy4c1zlGStaGK9Ghq6QteYKSLaelNRljHSSXUYE=";
+  };
+
+  outputs = [ "out" "info" ];
+
+  nativeBuildInputs = [ perl ];
+  preConfigure = "patchShebangs ./build-aux/help2man";
+
+  # Prevents attempts of running 'help2man' on cross-built binaries.
+  PERL = if stdenv.hostPlatform == stdenv.buildPlatform then null else "missing";
+
+  meta = {
+    homepage = "https://www.gnu.org/software/sed/";
+    description = "GNU sed, a batch stream editor";
+
+    longDescription = ''
+      Sed (stream editor) isn't really a true text editor or text
+      processor.  Instead, it is used to filter text, i.e., it takes
+      text input and performs some operation (or set of operations) on
+      it and outputs the modified text.  Sed is typically used for
+      extracting part of a file using pattern matching or substituting
+      multiple occurrences of a string within a file.
+    '';
+
+    license = lib.licenses.gpl3Plus;
+
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ mic92 ];
+    mainProgram = "sed";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/goawk/default.nix b/nixpkgs/pkgs/tools/text/goawk/default.nix
new file mode 100644
index 000000000000..fc1a2bab79f4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/goawk/default.nix
@@ -0,0 +1,43 @@
+{ buildGoModule, fetchFromGitHub, lib, stdenv, gawk }:
+
+buildGoModule rec {
+  pname = "goawk";
+  version = "1.25.0";
+
+  src = fetchFromGitHub {
+    owner = "benhoyt";
+    repo = "goawk";
+    rev = "v${version}";
+    hash = "sha256-vxDBtYrfSmYE2mCqhepeLr4u+zLfHxCrYSXGq05CEYQ=";
+  };
+
+  vendorHash = null;
+
+  nativeCheckInputs = [ gawk ];
+
+  postPatch = ''
+    substituteInPlace goawk_test.go \
+      --replace "TestCommandLine" "SkipCommandLine" \
+      --replace "TestDevStdout" "SkipDevStdout" \
+      --replace "TestFILENAME" "SkipFILENAME" \
+      --replace "TestWildcards" "SkipWildcards"
+
+    substituteInPlace interp/interp_test.go \
+      --replace "TestShellCommand" "SkipShellCommand"
+  '';
+
+  checkFlags = [
+    "-awk"
+    "${gawk}/bin/gawk"
+  ];
+
+  doCheck = (stdenv.system != "aarch64-darwin");
+
+  meta = with lib; {
+    description = "A POSIX-compliant AWK interpreter written in Go";
+    homepage = "https://benhoyt.com/writings/goawk/";
+    license = licenses.mit;
+    mainProgram = "goawk";
+    maintainers = with maintainers; [ abbe ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch b/nixpkgs/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch
new file mode 100644
index 000000000000..b47b444009ac
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch
@@ -0,0 +1,10 @@
+diff --git a/gpt2convert.py b/gpt2convert.py
+index 34ca909..6e6cac5 100644
+--- a/gpt2convert.py
++++ b/gpt2convert.py
+@@ -1,3 +1,5 @@
++#!/usr/bin/env python3
++
+ import sys
+ import tensorflow as tf
+ import numpy as np
diff --git a/nixpkgs/pkgs/tools/text/gpt2tc/default.nix b/nixpkgs/pkgs/tools/text/gpt2tc/default.nix
new file mode 100644
index 000000000000..ee78451aae8d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gpt2tc/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, autoPatchelfHook, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "gpt2tc";
+  version = "2021-04-24";
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20220603034455/https://bellard.org/libnc/gpt2tc-2021-04-24.tar.gz";
+    hash = "sha256-6oTxnbBwjHAXVrWMjOQVwdODbqLRoinx00pi29ff5w0=";
+  };
+
+  patches = [
+    # Add a shebang to the python script so that nix detects it as such and
+    # wraps it properly. Otherwise, it runs in shell and freezes the system.
+    ./0001-add-python-shebang.patch
+  ];
+
+  nativeBuildInputs = [ autoPatchelfHook ];
+
+  buildInputs = [
+    (python3.withPackages (p: with p; [ numpy tensorflow ]))
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D -m755 -t $out/lib libnc${stdenv.hostPlatform.extensions.sharedLibrary}
+    addAutoPatchelfSearchPath $out/lib
+    install -D -m755 -t $out/bin gpt2tc
+    install -T -m755 download_model.sh $out/bin/gpt2-download-model
+    install -T -m755 gpt2convert.py $out/bin/gpt2-convert
+    install -D -m644 -t $out/share/gpt2tc readme.txt gpt2vocab.txt Changelog
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Text completion and compression using GPT-2";
+    homepage = "https://bellard.org/libnc/gpt2tc.html";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ anna328p ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/grin/default.nix b/nixpkgs/pkgs/tools/text/grin/default.nix
new file mode 100644
index 000000000000..3e3763d9ef71
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/grin/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, fetchpatch, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "grin";
+  version = "1.3.0";
+  namePrefix = "";
+
+  src = fetchFromGitHub {
+    owner = "matthew-brett";
+    repo = pname;
+    rev = "1.3.0";
+    hash = "sha256-exKUy7LaDtpq0rJLSuNYsIcynpB4QLtLIE6T/ncB7RQ=";
+  };
+
+  patches = [
+    # https://github.com/matthew-brett/grin/pull/4
+    (fetchpatch {
+      name = "replace-nose-with-nose3.patch";
+      url = "https://github.com/matthew-brett/grin/commit/ba473fa4f5da1b337ee80d7d31772a4e41ffa62d.patch";
+      hash = "sha256-CnWHynKSsXYjSsTLdPuwpcIndrCdq3cQYS8teg5EM0A=";
+    })
+  ];
+
+  nativeCheckInputs = with python3Packages; [
+    nose3
+  ];
+
+  meta = {
+    homepage = "https://github.com/matthew-brett/grin";
+    description = "A grep program configured the way I like it";
+    platforms = lib.platforms.all;
+    maintainers = [ lib.maintainers.sjagoe ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/grip-search/default.nix b/nixpkgs/pkgs/tools/text/grip-search/default.nix
new file mode 100644
index 000000000000..57f0139dbc98
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/grip-search/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, boost, pkg-config, cmake, catch2 }:
+
+stdenv.mkDerivation rec {
+  pname = "grip-search";
+  version = "0.8";
+
+  src = fetchFromGitHub {
+    owner = "sc0ty";
+    repo = "grip";
+    rev = "v${version}";
+    sha256 = "0bkqarylgzhis6fpj48qbifcd6a26cgnq8784hgnm707rq9kb0rx";
+  };
+
+  nativeBuildInputs = [ pkg-config cmake catch2 ];
+
+  doCheck = true;
+
+  buildInputs = [ boost ];
+
+  patchPhase = ''
+    substituteInPlace src/general/config.h --replace "CUSTOM-BUILD" "${version}"
+  '';
+
+  meta = with lib; {
+    description = "Fast, indexed regexp search over large file trees";
+    homepage = "https://github.com/sc0ty/grip";
+    license = licenses.gpl3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ tex ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/groff/default.nix b/nixpkgs/pkgs/tools/text/groff/default.nix
new file mode 100644
index 000000000000..df06292c4f3e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/groff/default.nix
@@ -0,0 +1,136 @@
+{ lib, stdenv, fetchurl, fetchpatch, perl
+, enableGhostscript ? false
+, ghostscript, gawk, libX11, libXaw, libXt, libXmu # for postscript and html output
+, enableHtml ? false, psutils, netpbm # for html output
+, enableIconv ? false, iconv
+, enableLibuchardet ? false, libuchardet # for detecting input file encoding in preconv(1)
+, buildPackages
+, autoreconfHook
+, pkg-config
+, texinfo
+, bison
+, bash
+}:
+
+stdenv.mkDerivation rec {
+  pname = "groff";
+  version = "1.23.0";
+
+  src = fetchurl {
+    url = "mirror://gnu/groff/${pname}-${version}.tar.gz";
+    hash = "sha256-a5dX9ZK3UYtJAutq9+VFcL3Mujeocf3bLTCuOGNRHBM=";
+  };
+
+  outputs = [ "out" "man" "doc" "info" "perl" ];
+
+  enableParallelBuilding = true;
+
+  postPatch = ''
+    # BASH_PROG gets replaced with a path to the build bash which doesn't get automatically patched by patchShebangs
+    substituteInPlace contrib/gdiffmk/gdiffmk.sh \
+      --replace "@BASH_PROG@" "/bin/sh"
+  '' + lib.optionalString enableHtml ''
+    substituteInPlace src/preproc/html/pre-html.cpp \
+      --replace "psselect" "${psutils}/bin/psselect" \
+      --replace "pnmcut" "${lib.getBin netpbm}/bin/pnmcut" \
+      --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \
+      --replace "pnmtopng" "${lib.getBin netpbm}/bin/pnmtopng"
+    substituteInPlace tmac/www.tmac.in \
+      --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \
+      --replace "pngtopnm" "${lib.getBin netpbm}/bin/pngtopnm" \
+      --replace "@PNMTOPS_NOSETPAGE@" "${lib.getBin netpbm}/bin/pnmtops -nosetpage"
+  '' + lib.optionalString (enableGhostscript || enableHtml) ''
+    substituteInPlace contrib/pdfmark/pdfroff.sh \
+      --replace '$GROFF_GHOSTSCRIPT_INTERPRETER' "${lib.getBin ghostscript}/bin/gs" \
+      --replace '$GROFF_AWK_INTERPRETER' "${lib.getBin gawk}/bin/gawk"
+  '';
+
+  strictDeps = true;
+  nativeBuildInputs = [ autoreconfHook pkg-config texinfo ]
+    # Required due to the patch that changes .ypp files.
+    ++ lib.optional (stdenv.cc.isClang && lib.versionAtLeast stdenv.cc.version "9") bison;
+  buildInputs = [ perl bash ]
+    ++ lib.optionals enableGhostscript [ ghostscript gawk libX11 libXaw libXt libXmu ]
+    ++ lib.optionals enableHtml [ psutils netpbm ]
+    ++ lib.optionals enableIconv [ iconv ]
+    ++ lib.optionals enableLibuchardet [ libuchardet ];
+
+  # Builds running without a chroot environment may detect the presence
+  # of /usr/X11 in the host system, leading to an impure build of the
+  # package. To avoid this issue, X11 support is explicitly disabled.
+  configureFlags = lib.optionals (!enableGhostscript) [
+    "--without-x"
+  ] ++ [
+    "ac_cv_path_PERL=${buildPackages.perl}/bin/perl"
+  ] ++ lib.optionals enableGhostscript [
+    "--with-gs=${lib.getBin ghostscript}/bin/gs"
+    "--with-awk=${lib.getBin gawk}/bin/gawk"
+    "--with-appresdir=${placeholder "out"}/lib/X11/app-defaults"
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    "gl_cv_func_signbit=yes"
+  ];
+
+  makeFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    # Trick to get the build system find the proper 'native' groff
+    # http://www.mail-archive.com/bug-groff@gnu.org/msg01335.html
+    "GROFF_BIN_PATH=${buildPackages.groff}/bin"
+    "GROFFBIN=${buildPackages.groff}/bin/groff"
+  ];
+
+  doCheck = true;
+
+  postInstall = ''
+    for f in 'man.local' 'mdoc.local'; do
+        cat '${./site.tmac}' >>"$out/share/groff/site-tmac/$f"
+    done
+
+    moveToOutput bin/gropdf $perl
+    moveToOutput bin/pdfmom $perl
+    moveToOutput bin/roff2text $perl
+    moveToOutput bin/roff2pdf $perl
+    moveToOutput bin/roff2ps $perl
+    moveToOutput bin/roff2dvi $perl
+    moveToOutput bin/roff2ps $perl
+    moveToOutput bin/roff2html $perl
+    moveToOutput bin/glilypond $perl
+    moveToOutput bin/mmroff $perl
+    moveToOutput bin/roff2x $perl
+    moveToOutput bin/afmtodit $perl
+    moveToOutput bin/gperl $perl
+    moveToOutput bin/chem $perl
+
+    moveToOutput bin/gpinyin $perl
+    moveToOutput lib/groff/gpinyin $perl
+    substituteInPlace $perl/bin/gpinyin \
+      --replace $out/lib/groff/gpinyin $perl/lib/groff/gpinyin
+
+    moveToOutput bin/grog $perl
+    moveToOutput lib/groff/grog $perl
+    substituteInPlace $perl/bin/grog \
+      --replace $out/lib/groff/grog $perl/lib/groff/grog
+
+    find $perl/ -type f -print0 | xargs --null sed -i 's|${buildPackages.perl}|${perl}|'
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/groff/";
+    description = "GNU Troff, a typesetting package that reads plain text and produces formatted output";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pSub ];
+
+    longDescription = ''
+      groff is the GNU implementation of troff, a document formatting
+      system.  Included in this release are implementations of troff,
+      pic, eqn, tbl, grn, refer, -man, -mdoc, -mom, and -ms macros,
+      and drivers for PostScript, TeX dvi format, HP LaserJet 4
+      printers, Canon CAPSL printers, HTML and XHTML format (beta
+      status), and typewriter-like devices.  Also included is a
+      modified version of the Berkeley -me macros, the enhanced
+      version gxditview of the X11 xditview previewer, and an
+      implementation of the -mm macros.
+    '';
+
+    outputsToInstall = [ "out" "perl" ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/groff/site.tmac b/nixpkgs/pkgs/tools/text/groff/site.tmac
new file mode 100644
index 000000000000..07923f120009
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/groff/site.tmac
@@ -0,0 +1,13 @@
+.
+.if n \{\
+.  \" Character translations for non-keyboard
+.  \" characters - to make them searchable
+.  if '\*[.T]'utf8' \{\
+.    char \- \N'45'
+.    char - \N'45'
+.    char ' \N'39'
+.    char \' \N'39'
+.  \}
+.
+.ds doc-default-operating-system Nixpkgs
+.ds doc-volume-operating-system Nixpkgs
diff --git a/nixpkgs/pkgs/tools/text/gtranslator/default.nix b/nixpkgs/pkgs/tools/text/gtranslator/default.nix
new file mode 100644
index 000000000000..d51ac05701d4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gtranslator/default.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, lib
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, itstool
+, gettext
+, python3
+, wrapGAppsHook
+, libxml2
+, libgda6
+, libhandy
+, libsoup_3
+, json-glib
+, gspell
+, glib
+, gtk3
+, gtksourceview4
+, gnome
+, gsettings-desktop-schemas
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gtranslator";
+  version = "42.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "Kme8v+ZDBhsGltiaEIR9UL81kF/zNhuYcTV9PjQi8Ts=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    itstool
+    gettext
+    python3
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    libxml2
+    glib
+    gtk3
+    gtksourceview4
+    libgda6
+    libhandy
+    libsoup_3
+    json-glib
+    gettext
+    gspell
+    gsettings-desktop-schemas
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/meson_post_install.py
+    patchShebangs build-aux/meson/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with lib; {
+    description = "GNOME translation making program";
+    homepage = "https://wiki.gnome.org/Apps/Gtranslator";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gtree/default.nix b/nixpkgs/pkgs/tools/text/gtree/default.nix
new file mode 100644
index 000000000000..022ed0b0f0b6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gtree/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, testers
+, gtree
+}:
+
+buildGoModule rec {
+  pname = "gtree";
+  version = "1.9.12";
+
+  src = fetchFromGitHub {
+    owner = "ddddddO";
+    repo = "gtree";
+    rev = "v${version}";
+    hash = "sha256-N4gw2SaNAcQULNxE+v4I+UhfziLH7zLs0cIP5mHGUx0=";
+  };
+
+  vendorHash = "sha256-3VNcis7G0k/WTt8APvFaVBoYTo+RhjpnT1cGWhQhXK0=";
+
+  subPackages = [
+    "cmd/gtree"
+  ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=main.Version=${version}"
+    "-X=main.Revision=${src.rev}"
+  ];
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = gtree;
+    };
+  };
+
+  meta = with lib; {
+    description = "Generate directory trees and directories using Markdown or programmatically";
+    homepage = "https://github.com/ddddddO/gtree";
+    changelog = "https://github.com/ddddddO/gtree/releases/tag/${src.rev}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/gucci/default.nix b/nixpkgs/pkgs/tools/text/gucci/default.nix
new file mode 100644
index 000000000000..f866f74710a9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/gucci/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildGoModule, fetchFromGitHub, testers, gucci }:
+
+buildGoModule rec {
+  pname = "gucci";
+  version = "1.6.10";
+
+  src = fetchFromGitHub {
+    owner = "noqcks";
+    repo = "gucci";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-bwPQQtaPHby96C5ZHZhBTok+m8GPPS40U1CUPVYqCa4=";
+  };
+
+  vendorHash = "sha256-/4OnbtxxhXQnmSV6UbjgzXdL7szhL9rKiG5BR8FsyqI=";
+
+  ldflags = [ "-s" "-w" "-X main.AppVersion=${version}" ];
+
+  passthru.tests.version = testers.testVersion {
+    package = gucci;
+  };
+
+  checkFlags = [ "-short" ];
+
+  # Integration tests rely on Ginkgo but fail.
+  # Related: https://github.com/onsi/ginkgo/issues/602
+  #
+  # Disable integration tests.
+  preCheck = ''
+    buildFlagsArray+=("-run" "[^(TestIntegration)]")
+  '';
+
+  meta = with lib; {
+    description = "A simple CLI templating tool written in golang";
+    homepage = "https://github.com/noqcks/gucci";
+    license = licenses.mit;
+    maintainers = with maintainers; [ braydenjw ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/hck/default.nix b/nixpkgs/pkgs/tools/text/hck/default.nix
new file mode 100644
index 000000000000..0467894b116a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/hck/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, cmake
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "hck";
+  version = "0.9.2";
+
+  src = fetchFromGitHub {
+    owner = "sstadick";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-KPpvai7+El2JA97EXDCstZ66FeyVCe7w+ERDDNRZ/h8=";
+  };
+
+  cargoSha256 = "sha256-TpwUO0BL8kambnxAUE9+l6YYkNL1WzmkTYn1YxjufdY=";
+
+  nativeBuildInputs = [ cmake ];
+
+  meta = with lib; {
+    description = "A close to drop in replacement for cut that can use a regex delimiter instead of a fixed string";
+    homepage = "https://github.com/sstadick/hck";
+    changelog = "https://github.com/sstadick/hck/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit /* or */ unlicense ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/hcledit/default.nix b/nixpkgs/pkgs/tools/text/hcledit/default.nix
new file mode 100644
index 000000000000..d5b2fb0cc0a2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/hcledit/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "hcledit";
+  version = "0.2.10";
+
+  src = fetchFromGitHub {
+    owner = "minamijoyo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rXmbRbM6U1JtV3t8C0LlLAdYpxd4UjxrbrPVHdqiCJ8=";
+  };
+
+  vendorHash = "sha256-9ND/vDPDn3rn213Jn1UPMmYAkMI86gYx9QLcV/oFGh4=";
+
+  meta = with lib; {
+    description = "A command line editor for HCL";
+    homepage = "https://github.com/minamijoyo/hcledit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aleksana ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/highlight/default.nix b/nixpkgs/pkgs/tools/text/highlight/default.nix
new file mode 100644
index 000000000000..4287b7964801
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/highlight/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, fetchFromGitLab, getopt, lua, boost, libxcrypt, pkg-config, swig, perl, gcc }:
+
+let
+  self = stdenv.mkDerivation rec {
+    pname = "highlight";
+    version = "4.7";
+
+    src = fetchFromGitLab {
+      owner = "saalen";
+      repo = "highlight";
+      rev = "v${version}";
+      sha256 = "sha256-WblpRrvfFp4PlyH4RS2VNKXYD911H+OcnSL5rctyxiM=";
+    };
+
+    enableParallelBuilding = true;
+
+    nativeBuildInputs = [ pkg-config swig perl ]
+      ++ lib.optional stdenv.isDarwin gcc;
+
+    buildInputs = [ getopt lua boost libxcrypt ];
+
+    postPatch = ''
+      substituteInPlace src/makefile \
+        --replace "shell pkg-config" "shell $PKG_CONFIG"
+      substituteInPlace makefile \
+        --replace 'gzip' 'gzip -n'
+    '' + lib.optionalString stdenv.cc.isClang ''
+      substituteInPlace src/makefile \
+          --replace 'CXX=g++' 'CXX=clang++'
+    '';
+
+    preConfigure = ''
+      makeFlags="PREFIX=$out conf_dir=$out/etc/highlight/ CXX=$CXX AR=$AR"
+    '';
+
+    # This has to happen _before_ the main build because it does a
+    # `make clean' for some reason.
+    preBuild = lib.optionalString (!stdenv.isDarwin) ''
+      make -C extras/swig $makeFlags perl
+    '';
+
+    postCheck = lib.optionalString (!stdenv.isDarwin) ''
+      perl -Iextras/swig extras/swig/testmod.pl
+    '';
+
+    preInstall = lib.optionalString (!stdenv.isDarwin) ''
+      mkdir -p $out/${perl.libPrefix}
+      install -m644 extras/swig/highlight.{so,pm} $out/${perl.libPrefix}
+      make -C extras/swig clean # Clean up intermediate files.
+    '';
+
+    meta = with lib; {
+      description = "Source code highlighting tool";
+      homepage = "http://www.andre-simon.de/doku/highlight/en/highlight.php";
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ willibutz ];
+    };
+  };
+
+in
+  if stdenv.isDarwin then self
+  else perl.pkgs.toPerlModule self
diff --git a/nixpkgs/pkgs/tools/text/html-tidy/default.nix b/nixpkgs/pkgs/tools/text/html-tidy/default.nix
new file mode 100644
index 000000000000..1f9c04b7c9db
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/html-tidy/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, cmake, libxslt, html-tidy }:
+
+stdenv.mkDerivation rec {
+  pname = "html-tidy";
+  version = "5.8.0";
+
+  src = fetchFromGitHub {
+    owner = "htacg";
+    repo = "tidy-html5";
+    rev = version;
+    hash = "sha256-vzVWQodwzi3GvC9IcSQniYBsbkJV20iZanF33A0Gpe0=";
+  };
+
+  # https://github.com/htacg/tidy-html5/pull/1036
+  patches = (fetchpatch {
+    url = "https://github.com/htacg/tidy-html5/commit/e9aa038bd06bd8197a0dc049380bc2945ff55b29.diff";
+    sha256 = "sha256-Q2GjinNBWLL+HXUtslzDJ7CJSTflckbjweiSMCnIVwg=";
+  });
+
+  nativeBuildInputs = [ cmake libxslt/*manpage*/ ]
+    ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) html-tidy;
+
+  cmakeFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    "-DHOST_TIDY=tidy"
+  ];
+
+  # ATM bin/tidy is statically linked, as upstream provides no other option yet.
+  # https://github.com/htacg/tidy-html5/issues/326#issuecomment-160322107
+
+  meta = with lib; {
+    description = "A HTML validator and `tidier'";
+    longDescription = ''
+      HTML Tidy is a command-line tool and C library that can be
+      used to validate and fix HTML data.
+    '';
+    license = licenses.libpng; # very close to it - the 3 clauses are identical
+    homepage = "http://html-tidy.org";
+    platforms = platforms.all;
+    maintainers = with maintainers; [ edwtjo ];
+    mainProgram = "tidy";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/html2text/default.nix b/nixpkgs/pkgs/tools/text/html2text/default.nix
new file mode 100644
index 000000000000..fff3e44baf69
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/html2text/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "html2text";
+  version = "1.3.2a";
+
+  src = fetchurl {
+    url = "http://www.mbayer.de/html2text/downloads/html2text-${version}.tar.gz";
+    sha256 = "000b39d5d910b867ff7e087177b470a1e26e2819920dcffd5991c33f6d480392";
+  };
+
+  preConfigure = ''
+    substituteInPlace configure \
+        --replace /bin/echo echo \
+        --replace CXX=unknown ':'
+  '';
+
+  # the --prefix has no effect
+  installPhase = ''
+    mkdir -p $out/bin $out/man/man{1,5}
+    cp html2text $out/bin
+    cp html2text.1.gz $out/man/man1
+    cp html2textrc.5.gz $out/man/man5
+  '';
+
+  meta = {
+    description = "Convert HTML to plain text";
+    homepage = "http://www.mbayer.de/html2text/";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.eikek ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/huniq/default.nix b/nixpkgs/pkgs/tools/text/huniq/default.nix
new file mode 100644
index 000000000000..a1d30d2fb11d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/huniq/default.nix
@@ -0,0 +1,20 @@
+{ lib, rustPlatform, fetchCrate }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "huniq";
+  version = "2.7.0";
+
+  src = fetchCrate {
+    inherit pname version;
+    sha256 = "sha256-5GvHM05qY/Jj1mPYwn88Zybn6Nn5nJIaw0XP8iCcrwE=";
+  };
+
+  cargoSha256 = "sha256-pwDaLHJbVpZe7dAtd5/ytyHZkUHjCcNjtw3q7HF1qVQ=";
+
+  meta = with lib; {
+    description = "Command line utility to remove duplicates from the given input";
+    homepage = "https://github.com/koraa/huniq";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/hyx/default.nix b/nixpkgs/pkgs/tools/text/hyx/default.nix
new file mode 100644
index 000000000000..28b4765ede4a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/hyx/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, memstreamHook }:
+
+stdenv.mkDerivation rec {
+  pname = "hyx";
+  version = "2021.06.09";
+
+  src = fetchurl {
+    url = "https://yx7.cc/code/hyx/hyx-${lib.replaceStrings [ "-" ] [ "." ] version}.tar.xz";
+    sha256 = "sha256-jU8U5YWE1syPBOQ8o4BC7tIYiCo4kknCCwhnMCVtpes=";
+  };
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace Makefile \
+      --replace "-Wl,-z,relro,-z,now -fpic -pie" ""
+  '';
+
+  buildInputs = lib.optional (stdenv.system == "x86_64-darwin") memstreamHook;
+
+  installPhase = ''
+    install -vD hyx $out/bin/hyx
+  '';
+
+  meta = with lib; {
+    description = "minimalistic but powerful Linux console hex editor";
+    homepage = "https://yx7.cc/code/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fpletz ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/icdiff/default.nix b/nixpkgs/pkgs/tools/text/icdiff/default.nix
new file mode 100644
index 000000000000..1ab884b12d4d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/icdiff/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, python3Packages, bash, git, less }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "icdiff";
+  version = "1.9.5";
+
+  src = fetchFromGitHub {
+    owner = "jeffkaufman";
+    repo = "icdiff";
+    rev = "release-${version}";
+    sha256 = "080v8h09pv8qwplin4kwfm0kmqjwdqjfxbpcdrv16sv4hwfwl5qd";
+  };
+
+  nativeCheckInputs = [
+    bash
+    git
+    less
+  ];
+
+  # error: could not lock config file /homeless-shelter/.gitconfig: No such file or directory
+  doCheck = false;
+
+  checkPhase = ''
+    patchShebangs test.sh
+    ./test.sh ${python3Packages.python.interpreter}
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.jefftk.com/icdiff";
+    description = "Side-by-side highlighted command line diffs";
+    maintainers = with maintainers; [ ];
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/igrep/default.nix b/nixpkgs/pkgs/tools/text/igrep/default.nix
new file mode 100644
index 000000000000..db947ca2cc38
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/igrep/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, Security
+, testers
+, igrep
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "igrep";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "konradsz";
+    repo = "igrep";
+    rev = "v${version}";
+    hash = "sha256-L5mHuglU0CvTi02pbR8xfezBoH8L/DS+7jgvYvb4yro=";
+  };
+
+  cargoHash = "sha256-k63tu5Ffus4z0yd8vQ79q4+tokWAXD05Pvv9JByfnDg=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  passthru.tests = {
+    version = testers.testVersion { package = igrep; command = "ig --version"; };
+  };
+
+  meta = with lib; {
+    description = "Interactive Grep";
+    homepage = "https://github.com/konradsz/igrep";
+    changelog = "https://github.com/konradsz/igrep/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ _0x4A6F ];
+    mainProgram = "ig";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/invoice2data/default.nix b/nixpkgs/pkgs/tools/text/invoice2data/default.nix
new file mode 100644
index 000000000000..fd5ead9e0c35
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/invoice2data/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, ghostscript
+, imagemagick
+, poppler_utils
+, python3
+, tesseract5
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "invoice2data";
+  version = "0.4.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "invoice-x";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ss2h8cg0sga+lzJyQHckrZB/Eb63Oj3FkqmGqWCzCQ8=";
+  };
+
+  patches = [
+    # https://github.com/invoice-x/invoice2data/pull/522
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/invoice-x/invoice2data/commit/ccea3857c7c8295ca51dc24de6cde78774ea7e64.patch";
+      hash = "sha256-BhqPW4hWG/EaR3qBv5a68dcvIMrCCT74GdDHr0Mss5Q=";
+    })
+  ];
+
+  nativeBuildInputs = with python3.pkgs; [
+    setuptools-git
+  ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    dateparser
+    pdfminer-six
+    pillow
+    pyyaml
+  ];
+
+  makeWrapperArgs = ["--prefix" "PATH" ":" (lib.makeBinPath [
+    ghostscript
+    imagemagick
+    tesseract5
+    poppler_utils
+  ])];
+
+  # Tests fails even when ran manually on my ubuntu machine !!
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "invoice2data"
+  ];
+
+  meta = with lib; {
+    description = "Data extractor for PDF invoices";
+    homepage = "https://github.com/invoice-x/invoice2data";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ispell/default.nix b/nixpkgs/pkgs/tools/text/ispell/default.nix
new file mode 100644
index 000000000000..6a004253a4f0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ispell/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, bison, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "ispell";
+  version = "3.4.05";
+
+  src = fetchurl {
+    url = "https://www.cs.hmc.edu/~geoff/tars/${pname}-${version}.tar.gz";
+    sha256 = "sha256-zwxt7eP9JfraQ3XYasr+WDy5bY/lRt50apLrtt+JVgI=";
+  };
+
+  buildInputs = [ bison ncurses ];
+
+  postPatch = ''
+    cat >> local.h <<EOF
+    ${lib.optionalString (!stdenv.isDarwin) "#define USG"}
+    #define TERMLIB "-lncurses"
+    #define LANGUAGES "{american,MASTERDICTS=american.med,HASHFILES=americanmed.hash}"
+    #define MASTERHASH "americanmed.hash"
+    #define BINDIR "$out/bin"
+    #define LIBDIR "$out/lib"
+    #define ELISPDIR "{$out}/share/emacs/site-lisp"
+    #define TEXINFODIR "$out/share/info"
+    #define MAN1DIR "$out/share/man/man1"
+    #define MAN4DIR "$out/share/man/man4"
+    #define MAN45DIR "$out/share/man/man5"
+    #define MINIMENU
+    #define HAS_RENAME
+    EOF
+  '';
+
+  meta = with lib; {
+    description = "An interactive spell-checking program for Unix";
+    homepage = "https://www.cs.hmc.edu/~geoff/ispell.html";
+    license = licenses.free;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/jbofihe/default.nix b/nixpkgs/pkgs/tools/text/jbofihe/default.nix
new file mode 100644
index 000000000000..111b019c3b13
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jbofihe/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, bison, flex, perl, }:
+
+stdenv.mkDerivation rec {
+  pname = "jbofihe";
+  version = "0.43";
+
+  src = fetchFromGitHub {
+    owner = "lojban";
+    repo = "jbofihe";
+    rev = "v${version}";
+    sha256 = "1xx7x1256sjncyzx656jl6jl546vn8zz0siymqalz6v9yf341p98";
+  };
+
+  nativeBuildInputs = [ bison flex perl ];
+
+  doCheck = true;
+  checkPhase = ''
+    runHook preCheck
+    (cd tests && ./run *.in)
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Parser & analyser for Lojban";
+    homepage = "https://github.com/lojban/jbofihe";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ chkno ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/jen/default.nix b/nixpkgs/pkgs/tools/text/jen/default.nix
new file mode 100644
index 000000000000..2361c1aafc1b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jen/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, rustPlatform
+, fetchCrate
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "jen";
+  version = "1.6.0";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-fpv/IzU23yAz1cumTbdQP6wHJX2U4acNxq8Zrx+YQVs=";
+  };
+
+  cargoHash = "sha256-LKiPG7k5UgaESP1ShsIWNMnm9resbRje746txOBo+Qs=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  meta = with lib; {
+    description = "A simple CLI generation tool for creating large datasets";
+    homepage = "https://github.com/whitfin/jen";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/jotdown/default.nix b/nixpkgs/pkgs/tools/text/jotdown/default.nix
new file mode 100644
index 000000000000..e39209cfe106
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jotdown/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "jotdown";
+  version = "0.3.2";
+
+  src = fetchFromGitHub {
+    owner = "hellux";
+    repo = "jotdown";
+    rev = version;
+    hash = "sha256-XouI3PHKPtX+3GkhMvdRfwJkCoofMgCY/NXB0tnLyUc=";
+  };
+
+  cargoHash = "sha256-PvKXVP90GOAgz4Sc37B4hli7rbNHVZbksVAo+uy2yEU=";
+
+  meta = with lib; {
+    description = "A minimal Djot CLI";
+    homepage = "https://github.com/hellux/jotdown";
+    changelog = "https://github.com/hellux/jotdown/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/jsawk/default.nix b/nixpkgs/pkgs/tools/text/jsawk/default.nix
new file mode 100644
index 000000000000..2f21900b8d01
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jsawk/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, spidermonkey_102 }:
+
+stdenv.mkDerivation {
+  pname = "jsawk";
+  version = "1.5-pre";
+  src = fetchFromGitHub {
+    owner = "micha";
+    repo = "jsawk";
+    rev = "5a14c4af3c7b59807701b70a954ecefc6f77e978";
+    sha256 = "0z3vdr3c8nvdrrxkjv9b4xg47mdb2hsknxpimw6shgwbigihapyr";
+  };
+  dontBuild = true;
+  nativeBuildInputs = [ makeWrapper ];
+  installPhase = ''
+    mkdir -p $out/bin
+    cp $src/jsawk $out/bin/
+    wrapProgram $out/bin/jsawk \
+      --prefix PATH : "${spidermonkey_102}/bin"
+  '';
+
+  meta = {
+    description = "Like awk, but for JSON";
+    homepage = "https://github.com/micha/jsawk";
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ puffnfresh ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/jumanpp/0001-Exclude-all-tests-from-the-build.patch b/nixpkgs/pkgs/tools/text/jumanpp/0001-Exclude-all-tests-from-the-build.patch
new file mode 100644
index 000000000000..d41bada82def
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jumanpp/0001-Exclude-all-tests-from-the-build.patch
@@ -0,0 +1,177 @@
+From c52a5046e19718a43d48c9b3cfdc121d964e8c3b Mon Sep 17 00:00:00 2001
+From: Maximilian Bosch <maximilian@mbosch.me>
+Date: Fri, 28 Jan 2022 17:43:35 +0100
+Subject: [PATCH] Exclude all tests from the build
+
+For some reason it isn't sufficient to set `-DJPP_ENABLE_TESTS=OFF`.
+Doing that because the tests on 2.0.0-rc3 don't seem to be working and
+the vendored catch2 doesn't build with glibc 2.34.
+---
+ src/CMakeLists.txt               |  3 +--
+ src/core/CMakeLists.txt          | 11 +----------
+ src/core/analysis/CMakeLists.txt |  2 --
+ src/core/codegen/CMakeLists.txt  |  3 ---
+ src/core/spec/CMakeLists.txt     |  2 --
+ src/core/training/CMakeLists.txt |  2 --
+ src/jumandic/CMakeLists.txt      |  8 +-------
+ src/rnn/CMakeLists.txt           |  5 +----
+ src/util/CMakeLists.txt          |  2 --
+ 9 files changed, 4 insertions(+), 34 deletions(-)
+
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 169dff5..64b6a07 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -67,7 +67,6 @@ function(jpp_feature_codegen)
+ endfunction(jpp_feature_codegen)
+ 
+ add_subdirectory(util)
+-add_subdirectory(testing)
+ add_subdirectory(core)
+ add_subdirectory(jumandic)
+-add_subdirectory(rnn)
+\ No newline at end of file
++add_subdirectory(rnn)
+diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
+index c63d134..01c825e 100644
+--- a/src/core/CMakeLists.txt
++++ b/src/core/CMakeLists.txt
+@@ -55,20 +55,11 @@ set(core_hdrs
+   ${core_hdrs}
+   )
+ 
+-set(core_test_srcs
+-  ${core_test_srcs}
+-  ${core_tsrcs}
+-  test/test_analyzer_env.h
+-  ../testing/test_analyzer.h
+-  )
+-
+ add_library(jpp_core ${core_srcs} ${core_hdrs} ${libs3p_pegtl_headers})
+-jpp_test_executable(jpp_core_tests ${core_test_srcs})
+ 
+ target_include_directories(jpp_core PUBLIC ${jpp_core_cfg_dir})
+ 
+ target_link_libraries(jpp_core PUBLIC jpp_util jpp_rnn PRIVATE pathie)
+-target_link_libraries(jpp_core_tests jpp_core jpp_core_train)
+ 
+ if (${JPP_USE_PROTOBUF})
+   target_include_directories(jpp_core PUBLIC ${Protobuf_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+@@ -78,4 +69,4 @@ endif()
+ add_subdirectory(benchmarks)
+ if (${JPP_ENABLE_DEV_TOOLS})
+   add_subdirectory(devtools)
+-endif ()
+\ No newline at end of file
++endif ()
+diff --git a/src/core/analysis/CMakeLists.txt b/src/core/analysis/CMakeLists.txt
+index 526263e..1b32f8d 100644
+--- a/src/core/analysis/CMakeLists.txt
++++ b/src/core/analysis/CMakeLists.txt
+@@ -79,5 +79,3 @@ jpp_core_files(core_hdrs
+   )
+ 
+ 
+-jpp_test_executable(jpp_core_analysis_tests ${core_analysis_tsrc})
+-target_link_libraries(jpp_core_analysis_tests jpp_core)
+diff --git a/src/core/codegen/CMakeLists.txt b/src/core/codegen/CMakeLists.txt
+index a905cee..fa759c7 100644
+--- a/src/core/codegen/CMakeLists.txt
++++ b/src/core/codegen/CMakeLists.txt
+@@ -30,7 +30,4 @@ set(jpp_codegen_tsrcs
+ 
+ add_library(jpp_core_codegen ${jpp_codegen_srcs} ${jpp_codegen_hdrs})
+ 
+-jpp_test_executable(jpp_codegen_tests ${jpp_codegen_tsrcs})
+-target_include_directories(jpp_codegen_tests PRIVATE ${cgtest02_INCLUDE})
+ target_link_libraries(jpp_core_codegen jpp_core)
+-target_link_libraries(jpp_codegen_tests jpp_core_codegen)
+\ No newline at end of file
+diff --git a/src/core/spec/CMakeLists.txt b/src/core/spec/CMakeLists.txt
+index f495d67..da827b9 100644
+--- a/src/core/spec/CMakeLists.txt
++++ b/src/core/spec/CMakeLists.txt
+@@ -33,5 +33,3 @@ jpp_core_files(core_hdrs
+ 
+   )
+ 
+-jpp_test_executable(jpp_core_spec_tests ${core_spec_tsrc} ${libs3p_pegtl_headers})
+-target_link_libraries(jpp_core_spec_tests jpp_core)
+\ No newline at end of file
+diff --git a/src/core/training/CMakeLists.txt b/src/core/training/CMakeLists.txt
+index 960437e..4ede9e1 100644
+--- a/src/core/training/CMakeLists.txt
++++ b/src/core/training/CMakeLists.txt
+@@ -39,7 +39,5 @@ set(core_train_hdrs
+ 
+ 
+ add_library(jpp_core_train ${core_train_src} ${core_train_hdrs})
+-jpp_test_executable(jpp_core_train_tests ${core_train_tsrc})
+ 
+ target_link_libraries(jpp_core_train jpp_core)
+-target_link_libraries(jpp_core_train_tests jpp_core_train)
+\ No newline at end of file
+diff --git a/src/jumandic/CMakeLists.txt b/src/jumandic/CMakeLists.txt
+index bef3149..85a8b5d 100644
+--- a/src/jumandic/CMakeLists.txt
++++ b/src/jumandic/CMakeLists.txt
+@@ -53,10 +53,6 @@ if (${JPP_USE_PROTOBUF})
+ endif ()
+ 
+ 
+-jpp_test_executable(jpp_jumandic_tests ${jumandic_tests})
+-jpp_test_executable(jpp_bug_tests ${bug_test_sources})
+-target_include_directories(jpp_jumandic_tests PRIVATE ${jpp_jumandic_cg_INCLUDE})
+-
+ add_executable(jpp_jumandic_bootstrap main/bootstrap.cc)
+ add_executable(jumanpp_v2 main/jumanpp.cc)
+ add_executable(jumanpp_v2_train main/jumanpp_train.cc main/jumanpp_train.h)
+@@ -64,11 +60,9 @@ add_executable(jpp_jumandic_pathdiff main/path_diff.cc)
+ target_include_directories(jpp_jumandic_pathdiff PRIVATE ${jpp_jumandic_cg_INCLUDE})
+ 
+ target_link_libraries(jpp_jumandic jpp_jumandic_spec)
+-target_link_libraries(jpp_jumandic_tests jpp_jumandic jpp_core_train)
+-target_link_libraries(jpp_bug_tests jpp_jumandic jpp_core_train)
+ target_link_libraries(jpp_jumandic_bootstrap jpp_jumandic)
+ target_link_libraries(jumanpp_v2 jpp_jumandic)
+ target_link_libraries(jumanpp_v2_train jpp_jumandic jpp_core_train)
+ target_link_libraries(jpp_jumandic_pathdiff jpp_jumandic)
+ 
+-install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/jumanpp_v2 RENAME jumanpp DESTINATION bin)
+\ No newline at end of file
++install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/jumanpp_v2 RENAME jumanpp DESTINATION bin)
+diff --git a/src/rnn/CMakeLists.txt b/src/rnn/CMakeLists.txt
+index 448ba51..ca09a00 100644
+--- a/src/rnn/CMakeLists.txt
++++ b/src/rnn/CMakeLists.txt
+@@ -1,12 +1,9 @@
+ set(jpp_rnn_sources mikolov_rnn.cc)
+ set(jpp_rnn_includes mikolov_rnn.h simple_rnn_impl.h mikolov_rnn_impl.h rnn_arg_parse.h)
+-set(jpp_rnn_tests mikolov_rnn_test.cc)
+ 
+ add_library(jpp_rnn ${jpp_rnn_sources} ${jpp_rnn_includes} )
+ add_library(jumanpp_rnn_legacy legacy/rnnlmlib.h legacy/rnnlmlib_static.h legacy/rnnlmlib_static.cpp)
+ 
+-jpp_test_executable(jpp_rnn_tests ${jpp_rnn_tests})
+ target_link_libraries(jpp_rnn jpp_util)
+-target_link_libraries(jpp_rnn_tests jpp_rnn jumanpp_rnn_legacy)
+ 
+-target_link_libraries(jumanpp_rnn_legacy jpp_util)
+\ No newline at end of file
++target_link_libraries(jumanpp_rnn_legacy jpp_util)
+diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
+index 53b6c57..c4599d5 100644
+--- a/src/util/CMakeLists.txt
++++ b/src/util/CMakeLists.txt
+@@ -25,8 +25,6 @@ endif()
+ 
+ 
+ add_library(jpp_util ${jpp_util_sources} ${jpp_util_headers} ${BACKWARD_headers})
+-jpp_test_executable(jpp_util_test ${jpp_util_test_srcs} ${jpp_util_headers})
+-target_link_libraries(jpp_util_test jpp_util)
+ target_link_libraries(jpp_util ${CMAKE_THREAD_LIBS_INIT})
+ target_include_directories(jpp_util PUBLIC ${JPP_LIBS_DIR} ${JPP_SRC_DIR})
+ target_compile_features(jpp_util PUBLIC
+-- 
+2.33.1
+
diff --git a/nixpkgs/pkgs/tools/text/jumanpp/default.nix b/nixpkgs/pkgs/tools/text/jumanpp/default.nix
new file mode 100644
index 000000000000..348c785ab28d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/jumanpp/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, fetchurl, fetchpatch, cmake, protobuf, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "jumanpp";
+  version = "2.0.0-rc3";
+
+  src = fetchurl {
+    url = "https://github.com/ku-nlp/${pname}/releases/download/v${version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-ASdr6qbkSe71M7QmuuwidCa4xQhDVoXBJ2XqvSY53pQ=";
+  };
+
+  patches = [
+    ./0001-Exclude-all-tests-from-the-build.patch
+    # https://github.com/ku-nlp/jumanpp/pull/132
+    (fetchpatch {
+      name = "fix-unused-warning.patch";
+      url = "https://github.com/ku-nlp/jumanpp/commit/cc0d555287c8b214e9d6f0279c449a4e035deee4.patch";
+      sha256 = "sha256-yRKwuUJ2UPXJcjxBGhSOmcQI/EOijiJDMmmmSRdNpX8=";
+    })
+    (fetchpatch {
+      name = "update-libs.patch";
+      url = "https://github.com/ku-nlp/jumanpp/commit/5e9068f56ae310ed7c1df185b14d49654ffe1ab6.patch";
+      sha256 = "sha256-X49/ZoLT0OGePLZYlgacNxA1dHM4WYdQ8I4LW3sW16E=";
+    })
+    (fetchpatch {
+      name = "fix-mmap-on-apple-m1.patch";
+      url = "https://github.com/ku-nlp/jumanpp/commit/0c22249f12928d0c962f03f229026661bf0c7921.patch";
+      sha256 = "sha256-g6CuruqyoMJxU/hlNoALx1QnFM8BlTsTd0pwlVrco3I=";
+    })
+  ];
+  cmakeFlags = [ "-DJPP_ENABLE_TESTS=OFF" ];
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ protobuf ]
+    ++ lib.optional stdenv.isDarwin libiconv;
+
+  meta = with lib; {
+    description = "A Japanese morphological analyser using a recurrent neural network language model (RNNLM)";
+    longDescription = ''
+      JUMAN++ is a new morphological analyser that considers semantic
+      plausibility of word sequences by using a recurrent neural network
+      language model (RNNLM).
+    '';
+    homepage = "https://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mt-caret ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/justify/default.nix b/nixpkgs/pkgs/tools/text/justify/default.nix
new file mode 100644
index 000000000000..86de7365663e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/justify/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchFromGitea
+, cmake
+}:
+
+stdenv.mkDerivation rec {
+  pname = "justify";
+  version = "unstable-2022-03-19";
+
+  src = fetchFromGitea {
+    domain = "tildegit.org";
+    owner = "jns";
+    repo = "justify";
+    rev = "0d397c20ed921c8e091bf18e548d174e15810e62";
+    sha256 = "sha256-406OhJt2Ila/LIhfqJXhbFqFxJJiRyMVI4/VK8Y43kc=";
+  };
+
+  postPatch = ''
+    sed '1i#include <algorithm>' -i src/stringHelper.h # gcc12
+  '';
+
+  nativeBuildInputs = [ cmake ];
+
+  installPhase = ''
+    install -D justify $out/bin/justify
+  '';
+
+  meta = with lib; {
+    homepage = "https://tildegit.org/jns/justify";
+    description = "Simple text alignment tool that supports left/right/center/fill justify alignment";
+    license = licenses.gpl3Only;
+    platforms = platforms.unix;
+    mainProgram = "justify";
+    maintainers = with maintainers; [ xfnw ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/kakasi/default.nix b/nixpkgs/pkgs/tools/text/kakasi/default.nix
new file mode 100644
index 000000000000..fa509f1b4a72
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/kakasi/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "kakasi";
+  version = "2.3.6";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  meta = with lib; {
+    description = "Kanji Kana Simple Inverter";
+    longDescription = ''
+      KAKASI is the language processing filter to convert Kanji
+      characters to Hiragana, Katakana or Romaji and may be
+      helpful to read Japanese documents.
+    '';
+    homepage    = "http://kakasi.namazu.org/";
+    license     = licenses.gpl2Plus;
+    platforms   = platforms.unix;
+  };
+
+  src = fetchurl {
+    url = "http://kakasi.namazu.org/stable/kakasi-${version}.tar.xz";
+    sha256 = "1qry3xqb83pjgxp3my8b1sy77z4f0893h73ldrvdaky70cdppr9f";
+  };
+
+  postPatch = ''
+    for a in tests/kakasi-* ; do
+      substituteInPlace $a \
+        --replace "/bin/echo" echo
+    done
+  '';
+
+  doCheck = false; # fails 1 of 6 tests
+
+}
diff --git a/nixpkgs/pkgs/tools/text/kdiff3/default.nix b/nixpkgs/pkgs/tools/text/kdiff3/default.nix
new file mode 100644
index 000000000000..8904d1bf690e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/kdiff3/default.nix
@@ -0,0 +1,39 @@
+{ mkDerivation
+, lib
+, fetchurl
+, extra-cmake-modules
+, kdoctools
+, wrapGAppsHook
+, boost
+, kcrash
+, kconfig
+, kinit
+, kparts
+, kiconthemes
+}:
+
+mkDerivation rec {
+  pname = "kdiff3";
+  version = "1.10.6";
+
+  src = fetchurl {
+    url = "https://download.kde.org/stable/${pname}/${pname}-${version}.tar.xz";
+    hash = "sha256-EzOu+dZjbGs0ZqF/0sXZbpGdTrUh6isjUoJUETau+zE=";
+  };
+
+  buildInputs = [ boost ];
+
+  nativeBuildInputs = [ extra-cmake-modules kdoctools wrapGAppsHook ];
+
+  propagatedBuildInputs = [ kconfig kcrash kinit kparts kiconthemes ];
+
+  cmakeFlags = [ "-Wno-dev" ];
+
+  meta = with lib; {
+    description = "Compares and merges 2 or 3 files or directories";
+    homepage = "https://invent.kde.org/sdk/kdiff3";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ peterhoeg ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/kytea/default.nix b/nixpkgs/pkgs/tools/text/kytea/default.nix
new file mode 100644
index 000000000000..322fa77ebad6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/kytea/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+
+  pname = "kytea";
+  version = "0.4.7";
+
+  src = fetchurl {
+    url    = "http://www.phontron.com/kytea/download/${pname}-${version}.tar.gz";
+    sha256 = "0ilzzwn5vpvm65bnbyb9f5rxyxy3jmbafw9w0lgl5iad1ka36jjk";
+  };
+
+  patches = [ ./gcc-O3.patch ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-error=c++11-narrowing";
+
+  meta = with lib; {
+    homepage = "http://www.phontron.com/kytea/";
+    description = "General toolkit developed for analyzing text";
+
+    longDescription = ''
+      A general toolkit developed for analyzing text, with a focus on Japanese,
+      Chinese and other languages requiring word or morpheme segmentation.
+    '';
+
+    license = licenses.asl20;
+
+    maintainers = with maintainers; [ ericsagnes ];
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/tools/text/kytea/gcc-O3.patch b/nixpkgs/pkgs/tools/text/kytea/gcc-O3.patch
new file mode 100644
index 000000000000..71b1d0c3b16e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/kytea/gcc-O3.patch
@@ -0,0 +1,13 @@
+diff --git a/src/lib/kytea-util.cpp b/src/lib/kytea-util.cpp
+index 7c8c4c6..4492df1 100644
+--- a/src/lib/kytea-util.cpp
++++ b/src/lib/kytea-util.cpp
+@@ -49,5 +49,8 @@ void checkValueVecEqual(const std::vector<T> * a, const std::vector<T> * b) {
+ 
++template void checkValueVecEqual(const std::vector<unsigned int> & a, const std::vector<unsigned int> & b);
+ template void checkValueVecEqual(const std::vector<unsigned int> * a, const std::vector<unsigned int> * b);
++template void checkValueVecEqual(const std::vector<short> & a, const std::vector<short> & b);
+ template void checkValueVecEqual(const std::vector<short> * a, const std::vector<short> * b);
+ template void checkValueVecEqual(const std::vector<vector<KyteaString> > * a, const std::vector<vector<KyteaString> > * b);
++template void checkValueVecEqual(const std::vector<int> & a, const std::vector<int> & b);
+ template void checkValueVecEqual(const std::vector<int> * a, const std::vector<int> * b);
diff --git a/nixpkgs/pkgs/tools/text/l2md/default.nix b/nixpkgs/pkgs/tools/text/l2md/default.nix
new file mode 100644
index 000000000000..758130e9f0aa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/l2md/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchgit, libgit2 }:
+
+stdenv.mkDerivation rec {
+  pname = "l2md";
+  version = "unstable-2021-10-27";
+
+  src = fetchgit {
+    url = "https://git.kernel.org/pub/scm/linux/kernel/git/dborkman/l2md.git";
+    rev = "9db252bc1716ebaf0abd3a47a59ea78e4e6253d6";
+    sha256 = "sha256-H/leDUwQM55akyXsmTnI2YsnG4i1KQtf4bBt1fizy8E=";
+  };
+
+  buildInputs = [ libgit2 ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp l2md $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Convert public-inbox archives to maildir messages";
+    longDescription = ''
+      Quick and dirty hack to import lore.kernel.org list archives via git,
+      to export them in maildir format or through a pipe, and to keep them
+      periodically synced.
+    '';
+    homepage = "https://git.kernel.org/pub/scm/linux/kernel/git/dborkman/l2md.git";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ yoctocell ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/languagetool-rust/default.nix b/nixpkgs/pkgs/tools/text/languagetool-rust/default.nix
new file mode 100644
index 000000000000..eda1060320c8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/languagetool-rust/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, installShellFiles
+, pkg-config
+, openssl
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "languagetool-rust";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "jeertmans";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-YsVK72q+A9T00u9bXIUfGDhwQl5kiLMec6onbp9YKkg=";
+  };
+
+  cargoHash = "sha256-Yit6zWWEcH5LXpcvy9EXUvRNz+JsyW10fauSNBf1BoU=";
+
+  buildFeatures = [ "full" ];
+
+  nativeBuildInputs = [ installShellFiles pkg-config ];
+  buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ Security ];
+
+  checkFlags = [
+    # requires network access
+    "--skip=server::tests::test_server_check_data"
+    "--skip=server::tests::test_server_check_text"
+    "--skip=server::tests::test_server_languages"
+    "--skip=server::tests::test_server_ping"
+    "--skip=test_match_positions_1"
+    "--skip=test_match_positions_2"
+    "--skip=test_match_positions_3"
+    "--skip=test_match_positions_4"
+    "--skip=src/lib/lib.rs"
+    "--skip=test_basic_check_data"
+    "--skip=test_basic_check_file"
+    "--skip=test_basic_check_files"
+    "--skip=test_basic_check_piped"
+    "--skip=test_basic_check_text"
+    "--skip=test_check_with_dict"
+    "--skip=test_check_with_dicts"
+    "--skip=test_check_with_disabled_categories"
+    "--skip=test_check_with_disabled_category"
+    "--skip=test_check_with_disabled_rule"
+    "--skip=test_check_with_disabled_rules"
+    "--skip=test_check_with_enabled_categories"
+    "--skip=test_check_with_enabled_category"
+    "--skip=test_check_with_enabled_only_category"
+    "--skip=test_check_with_enabled_only_rule"
+    "--skip=test_check_with_enabled_only_without_enabled"
+    "--skip=test_check_with_enabled_rule"
+    "--skip=test_check_with_enabled_rules"
+    "--skip=test_check_with_language"
+    "--skip=test_check_with_picky_level"
+    "--skip=test_check_with_preferred_variant"
+    "--skip=test_check_with_preferred_variants"
+    "--skip=test_check_with_unexisting_language"
+    "--skip=test_check_with_username_and_key"
+    "--skip=test_languages"
+    "--skip=test_ping"
+    "--skip=test_words"
+    "--skip=test_words_add"
+    "--skip=test_words_delete"
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd ltrs \
+      --bash <($out/bin/ltrs completions bash) \
+      --fish <($out/bin/ltrs completions fish) \
+      --zsh <($out/bin/ltrs completions zsh)
+  '';
+
+  meta = with lib; {
+    description = "LanguageTool API in Rust";
+    homepage = "https://github.com/jeertmans/languagetool-rust";
+    license = licenses.mit;
+    maintainers = with maintainers; [ name-snrl ];
+    mainProgram = "ltrs";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/languagetool/default.nix b/nixpkgs/pkgs/tools/text/languagetool/default.nix
new file mode 100644
index 000000000000..65fcb5b71e7b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/languagetool/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchzip, jre, makeWrapper, nixosTests }:
+
+stdenv.mkDerivation rec {
+  pname = "LanguageTool";
+  version = "6.2";
+
+  src = fetchzip {
+    url = "https://www.languagetool.org/download/${pname}-${version}.zip";
+    sha256 = "sha256-I0Blp3o+NVL0b/86UTztufwKVkgO9KNXtBuUrUnbWco=";
+  };
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ jre ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share
+    mv -- * $out/share/
+
+    for lt in languagetool{,-commandline,-server};do
+      makeWrapper ${jre}/bin/java $out/bin/$lt \
+        --add-flags "-cp $out/share/ -jar $out/share/$lt.jar"
+    done
+
+    makeWrapper ${jre}/bin/java $out/bin/languagetool-http-server \
+      --add-flags "-cp $out/share/languagetool-server.jar org.languagetool.server.HTTPServer"
+
+    runHook postInstall
+  '';
+
+  passthru.tests.languagetool = nixosTests.languagetool;
+
+  meta = with lib; {
+    homepage = "https://languagetool.org";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ edwtjo ];
+    platforms = jre.meta.platforms;
+    description = "A proofreading program for English, French German, Polish, and more";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ledger2beancount/default.nix b/nixpkgs/pkgs/tools/text/ledger2beancount/default.nix
new file mode 100644
index 000000000000..385222937676
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ledger2beancount/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, perlPackages, beancount }:
+
+let
+  perlDeps = with perlPackages; [
+    DateCalc
+    DateTimeFormatStrptime
+    enum
+    FileBaseDir
+    GetoptLongDescriptive
+    ListMoreUtils
+    RegexpCommon
+    StringInterpolate
+    YAMLLibYAML
+  ];
+
+in stdenv.mkDerivation rec {
+  pname = "ledger2beancount";
+  version = "2.7";
+
+  src = fetchFromGitHub {
+    owner = "beancount";
+    repo = "ledger2beancount";
+    rev = version;
+    sha256 = "sha256-2LIP3ljK1HMAwjk2ueIf9pFL+UUnGDgx9GYNtRztdFY=";
+  };
+
+  dontBuild = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ perlPackages.perl beancount ] ++ perlDeps;
+
+  makeFlags = [ "prefix=$(out)" ];
+  installFlags = [ "INSTALL=install" ];
+
+  installPhase = ''
+    mkdir -p $out
+    cp -r $src/bin $out/bin
+  '';
+
+  postFixup = ''
+    wrapProgram "$out/bin/ledger2beancount" \
+      --set PERL5LIB "${perlPackages.makeFullPerlPath perlDeps}"
+  '';
+
+  meta = with lib; {
+    description = "Ledger to Beancount text-based converter";
+    longDescription = ''
+      A script to automatically convert Ledger-based textual ledgers to Beancount ones.
+
+      Conversion is based on (concrete) syntax, so that information that is not meaningful for accounting reasons but still valuable (e.g., comments, formatting, etc.) can be preserved.
+    '';
+    homepage = "https://github.com/beancount/ledger2beancount";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pablovsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/link-grammar/default.nix b/nixpkgs/pkgs/tools/text/link-grammar/default.nix
new file mode 100644
index 000000000000..0406c41d1a88
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/link-grammar/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, python3
+, flex
+, sqlite
+, libedit
+, runCommand
+, dieHook
+}:
+
+let
+
+link-grammar = stdenv.mkDerivation rec {
+  pname = "link-grammar";
+  version = "5.10.5";
+
+  outputs = [ "bin" "out" "dev" "man" ];
+
+  src = fetchurl {
+    url = "http://www.abisource.com/downloads/${pname}/${version}/${pname}-${version}.tar.gz";
+    sha256 = "sha256-MkcQzYEyl1/5zLU1CXMvdVhHOxwZ8XiSAAo97bhhiu0=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    python3
+    flex
+  ];
+
+  buildInputs = [
+    sqlite
+    libedit
+  ];
+
+  configureFlags = [
+    "--disable-java-bindings"
+  ];
+
+  doCheck = true;
+
+  passthru.tests = {
+    quick = runCommand "link-grammar-quick-test" {
+      buildInputs = [
+        link-grammar
+        dieHook
+      ];
+    } ''
+      echo "Furiously sleep ideas green colorless." | link-parser en | grep "No complete linkages found." || die "Grammaticaly invalid sentence was parsed."
+      echo "Colorless green ideas sleep furiously." | link-parser en | grep "Found .* linkages." || die "Grammaticaly valid sentence was not parsed."
+      touch $out
+    '';
+  };
+
+  meta = with lib; {
+    description = "A Grammar Checking library";
+    homepage = "https://www.abisource.com/projects/link-grammar/";
+    changelog = "https://github.com/opencog/link-grammar/blob/link-grammar-${version}/ChangeLog";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ jtojnar ];
+    platforms = platforms.unix;
+  };
+};
+
+in
+  link-grammar
diff --git a/nixpkgs/pkgs/tools/text/ltex-ls/default.nix b/nixpkgs/pkgs/tools/text/ltex-ls/default.nix
new file mode 100644
index 000000000000..a494ebfe864f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ltex-ls/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenvNoCC, fetchurl, makeBinaryWrapper, jre_headless }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "ltex-ls";
+  version = "16.0.0";
+
+  src = fetchurl {
+    url = "https://github.com/valentjn/ltex-ls/releases/download/${version}/ltex-ls-${version}.tar.gz";
+    sha256 = "sha256-lW1TfTckqhCmhjcvduISY9qAdKPM/0cobxbIrCq5JkQ=";
+  };
+
+  nativeBuildInputs = [ makeBinaryWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    cp -rfv bin/ lib/ $out
+    rm -fv $out/bin/.lsp-cli.json $out/bin/*.bat
+    for file in $out/bin/{ltex-ls,ltex-cli}; do
+      wrapProgram $file --set JAVA_HOME "${jre_headless}"
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://valentjn.github.io/ltex/";
+    description = "LSP language server for LanguageTool";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.marsam ];
+    platforms = jre_headless.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/lv/default.nix b/nixpkgs/pkgs/tools/text/lv/default.nix
new file mode 100644
index 000000000000..48ed867c8e4c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/lv/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "lv";
+  version = "4.51";
+
+  src = fetchurl {
+    url = "mirror://debian/pool/main/l/${pname}/${pname}_${version}.orig.tar.gz";
+    sha256 = "0yf3idz1qspyff1if41xjpqqcaqa8q8icslqlnz0p9dj36gmm5l3";
+  };
+
+  makeFlags = [ "prefix=${placeholder "out"}" ];
+
+  buildInputs = [ ncurses ];
+
+  configurePhase = ''
+    mkdir -p build
+    cd build
+    ../src/configure
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Powerful multi-lingual file viewer / grep";
+    homepage = "https://web.archive.org/web/20160310122517/www.ff.iij4u.or.jp/~nrt/lv/";
+    license = licenses.gpl2;
+    platforms = with platforms; linux ++ darwin;
+    maintainers = with maintainers; [ kayhide ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mairix/default.nix b/nixpkgs/pkgs/tools/text/mairix/default.nix
new file mode 100644
index 000000000000..aa58ecdd35a9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mairix/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, zlib, bzip2, bison, flex }:
+
+stdenv.mkDerivation rec {
+  pname = "mairix";
+  version = "0.24";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/mairix/mairix-${version}.tar.gz";
+    sha256 = "0msaxz5c5hf7k1ci16i67m4ynrbrpsxbqzk84nz6z2vnkh3jww50";
+  };
+
+  buildInputs = [ zlib bzip2 bison flex ];
+
+  # https://github.com/rc0/mairix/pull/19
+  patches = [ ./mmap.patch ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "http://www.rc0.org.uk/mairix";
+    license = lib.licenses.gpl2Plus;
+    description = "Program for indexing and searching email messages stored in maildir, MH or mbox";
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mairix/mmap.patch b/nixpkgs/pkgs/tools/text/mairix/mmap.patch
new file mode 100644
index 000000000000..241083f2dde5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mairix/mmap.patch
@@ -0,0 +1,161 @@
+Making mairix work with mbox files over 2GB.
+
+https://github.com/rc0/mairix/pull/19
+
+diff --git a/mairix.h b/mairix.h
+index 2480492..cb25824 100644
+--- a/mairix.h
++++ b/mairix.h
+@@ -327,9 +327,9 @@ enum data_to_rfc822_error {
+   DTR8_BAD_HEADERS, /* corrupt headers */
+   DTR8_BAD_ATTACHMENT /* corrupt attachment (e.g. no body part) */
+ };
+-struct rfc822 *data_to_rfc822(struct msg_src *src, char *data, int length, enum data_to_rfc822_error *error);
+-void create_ro_mapping(const char *filename, unsigned char **data, int *len);
+-void free_ro_mapping(unsigned char *data, int len);
++struct rfc822 *data_to_rfc822(struct msg_src *src, char *data, size_t length, enum data_to_rfc822_error *error);
++void create_ro_mapping(const char *filename, unsigned char **data, size_t *len);
++void free_ro_mapping(unsigned char *data, size_t len);
+ char *format_msg_src(struct msg_src *src);
+ 
+ /* In tok.c */
+diff --git a/mbox.c b/mbox.c
+index ebbfa78..396e27d 100644
+--- a/mbox.c
++++ b/mbox.c
+@@ -816,7 +816,7 @@ void build_mbox_lists(struct database *db, const char *folder_base, /*{{{*/
+         mb->n_old_msgs_valid = mb->n_msgs;
+       } else {
+         unsigned char *va;
+-        int len;
++        size_t len;
+         create_ro_mapping(mb->path, &va, &len);
+         if (va) {
+           rescan_mbox(mb, (char *) va, len);
+@@ -852,7 +852,7 @@ int add_mbox_messages(struct database *db)/*{{{*/
+   int any_new = 0;
+   int N;
+   unsigned char *va;
+-  int valen;
++  size_t valen;
+   enum data_to_rfc822_error error;
+ 
+   for (i=0; i<db->n_mboxen; i++) {
+diff --git a/reader.c b/reader.c
+index 71ac5bd..18f0108 100644
+--- a/reader.c
++++ b/reader.c
+@@ -81,7 +81,8 @@ static void read_toktable2_db(char *data, struct toktable2_db *toktable, int sta
+ /*}}}*/
+ struct read_db *open_db(char *filename)/*{{{*/
+ {
+-  int fd, len;
++  int fd;
++  size_t len;
+   char *data;
+   struct stat sb;
+   struct read_db *result;
+diff --git a/reader.h b/reader.h
+index 9b5dfa3..d709cc4 100644
+--- a/reader.h
++++ b/reader.h
+@@ -138,7 +138,7 @@ struct toktable2_db {/*{{{*/
+ struct read_db {/*{{{*/
+   /* Raw file parameters, needed later for munmap */
+   char *data;
+-  int len;
++  size_t len;
+ 
+   /* Pathname information */
+   int n_msgs;
+diff --git a/rfc822.c b/rfc822.c
+index b411f85..9c8e1a4 100644
+--- a/rfc822.c
++++ b/rfc822.c
+@@ -990,7 +990,7 @@ static void scan_status_flags(const char *s, struct headers *hdrs)/*{{{*/
+ 
+ /*{{{ data_to_rfc822() */
+ struct rfc822 *data_to_rfc822(struct msg_src *src,
+-    char *data, int length,
++    char *data, size_t length,
+     enum data_to_rfc822_error *error)
+ {
+   struct rfc822 *result;
+@@ -1265,7 +1265,7 @@ static struct ro_mapping *add_ro_cache(const char *filename, int fd, size_t len)
+ }
+ #endif /* USE_GZIP_MBOX || USE_BZIP_MBOX */
+ 
+-void create_ro_mapping(const char *filename, unsigned char **data, int *len)/*{{{*/
++void create_ro_mapping(const char *filename, unsigned char **data, size_t *len)/*{{{*/
+ {
+   struct stat sb;
+   int fd;
+@@ -1386,7 +1386,7 @@ comp_error:
+   data_alloc_type = ALLOC_MMAP;
+ }
+ /*}}}*/
+-void free_ro_mapping(unsigned char *data, int len)/*{{{*/
++void free_ro_mapping(unsigned char *data, size_t len)/*{{{*/
+ {
+   int r;
+ 
+@@ -1414,7 +1414,7 @@ static struct msg_src *setup_msg_src(char *filename)/*{{{*/
+ /*}}}*/
+ struct rfc822 *make_rfc822(char *filename)/*{{{*/
+ {
+-  int len;
++  size_t len;
+   unsigned char *data;
+   struct rfc822 *result;
+ 
+diff --git a/search.c b/search.c
+index 18b51ee..97967bc 100644
+--- a/search.c
++++ b/search.c
+@@ -681,7 +681,7 @@ static void mbox_terminate(const unsigned char *data, int len, FILE *out)/*{{{*/
+ static void append_file_to_mbox(const char *path, FILE *out)/*{{{*/
+ {
+   unsigned char *data;
+-  int len;
++  size_t len;
+   create_ro_mapping(path, &data, &len);
+   if (data) {
+     fprintf(out, "From mairix@mairix Mon Jan  1 12:34:56 1970\n");
+@@ -698,8 +698,8 @@ static int had_failed_checksum;
+ 
+ static void get_validated_mbox_msg(struct read_db *db, int msg_index,/*{{{*/
+                                    int *mbox_index,
+-                                   unsigned char **mbox_data, int *mbox_len,
+-                                   unsigned char **msg_data,  int *msg_len)
++                                   unsigned char **mbox_data, size_t *mbox_len,
++                                   unsigned char **msg_data,  size_t *msg_len)
+ {
+   /* msg_data==NULL if checksum mismatches */
+   unsigned char *start;
+@@ -738,7 +738,7 @@ static void append_mboxmsg_to_mbox(struct read_db *db, int msg_index, FILE *out)
+ {
+   /* Need to common up code with try_copy_to_path */
+   unsigned char *mbox_start, *msg_start;
+-  int mbox_len, msg_len;
++  size_t mbox_len, msg_len;
+   int mbox_index;
+ 
+   get_validated_mbox_msg(db, msg_index, &mbox_index, &mbox_start, &mbox_len, &msg_start, &msg_len);
+@@ -759,7 +759,7 @@ static void append_mboxmsg_to_mbox(struct read_db *db, int msg_index, FILE *out)
+ static void try_copy_to_path(struct read_db *db, int msg_index, char *target_path)/*{{{*/
+ {
+   unsigned char *data;
+-  int mbox_len, msg_len;
++  size_t mbox_len, msg_len;
+   int mbi;
+   FILE *out;
+   unsigned char *start;
+@@ -1214,7 +1214,7 @@ static int do_search(struct read_db *db, char **args, char *output_path, int sho
+                 unsigned int mbix, msgix;
+                 int start, len, after_end;
+                 unsigned char *mbox_start, *msg_start;
+-                int mbox_len, msg_len;
++                size_t mbox_len, msg_len;
+                 int mbox_index;
+ 
+                 start = db->mtime_table[i];
diff --git a/nixpkgs/pkgs/tools/text/mark/default.nix b/nixpkgs/pkgs/tools/text/mark/default.nix
new file mode 100644
index 000000000000..33d6072c8c81
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mark/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "mark";
+  version = "9.1.4";
+
+  src = fetchFromGitHub {
+    owner  = "kovetskiy";
+    repo   = "mark";
+    rev    = version;
+    sha256 = "sha256-nAgEegtRT4c2wJzVOY41JgM/JVW5xQjRnhXUzjwqxLY=";
+  };
+
+  vendorHash = "sha256-2rEwZffM+RK0baz8m+fXN2NGYskv4zO67cWC4rx+hfI=";
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  meta = with lib; {
+    description = "A tool for syncing your markdown documentation with Atlassian Confluence pages";
+    homepage = "https://github.com/kovetskiy/mark";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rguevara84 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/markdownlint-cli/default.nix b/nixpkgs/pkgs/tools/text/markdownlint-cli/default.nix
new file mode 100644
index 000000000000..6916999cb42e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/markdownlint-cli/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "markdownlint-cli";
+  version = "0.35.0";
+
+  src = fetchFromGitHub {
+    owner = "igorshubovych";
+    repo = "markdownlint-cli";
+    rev = "v${version}";
+    hash = "sha256-PkvgZn7cQafKO7p5i1fYYZrWjNcFuX700r223qUMN5I=";
+  };
+
+  npmDepsHash = "sha256-hh8T2MRjUJQVibd+cY7vkJvBgNDueWuluGE3HxWOCU8=";
+
+  dontNpmBuild = true;
+
+  meta = {
+    description = "Command line interface for MarkdownLint";
+    homepage = "https://github.com/igorshubovych/markdownlint-cli";
+    license = lib.licenses.mit;
+    mainProgram = "markdownlint";
+    maintainers = with lib.maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/markdownlint-cli2/default.nix b/nixpkgs/pkgs/tools/text/markdownlint-cli2/default.nix
new file mode 100644
index 000000000000..86e1338a09ef
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/markdownlint-cli2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "markdownlint-cli2";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "DavidAnson";
+    repo = "markdownlint-cli2";
+    rev = "v${version}";
+    hash = "sha256-qtdR7Rhz+HLZJX82OrN+twOsvFOv99e4BBDVV1UayPI=";
+  };
+
+  npmDepsHash = "sha256-Fx0lDcvzLRVSAX0apKmu1CBfnGmGQR9FQEdhHUtue/c=";
+
+  postPatch = ''
+    ln -s npm-shrinkwrap.json package-lock.json
+  '';
+
+  dontNpmBuild = true;
+
+  meta = {
+    changelog = "https://github.com/DavidAnson/markdownlint-cli2/blob/${src.rev}/CHANGELOG.md";
+    description = "A fast, flexible, configuration-based command-line interface for linting Markdown/CommonMark files with the markdownlint library";
+    homepage = "https://github.com/DavidAnson/markdownlint-cli2";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/markscribe/default.nix b/nixpkgs/pkgs/tools/text/markscribe/default.nix
new file mode 100644
index 000000000000..d542fe281107
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/markscribe/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "markscribe";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "muesli";
+    repo = "markscribe";
+    rev = "v${version}";
+    hash = "sha256-I8WSG9rMqgf2QADQetlYTSUIQH1Iv8cMVw/3uIwEDPc=";
+  };
+
+  vendorHash = "sha256-leeP2+W+bnYASls3k0l4jpz1rc1mAkMWUfrY2uBUUdQ=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "Your personal markdown scribe with template-engine and Git(Hub) & RSS powers";
+    homepage = "https://github.com/muesli/markscribe";
+    changelog = "https://github.com/muesli/markscribe/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/math-review/default.nix b/nixpkgs/pkgs/tools/text/math-review/default.nix
new file mode 100644
index 000000000000..3592aad8bec7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/math-review/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, nix-update-script
+, fetchFromGitLab
+, buildNpmPackage
+, nodejs
+}:
+
+buildNpmPackage rec {
+  pname = "math-preview";
+  version = "5.1.1";
+
+  src = fetchFromGitLab {
+    owner = "matsievskiysv";
+    repo = "math-preview";
+    rev = "v${version}";
+    hash = "sha256-P3TZ/D6D2PvwPV6alSrDEQujzgI8DhK4VOuCC0BCIFo=";
+  };
+
+  npmDepsHash = "sha256-GAPhG3haM9UNdj6tCz8I4j7v6rvNbatdu7NjCeENj3s=";
+  dontNpmBuild = true;
+
+  passthru = {
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "Emacs preview math inline";
+    license = licenses.gpl3Plus;
+    homepage = "https://gitlab.com/matsievskiysv/math-preview";
+    maintainers = with maintainers; [ renesat ];
+    inherit (nodejs.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mawk/default.nix b/nixpkgs/pkgs/tools/text/mawk/default.nix
new file mode 100644
index 000000000000..412467deacca
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mawk/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchurl, buildPackages }:
+
+stdenv.mkDerivation rec {
+  pname = "mawk";
+  version = "1.3.4-20230525";
+
+  src = fetchurl {
+    urls = [
+      "ftp://ftp.invisible-island.net/mawk/mawk-${version}.tgz"
+      "https://invisible-mirror.net/archives/mawk/mawk-${version}.tgz"
+    ];
+    sha256 = "sha256-VjnRS7kSQ3Oz1/lX0rklrYrZZW1GISw/I9vKgQzJJp8=";
+  };
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  meta = with lib; {
+    description = "Interpreter for the AWK Programming Language";
+    homepage = "https://invisible-island.net/mawk/mawk.html";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ehmry ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mb2md/default.nix b/nixpkgs/pkgs/tools/text/mb2md/default.nix
new file mode 100644
index 000000000000..78ce7f593974
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mb2md/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, makeWrapper, perlPackages }:
+
+let
+  perlDeps = with perlPackages; [ TimeDate ];
+in
+stdenv.mkDerivation rec {
+  version = "3.20";
+  pname = "mb2md";
+
+  src = fetchurl {
+    url = "http://batleth.sapienti-sat.org/projects/mb2md/mb2md-${version}.pl.gz";
+    sha256 = "0bvkky3c90738h3skd2f1b2yy5xzhl25cbh9w2dy97rs86ssjidg";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ perlPackages.perl ];
+
+  unpackPhase = ''
+    sourceRoot=.
+    gzip -d < $src > mb2md.pl
+  '';
+
+  installPhase = ''
+    install -D $sourceRoot/mb2md.pl $out/bin/mb2md
+  '';
+
+  postFixup = ''
+    wrapProgram $out/bin/mb2md \
+      --set PERL5LIB "${perlPackages.makePerlPath perlDeps}"
+  '';
+
+  meta = with lib; {
+    description = "mbox to maildir tool";
+    license = licenses.publicDomain;
+    platforms = platforms.all;
+    maintainers = [ maintainers.jb55 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-admonish/default.nix b/nixpkgs/pkgs/tools/text/mdbook-admonish/default.nix
new file mode 100644
index 000000000000..cc84b33b9f65
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-admonish/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-admonish";
+  version = "1.13.0";
+
+  src = fetchFromGitHub {
+    owner = "tommilligan";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-jr77WC6b5PrPANivd6diAFfVqudtviIWBE7I8eFmCfs=";
+  };
+
+  cargoHash = "sha256-gBkRA8QRha46y5cp5aY2R+ekdfjUX5tDuNawCwzKFi4=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook to add Material Design admonishments";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jmgilman Frostman ];
+    homepage = "https://github.com/tommilligan/mdbook-admonish";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-cmdrun/default.nix b/nixpkgs/pkgs/tools/text/mdbook-cmdrun/default.nix
new file mode 100644
index 000000000000..07252461336c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-cmdrun/default.nix
@@ -0,0 +1,26 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-cmdrun";
+  version = "unstable-2023-01-10";
+
+  src = fetchFromGitHub {
+    owner = "FauconFan";
+    repo = pname;
+    rev = "3f6d243cd9de5659f166a5642eb46b2a6d8384e7";
+    hash = "sha256-JuKMAb3vwGTju9U1vaS9I39gObTz0JQQV4uol9SmsfM=";
+  };
+
+  # Tests are outdated currently, application works fine
+  # See for more info: https://github.com/FauconFan/mdbook-cmdrun/issues/2
+  doCheck = false;
+
+  cargoHash = "sha256-h3xCnx6byToZx83uWNLz05F3VIDR0D1NVtSOKPuYeG4=";
+
+  meta = with lib; {
+    description = "mdbook preprocessor to run arbitrary commands";
+    homepage = "https://github.com/FauconFan/mdbook-cmdrun";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pinpox ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-d2/default.nix b/nixpkgs/pkgs/tools/text/mdbook-d2/default.nix
new file mode 100644
index 000000000000..e8a5f169399e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-d2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-d2";
+  version = "unstable-2023-03-30";
+
+  src = fetchFromGitHub {
+    owner = "danieleades";
+    repo = "mdbook-d2";
+    rev = "93f3037ad9730d134c929cfc90d9bd592a48a1a9";
+    hash = "sha256-cmmOmJHARIBCQQEsffnBh4nc2XEDPBzLPcCrOwfTKS8=";
+  };
+
+  cargoHash = "sha256-ACwEWK5upeRLo7HU+1kKunecnEeZm0ufUaQjJkXM/4I=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.CoreFoundation
+    darwin.apple_sdk.frameworks.CoreServices
+  ];
+
+  meta = with lib; {
+    description = "D2 diagram generator plugin for MdBook";
+    homepage = "https://github.com/danieleades/mdbook-d2";
+    changelog = "https://github.com/danieleades/mdbook-d2/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-emojicodes/default.nix b/nixpkgs/pkgs/tools/text/mdbook-emojicodes/default.nix
new file mode 100644
index 000000000000..0bbcffd28fe2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-emojicodes/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-emojicodes";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "blyxyas";
+    repo = "mdbook-emojicodes";
+    rev = "${version}";
+    hash = "sha256-dlvfY2AMBvTl0j9YaT+u4CeWQGGihFD8AZaAK4/hUWU=";
+  };
+
+  cargoHash = "sha256-SkvAtV613+ARk79dB2zRKoLjPgdzoEKQa3JrRw9qBkA=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.CoreFoundation
+  ];
+
+  meta = with lib; {
+    description = "MDBook preprocessor for converting emojicodes (e.g. `: cat :`) into emojis 🐱";
+    homepage = "https://github.com/blyxyas/mdbook-emojicodes";
+    changelog = "https://github.com/blyxyas/mdbook-emojicodes/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-epub/default.nix b/nixpkgs/pkgs/tools/text/mdbook-epub/default.nix
new file mode 100644
index 000000000000..47c118afa43a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-epub/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, bzip2
+, CoreServices
+}:
+
+let
+  pname = "mdbook-epub";
+  version = "unstable-2022-12-25";
+in rustPlatform.buildRustPackage {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "michael-f-bryan";
+    repo = pname;
+    rev = "2e1e48d0d1a1b4c1b0f866267e6666b41c598225";
+    hash = "sha256-wjn/7dv/Z2OmwvH/XaEeCz/JOvJWlMJ60q5qozzOEWY=";
+  };
+
+  cargoHash = "sha256-4oSpQUYJDK0srABZMwJ8x8jv6DOnLShXSnjLjf8c9Ac=";
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    bzip2
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreServices
+  ];
+
+  meta = with lib; {
+    description = "mdbook backend for generating an e-book in the EPUB format";
+    homepage = "https://michael-f-bryan.github.io/mdbook-epub";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ yuu ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-graphviz/default.nix b/nixpkgs/pkgs/tools/text/mdbook-graphviz/default.nix
new file mode 100644
index 000000000000..cdba18e5b020
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-graphviz/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices, graphviz }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-graphviz";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "dylanowen";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-WkjkQll5oETVADYpA8/CIZOJCBnfenGSy49sZ5nAQ+c=";
+  };
+
+  cargoHash = "sha256-whBTPQGozPPTSdXuRx5wamc1yy/EC3wNShQGhRqdY9Y=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  nativeCheckInputs = [ graphviz ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook, rendering Graphviz graphs to HTML at build time.";
+    homepage = "https://github.com/dylanowen/mdbook-graphviz";
+    changelog = "https://github.com/dylanowen/mdbook-graphviz/releases/tag/v${version}";
+    license = [ licenses.mpl20 ];
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-i18n-helpers/default.nix b/nixpkgs/pkgs/tools/text/mdbook-i18n-helpers/default.nix
new file mode 100644
index 000000000000..e3485f46295a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-i18n-helpers/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-i18n-helpers";
+  version = "0.2.4";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "mdbook-i18n-helpers";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TxSALv/uqRFdv4JZ8BCiAlirMcizGRkw0YxMCBVkgo4=";
+  };
+
+  cargoHash = "sha256-BhaSK2A/z05a75dEx8c4RHKau1HRJabOcQ6/eLvcdio=";
+
+  meta = with lib; {
+    description = "Helpers for a mdbook i18n workflow based on Gettext";
+    homepage = "https://github.com/google/mdbook-i18n-helpers";
+    changelog = "https://github.com/google/mdbook-i18n-helpers/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ teutat3s ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-katex/default.nix b/nixpkgs/pkgs/tools/text/mdbook-katex/default.nix
new file mode 100644
index 000000000000..7be47c0c8d4d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-katex/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchCrate, stdenv, CoreServices }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-katex";
+  version = "0.5.8";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-YFrl0YR/+lDJW8GjLF0wk0D6Bx9zUxAoAXd9twaxrmM=";
+  };
+
+  cargoHash = "sha256-wBaek9AQKwPsg9TzBmS0yBtn1G0KCnmxfmGCGCFNWxc=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook, rendering LaTeX equations to HTML at build time.";
+    homepage = "https://github.com/lzanini/${pname}";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-kroki-preprocessor/default.nix b/nixpkgs/pkgs/tools/text/mdbook-kroki-preprocessor/default.nix
new file mode 100644
index 000000000000..07fd2cd634dd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-kroki-preprocessor/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, openssl
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-kroki-preprocessor";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "joelcourtney";
+    repo = "mdbook-kroki-preprocessor";
+    rev = "v${version}";
+    hash = "sha256-3BxIhJK0YWZBEbbNwMKixo1icEn+QKJwoskgIEaZcGQ=";
+  };
+
+  cargoHash = "sha256-9jIB80vtskpR3/QYhaA0JFw6IhIsS9VnCnJtE5RfDRk=";
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.CoreFoundation
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  meta = with lib; {
+    description = "Render Kroki diagrams from files or code blocks in mdbook";
+    homepage = "https://github.com/joelcourtney/mdbook-kroki-preprocessor";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-linkcheck/default.nix b/nixpkgs/pkgs/tools/text/mdbook-linkcheck/default.nix
new file mode 100644
index 000000000000..0d2533eba48d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-linkcheck/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, pkg-config, openssl, Security
+, testers, mdbook-linkcheck }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-linkcheck";
+  version = "0.7.7";
+
+  src = fetchFromGitHub {
+    owner = "Michael-F-Bryan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ZbraChBHuKAcUA62EVHZ1RygIotNEEGv24nhSPAEj00=";
+  };
+
+  cargoSha256 = "sha256-AwixlCL5ZcLgj9wYeBvkSy2U6J8alXf488l8DMn73w4=";
+
+  buildInputs = if stdenv.isDarwin then [ Security ] else [ openssl ];
+
+  nativeBuildInputs = lib.optionals (!stdenv.isDarwin) [ pkg-config ];
+
+  OPENSSL_NO_VENDOR = 1;
+
+  doCheck = false; # tries to access network to test broken web link functionality
+
+  passthru.tests.version = testers.testVersion { package = mdbook-linkcheck; };
+
+  meta = with lib; {
+    description = "A backend for `mdbook` which will check your links for you.";
+    homepage = "https://github.com/Michael-F-Bryan/mdbook-linkcheck";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-man/default.nix b/nixpkgs/pkgs/tools/text/mdbook-man/default.nix
new file mode 100644
index 000000000000..541e27eb7e06
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-man/default.nix
@@ -0,0 +1,23 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-man";
+  version = "unstable-2022-11-05";
+
+  src = fetchFromGitHub {
+    owner = "vv9k";
+    repo = pname;
+    rev = "b9537dfbb241d7456835ed7e9d27ab8c8184e5f6";
+    hash = "sha256-ssAk60jnwYzAjseL26/3FaDv1vBAylgdE+vLhWZ8It4=";
+  };
+
+  cargoHash = "sha256-cR86eFhP9Swh+Ff8FNbAfWpWMkliOAyPwDQ6lRvU+nk=";
+
+  meta = with lib; {
+    description = "Generate manual pages from mdBooks";
+    homepage = "https://github.com/vv9k/mdbook-man";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/tools/text/mdbook-mermaid/default.nix b/nixpkgs/pkgs/tools/text/mdbook-mermaid/default.nix
new file mode 100644
index 000000000000..9ca9669fa201
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-mermaid/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, CoreServices
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-mermaid";
+  version = "0.12.6";
+
+  src = fetchFromGitHub {
+    owner = "badboy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1mSSnAfsg9AEnDAgINrSLIeu9O2vLqchZPSH12cjATk=";
+  };
+
+  cargoHash = "sha256-9PMBHVpf8bDuSIYKrIFZjmBE2icejPTML+hhZ4DLq/Y=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreServices
+  ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook to add mermaid.js support";
+    homepage = "https://github.com/badboy/mdbook-mermaid";
+    changelog = "https://github.com/badboy/mdbook-mermaid/blob/v${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ xrelkd ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-open-on-gh/default.nix b/nixpkgs/pkgs/tools/text/mdbook-open-on-gh/default.nix
new file mode 100644
index 000000000000..a570d6805928
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-open-on-gh/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-open-on-gh";
+  version = "2.4.1";
+
+  src = fetchFromGitHub {
+    owner = "badboy";
+    repo = pname;
+    rev = version;
+    hash = "sha256-d+8/7lli6iyzAWHIi0ahwPBwGhXrQrCKQisD2+jPHQ0=";
+  };
+
+  cargoHash = "sha256-WbPYrjDMJEwle+Pev5nr9ZhnycbXUjdrx8XAqQ0OpaM=";
+
+  meta = with lib; {
+    description = "mdbook preprocessor to add a open-on-github link on every page";
+    homepage = "https://github.com/badboy/mdbook-open-on-gh";
+    license = [ licenses.mpl20 ];
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-pagetoc/default.nix b/nixpkgs/pkgs/tools/text/mdbook-pagetoc/default.nix
new file mode 100644
index 000000000000..74e88c8ef358
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-pagetoc/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-pagetoc";
+  version = "0.1.7";
+
+  src = fetchFromGitHub {
+    owner = "slowsage";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rhg/QDdO44Qwb/z1tQEYK5DcGuUI6cQvpHTYmqYyoWY=";
+  };
+
+  cargoHash = "sha256-03/bLFbP+BSfRW6wyg7LnryDP0kqvfvYqrFBKFZ2xY8=";
+
+  meta = with lib; {
+    description = "Table of contents for mdbook (in sidebar)";
+    homepage = "https://github.com/slowsage/mdbook-pagetoc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-pdf/default.nix b/nixpkgs/pkgs/tools/text/mdbook-pdf/default.nix
new file mode 100644
index 000000000000..9ff9a80214f3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-pdf/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchCrate
+, rustPlatform
+, pkg-config
+, rustfmt
+, openssl
+, CoreServices
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-pdf";
+  version = "0.1.7";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-3hyvLLBcS7MLAL707tkvW8LGue/x9DudOYhJDDqAdRg=";
+  };
+
+  cargoHash = "sha256-ecIaKSrkqUsQWchkm9uCTXLuQabzGmEz1UqDR13vX8Y=";
+
+  nativeBuildInputs = [
+    pkg-config
+    rustfmt
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreServices
+  ];
+
+  # Stop downloading from the Internet to
+  # generate the Chrome Devtools Protocol
+  DOCS_RS=true;
+
+  # # Stop formating with rustfmt, pending version update for
+  # # https://github.com/mdrokz/auto_generate_cdp/pull/8
+  # # to remove rustfmt dependency
+  # DO_NOT_FORMAT=true;
+
+  # No test.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A backend for mdBook written in Rust for generating PDF";
+    homepage = "https://github.com/HollowMan6/mdbook-pdf";
+    changelog = "https://github.com/HollowMan6/mdbook-pdf/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hollowman6 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-plantuml/default.nix b/nixpkgs/pkgs/tools/text/mdbook-plantuml/default.nix
new file mode 100644
index 000000000000..3e6d13d24489
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-plantuml/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, stdenv
+, rustPlatform
+, pkg-config
+, openssl
+, CoreServices
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-plantuml";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "sytsereitsma";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-26epwn6j/ZeMAphiFsrLjS0KIewvElr7V3p/EDr4Uqk=";
+  };
+
+  cargoPatches = [
+    # https://github.com/sytsereitsma/mdbook-plantuml/pull/60
+    (fetchpatch {
+      name = "update-mdbook-for-rust-1.64.patch";
+      url = "https://github.com/sytsereitsma/mdbook-plantuml/commit/a1c7fdaff65fbbcc086006f6d180b27e180739e7.patch";
+      hash = "sha256-KXFQxogR6SaoX8snsSYMA8gn1FrQVKMl5l8khxB09WE=";
+    })
+  ];
+
+  cargoHash = "sha256-3HlnhRexfFcAuk1RoatWORMJvYRrnoEft5ys6j3t9S0=";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ openssl ]
+    ++ lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  meta = with lib; {
+    description = "mdBook preprocessor to render PlantUML diagrams to png images in the book output directory";
+    homepage = "https://github.com/sytsereitsma/mdbook-plantuml";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ jcouyang ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdbook-toc/default.nix b/nixpkgs/pkgs/tools/text/mdbook-toc/default.nix
new file mode 100644
index 000000000000..52e8070e0794
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook-toc/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-toc";
+  version = "0.14.1";
+
+  src = fetchFromGitHub {
+    owner = "badboy";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-F0dIqtDEOVUXlWhmXKPOaJTEuA3Tl3h0vaEu7VsBo7s=";
+  };
+
+  cargoHash = "sha256-gbBX6Hj+271BA9FWmkZdyR0tMP2Lny7UgW0o+kZe9bU=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook to add inline Table of Contents support";
+    homepage = "https://github.com/badboy/mdbook-toc";
+    license = [ licenses.mpl20 ];
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/tools/text/mdbook/default.nix b/nixpkgs/pkgs/tools/text/mdbook/default.nix
new file mode 100644
index 000000000000..e0529c77917b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdbook/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, nix, rustPlatform, CoreServices }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook";
+  version = "0.4.35";
+
+  src = fetchFromGitHub {
+    owner = "rust-lang";
+    repo = "mdBook";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-oplR34M2PbcIwrfIkA4Ttk2zt3ve883TfXGIDnfJt/4=";
+  };
+
+  cargoHash = "sha256-D0XhrweO0A1+81Je4JZ0lmnbIHstNvefpmogCyB4FEE=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  passthru = {
+    tests = {
+      inherit nix;
+    };
+  };
+
+  meta = with lib; {
+    description = "Create books from MarkDown";
+    homepage = "https://github.com/rust-lang/mdBook";
+    changelog = "https://github.com/rust-lang/mdBook/blob/v${version}/CHANGELOG.md";
+    license = [ licenses.mpl20 ];
+    maintainers = with maintainers; [ havvy Frostman matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdcat/default.nix b/nixpkgs/pkgs/tools/text/mdcat/default.nix
new file mode 100644
index 000000000000..86809e28487e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdcat/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, pkg-config
+, asciidoctor
+, openssl
+, Security
+, SystemConfiguration
+, ansi2html
+, installShellFiles
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdcat";
+  version = "2.0.4";
+
+  src = fetchFromGitHub {
+    owner = "swsnr";
+    repo = "mdcat";
+    rev = "mdcat-${version}";
+    hash = "sha256-QGGZv+wk0w01eL6vAsRRUw+CuTdI949sGOM8ot4dGIc=";
+  };
+
+  nativeBuildInputs = [ pkg-config asciidoctor installShellFiles ];
+  buildInputs = [ openssl ]
+    ++ lib.optionals stdenv.isDarwin [ Security SystemConfiguration ];
+
+  cargoHash = "sha256-VH9MmASMiD62rxDZSKmrW7N+qp0Fpm7Pcyhxpkpl/oM=";
+
+  nativeCheckInputs = [ ansi2html ];
+  # Skip tests that use the network and that include files.
+  checkFlags = [
+    "--skip magic::tests::detect_mimetype_of_larger_than_magic_param_bytes_max_length"
+    "--skip magic::tests::detect_mimetype_of_magic_param_bytes_max_length"
+    "--skip magic::tests::detect_mimetype_of_png_image"
+    "--skip magic::tests::detect_mimetype_of_svg_image"
+    "--skip resources::tests::read_url_with_http_url_fails_when_size_limit_is_exceeded"
+    "--skip resources::tests::read_url_with_http_url_fails_when_status_404"
+    "--skip resources::tests::read_url_with_http_url_returns_content_when_status_200"
+    "--skip iterm2_tests_render_md_samples_images_md"
+  ];
+
+  postInstall = ''
+    installManPage $releaseDir/build/mdcat-*/out/mdcat.1
+    ln -sr $out/bin/{mdcat,mdless}
+
+    for bin in mdcat mdless; do
+      installShellCompletion \
+        --bash $releaseDir/build/mdcat-*/out/completions/$bin.bash \
+        --fish $releaseDir/build/mdcat-*/out/completions/$bin.fish \
+        --zsh $releaseDir/build/mdcat-*/out/completions/_$bin
+    done
+  '';
+
+  meta = with lib; {
+    description = "cat for markdown";
+    homepage = "https://github.com/swsnr/mdcat";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mdhtml/default.nix b/nixpkgs/pkgs/tools/text/mdhtml/default.nix
new file mode 100644
index 000000000000..b5d12e7b3dcf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mdhtml/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildGoModule
+, fetchFromGitea
+}:
+
+buildGoModule rec {
+  pname = "mdhtml";
+  version = "0.2.2";
+
+  src = fetchFromGitea {
+    domain = "codeberg.org";
+    owner = "Tomkoid";
+    repo = pname;
+    rev = version;
+    hash = "sha256-893pqrrTftzKqPYZgukV/yx2gkukVZWDTgg7ufx1MsY=";
+  };
+
+  vendorHash = null;
+
+  meta = with lib; {
+    description = "Really simple CLI Markdown to HTML converter with styling support";
+    homepage = "https://codeberg.org/Tomkoid/mdhtml";
+    license = licenses.mit;
+    changelog = "https://codeberg.org/Tomkoid/mdhtml/releases";
+    maintainers = with maintainers; [ tomkoid ];
+    mainProgram = "mdhtml";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mecab/base.nix b/nixpkgs/pkgs/tools/text/mecab/base.nix
new file mode 100644
index 000000000000..572ec28c0750
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mecab/base.nix
@@ -0,0 +1,19 @@
+{ fetchurl, libiconv }:
+
+finalAttrs: {
+  version = "0.996";
+
+  src = fetchurl {
+    url = "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE";
+    name = "mecab-${finalAttrs.version}.tar.gz";
+    hash = "sha256-4HMyV4MTW3LmZhRceBu0j62lg9UiT7JJD7bBQDumnFk=";
+  };
+
+  buildInputs = [ libiconv ];
+
+  configureFlags = [
+    "--with-charset=utf8"
+  ];
+
+  doCheck = true;
+}
diff --git a/nixpkgs/pkgs/tools/text/mecab/default.nix b/nixpkgs/pkgs/tools/text/mecab/default.nix
new file mode 100644
index 000000000000..3cca6776d3a9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mecab/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl, mecab-ipadic, libiconv }:
+
+let
+  mecab-base = import ./base.nix { inherit fetchurl libiconv; };
+in
+stdenv.mkDerivation (finalAttrs: ((mecab-base finalAttrs) // {
+  pname = "mecab";
+
+  postInstall = ''
+    sed -i 's|^dicdir = .*$|dicdir = ${mecab-ipadic}|' "$out/etc/mecabrc"
+  '';
+
+  meta = with lib; {
+    description = "Japanese morphological analysis system";
+    homepage = "http://taku910.github.io/mecab";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    mainProgram = "mecab";
+    maintainers = with maintainers; [ auntie paveloom ];
+  };
+}))
diff --git a/nixpkgs/pkgs/tools/text/mecab/ipadic.nix b/nixpkgs/pkgs/tools/text/mecab/ipadic.nix
new file mode 100644
index 000000000000..61d23f87a8ce
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mecab/ipadic.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, mecab-nodic }:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "mecab-ipadic";
+  version = "2.7.0-20070801";
+
+  src = fetchurl {
+    url = "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM";
+    name = "mecab-ipadic-${finalAttrs.version}.tar.gz";
+    hash = "sha256-ti9SfYgcUEV2uu2cbvZWFVRlixdc5q4AlqYDB+SeNSM=";
+  };
+
+  buildInputs = [ mecab-nodic ];
+
+  configureFlags = [
+    "--with-charset=utf8"
+    "--with-dicdir=${placeholder "out"}"
+  ];
+})
diff --git a/nixpkgs/pkgs/tools/text/mecab/nodic.nix b/nixpkgs/pkgs/tools/text/mecab/nodic.nix
new file mode 100644
index 000000000000..a40e2a19698d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mecab/nodic.nix
@@ -0,0 +1,8 @@
+{ stdenv, fetchurl, libiconv }:
+
+let
+  mecab-base = import ./base.nix { inherit fetchurl libiconv; };
+in
+stdenv.mkDerivation (finalAttrs: ((mecab-base finalAttrs) // {
+  pname = "mecab-nodic";
+}))
diff --git a/nixpkgs/pkgs/tools/text/miller/default.nix b/nixpkgs/pkgs/tools/text/miller/default.nix
new file mode 100644
index 000000000000..3a4198fa630e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/miller/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, buildGoModule }:
+
+buildGoModule rec {
+  pname = "miller";
+  version = "6.9.0";
+
+  src = fetchFromGitHub {
+    owner = "johnkerl";
+    repo = "miller";
+    rev = "v${version}";
+    sha256 = "sha256-g2Jnqo3U9acyqohGpcEEogq871qJQTc7k0/oIawAQW8=";
+  };
+
+  vendorHash = "sha256-/1/FTQL3Ki8QzL+1J4Ah8kwiJyGPd024di/1MC8gtkE=";
+
+  subPackages = [ "cmd/mlr" ];
+
+  meta = with lib; {
+    description = "Like awk, sed, cut, join, and sort for data formats such as CSV, TSV, JSON, JSON Lines, and positionally-indexed";
+    homepage    = "https://github.com/johnkerl/miller";
+    license     = licenses.bsd2;
+    maintainers = with maintainers; [ mstarzyk ];
+    mainProgram = "mlr";
+    platforms   = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mir-qualia/default.nix b/nixpkgs/pkgs/tools/text/mir-qualia/default.nix
new file mode 100644
index 000000000000..f532daf8c442
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mir-qualia/default.nix
@@ -0,0 +1,21 @@
+{ lib, pythonPackages, fetchurl }:
+
+pythonPackages.buildPythonApplication rec {
+  pname = "mir.qualia";
+  version = "2.0.0";
+  doCheck = false; # 2.0.0-released pytests are broken
+
+  buildInputs = with pythonPackages; [ pytest ];
+
+  src = fetchurl {
+    url = "mirror://pypi/m/mir.qualia/mir.qualia-${version}.tar.gz";
+    sha256 = "1ybq6jb5clh9hw0sp3idp4hjv2gkm9yiaph48gcc208affflc8m9";
+  };
+
+  meta = {
+    description = "Dynamically enable sections of config files";
+    homepage = "https://github.com/darkfeline/mir.qualia";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.srhb ] ;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mmdoc/default.nix b/nixpkgs/pkgs/tools/text/mmdoc/default.nix
new file mode 100644
index 000000000000..50b7f6dcb9df
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mmdoc/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmark-gfm
+, xxd
+, fastJson
+, libzip
+, ninja
+, meson
+, pkg-config
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mmdoc";
+  version = "0.20.0";
+
+  src = fetchFromGitHub {
+    owner = "ryantm";
+    repo = "mmdoc";
+    rev = version;
+    hash = "sha256-NS8i5xvCwq0pSdfxnaxnpuwmDAkfH6Tkc4N2F6aGvWY=";
+  };
+
+  nativeBuildInputs = [ ninja meson pkg-config xxd ];
+
+  buildInputs = [ cmark-gfm fastJson libzip ];
+
+  meta = with lib; {
+    description = "Minimal Markdown Documentation";
+    homepage = "https://github.com/ryantm/mmdoc";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ ryantm ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/morsel/default.nix b/nixpkgs/pkgs/tools/text/morsel/default.nix
new file mode 100644
index 000000000000..b761b03e83d0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/morsel/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "morsel";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "SamLee514";
+    repo = "morsel";
+    rev = "v${version}";
+    hash = "sha256-bb+88GIyd92kHJAs25mJ9vmq0Ha2q0fdHnpTXhX2BFE=";
+  };
+
+  cargoHash = "sha256-XRl71n+rV6MTQMz957K5/25SX9HvYVW6qAuHTdfRLLs=";
+
+  meta = with lib; {
+    description = "Command line tool to translate morse code input to text in real time";
+    homepage = "https://github.com/SamLee514/morsel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mpage/default.nix b/nixpkgs/pkgs/tools/text/mpage/default.nix
new file mode 100644
index 000000000000..5033d53fedaa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mpage/default.nix
@@ -0,0 +1,32 @@
+{ fetchurl, lib, stdenv }:
+
+stdenv.mkDerivation rec {
+  pname = "mpage";
+  version = "2.5.8";
+
+  src = fetchurl {
+    url = "https://www.mesa.nl/pub/mpage/mpage-${version}.tgz";
+    sha256 = "sha256-I1HpHSV5SzWN9mGPF6cBOijTUOwgQI/gb4Ej3EZz/pM=";
+  };
+
+  postPatch = ''
+    sed -i "Makefile" -e "s|^ *PREFIX *=.*$|PREFIX = $out|g"
+    substituteInPlace Makefile --replace 'gcc' '${stdenv.cc.targetPrefix}cc'
+  '';
+
+  meta = {
+    description = "Many-to-one page printing utility";
+
+    longDescription = ''
+      Mpage reads plain text files or PostScript documents and prints
+      them on a PostScript printer with the text reduced in size so
+      that several pages appear on one sheet of paper.  This is useful
+      for viewing large printouts on a small amount of paper.  It uses
+      ISO 8859.1 to print 8-bit characters.
+    '';
+
+    license = "liberal";  # a non-copyleft license, see `Copyright' file
+    homepage = "http://www.mesa.nl/pub/mpage/";
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mrkd/default.nix b/nixpkgs/pkgs/tools/text/mrkd/default.nix
new file mode 100644
index 000000000000..b43b6cfdf6ab
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mrkd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, python3
+, fetchPypi
+}:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: {
+      # https://github.com/refi64/mrkd/pull/6
+      mistune = super.mistune.overridePythonAttrs (old: rec {
+        version = "0.8.4";
+        src = fetchPypi {
+          inherit (old) pname;
+          inherit version;
+          hash = "sha256-WaNCnbU8ULXGvMigf4hIywDX3IvbQxpKtBkg0gHUdW4=";
+        };
+        meta = old.meta // {
+          knownVulnerabilities = [
+            "CVE-2022-34749"
+          ];
+        };
+      });
+    };
+  };
+in python.pkgs.buildPythonApplication rec {
+  pname = "mrkd";
+  version = "0.2.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "456f8c1be99da268554b29c6b5383532e58119def5a65d85270bc6a0ecc26aaf";
+  };
+
+  propagatedBuildInputs = with python.pkgs; [
+    jinja2
+    mistune
+    pygments
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "mrkd" ];
+
+  meta = with lib; {
+    description = "Write man pages using Markdown, and convert them to Roff or HTML";
+    homepage = "https://github.com/refi64/mrkd";
+    license = licenses.bsd2;
+    mainProgram = "mrkd";
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/data/default.nix b/nixpkgs/pkgs/tools/text/multitran/data/default.nix
new file mode 100644
index 000000000000..78b6ee79ea0f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/data/default.nix
@@ -0,0 +1,27 @@
+{lib, stdenv, fetchurl} :
+
+# This package requires a locale ru_RU.cp1251 locale entry.
+# Waiting for a better idea, I created it modifying a store file using:
+#   localedef -f CP1251 -i ru_RU ru_RU.CP1251
+# The store file mentioned is in "${glibc.out}/lib/locale/locale-archive"
+
+stdenv.mkDerivation {
+  pname = "multitran-data";
+  version = "0.3";
+
+  src = fetchurl {
+      url = "mirror://sourceforge/multitran/multitran-data.tar.bz2";
+      sha256 = "9c2ff5027c2fe72b0cdf056311cd7543f447feb02b455982f20d4a3966b7828c";
+  };
+
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' Makefile
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran data english-russian";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/libbtree/default.nix b/nixpkgs/pkgs/tools/text/multitran/libbtree/default.nix
new file mode 100644
index 000000000000..c10a65c271d4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/libbtree/default.nix
@@ -0,0 +1,21 @@
+{lib, stdenv, fetchurl} :
+
+stdenv.mkDerivation rec {
+  pname = "libbtree";
+  version = "0.0.1alpha2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/multitran/libbtree-${version}.tar.bz2";
+    sha256 = "34a584e45058950337ff9342693b6739b52c3ce17e66440526c4bd6f9575802c";
+  };
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' src/Makefile;
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran lib: library for reading Multitran's BTREE database format";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/libfacet/default.nix b/nixpkgs/pkgs/tools/text/multitran/libfacet/default.nix
new file mode 100644
index 000000000000..b035ce32cbf1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/libfacet/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, libmtsupport }:
+
+stdenv.mkDerivation rec {
+  pname = "libfacet";
+  version = "0.0.1alpha2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/multitran/libfacet-${version}.tar.bz2";
+    sha256 = "dc53351c4035a3c27dc6c1d0410e808346fbc107e7e7c112ec65c59d0df7a144";
+  };
+
+  buildInputs = [ libmtsupport ];
+
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' \
+      -e 's@/usr/include/mt/support@${libmtsupport}/include/mt/support@' \
+      src/Makefile;
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran lib: enchanced locale facets";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/libmtquery/default.nix b/nixpkgs/pkgs/tools/text/multitran/libmtquery/default.nix
new file mode 100644
index 000000000000..41f17560d286
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/libmtquery/default.nix
@@ -0,0 +1,31 @@
+{lib, stdenv, fetchurl, libmtsupport, libfacet, libbtree, multitrandata } :
+
+stdenv.mkDerivation rec {
+  pname = "libmtquery";
+  version = "0.0.1alpha3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/multitran/libmtquery-${version}.tar.bz2";
+    sha256 = "e24c7c15772445f1b14871928d84dd03cf93bd88f9d2b2ed1bf0257c2cf2b15e";
+  };
+
+  buildInputs = [ libmtsupport libfacet libbtree multitrandata ];
+
+  NIX_LDFLAGS = "-lbtree";
+
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' \
+      -e 's@/usr/include/mt/support@${libmtsupport}/include/mt/support@' \
+      -e 's@/usr/include/btree@${libbtree}/include/btree@' \
+      -e 's@/usr/include/facet@${libfacet}/include/facet@' \
+      src/Makefile testsuite/Makefile;
+    sed -i -e 's@/usr/share/multitran@${multitrandata}/share/multitran@' src/config.cc
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran lib: main engine to query translations";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/libmtsupport/default.nix b/nixpkgs/pkgs/tools/text/multitran/libmtsupport/default.nix
new file mode 100644
index 000000000000..06317fe3043b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/libmtsupport/default.nix
@@ -0,0 +1,21 @@
+{lib, stdenv, fetchurl} :
+
+stdenv.mkDerivation rec {
+  pname = "libmtsupport";
+  version = "0.0.1alpha2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/multitran/libmtsupport-${version}.tar.bz2";
+    sha256 = "481f0f1ec15d7274f1e4eb93e7d060df10a181efd037eeff5e8056d283a9298b";
+  };
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' src/Makefile;
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran lib: basic useful functions";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/multitran/mtutils/default.nix b/nixpkgs/pkgs/tools/text/multitran/mtutils/default.nix
new file mode 100644
index 000000000000..625f06734b2e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/multitran/mtutils/default.nix
@@ -0,0 +1,34 @@
+{lib, stdenv, fetchurl, libmtsupport, libfacet, libbtree, libmtquery, help2man} :
+
+stdenv.mkDerivation rec {
+  pname = "mt-utils";
+  version = "0.0.1alpha3";
+
+  src = fetchurl {
+      url = "mirror://sourceforge/multitran/mt-utils-${version}.tar.bz2";
+      sha256 = "e407702c90c5272882386914e1eeca5f6c5039393af9a44538536b94867b0a0e";
+  };
+
+  buildInputs = [ libmtsupport libfacet libbtree libmtquery help2man ];
+
+  patchPhase = ''
+    sed -i -e 's@\$(DESTDIR)/usr@'$out'@' \
+      -e 's@/usr/include/mt/support@${libmtsupport}/include/mt/support@' \
+      -e 's@/usr/include/btree@${libbtree}/include/btree@' \
+      -e 's@/usr/include/facet@${libfacet}/include/facet@' \
+      -e 's@/usr/include/mt/query@${libmtquery}/include/mt/query@' \
+      -e 's@-lmtquery@-lmtquery -lmtsupport -lfacet@' \
+      src/Makefile;
+    # Fixing multibyte locale output
+    sed -i -e 's@message.length()@message.length()*5@' \
+      src/converter.cc;
+  '';
+
+  meta = {
+    homepage = "https://multitran.sourceforge.net/";
+    description = "Multitran: simple command line utilities for dictionary maintenance";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/mw/default.nix b/nixpkgs/pkgs/tools/text/mw/default.nix
new file mode 100644
index 000000000000..c85b01828037
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/mw/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildNpmPackage
+}:
+
+buildNpmPackage rec {
+  pname = "mw";
+  version = "unstable-2023-08-04";
+
+  src = fetchFromGitHub {
+    owner = "mark-when";
+    repo = "mw";
+    rev = "a8676da1c7812a051456fabcb980c52a72f6e75e";
+    hash = "sha256-i95WuTH8qY+0PYQA9kOykQL+4d4oB2Hlvg9sfGtDeCo=";
+  };
+
+  npmDepsHash = "sha256-D1hTaoM4j81qrrLMoKJ7OxJTfRoht3/yqgJs95EFxY4=";
+
+  # correctly substitute the usage message
+  postPatch = ''
+    substituteInPlace src/index.ts  --replace \
+    '.usage("$0' '.usage("mw'
+  '';
+
+  meta = {
+    changelog = "https://github.com/mark-when/mw/blob/${src.rev}/CHANGELOG.md";
+    description = "Markwhen CLI";
+    homepage = "https://github.com/mark-when/mw";
+    license = lib.licenses.mit;
+    longDescription = ''
+      Markwhen is an interactive text-to-timeline tool. Write markdown-ish text and it gets converted into a nice looking cascading timeline.
+    '';
+    mainProgram = "mw";
+    maintainers = with lib.maintainers; [ dit7ya ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/namazu/default.nix b/nixpkgs/pkgs/tools/text/namazu/default.nix
new file mode 100644
index 000000000000..e748515b0513
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/namazu/default.nix
@@ -0,0 +1,34 @@
+{ fetchurl, lib, stdenv, perl, perlPackages, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "namazu";
+  version = "2.0.21";
+
+  src = fetchurl {
+    url = "http://namazu.org/stable/${pname}-${version}.tar.gz";
+    sha256 = "1xvi7hrprdchdpzhg3fvk4yifaakzgydza5c0m50h1yvg6vay62w";
+  };
+
+  buildInputs = [ perl perlPackages.FileMMagic ];
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/mknmz --set PERL5LIB ${perlPackages.makeFullPerlPath [ perlPackages.FileMMagic ]}
+  '';
+
+  meta = {
+    description = "Full-text search engine";
+
+    longDescription = ''
+      Namazu is a full-text search engine intended for easy use.  Not
+      only does it work as a small or medium scale Web search engine,
+      but also as a personal search system for email or other files.
+    '';
+
+    license = lib.licenses.gpl2Plus;
+    homepage = "http://namazu.org/";
+
+    platforms = lib.platforms.gnu ++ lib.platforms.linux;  # arbitrary choice
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/nerdfix/default.nix b/nixpkgs/pkgs/tools/text/nerdfix/default.nix
new file mode 100644
index 000000000000..8bb9113f013a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/nerdfix/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nerdfix";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "loichyan";
+    repo = "nerdfix";
+    rev = "v${version}";
+    hash = "sha256-V9f39/9k9kYjngYOSXJYblaKDABPCZbVWxD0p3ZWzlY=";
+  };
+
+  cargoHash = "sha256-PkUQZPLzvVJ7s1D9TkMmgIVQiR/E79BRCYmjZVcHIv8=";
+
+  meta = with lib; {
+    description = "Nerdfix helps you to find/fix obsolete nerd font icons in your project";
+    homepage = "https://github.com/loichyan/nerdfix";
+    changelog = "https://github.com/loichyan/nerdfix/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/nkf/default.nix b/nixpkgs/pkgs/tools/text/nkf/default.nix
new file mode 100644
index 000000000000..9a70ea9461af
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/nkf/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  pname = "nkf";
+  version = "2.1.5";
+
+  src = fetchurl {
+    url = "mirror://osdn/nkf/70406/${pname}-${version}.tar.gz";
+    sha256 = "0i5dbcb9aipwr8ym4mhvgf1in3frl6y8h8x96cprz9s7b11xz9yi";
+  };
+
+  patches = [
+    # Pull upstream fix for parllel build failures
+    (fetchpatch {
+      name = "parallel-install.patch";
+      url = "http://git.osdn.net/view?p=nkf/nkf.git;a=patch;h=9ccff5975bec7963e591e042e1ab1139252a4dc9";
+      sha256 = "00f0x414gfch650b20w0yj5x2bd67hchmadl7v54lk3vdgkc6jwj";
+    })
+  ];
+
+  makeFlags = [ "prefix=$(out)" ];
+
+  meta = {
+    description = "Tool for converting encoding of Japanese text";
+    homepage = "https://nkf.osdn.jp/";
+    license = lib.licenses.zlib;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.auntie ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/nltk_data/default.nix b/nixpkgs/pkgs/tools/text/nltk_data/default.nix
new file mode 100644
index 000000000000..118598083d5d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/nltk_data/default.nix
@@ -0,0 +1,56 @@
+{ lib, newScope, fetchFromGitHub, unzip, stdenvNoCC }:
+let
+  base = {
+    version = "unstable-2023-02-02";
+    nativeBuildInputs = [ unzip ];
+    dontBuild = true;
+    meta = with lib; {
+      description = "NLTK Data";
+      homepage = "https://github.com/nltk/nltk_data";
+      license = licenses.asl20;
+      platforms = platforms.all;
+      maintainers = with maintainers; [ happysalada ];
+    };
+  };
+  makeNltkDataPackage = {pname, location, hash}:
+    let
+      src = fetchFromGitHub {
+        owner = "nltk";
+        repo = "nltk_data";
+        rev = "5db857e6f7df11eabb5e5665836db9ec8df07e28";
+        inherit hash;
+        sparseCheckout = [ "packages/${location}/${pname}.zip" ];
+      };
+    in
+    stdenvNoCC.mkDerivation (base // {
+      inherit pname src;
+      version = base.version;
+      installPhase = ''
+        runHook preInstall
+
+        mkdir -p $out
+        unzip ${src}/packages/${location}/${pname}.zip
+        mkdir -p $out/${location}
+        cp -R ${pname}/ $out/${location}
+
+        runHook postInstall
+      '';
+    });
+in
+lib.makeScope newScope (self: {
+  punkt = makeNltkDataPackage ({
+    pname = "punkt";
+    location = "tokenizers";
+    hash = "sha256-rMkgn3xzmSJNv8//kqbPF2Xq3Gf16lgA1Wx8FPYbaQo=";
+  });
+  averaged_perceptron_tagger = makeNltkDataPackage ({
+    pname = "averaged_perceptron_tagger";
+    location = "taggers";
+    hash = "sha256-ilTs4HWPUoHxQb4kWEy3wJ6QsE/98+EQya44gtV2inw=";
+  });
+  stopwords = makeNltkDataPackage ({
+    pname = "stopwords";
+    location = "corpora";
+    hash = "sha256-Rj1jnt6IDEmBbSIHHueyEvPmdE4EZ6/bJ3qehniebbk=";
+  });
+})
diff --git a/nixpkgs/pkgs/tools/text/num-utils/default.nix b/nixpkgs/pkgs/tools/text/num-utils/default.nix
new file mode 100644
index 000000000000..14784a4e8cfc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/num-utils/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "num-utils";
+  version = "0.5";
+
+  src = fetchurl {
+    url = "https://suso.suso.org/programs/num-utils/downloads/num-utils-${version}.tar.gz";
+    sha256 = "0kn6yskjww2agcqvas5l2xp55mp4njdxqkdicchlji3qzih2fn83";
+  };
+
+  buildInputs = [ perl ];
+
+  patchPhase = ''
+    substituteInPlace Makefile --replace "-o 0 -g 0" "" --replace "\$(RPMDIR)" ""
+  '';
+  makeFlags = [
+    "TOPDIR=${placeholder "out"}"
+    "PERL=${perl}/bin/perl"
+  ];
+
+  meta = with lib; {
+    description = "Programs for dealing with numbers from the command line";
+    homepage = "https://suso.suso.org/xulu/Num-utils";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/numdiff/default.nix b/nixpkgs/pkgs/tools/text/numdiff/default.nix
new file mode 100644
index 000000000000..317d29003cd3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/numdiff/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, libintl }:
+
+
+stdenv.mkDerivation rec {
+  pname = "numdiff";
+  version = "5.9.0";
+
+  src = fetchurl {
+    url = "mirror://savannah/numdiff/numdiff-${version}.tar.gz";
+    sha256 = "1vzmjh8mhwwysn4x4m2vif7q2k8i19x8azq7pzmkwwj4g48lla47";
+  };
+
+  buildInputs = [ libintl ];
+
+  meta = with lib; {
+    description = ''
+      A little program that can be used to compare putatively similar files
+      line by line and field by field, ignoring small numeric differences
+      or/and different numeric formats
+    '';
+    homepage = "https://www.nongnu.org/numdiff/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/odt2txt/default.nix b/nixpkgs/pkgs/tools/text/odt2txt/default.nix
new file mode 100644
index 000000000000..0eb18e8435d4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/odt2txt/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl, zlib, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "odt2txt";
+  version = "0.5";
+
+  src = fetchurl {
+    url = "${meta.homepage}/archive/v${version}.tar.gz";
+    sha256 = "23a889109ca9087a719c638758f14cc3b867a5dcf30a6c90bf6a0985073556dd";
+  };
+
+  configurePhase="export makeFlags=\"DESTDIR=$out\"";
+
+  buildInputs = [ zlib libiconv ];
+
+  meta = {
+    description = "Simple .odt to .txt converter";
+    homepage = "https://github.com/dstosberg/odt2txt";
+    platforms = lib.platforms.all;
+    license = lib.licenses.gpl2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/opencc/default.nix b/nixpkgs/pkgs/tools/text/opencc/default.nix
new file mode 100644
index 000000000000..4093554604f6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/opencc/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, cmake, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "opencc";
+  version = "1.1.7";
+
+  src = fetchFromGitHub {
+    owner = "BYVoid";
+    repo = "OpenCC";
+    rev = "ver.${version}";
+    sha256 = "sha256-N7nazA0xoQ2ewOGDiJg1vBBYMdF1/qiCfNjG5CFFbuk=";
+  };
+
+  nativeBuildInputs = [ cmake python3 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/BYVoid/OpenCC";
+    license = licenses.asl20;
+    description = "A project for conversion between Traditional and Simplified Chinese";
+    longDescription = ''
+      Open Chinese Convert (OpenCC) is an opensource project for conversion between
+      Traditional Chinese and Simplified Chinese, supporting character-level conversion,
+      phrase-level conversion, variant conversion and regional idioms among Mainland China,
+      Taiwan and Hong kong.
+    '';
+    maintainers = with maintainers; [ sifmelcara ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ov/default.nix b/nixpkgs/pkgs/tools/text/ov/default.nix
new file mode 100644
index 000000000000..2a70d7cdaa54
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ov/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+, pandoc
+, makeWrapper
+, testers
+, ov
+}:
+
+buildGoModule rec {
+  pname = "ov";
+  version = "0.32.1";
+
+  src = fetchFromGitHub {
+    owner = "noborus";
+    repo = "ov";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-S84CMC02KJ5eevLxVkapCdjZh4PH95u/0AK4tpkOx2k=";
+  };
+
+  vendorHash = "sha256-1NdvUdPPr0Twx0hyve4/vvDR2cU+mGyws3UIf8jHfbw=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=main.Version=v${version}"
+    "-X=main.Revision=${src.rev}"
+  ];
+
+  subPackages = [ "." ];
+
+  nativeBuildInputs = [
+    installShellFiles
+    pandoc
+    makeWrapper
+  ];
+
+  outputs = [ "out" "doc" ];
+
+  postInstall = ''
+    installShellCompletion --cmd ov \
+      --bash <($out/bin/ov completion bash) \
+      --fish <($out/bin/ov completion fish) \
+      --zsh <($out/bin/ov completion zsh)
+
+    mkdir -p $out/share/$name
+    cp $src/ov-less.yaml $out/share/$name/less-config.yaml
+    makeWrapper $out/bin/ov $out/bin/ov-less --add-flags "--config $out/share/$name/less-config.yaml"
+
+    mkdir -p $doc/share/doc/$name
+    pandoc -s < $src/README.md > $doc/share/doc/$name/README.html
+    mkdir -p $doc/share/$name
+    cp $src/ov.yaml $doc/share/$name/sample-config.yaml
+  '';
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = ov;
+      version = "v${version}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Feature-rich terminal-based text viewer";
+    homepage = "https://noborus.github.io/ov";
+    changelog = "https://github.com/noborus/ov/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ farcaller figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/papeer/default.nix b/nixpkgs/pkgs/tools/text/papeer/default.nix
new file mode 100644
index 000000000000..4084d49373fd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/papeer/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "papeer";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "lapwat";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-nEt2rxI9slrEkbpMpXQM6+jO0QWQsuLdOswXPCSozJs=";
+  };
+
+  vendorHash = "sha256-3QRSdkx9p0H+zPB//bpWCBKKjKjrx0lHMk5lFm+U7pA=";
+
+  doCheck = false; # uses network
+
+  meta = {
+    description = "Convert websites into ebooks and markdown";
+    homepage = "https://papeer.tech/";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ ehmry ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/paperoni/Cargo.lock b/nixpkgs/pkgs/tools/text/paperoni/Cargo.lock
new file mode 100644
index 000000000000..e08a993ea54a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/paperoni/Cargo.lock
@@ -0,0 +1,3014 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aead"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "aes"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561"
+dependencies = [
+ "aes-soft",
+ "aesni",
+ "cipher",
+]
+
+[[package]]
+name = "aes-gcm"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da"
+dependencies = [
+ "aead",
+ "aes",
+ "cipher",
+ "ctr",
+ "ghash",
+ "subtle",
+]
+
+[[package]]
+name = "aes-soft"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
+dependencies = [
+ "cipher",
+ "opaque-debug",
+]
+
+[[package]]
+name = "aesni"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
+dependencies = [
+ "cipher",
+ "opaque-debug",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
+
+[[package]]
+name = "async-channel"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-global-executor"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "blocking",
+ "futures-lite",
+ "once_cell",
+]
+
+[[package]]
+name = "async-io"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+dependencies = [
+ "async-lock",
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-lite",
+ "log 0.4.17",
+ "parking",
+ "polling",
+ "rustix",
+ "slab",
+ "socket2",
+ "waker-fn",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-std"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
+dependencies = [
+ "async-channel",
+ "async-global-executor",
+ "async-io",
+ "async-lock",
+ "crossbeam-utils",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-lite",
+ "gloo-timers",
+ "kv-log-macro",
+ "log 0.4.17",
+ "memchr",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "async-task"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
+
+[[package]]
+name = "async-trait"
+version = "0.1.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base-x"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "blocking"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "log 0.4.17",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "time 0.1.45",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "cipher"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim 0.8.0",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+ "yaml-rust",
+]
+
+[[package]]
+name = "colored"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
+dependencies = [
+ "atty",
+ "lazy_static",
+ "winapi",
+]
+
+[[package]]
+name = "comfy-table"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c93d79ba722818d1a6aedfbe2cf4889330c856d0c6772951efbbf3dd283c070a"
+dependencies = [
+ "crossterm",
+ "strum",
+ "strum_macros",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "console"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "const_fn"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935"
+
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
+[[package]]
+name = "cookie"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951"
+dependencies = [
+ "aes-gcm",
+ "base64",
+ "hkdf",
+ "hmac",
+ "percent-encoding",
+ "rand 0.8.5",
+ "sha2",
+ "time 0.2.27",
+ "version_check",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cpuid-bool"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossterm"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0ebde6a9dd5e331cd6c6f48253254d117642c31653baa475e394657c59c1f7d"
+dependencies = [
+ "bitflags",
+ "crossterm_winapi",
+ "libc",
+ "mio",
+ "parking_lot 0.11.2",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a6966607622438301997d3dac0d2f6e9a90c68bb6bc1785ea98456ab93c0507"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "cssparser"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
+dependencies = [
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa 0.4.8",
+ "matches",
+ "phf",
+ "proc-macro2",
+ "quote",
+ "smallvec",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "ctor"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "ctr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "curl"
+version = "0.4.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
+dependencies = [
+ "curl-sys",
+ "libc",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "socket2",
+ "winapi",
+]
+
+[[package]]
+name = "curl-sys"
+version = "0.4.61+curl-8.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79"
+dependencies = [
+ "cc",
+ "libc",
+ "libnghttp2-sys",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+ "vcpkg",
+ "winapi",
+]
+
+[[package]]
+name = "darling"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.10.0",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_builder"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d13202debe11181040ae9063d739fa32cfcaaebe2275fe387703460ae2365b30"
+dependencies = [
+ "derive_builder_macro",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_builder_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58a94ace95092c5acb1e97a7e846b310cfbd499652f72297da7493f618a98d73"
+dependencies = [
+ "derive_builder_core",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version 0.4.0",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "directories"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dtoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+
+[[package]]
+name = "dtoa-short"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
+dependencies = [
+ "dtoa",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "epub-builder"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d8b1b5059c4b990da60cb6fee785e49ea09d1ed8249d91e2dddfd92b74b7cbc"
+dependencies = [
+ "chrono",
+ "error-chain",
+ "html-escape",
+ "lazy_static",
+ "mustache",
+ "regex",
+ "tempdir",
+ "uuid",
+ "zip",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
+dependencies = [
+ "backtrace",
+ "version_check",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "flexi_logger"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "081e9563bb9600593f0f5d38c24f0e3dc550cd301b4872b986e20f1874104791"
+dependencies = [
+ "atty",
+ "chrono",
+ "glob",
+ "lazy_static",
+ "log 0.4.17",
+ "regex",
+ "thiserror",
+ "yansi",
+]
+
+[[package]]
+name = "flume"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bebadab126f8120d410b677ed95eee4ba6eb7c6dd8e34a5ec88a08050e26132"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "spinning_top",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "ghash"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375"
+dependencies = [
+ "opaque-debug",
+ "polyval",
+]
+
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "gloo-timers"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hkdf"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f"
+dependencies = [
+ "digest",
+ "hmac",
+]
+
+[[package]]
+name = "hmac"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"
+dependencies = [
+ "crypto-mac",
+ "digest",
+]
+
+[[package]]
+name = "html-escape"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476"
+dependencies = [
+ "utf8-width",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
+dependencies = [
+ "log 0.4.17",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes 1.4.0",
+ "fnv",
+ "itoa 1.0.6",
+]
+
+[[package]]
+name = "http-client"
+version = "6.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1947510dc91e2bf586ea5ffb412caad7673264e14bb39fb9078da114a94ce1a5"
+dependencies = [
+ "async-std",
+ "async-trait",
+ "cfg-if",
+ "http-types",
+ "isahc",
+ "log 0.4.17",
+]
+
+[[package]]
+name = "http-types"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "async-std",
+ "base64",
+ "cookie",
+ "futures-lite",
+ "infer",
+ "pin-project-lite",
+ "rand 0.7.3",
+ "serde",
+ "serde_json",
+ "serde_qs",
+ "serde_urlencoded",
+ "url",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix",
+ "regex",
+]
+
+[[package]]
+name = "infer"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac"
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "isahc"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2948a0ce43e2c2ef11d7edf6816508998d99e13badd1150be0914205df9388a"
+dependencies = [
+ "bytes 0.5.6",
+ "crossbeam-utils",
+ "curl",
+ "curl-sys",
+ "flume",
+ "futures-lite",
+ "http",
+ "log 0.4.17",
+ "once_cell",
+ "slab",
+ "sluice",
+ "tracing",
+ "tracing-futures",
+ "url",
+ "waker-fn",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kuchiki"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358"
+dependencies = [
+ "cssparser",
+ "html5ever",
+ "matches",
+ "selectors",
+]
+
+[[package]]
+name = "kv-log-macro"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
+dependencies = [
+ "log 0.4.17",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+
+[[package]]
+name = "libnghttp2-sys"
+version = "0.1.7+1.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
+dependencies = [
+ "log 0.4.17",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+ "value-bag",
+]
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
+dependencies = [
+ "log 0.4.17",
+ "phf",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "md5"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.7.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc"
+dependencies = [
+ "libc",
+ "log 0.4.17",
+ "miow",
+ "ntapi",
+ "winapi",
+]
+
+[[package]]
+name = "miow"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "mustache"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5"
+dependencies = [
+ "log 0.3.9",
+ "serde",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "nodrop"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+
+[[package]]
+name = "ntapi"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "paperoni"
+version = "0.6.1-alpha1"
+dependencies = [
+ "async-std",
+ "base64",
+ "chrono",
+ "clap",
+ "colored",
+ "comfy-table",
+ "derive_builder",
+ "directories",
+ "epub-builder",
+ "flexi_logger",
+ "futures",
+ "html5ever",
+ "indicatif",
+ "itertools",
+ "kuchiki",
+ "lazy_static",
+ "log 0.4.17",
+ "md5",
+ "regex",
+ "surf",
+ "thiserror",
+ "url",
+]
+
+[[package]]
+name = "parking"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.6",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.7",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "phf"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+dependencies = [
+ "phf_macros",
+ "phf_shared 0.8.0",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+dependencies = [
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+dependencies = [
+ "phf_shared 0.8.0",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+dependencies = [
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "polling"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
+dependencies = [
+ "autocfg",
+ "bitflags",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log 0.4.17",
+ "pin-project-lite",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "polyval"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd"
+dependencies = [
+ "cpuid-bool",
+ "opaque-debug",
+ "universal-hash",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
+dependencies = [
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.3.1",
+ "rdrand",
+ "winapi",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+ "rand_pcg",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.9",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom 0.2.9",
+ "redox_syscall",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver 0.9.0",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver 1.0.17",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "selectors"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
+dependencies = [
+ "bitflags",
+ "cssparser",
+ "derive_more",
+ "fxhash",
+ "log 0.4.17",
+ "matches",
+ "phf",
+ "phf_codegen",
+ "precomputed-hash",
+ "servo_arc",
+ "smallvec",
+ "thin-slice",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "itoa 1.0.6",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_qs"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6"
+dependencies = [
+ "percent-encoding",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa 1.0.6",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "servo_arc"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
+dependencies = [
+ "nodrop",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770"
+dependencies = [
+ "sha1_smol",
+]
+
+[[package]]
+name = "sha1_smol"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+
+[[package]]
+name = "sha2"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
+dependencies = [
+ "block-buffer",
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+ "opaque-debug",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "siphasher"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "sluice"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5"
+dependencies = [
+ "async-channel",
+ "futures-core",
+ "futures-io",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "spinning_top"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "standback"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version 0.2.3",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
+[[package]]
+name = "string_cache"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot 0.12.1",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "strum"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
+
+[[package]]
+name = "strum_macros"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "subtle"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+
+[[package]]
+name = "surf"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "718b1ae6b50351982dedff021db0def601677f2120938b070eadb10ba4038dd7"
+dependencies = [
+ "async-std",
+ "async-trait",
+ "cfg-if",
+ "encoding_rs",
+ "futures-util",
+ "getrandom 0.2.9",
+ "http-client",
+ "http-types",
+ "log 0.4.17",
+ "mime_guess",
+ "once_cell",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "web-sys",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tempdir"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
+dependencies = [
+ "rand 0.4.6",
+ "remove_dir_all",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thin-slice"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.2.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242"
+dependencies = [
+ "const_fn",
+ "libc",
+ "standback",
+ "stdweb",
+ "time-macros",
+ "version_check",
+ "winapi",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1"
+dependencies = [
+ "proc-macro-hack",
+ "time-macros-impl",
+]
+
+[[package]]
+name = "time-macros-impl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "standback",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "log 0.4.17",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "universal-hash"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8-width"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1"
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+dependencies = [
+ "getrandom 0.2.9",
+]
+
+[[package]]
+name = "value-bag"
+version = "1.0.0-alpha.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
+dependencies = [
+ "ctor",
+ "version_check",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822"
+dependencies = [
+ "bumpalo",
+ "log 0.4.17",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb"
+
+[[package]]
+name = "web-sys"
+version = "0.3.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "yaml-rust"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992"
+
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+
+[[package]]
+name = "zip"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815"
+dependencies = [
+ "byteorder",
+ "crc32fast",
+ "thiserror",
+ "time 0.1.45",
+]
diff --git a/nixpkgs/pkgs/tools/text/paperoni/default.nix b/nixpkgs/pkgs/tools/text/paperoni/default.nix
new file mode 100644
index 000000000000..346ce515b64f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/paperoni/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, curl
+, stdenv
+, pkg-config
+, zlib
+, openssl
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "paperoni";
+  version = "0.6.1-alpha1";
+
+  src = fetchFromGitHub {
+    owner = "hipstermojo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-vTylnDtoPpiRtk/vew1hLq3g8pepWRVqBEBnvSif4Zw=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+  };
+
+  nativeBuildInputs = [
+    curl
+  ] ++ lib.optionals stdenv.isLinux [
+    pkg-config
+  ];
+
+  buildInputs = [
+    curl
+    zlib
+  ] ++ lib.optionals stdenv.isLinux [
+    openssl
+  ];
+
+  # update Cargo.lock to work with openssl 3
+  postPatch = ''
+    ln -sf ${./Cargo.lock} Cargo.lock
+  '';
+
+  meta = with lib; {
+    description = "An article extractor in Rust";
+    homepage = "https://github.com/hipstermojo/paperoni";
+    changelog = "https://github.com/hipstermojo/paperoni/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/papertrail/Gemfile b/nixpkgs/pkgs/tools/text/papertrail/Gemfile
new file mode 100755
index 000000000000..199cd1422aaa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/papertrail/Gemfile
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+source "https://rubygems.org"
+
+gem "papertrail"
diff --git a/nixpkgs/pkgs/tools/text/papertrail/Gemfile.lock b/nixpkgs/pkgs/tools/text/papertrail/Gemfile.lock
new file mode 100644
index 000000000000..37cd23eab6f5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/papertrail/Gemfile.lock
@@ -0,0 +1,17 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    ansi (1.5.0)
+    chronic (0.10.2)
+    papertrail (0.10.1)
+      ansi (~> 1.5)
+      chronic (~> 0.10)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  papertrail
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/tools/text/papertrail/default.nix b/nixpkgs/pkgs/tools/text/papertrail/default.nix
new file mode 100644
index 000000000000..afc9d2d89e7a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/papertrail/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, bundlerEnv, ruby, bundlerUpdateScript }:
+
+let
+  papertrail-env = bundlerEnv {
+    name = "papertrail-env";
+    inherit ruby;
+    gemfile = ./Gemfile;
+    lockfile = ./Gemfile.lock;
+    gemset = ./gemset.nix;
+  };
+in stdenv.mkDerivation {
+  pname = "papertrail";
+  version = (import ./gemset.nix).papertrail.version;
+
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    ln -s ${papertrail-env}/bin/papertrail $out/bin/papertrail
+  '';
+
+  passthru.updateScript = bundlerUpdateScript "papertrail";
+
+  meta = with lib; {
+    description = "Command-line client for Papertrail log management service";
+    homepage    = "https://github.com/papertrail/papertrail-cli/";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ nicknovitski ];
+    platforms   = ruby.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/papertrail/gemset.nix b/nixpkgs/pkgs/tools/text/papertrail/gemset.nix
new file mode 100644
index 000000000000..dcdfcdf7ea58
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/papertrail/gemset.nix
@@ -0,0 +1,26 @@
+{
+  ansi = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14ims9zfal4gs2wpx2m5rd8zsrl2k794d359shkrsgg3fhr2a22l";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  chronic = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  papertrail = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vb7bh7qh5hr4v3w711bl0yrr3rlhz5c3h3qx3fq31dr5y4100v7";
+      type = "gem";
+    };
+    version = "0.10.1";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/par/default.nix b/nixpkgs/pkgs/tools/text/par/default.nix
new file mode 100644
index 000000000000..e64dbd367be5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/par/default.nix
@@ -0,0 +1,33 @@
+{lib, stdenv, fetchurl}:
+
+stdenv.mkDerivation rec {
+  pname = "par";
+  version = "1.53.0";
+
+  src = fetchurl {
+    url = "http://www.nicemice.net/par/Par-${version}.tar.gz";
+    sha256 = "sha256-yAnGIOuCtYlVOsVLmJjI2lUZbSYjOdE8BG8r5ErEeAQ=";
+  };
+
+  makefile = "protoMakefile";
+  preBuild = ''
+    makeFlagsArray+=(CC="${stdenv.cc.targetPrefix}cc -c" LINK1=${stdenv.cc.targetPrefix}cc)
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp par $out/bin
+
+    mkdir -p $out/share/man/man1
+    cp  par.1 $out/share/man/man1
+  '';
+
+
+  meta = with lib; {
+    homepage = "http://www.nicemice.net/par/";
+    description = "Paragraph reflow for email";
+    platforms = platforms.unix;
+    # See https://fedoraproject.org/wiki/Licensing/Par for license details
+    license = licenses.free;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/patchutils/0.3.3.nix b/nixpkgs/pkgs/tools/text/patchutils/0.3.3.nix
new file mode 100644
index 000000000000..f50354199c3f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/patchutils/0.3.3.nix
@@ -0,0 +1,7 @@
+{ callPackage, ... } @ args:
+
+callPackage ./generic.nix (args // {
+  version = "0.3.3";
+  sha256 = "0g5df00cj4nczrmr4k791l7la0sq2wnf8rn981fsrz1f3d2yix4i";
+  patches = [ ./drop-comments.patch ]; # we would get into a cycle when using fetchpatch on this one
+})
diff --git a/nixpkgs/pkgs/tools/text/patchutils/0.4.2.nix b/nixpkgs/pkgs/tools/text/patchutils/0.4.2.nix
new file mode 100644
index 000000000000..1b2c0d6b1f3e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/patchutils/0.4.2.nix
@@ -0,0 +1,8 @@
+{ callPackage, python3, ... } @ args:
+
+callPackage ./generic.nix (args // {
+  version = "0.4.2";
+  sha256 = "sha256-iHWwll/jPeYriQ9s15O+f6/kGk5VLtv2QfH+1eu/Re0=";
+  # for gitdiff
+  extraBuildInputs = [ python3 ];
+})
diff --git a/nixpkgs/pkgs/tools/text/patchutils/default.nix b/nixpkgs/pkgs/tools/text/patchutils/default.nix
new file mode 100644
index 000000000000..902773f40fa4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/patchutils/default.nix
@@ -0,0 +1,6 @@
+{ callPackage, ... } @ args:
+
+callPackage ./generic.nix (args // {
+  version = "0.3.4";
+  sha256 = "0xp8mcfyi5nmb5a2zi5ibmyshxkb1zv1dgmnyn413m7ahgdx8mfg";
+})
diff --git a/nixpkgs/pkgs/tools/text/patchutils/drop-comments.patch b/nixpkgs/pkgs/tools/text/patchutils/drop-comments.patch
new file mode 100644
index 000000000000..e02693a5683d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/patchutils/drop-comments.patch
@@ -0,0 +1,84 @@
+From 58987954647f51dc42fb13b7759923c6170dd905 Mon Sep 17 00:00:00 2001
+From: Tim Waugh <twaugh@redhat.com>
+Date: Fri, 9 May 2014 16:23:27 +0100
+Subject: Make --clean drop comments after '@@' lines as well (trac #29).
+
+
+diff --git a/Makefile.am b/Makefile.am
+index 99ad2a3..f3c6dbc 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -198,6 +198,7 @@ TESTS = tests/newline1/run-test \
+ 	tests/convert1/run-test \
+ 	tests/convert2/run-test \
+ 	tests/clean1/run-test \
++	tests/clean2/run-test \
+ 	tests/stdin/run-test
+ 
+ # These ones don't work yet.
+diff --git a/src/filterdiff.c b/src/filterdiff.c
+index 383e72b..6ca2316 100644
+--- a/src/filterdiff.c
++++ b/src/filterdiff.c
+@@ -2,7 +2,7 @@
+  * filterdiff - extract (or exclude) a diff from a diff file
+  * lsdiff - show which files are modified by a patch
+  * grepdiff - show files modified by a patch containing a regexp
+- * Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2011 Tim Waugh <twaugh@redhat.com>
++ * Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2011, 2013, 2014 Tim Waugh <twaugh@redhat.com>
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -408,7 +408,8 @@ do_unified (FILE *f, char *header[2], int match, char **line,
+ 							 " Hunk #%lu, %s",
+ 							 hunknum, bestname);
+ 
+-					fputs (trailing, output_to);
++					fputs (clean_comments ? "\n" : trailing,
++					       output_to);
+ 					break;
+ 				case Before:
+ 					// Note the initial line number
+diff --git a/tests/clean2/run-test b/tests/clean2/run-test
+new file mode 100755
+index 0000000..42320df
+--- /dev/null
++++ b/tests/clean2/run-test
+@@ -0,0 +1,34 @@
++#!/bin/sh
++
++# This is a filterdiff(1) testcase.
++# Test: Make sure --clean removes hunk-level comments.
++
++
++. ${top_srcdir-.}/tests/common.sh
++
++cat << EOF > diff
++non-diff line
++--- a/file1
+++++ b/file1
++@@ -0,0 +1 @@ this is a hunk-level comment
+++a
++EOF
++
++${FILTERDIFF} --clean diff 2>errors >filtered || exit 1
++[ -s errors ] && exit 1
++
++cat << EOF | cmp - filtered || exit 1
++--- a/file1
+++++ b/file1
++@@ -0,0 +1 @@
+++a
++EOF
++
++${FILTERDIFF} --clean -x file1 diff 2>errors >filtered || exit 1
++[ -s errors ] && exit 1
++cat << EOF | cmp - filtered || exit 1
++--- a/file1
+++++ b/file1
++@@ -0,0 +1 @@
+++a
++EOF
+-- 
+cgit v0.10.1
+
diff --git a/nixpkgs/pkgs/tools/text/patchutils/generic.nix b/nixpkgs/pkgs/tools/text/patchutils/generic.nix
new file mode 100644
index 000000000000..d1cd4334e119
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/patchutils/generic.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, perl, makeWrapper
+, version, sha256, patches ? [], extraBuildInputs ? []
+, ...
+}:
+stdenv.mkDerivation rec {
+  pname = "patchutils";
+  inherit version patches;
+
+  src = fetchurl {
+    url = "http://cyberelk.net/tim/data/patchutils/stable/${pname}-${version}.tar.xz";
+    inherit sha256;
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ perl ] ++ extraBuildInputs;
+  hardeningDisable = [ "format" ];
+
+  # tests fail when building in parallel
+  enableParallelBuilding = false;
+
+  postInstall = ''
+    for bin in $out/bin/{splitdiff,rediff,editdiff,dehtmldiff}; do
+      wrapProgram "$bin" \
+        --prefix PATH : "$out/bin"
+    done
+  '';
+
+  doCheck = lib.versionAtLeast version "0.3.4";
+
+  preCheck = ''
+    patchShebangs tests
+    chmod +x scripts/*
+  '' + lib.optionalString (lib.versionOlder version "0.4.2") ''
+    find tests -type f -name 'run-test' \
+      -exec sed -i '{}' -e 's|/bin/echo|echo|g' \;
+  '';
+
+  meta = with lib; {
+    description = "Tools to manipulate patch files";
+    homepage = "http://cyberelk.net/tim/software/patchutils";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/pbgopy/default.nix b/nixpkgs/pkgs/tools/text/pbgopy/default.nix
new file mode 100644
index 000000000000..dad688f1dfb5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/pbgopy/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "pbgopy";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "nakabonne";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-P/MFDFMsqSTVErTM9izJJSMIbiOcbQ9Ya10/w6NRcYw=";
+  };
+
+  vendorHash = "sha256-S2X74My6wyDZOsEYTDilCFaYgV2vQzU0jOAY9cEkJ6A=";
+
+  meta = with lib; {
+    description = "Copy and paste between devices";
+    homepage = "https://github.com/nakabonne/pbgopy";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivar ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/peco/default.nix b/nixpkgs/pkgs/tools/text/peco/default.nix
new file mode 100644
index 000000000000..7c026f06292e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/peco/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "peco";
+  version = "0.5.11";
+
+  subPackages = [ "cmd/peco" ];
+
+  src = fetchFromGitHub {
+    owner = "peco";
+    repo = "peco";
+    rev = "v${version}";
+    sha256 = "sha256-OVUfeNpnmuJsgD//JTn6n9n4oOBxep69LhIpHX+ru2w=";
+  };
+
+  vendorHash = "sha256-+HQz7UUgATdgSWlI1dg2DdQRUSke9MyAtXgLikFhF90=";
+
+  meta = with lib; {
+    description = "Simplistic interactive filtering tool";
+    homepage = "https://github.com/peco/peco";
+    changelog = "https://github.com/peco/peco/blob/v${version}/Changes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/percollate/default.nix b/nixpkgs/pkgs/tools/text/percollate/default.nix
new file mode 100644
index 000000000000..6c1ce360da20
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/percollate/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildNpmPackage, fetchFromGitHub, chromium, makeWrapper }:
+
+buildNpmPackage rec {
+  pname = "percollate";
+  version = "4.0.2";
+
+  src = fetchFromGitHub {
+    owner = "danburzo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-QLbLg/zdDCZsRKgC4vR0OT//JHaapGmX33l7jIqUc1M=";
+  };
+
+  npmDepsHash = "sha256-Hxhgjdiz0zC/UlFXK8vvKZFI963Wi2Wx6iHWegr6f10=";
+
+  dontNpmBuild = true;
+
+  # Dev dependencies include an unnecessary Java dependency (epubchecker)
+  # https://github.com/danburzo/percollate/blob/v4.0.2/package.json#L40
+  npmInstallFlags = [ "--omit=dev" ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  env = {
+    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true;
+  };
+
+  postPatch = ''
+    substituteInPlace package.json --replace "git config core.hooksPath .git-hooks" ""
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/percollate \
+      --set PUPPETEER_EXECUTABLE_PATH ${chromium}/bin/chromium
+  '';
+
+  meta = with lib; {
+    description = "A command-line tool to turn web pages into readable PDF, EPUB, HTML, or Markdown docs";
+    homepage = "https://github.com/danburzo/percollate";
+    license = licenses.mit;
+    maintainers = [ maintainers.austinbutler ];
+    mainProgram = "percollate";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/pinyin-tool/default.nix b/nixpkgs/pkgs/tools/text/pinyin-tool/default.nix
new file mode 100644
index 000000000000..9d98385933b1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/pinyin-tool/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, lib, rustPlatform, fetchFromGitHub, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "pinyin-tool";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "briankung";
+    repo = pname;
+    rev = version;
+    sha256 = "1gwqwxlvdrm4sdyqkvpvvfi6jh6qqn6qybn0z66wm06k62f8zj5b";
+  };
+
+  cargoSha256 = "1ixl4bsb8c8dmz9s28a2v5l5f2hi3g9xjy6ribmhybpwmfs4mr4d";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  meta = with lib; {
+    description = "A simple command line tool for converting Chinese characters to space-separate pinyin words";
+    homepage = "https://github.com/briankung/pinyin-tool";
+    license = licenses.mit;
+    maintainers = with maintainers; [ neonfuz ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/platinum-searcher/default.nix b/nixpkgs/pkgs/tools/text/platinum-searcher/default.nix
new file mode 100644
index 000000000000..cbca59bdc6e5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/platinum-searcher/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildGoModule, fetchFromGitHub, fetchpatch }:
+
+buildGoModule rec {
+  pname = "the_platinum_searcher";
+  version = "2.1.5";
+
+  src = fetchFromGitHub {
+    owner = "monochromegane";
+    repo = "the_platinum_searcher";
+    rev = "v${version}";
+    hash = "sha256-AJsFLleZf5yhLY5UZnaQUBQYntzBLXFh6jU2UtKg8/g=";
+  };
+
+  vendorHash = "sha256-GIjPgu0e+duN5MeWcRaF5xUFCkqe2aZJCwGbLUMko08=";
+
+  patches = [
+    # Add Go Modules support. See https://github.com/monochromegane/the_platinum_searcher/pull/217.
+    (fetchpatch {
+      url = "https://github.com/monochromegane/the_platinum_searcher/pull/217/commits/69064d11c57d5fd5f66ddd95f0e789786183d3c6.patch";
+      hash = "sha256-qQ7kZYb2MWSUV6T1frIPT9nMfb20SI7lbG8YhqyQEi8=";
+    })
+  ];
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/monochromegane/the_platinum_searcher";
+    description = "A code search tool similar to ack and the_silver_searcher(ag)";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/pn/default.nix b/nixpkgs/pkgs/tools/text/pn/default.nix
new file mode 100644
index 000000000000..d77b36651d62
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/pn/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, cmake, libphonenumber, icu, protobuf }:
+
+stdenv.mkDerivation rec {
+  pname = "pn";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "Orange-OpenSource";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-vRF9MPcw/hCreHVLD6QB7g1r0wQiZv1xrfzIHj1Yf9M=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libphonenumber icu protobuf ];
+
+  meta = with lib; {
+    description = "A libphonenumber command-line wrapper";
+    homepage = "https://github.com/Orange-OpenSource/pn";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/podiff/default.nix b/nixpkgs/pkgs/tools/text/podiff/default.nix
new file mode 100644
index 000000000000..eec0eb351636
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/podiff/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation {
+  pname = "podiff";
+  version = "1.4";
+
+  src = fetchurl {
+    url = "ftp://download.gnu.org.ua/pub/release/podiff/podiff-1.4.tar.gz";
+    sha256 = "sha256-IxUx87CxdhWh8MqdcSo8GWaG358aZBaIx0oldK94sio=";
+  };
+
+  patchPhase = ''
+    sed "s#PREFIX=/usr#PREFIX=$out#g" -i Makefile
+    mkdir -p $out/bin
+    mkdir -p $out/share/man/man1
+  '';
+
+  meta = with lib; {
+    description = "Finds differences in translations between two PO files, or revisions";
+    homepage = "http://puszcza.gnu.org.ua/software/podiff";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.goibhniu ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/poedit/default.nix b/nixpkgs/pkgs/tools/text/poedit/default.nix
new file mode 100644
index 000000000000..2a01b58c3a6c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/poedit/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, gettext, pkg-config, wxGTK32,
+  boost, icu, lucenepp, asciidoc, libxslt, xmlto, gtk3, gtkspell3, pugixml,
+  nlohmann_json, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "poedit";
+  version = "3.3.2";
+
+  src = fetchFromGitHub {
+    owner = "vslavik";
+    repo = "poedit";
+    rev = "v${version}-oss";
+    hash = "sha256-4WImcTr2nWIdsYJ9ADztvjKEzHK4F8qpJ0QGMOfB3ng=";
+  };
+
+  nativeBuildInputs = [ autoconf automake asciidoc wrapGAppsHook
+    libxslt xmlto boost libtool pkg-config ];
+
+  buildInputs = [ lucenepp nlohmann_json wxGTK32 icu pugixml gtk3 gtkspell3 hicolor-icon-theme ];
+
+  propagatedBuildInputs = [ gettext ];
+
+  preConfigure = "
+    patchShebangs bootstrap
+    ./bootstrap
+  ";
+
+  configureFlags = [
+    "--without-cld2"
+    "--without-cpprest"
+    "--with-boost-libdir=${boost.out}/lib"
+    "CPPFLAGS=-I${nlohmann_json}/include/nlohmann/"
+    "LDFLAGS=-llucene++"
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix PATH : "${lib.makeBinPath [ gettext ]}")
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Cross-platform gettext catalogs (.po files) editor";
+    homepage = "https://www.poedit.net/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dasj19 ];
+    # configure: error: GTK+ build of wxWidgets is required
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/pomsky/Cargo.lock b/nixpkgs/pkgs/tools/text/pomsky/Cargo.lock
new file mode 100644
index 000000000000..9c93b91631e1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/pomsky/Cargo.lock
@@ -0,0 +1,1649 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "anstyle"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2"
+
+[[package]]
+name = "arbitrary"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e"
+dependencies = [
+ "derive_arbitrary",
+]
+
+[[package]]
+name = "assert_cmd"
+version = "2.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd"
+dependencies = [
+ "anstyle",
+ "bstr",
+ "doc-comment",
+ "predicates 3.0.1",
+ "predicates-core",
+ "predicates-tree",
+ "wait-timeout",
+]
+
+[[package]]
+name = "assert_fs"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9d5bf7e5441c6393b5a9670a5036abe6b4847612f594b870f7332dbf10cf6fa"
+dependencies = [
+ "anstyle",
+ "doc-comment",
+ "globwalk",
+ "predicates 3.0.1",
+ "predicates-core",
+ "predicates-tree",
+ "tempfile",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "benchmark"
+version = "0.1.3"
+dependencies = [
+ "criterion",
+ "melody_compiler",
+ "pomsky",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.59.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8"
+dependencies = [
+ "bitflags",
+ "cexpr",
+ "clang-sys",
+ "clap 2.34.0",
+ "env_logger",
+ "lazy_static",
+ "lazycell",
+ "log",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "which",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bstr"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
+dependencies = [
+ "memchr",
+ "once_cell",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "ciborium"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clang-sys"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ed9a53e5d4d9c573ae844bfac6872b159cb1d1585a83b29e7a64b7eef7332a"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim 0.8.0",
+ "textwrap 0.11.0",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+dependencies = [
+ "bitflags",
+ "clap_lex",
+ "indexmap",
+ "textwrap 0.16.0",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "criterion"
+version = "0.3.6"
+source = "git+https://github.com/bheisler/criterion.rs?branch=version-0.4#935c6327e152e44f2b9178797682b9b99b5123a5"
+dependencies = [
+ "anes",
+ "atty",
+ "cast",
+ "ciborium",
+ "clap 3.2.23",
+ "criterion-plot",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.4.5"
+source = "git+https://github.com/bheisler/criterion.rs?branch=version-0.4#935c6327e152e44f2b9178797682b9b99b5123a5"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "derive_arbitrary"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
+[[package]]
+name = "digest"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "env_logger"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
+dependencies = [
+ "atty",
+ "humantime",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "generic-array"
+version = "0.14.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "globset"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "fnv",
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "globwalk"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc"
+dependencies = [
+ "bitflags",
+ "ignore",
+ "walkdir",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "helptext"
+version = "0.1.0"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "ignore"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
+dependencies = [
+ "globset",
+ "lazy_static",
+ "log",
+ "memchr",
+ "regex",
+ "same-file",
+ "thread_local",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "is_ci"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "jobserver"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "lexopt"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baff4b617f7df3d896f97fe922b64817f6cd9a756bb81d40f8883f2f66dcb401"
+
+[[package]]
+name = "libc"
+version = "0.2.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "melody_compiler"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c65dfed91963cb9aa714e283edbc99cfffc3a971f9ea816eed3dbf593d378d6"
+dependencies = [
+ "once_cell",
+ "pest",
+ "pest_derive",
+ "thiserror",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "miette"
+version = "5.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07749fb52853e739208049fb513287c6f448de9103dfa78b05ae01f2fc5809bb"
+dependencies = [
+ "is-terminal",
+ "miette-derive",
+ "once_cell",
+ "owo-colors",
+ "supports-color",
+ "supports-hyperlinks",
+ "supports-unicode",
+ "terminal_size",
+ "textwrap 0.15.2",
+ "thiserror",
+ "unicode-width",
+]
+
+[[package]]
+name = "miette-derive"
+version = "5.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a07ad93a80d1b92bb44cb42d7c49b49c9aab1778befefad49cceb5e4c5bf460"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "normalize-line-endings"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "onig"
+version = "6.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f"
+dependencies = [
+ "bitflags",
+ "libc",
+ "once_cell",
+ "onig_sys",
+]
+
+[[package]]
+name = "onig_sys"
+version = "69.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7"
+dependencies = [
+ "bindgen",
+ "cc",
+ "pkg-config",
+]
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "os_str_bytes"
+version = "6.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
+
+[[package]]
+name = "owo-colors"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+[[package]]
+name = "pcre2"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85b30f2f69903b439dd9dc9e824119b82a55bf113b29af8d70948a03c1b11ab1"
+dependencies = [
+ "libc",
+ "log",
+ "pcre2-sys",
+ "thread_local",
+]
+
+[[package]]
+name = "pcre2-sys"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec30e5e9ec37eb8fbf1dea5989bc957fd3df56fbee5061aa7b7a99dbb37b722"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "pest"
+version = "2.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7"
+dependencies = [
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a81186863f3d0a27340815be8f2078dd8050b14cd71913db9fbda795e5f707d7"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75a1ef20bf3193c15ac345acb32e26b3dc3223aff4d77ae4fc5359567683796b"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e3b284b1f13a20dc5ebc90aff59a51b8d7137c221131b52a7260c08cbc1cc80"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "plotters"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "pomsky"
+version = "0.10.0"
+dependencies = [
+ "arbitrary",
+ "atty",
+ "lexopt",
+ "miette",
+ "once_cell",
+ "pomsky-syntax",
+ "regex",
+ "regex-test",
+]
+
+[[package]]
+name = "pomsky-bin"
+version = "0.10.0"
+dependencies = [
+ "assert_cmd",
+ "assert_fs",
+ "atty",
+ "helptext",
+ "lexopt",
+ "miette",
+ "pomsky",
+ "predicates 2.1.5",
+ "serde",
+ "serde_json",
+ "supports-color",
+]
+
+[[package]]
+name = "pomsky-macro"
+version = "0.10.0"
+dependencies = [
+ "pomsky",
+]
+
+[[package]]
+name = "pomsky-syntax"
+version = "0.10.0"
+dependencies = [
+ "arbitrary",
+ "strsim 0.10.0",
+]
+
+[[package]]
+name = "predicates"
+version = "2.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
+dependencies = [
+ "difflib",
+ "float-cmp",
+ "itertools",
+ "normalize-line-endings",
+ "predicates-core",
+ "regex",
+]
+
+[[package]]
+name = "predicates"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba7d6ead3e3966038f68caa9fc1f860185d95a793180bbcfe0d0da47b3961ed"
+dependencies = [
+ "anstyle",
+ "difflib",
+ "itertools",
+ "predicates-core",
+]
+
+[[package]]
+name = "predicates-core"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
+
+[[package]]
+name = "predicates-tree"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
+dependencies = [
+ "predicates-core",
+ "termtree",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-test"
+version = "0.1.0"
+dependencies = [
+ "onig",
+ "pcre2",
+ "regex",
+]
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustix"
+version = "0.36.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.4",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "shlex"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
+
+[[package]]
+name = "smawk"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "supports-color"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4950e7174bffabe99455511c39707310e7e9b440364a2fcb1cc21521be57b354"
+dependencies = [
+ "is-terminal",
+ "is_ci",
+]
+
+[[package]]
+name = "supports-hyperlinks"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b4806e0b03b9906e76b018a5d821ebf198c8e9dc0829ed3328eeeb5094aed60"
+dependencies = [
+ "is-terminal",
+]
+
+[[package]]
+name = "supports-unicode"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b6c2cb240ab5dd21ed4906895ee23fe5a48acdbd15a3ce388e7b62a9b66baf7"
+dependencies = [
+ "is-terminal",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c622ae390c9302e214c31013517c2061ecb2699935882c60a9b37f82f8625ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "termtree"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d"
+dependencies = [
+ "smawk",
+ "unicode-linebreak",
+ "unicode-width",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.4",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-linebreak"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5faade31a542b8b35855fff6e8def199853b2da8da256da52f52f1316ee3137"
+dependencies = [
+ "hashbrown",
+ "regex",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wait-timeout"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
diff --git a/nixpkgs/pkgs/tools/text/pomsky/default.nix b/nixpkgs/pkgs/tools/text/pomsky/default.nix
new file mode 100644
index 000000000000..45e44b06e8a5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/pomsky/default.nix
@@ -0,0 +1,31 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "pomsky";
+  version = "0.10";
+
+  src = fetchFromGitHub {
+    owner = "pomsky-lang";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-V4WztquClcBQF74c8WalWITT+SRymEawLXmvTflNEGk=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "criterion-0.3.6" = "sha256-biFm0+AjKLwV9yHgCaK6E6L6W+6sRbnY2QOKVhv/1C8=";
+    };
+  };
+
+  # thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: invalid option '--test-threads''
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A portable, modern regular expression language";
+    homepage = "https://pomsky-lang.org";
+    changelog = "https://github.com/pomsky-lang/pomsky/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/popfile/default.nix b/nixpkgs/pkgs/tools/text/popfile/default.nix
new file mode 100644
index 000000000000..7dec478a6342
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/popfile/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv, fetchzip, makeWrapper, perlPackages,
+... }:
+
+stdenv.mkDerivation rec {
+  appname = "popfile";
+  version = "1.1.3";
+  name = "${appname}-${version}";
+
+  src = fetchzip {
+    url = "https://getpopfile.org/downloads/${appname}-${version}.zip";
+    sha256 = "0gcib9j7zxk8r2vb5dbdz836djnyfza36vi8215nxcdfx1xc7l63";
+    stripRoot = false;
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = (with perlPackages; [
+    ## These are all taken from the popfile documentation as applicable to Linux
+    ## https://getpopfile.org/docs/howtos:allplatformsrequireperl
+    perl
+    DBI
+    DBDSQLite
+    HTMLTagset
+    TimeDate # == DateParse
+    HTMLTemplate
+    # IO::Socket::Socks is not in nixpkgs
+    # IOSocketSocks
+    IOSocketSSL
+    NetSSLeay
+    SOAPLite
+  ]);
+
+  installPhase = ''
+    mkdir -p $out/bin
+    # I user `cd` rather than `cp $out/* ...` b/c the * breaks syntax
+    # highlighting in emacs for me.
+    cd $src
+    cp -r * $out/bin
+    cd $out/bin
+    chmod +x *.pl
+
+    find $out -name '*.pl' -executable | while read path; do
+      wrapProgram "$path" \
+        --prefix PERL5LIB : $PERL5LIB:$out/bin \
+        --set POPFILE_ROOT $out/bin \
+        --run 'export POPFILE_USER=''${POPFILE_USER:-$HOME/.popfile}' \
+        --run 'test -d "$POPFILE_USER" || mkdir -m 0700 -p "$POPFILE_USER"'
+    done
+  '';
+
+  meta = {
+    description = "An email classification system that automatically sorts messages and fights spam";
+    homepage = "https://getpopfile.org/";
+    license = lib.licenses.gpl2;
+
+    # Should work on macOS, but havent tested it.
+    # Windows support is more complicated.
+    # https://getpopfile.org/docs/faq:systemrequirements
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/proselint/default.nix b/nixpkgs/pkgs/tools/text/proselint/default.nix
new file mode 100644
index 000000000000..3f1b79c3e015
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/proselint/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchurl, buildPythonApplication, click, future, six }:
+
+buildPythonApplication rec {
+  pname = "proselint";
+  version = "0.13.0";
+
+  doCheck = false; # fails to pass because it tries to run in home directory
+
+  src = fetchurl {
+    url = "mirror://pypi/p/proselint/${pname}-${version}.tar.gz";
+    sha256 = "7dd2b63cc2aa390877c4144fcd3c80706817e860b017f04882fbcd2ab0852a58";
+  };
+
+  propagatedBuildInputs = [ click future six ];
+
+  meta = with lib; {
+    description = "A linter for prose";
+    homepage = "http://proselint.com";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ alibabzo ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/qgrep/default.nix b/nixpkgs/pkgs/tools/text/qgrep/default.nix
new file mode 100644
index 000000000000..7db56539bf2e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/qgrep/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchFromGitHub, CoreServices, CoreFoundation, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  version = "1.1";
+  pname = "qgrep";
+
+  src = fetchFromGitHub {
+    owner = "zeux";
+    repo = "qgrep";
+    rev = "v${version}";
+    sha256 = "046ccw34vz2k5jn6gyxign5gs2qi7i50jy9b74wqv7sjf5zayrh0";
+    fetchSubmodules = true;
+  };
+
+  patches = lib.optionals stdenv.isDarwin [
+    (fetchpatch {
+      url = "https://github.com/zeux/qgrep/commit/21c4d1a5ab0f0bdaa0b5ca993c1315c041418cc6.patch";
+      sha256 = "0wpxzrd9pmhgbgby17vb8279xwvkxfdd99gvv7r74indgdxqg7v8";
+    })
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices CoreFoundation ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "12") [
+    # Needed with GCC 12 but breaks on darwin (with clang) or older gcc
+    "-Wno-error=mismatched-new-delete"
+  ]);
+
+  postPatch = lib.optionalString stdenv.isAarch64 ''
+    substituteInPlace Makefile \
+      --replace "-msse2" "" --replace "-DUSE_SSE2" ""
+  '';
+
+  installPhase = ''
+    install -Dm755 qgrep $out/bin/qgrep
+  '';
+
+  meta = with lib; {
+    description = "Fast regular expression grep for source code with incremental index updates";
+    homepage = "https://github.com/zeux/qgrep";
+    license = licenses.mit;
+    maintainers = [ maintainers.yrashk ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/qprint/default.nix b/nixpkgs/pkgs/tools/text/qprint/default.nix
new file mode 100644
index 000000000000..56f5b5becbd6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/qprint/default.nix
@@ -0,0 +1,29 @@
+{ fetchurl, lib, stdenv }:
+
+stdenv.mkDerivation rec {
+  pname = "qprint";
+  version = "1.1";
+
+  src = fetchurl {
+    url = "https://www.fourmilab.ch/webtools/qprint/qprint-${version}.tar.gz";
+    sha256 = "1701cnb1nl84rmcpxzq11w4cyj4385jh3gx4aqxznwf8a4fwmagz";
+  };
+
+  doCheck = true;
+
+  checkTarget = "wringer";
+
+  preInstall = ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/man/man1
+  '';
+
+  meta = {
+    homepage = "https://www.fourmilab.ch/webtools/qprint/";
+    license = lib.licenses.publicDomain;
+    description = "Encode and decode Quoted-Printable files";
+    maintainers = [ lib.maintainers.tv ];
+    platforms = lib.platforms.all;
+  };
+
+}
diff --git a/nixpkgs/pkgs/tools/text/rare-regex/default.nix b/nixpkgs/pkgs/tools/text/rare-regex/default.nix
new file mode 100644
index 000000000000..6dbd062ef61c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rare-regex/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildGoModule
+, fetchFromGitHub
+, withPcre2 ? stdenv.isLinux
+, pcre2
+, testers
+, rare-regex
+}:
+
+buildGoModule rec {
+  pname = "rare";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "zix99";
+    repo = "rare";
+    rev = version;
+    hash = "sha256-83iHYWMdLOzWDu/WW2TN8D2gUe2Y74aGBUjfHIa9ki8=";
+  };
+
+  vendorHash = "sha256-wUOtxNjL/4MosACCzPTWKWrnMZhxINfN1ppkRsqDh9M=";
+
+  buildInputs = lib.optionals withPcre2 [
+    pcre2
+  ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=main.version=${version}"
+    "-X=main.buildSha=${src.rev}"
+  ];
+
+  tags = lib.optionals withPcre2 [
+    "pcre2"
+  ];
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = rare-regex;
+    };
+  };
+
+  meta = with lib; {
+    description = "A fast text scanner/regex extractor and realtime summarizer";
+    homepage = "https://rare.zdyn.net";
+    changelog = "https://github.com/zix99/rare/releases/tag/${src.rev}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/readability-cli/default.nix b/nixpkgs/pkgs/tools/text/readability-cli/default.nix
new file mode 100644
index 000000000000..5c0fedd752c3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/readability-cli/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildNpmPackage, fetchFromGitLab, installShellFiles }:
+
+buildNpmPackage rec {
+  pname = "readability-cli";
+  version = "2.4.4";
+
+  src = fetchFromGitLab {
+    owner = "gardenappl";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-pvAp3ZJ8/FPhrSMC8B4U1m5zuBNRP/HcsXkrW6QYgSQ=";
+  };
+
+  postPatch = ''
+    # Set a script name to avoid yargs using index.js as $0
+    substituteInPlace common.mjs \
+      --replace '.version(false)' '.version(false).scriptName("readable")'
+  '';
+
+  npmDepsHash = "sha256-X1pcgDm8C4G+hIsgx3sAVFQPadWsULvXrdLAIHnpjmE=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  dontNpmBuild = true;
+
+  postInstall = ''
+    installManPage readability-cli.1
+    installShellCompletion --cmd readable \
+      --bash <(SHELL=bash $out/bin/readable --completion) \
+      --zsh <(SHELL=zsh $out/bin/readable --completion)
+  '';
+
+  meta = with lib; {
+    description = "Firefox Reader Mode in your terminal - get useful text from a web page using Mozilla's Readability library";
+    homepage = "https://gitlab.com/gardenappl/readability-cli";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.marsam ];
+    mainProgram = "readable";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/reckon/Gemfile b/nixpkgs/pkgs/tools/text/reckon/Gemfile
new file mode 100644
index 000000000000..f708ddd93664
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/reckon/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'reckon'
diff --git a/nixpkgs/pkgs/tools/text/reckon/Gemfile.lock b/nixpkgs/pkgs/tools/text/reckon/Gemfile.lock
new file mode 100644
index 000000000000..7409a4bae84f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/reckon/Gemfile.lock
@@ -0,0 +1,21 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    chronic (0.10.2)
+    highline (2.1.0)
+    matrix (0.4.2)
+    rchardet (1.8.0)
+    reckon (0.9.2)
+      chronic (>= 0.3.0)
+      highline (>= 1.5.2)
+      matrix (>= 0.4.2)
+      rchardet (>= 1.8.0)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  reckon
+
+BUNDLED WITH
+   2.4.13
diff --git a/nixpkgs/pkgs/tools/text/reckon/default.nix b/nixpkgs/pkgs/tools/text/reckon/default.nix
new file mode 100644
index 000000000000..91233dfe97b4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/reckon/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, bundlerEnv, bundlerUpdateScript, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "reckon";
+  version = (import ./gemset.nix).reckon.version;
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = let
+    env = bundlerEnv {
+      name = "${pname}-${version}-gems";
+
+      gemdir = ./.;
+    };
+  in ''
+    runHook preInstall
+    mkdir -p $out/bin
+    makeWrapper ${env}/bin/reckon $out/bin/reckon
+    runHook postInstall
+  '';
+
+  passthru.updateScript = bundlerUpdateScript "reckon";
+
+  meta = with lib; {
+    description = "Flexibly import bank account CSV files into Ledger for command line accounting";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nicknovitski ];
+    platforms = platforms.unix;
+    changelog = "https://github.com/cantino/reckon/blob/v${version}/CHANGELOG.md";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/reckon/gemset.nix b/nixpkgs/pkgs/tools/text/reckon/gemset.nix
new file mode 100644
index 000000000000..508d6da0be3e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/reckon/gemset.nix
@@ -0,0 +1,53 @@
+{
+  chronic = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  highline = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1f8cr014j7mdqpdb9q17fp5vb5b8n1pswqaif91s3ylg5x3pygfn";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  matrix = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1h2cgkpzkh3dd0flnnwfq6f3nl2b1zff9lvqz8xs853ssv5kq23i";
+      type = "gem";
+    };
+    version = "0.4.2";
+  };
+  rchardet = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1isj1b3ywgg2m1vdlnr41lpvpm3dbyarf1lla4dfibfmad9csfk9";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  reckon = {
+    dependencies = ["chronic" "highline" "matrix" "rchardet"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0188k41lvz5vnn03qw1hbi6c2i88n5p3183rb0xz9rfjcngh2ly3";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/recode/default.nix b/nixpkgs/pkgs/tools/text/recode/default.nix
new file mode 100644
index 000000000000..8c49fb5ee7fc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/recode/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, python3, perl, intltool, flex, texinfo, libiconv, libintl }:
+
+stdenv.mkDerivation rec {
+  pname = "recode";
+  version = "3.7.12";
+
+  # Use official tarball, avoid need to bootstrap/generate build system
+  src = fetchurl {
+    url = "https://github.com/rrthomas/${pname}/releases/download/v${version}/${pname}-${version}.tar.gz";
+    hash = "sha256-TbHJB28E26oVlyb1AAhH5eWoOuyOXGT4ygQ4P2zaEtU=";
+  };
+
+  nativeBuildInputs = [ python3 python3.pkgs.cython perl intltool flex texinfo libiconv ];
+  buildInputs = [ libintl ];
+
+  enableParallelBuilding = true;
+
+  doCheck = true;
+
+  meta = {
+    homepage = "https://github.com/rrthomas/recode";
+    description = "Converts files between various character sets and usages";
+    changelog = "https://github.com/rrthomas/recode/raw/v${version}/NEWS";
+    platforms = lib.platforms.unix;
+    license = with lib.licenses; [ lgpl3Plus gpl3Plus ];
+    maintainers = with lib.maintainers; [ jcumming ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/repgrep/default.nix b/nixpkgs/pkgs/tools/text/repgrep/default.nix
new file mode 100644
index 000000000000..cefc0fba0349
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/repgrep/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, asciidoctor
+, installShellFiles
+, makeWrapper
+, ripgrep
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "repgrep";
+  version = "0.14.3";
+
+  src = fetchFromGitHub {
+    owner = "acheronfail";
+    repo = "repgrep";
+    rev = version;
+    hash = "sha256-33b0dZJY/lnVJGMfAg/faD6PPJIFZsvMZOmKAqCZw8k=";
+  };
+
+  cargoHash = "sha256-UMMTdWJ0/M8lN4abTJEVUGtoNp/g49DyW+OASg3TKfg=";
+
+  nativeBuildInputs = [
+    asciidoctor
+    installShellFiles
+    makeWrapper
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/rgr \
+      --prefix PATH : ${lib.makeBinPath [ ripgrep ]}
+
+    pushd "$(dirname "$(find -path '**/repgrep-stamp' | head -n 1)")"
+    installManPage rgr.1
+    installShellCompletion rgr.{bash,fish} _rgr
+    popd
+  '';
+
+  meta = with lib; {
+    description = "An interactive replacer for ripgrep that makes it easy to find and replace across files on the command line";
+    homepage = "https://github.com/acheronfail/repgrep";
+    changelog = "https://github.com/acheronfail/repgrep/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ mit asl20 unlicense ];
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "rgr";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/replace/default.nix b/nixpkgs/pkgs/tools/text/replace/default.nix
new file mode 100644
index 000000000000..62b83636b37c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/replace/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "replace";
+  version = "2.24";
+
+  src = fetchurl {
+    url = "http://hpux.connect.org.uk/ftp/hpux/Users/replace-${version}/replace-${version}-src-11.31.tar.gz";
+    sha256 = "18hkwhaz25s6209n5mpx9hmkyznlzygqj488p2l7nvp9zrlxb9sf";
+  };
+
+  outputs = [ "out" "man" ];
+
+  makeFlags = [
+    "TREE=\$(out)"
+    "MANTREE=\$(TREE)/share/man"
+    "CC=${stdenv.cc.targetPrefix}cc"
+  ];
+
+  preBuild = ''
+    sed -e "s@/bin/mv@$(type -P mv)@" -i replace.h
+  '';
+
+  preInstall = "mkdir -p \$out/share/man";
+  postInstall = "mv \$out/bin/replace \$out/bin/replace-literal";
+
+  patches = [./malloc.patch];
+
+  meta = {
+    description = "A tool to replace verbatim strings";
+    homepage = "https://replace.richardlloyd.org.uk/";
+    mainProgram = "replace-literal";
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/replace/malloc.patch b/nixpkgs/pkgs/tools/text/replace/malloc.patch
new file mode 100644
index 000000000000..1ee95c4bae18
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/replace/malloc.patch
@@ -0,0 +1,13 @@
+diff -rc replace-2.24-orig/replace.h replace-2.24/replace.h
+*** replace-2.24-orig/replace.h	2004-10-07 15:15:06.000000000 +0200
+--- replace-2.24/replace.h	2008-02-21 14:57:47.000000000 +0100
+***************
+*** 11,17 ****
+  #include <ctype.h>
+  #include <unistd.h>
+  #include <string.h>
+- #include <malloc.h>
+  #include <sys/stat.h>
+  #include <ftw.h>
+  #include <utime.h>
+--- 11,16 ----
diff --git a/nixpkgs/pkgs/tools/text/reveal-md/default.nix b/nixpkgs/pkgs/tools/text/reveal-md/default.nix
new file mode 100644
index 000000000000..0ae05e59025d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/reveal-md/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "reveal-md";
+  version = "5.5.1";
+
+  src = fetchFromGitHub {
+    owner = "webpro";
+    repo = "reveal-md";
+    rev = version;
+    hash = "sha256-BlUZsETMdOmnz+OFGQhQ9aLHxIIAZ12X1ipy3u59zxo=";
+  };
+
+  npmDepsHash = "sha256-xaDBB16egGi8zThHRrhcN8TVf6Nqkx8fkbxWqvJwJb4=";
+
+  env = {
+    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true;
+  };
+
+  dontNpmBuild = true;
+
+  doCheck = true;
+
+  checkPhase = ''
+    runHook preCheck
+
+    npm run test
+
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "Get beautiful reveal.js presentations from your Markdown files";
+    homepage = "https://github.com/webpro/reveal-md";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ sagikazarmark ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rgxg/default.nix b/nixpkgs/pkgs/tools/text/rgxg/default.nix
new file mode 100644
index 000000000000..8e4d991e7bf0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rgxg/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, fetchzip }:
+
+stdenv.mkDerivation rec {
+  pname = "rgxg";
+  version = "0.1.2";
+
+  src = fetchzip {
+    url = "https://github.com/rgxg/rgxg/releases/download/v${version}/${pname}-${version}.tar.gz";
+    sha256 = "050jxc3qhfrm9fdbzd67hlsqlp4qk1fa20q1g2v919sh7s6v77si";
+  };
+
+  meta = with lib; {
+    description = "A C library and a command-line tool to generate (extended) regular expressions";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ hloeffler ];
+    homepage = "https://rgxg.github.io/";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/riffdiff/default.nix b/nixpkgs/pkgs/tools/text/riffdiff/default.nix
new file mode 100644
index 000000000000..cd5e2caa8f0d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/riffdiff/default.nix
@@ -0,0 +1,23 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "riffdiff";
+  version = "2.27.0";
+
+  src = fetchFromGitHub {
+    owner = "walles";
+    repo = "riff";
+    rev = version;
+    hash = "sha256-yrIZsCxoFV9LFh96asYxpAYv1KvrLq+RlqL8gZXaeak=";
+  };
+
+  cargoHash = "sha256-tO49qAEW15q76hLcHOtniwLqGy29MZ/dabyZHYAsiME=";
+
+  meta = with lib; {
+    description = "A diff filter highlighting which line parts have changed";
+    homepage = "https://github.com/walles/riff";
+    license = licenses.mit;
+    maintainers = with maintainers; [ johnpyp ];
+    mainProgram = "riff";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ripgrep-all/default.nix b/nixpkgs/pkgs/tools/text/ripgrep-all/default.nix
new file mode 100644
index 000000000000..d25d068b7e07
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ripgrep-all/default.nix
@@ -0,0 +1,63 @@
+{ stdenv, lib, fetchFromGitHub, rustPlatform, makeWrapper, ffmpeg
+, pandoc, poppler_utils, ripgrep, Security, imagemagick, tesseract3
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ripgrep-all";
+  version = "0.9.6";
+
+  src = fetchFromGitHub {
+    owner = "phiresky";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wjpgi7m3lxybllkr3r60zaphp02ykq2syq72q9ail2760cjcir6";
+  };
+
+  cargoSha256 = "1l71xj5crfb51wfp2bdvdqp1l8kg182n5d6w23lq2wjszaqcj7cw";
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = lib.optional stdenv.isDarwin Security;
+
+  postInstall = ''
+    wrapProgram $out/bin/rga \
+      --prefix PATH ":" "${lib.makeBinPath [ ffmpeg pandoc poppler_utils ripgrep imagemagick tesseract3 ]}"
+  '';
+
+  # Use upstream's example data to run a couple of queries to ensure the dependencies
+  # for all of the adapters are available.
+  installCheckPhase = ''
+    set -e
+    export PATH="$PATH:$out/bin"
+
+    test1=$(rga --rga-no-cache "hello" exampledir/ | wc -l)
+    test2=$(rga --rga-no-cache --rga-adapters=tesseract "crate" exampledir/screenshot.png | wc -l)
+
+    if [ $test1 != 26 ]
+    then
+      echo "ERROR: test1 failed! Could not find the word 'hello' 26 times in the sample data."
+      exit 1
+    fi
+
+    if [ $test2 != 1 ]
+    then
+      echo "ERROR: test2 failed! Could not find the word 'crate' in the screenshot."
+      exit 1
+    fi
+  '';
+
+  doInstallCheck = true;
+
+  meta = with lib; {
+    description = "Ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, and more";
+    longDescription = ''
+      Ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc.
+
+      rga is a line-oriented search tool that allows you to look for a regex in
+      a multitude of file types. rga wraps the awesome ripgrep and enables it
+      to search in pdf, docx, sqlite, jpg, movie subtitles (mkv, mp4), etc.
+    '';
+    homepage = "https://github.com/phiresky/ripgrep-all";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ zaninime ma27 ];
+    mainProgram = "rga";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ripgrep/default.nix b/nixpkgs/pkgs/tools/text/ripgrep/default.nix
new file mode 100644
index 000000000000..456956986cb4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ripgrep/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, fetchFromGitHub
+, rustPlatform
+, asciidoctor
+, installShellFiles
+, pkg-config
+, Security
+, withPCRE2 ? true
+, pcre2
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ripgrep";
+  version = "13.0.0";
+
+  src = fetchFromGitHub {
+    owner = "BurntSushi";
+    repo = pname;
+    rev = version;
+    sha256 = "0pdcjzfi0fclbzmmf701fdizb95iw427vy3m1svy6gdn2zwj3ldr";
+  };
+
+  cargoSha256 = "1kfdgh8dra4jxgcdb0lln5wwrimz0dpp33bq3h7jgs8ngaq2a9wp";
+
+  nativeBuildInputs = [ asciidoctor installShellFiles ]
+    ++ lib.optional withPCRE2 pkg-config;
+  buildInputs = lib.optional withPCRE2 pcre2
+    ++ lib.optional stdenv.isDarwin Security;
+
+  buildFeatures = lib.optional withPCRE2 "pcre2";
+
+  preFixup = ''
+    installManPage $releaseDir/build/ripgrep-*/out/rg.1
+
+    installShellCompletion $releaseDir/build/ripgrep-*/out/rg.{bash,fish}
+    installShellCompletion --zsh complete/_rg
+  '';
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    file="$(mktemp)"
+    echo "abc\nbcd\ncde" > "$file"
+    $out/bin/rg -N 'bcd' "$file"
+    $out/bin/rg -N 'cd' "$file"
+  '' + lib.optionalString withPCRE2 ''
+    echo '(a(aa)aa)' | $out/bin/rg -P '\((a*|(?R))*\)'
+  '';
+
+  meta = with lib; {
+    description = "A utility that combines the usability of The Silver Searcher with the raw speed of grep";
+    homepage = "https://github.com/BurntSushi/ripgrep";
+    license = with licenses; [ unlicense /* or */ mit ];
+    maintainers = with maintainers; [ globin ma27 zowoq ];
+    mainProgram = "rg";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rnr/default.nix b/nixpkgs/pkgs/tools/text/rnr/default.nix
new file mode 100644
index 000000000000..834ecfddee77
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rnr/default.nix
@@ -0,0 +1,23 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "rnr";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "ismaelgv";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-g/PnvOZzlWzEHf3vvYANeJ2ogQ/6duNzhlKpKMBoBFU=";
+  };
+
+  cargoSha256 = "sha256-+oDRNBQ03MknhcTpZFKt0ipJY43LPOKbGF014rrs6dw=";
+
+  meta = with lib; {
+    description = "A command-line tool to batch rename files and directories";
+    homepage = "https://github.com/ismaelgv/rnr";
+    changelog = "https://github.com/ismaelgv/rnr/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rosie/default.nix b/nixpkgs/pkgs/tools/text/rosie/default.nix
new file mode 100644
index 000000000000..190fd4944d15
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rosie/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchgit
+, libbsd
+, readline
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rosie";
+  version = "1.3.0";
+
+  src = fetchgit {
+    url = "https://gitlab.com/rosie-pattern-language/rosie";
+    rev = "9303e04ae2cffabdda6ccc4e2a351a47218615ff";
+    sha256 = "1smh760baf43hr56p6rh4khz3shyzda5lqva4ffxwchl7yy7r82j";
+    fetchSubmodules = true;
+  };
+
+  postUnpack = ''
+    # The Makefile calls git to update submodules, unless this file exists
+    touch ${src.name}/submodules/~~present~~
+  '';
+
+  preConfigure = ''
+    patchShebangs src/build_info.sh
+    # rosie is ran as part of `make check`,
+    # and so needs to be patched in preConfigure.
+    patchShebangs rosie
+    # Part of the same Makefile target which calls git to update submodules
+    ln -s src submodules/lua/include
+    # ldconfig is irrelevant, disable it inside `make installforce`.
+    sed -iE 's/ldconfig/echo skippin ldconfig/' Makefile
+    sed -iE '/ld.so.conf.d/d' Makefile
+  '';
+
+  preInstall = lib.optionalString stdenv.isDarwin ''
+    install_name_tool -add_rpath $out/lib build/bin/rosie
+    install_name_tool -id $out/lib/librosie.dylib build/lib/librosie.dylib
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/emacs/site-lisp $out/share/vim-plugins $out/share/nvim
+    mv $out/lib/rosie/extra/emacs/* $out/share/emacs/site-lisp/
+    mv $out/lib/rosie/extra/vim $out/share/vim-plugins/rosie
+    ln -s $out/share/vim-plugins/rosie $out/share/nvim/site
+  '';
+
+  # librosie.so is dlopen'ed , so we disable ELF patching to preserve RUNPATH .
+  dontPatchELF = true;
+
+  makeFlags = [ "DESTDIR=${placeholder "out"}" ];
+
+  buildInputs = [ libbsd readline ];
+
+  meta = with lib; {
+    homepage = "https://rosie-lang.org";
+    description = "Tools for searching using parsing expression grammars";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kovirobi ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rpl/default.nix b/nixpkgs/pkgs/tools/text/rpl/default.nix
new file mode 100644
index 000000000000..9f37fd260d71
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rpl/default.nix
@@ -0,0 +1,38 @@
+{ lib, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "rpl";
+  version = "1.10";
+
+  # Tests not included in pip package.
+  doCheck = false;
+
+
+  src = fetchFromGitHub {
+    owner = "rrthomas";
+    repo = "rpl";
+    rev = "4467bd46a7a798f738247a7f090c1505176bd597";
+    sha256 = "0yf3pc3fws4nnh4nd8d3jpglmsyi69d17qqgpcnkpqca5l4cd25w";
+  };
+
+  patches = [
+    ./remove-argparse-manpage.diff # quickfix for ImportError: No module named build_manpages.build_manpages
+  ];
+
+  propagatedBuildInputs = [
+    #python3Packages.argparse-manpage # TODO
+    python3Packages.chardet
+  ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    mv rpl $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Replace strings in files";
+    homepage    = "https://github.com/rrthomas/rpl";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rpl/remove-argparse-manpage.diff b/nixpkgs/pkgs/tools/text/rpl/remove-argparse-manpage.diff
new file mode 100644
index 000000000000..8d3297699682
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rpl/remove-argparse-manpage.diff
@@ -0,0 +1,27 @@
+diff --git a/setup.cfg b/setup.cfg
+index 12e9198..38e5376 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -15,7 +15,6 @@ classifiers =
+ [options]
+ scripts = rpl
+ python_requires = >=3
+-setup_requires = argparse-manpage
+ install_requires = chardet
+ 
+ [options.extras_require]
+diff --git a/setup.py b/setup.py
+index 96cade6..879fc44 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,9 +1,8 @@
+-from build_manpages.build_manpages import get_install_cmd
+ from setuptools import setup
+ from setuptools.command.install import install
+ 
+ setup(
+     cmdclass={
+-        'install': get_install_cmd(install),
++        'install': install,
+     }
+ )
diff --git a/nixpkgs/pkgs/tools/text/rsbkb/default.nix b/nixpkgs/pkgs/tools/text/rsbkb/default.nix
new file mode 100644
index 000000000000..1510a63b050f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rsbkb/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+, enableAppletSymlinks ? true
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "rsbkb";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "trou";
+    repo = "rsbkb";
+    rev = "release-${version}";
+    hash = "sha256-+plf7BoYpEFPRsGKNrvLF8TAU3Z7nyx6Td6uRBoNGiE=";
+  };
+
+  cargoHash = "sha256-HyosR/5tZCRU2CNnnGITEuESW30Zq3s33UFNcLmEWIA=";
+
+  # Setup symlinks for all the utilities,
+  # busybox style
+  postInstall = lib.optionalString enableAppletSymlinks ''
+    cd $out/bin || exit 1
+    path="$(realpath --canonicalize-missing ./rsbkb)"
+    for i in $(./rsbkb list) ; do ln -s $path $i ; done
+  '';
+
+  meta = with lib; {
+    description = "Command line tools to encode/decode things";
+    homepage = "https://github.com/trou/rsbkb";
+    changelog = "https://github.com/trou/rsbkb/releases/tag/release-${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ProducerMatt ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile b/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile
new file mode 100644
index 000000000000..4bb5d8c175d7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'ruby-zoom'
diff --git a/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile.lock b/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile.lock
new file mode 100644
index 000000000000..820a972d106d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ruby-zoom/Gemfile.lock
@@ -0,0 +1,24 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    djinni (2.2.4)
+      fagin (~> 1.2, >= 1.2.1)
+    fagin (1.2.1)
+    hilighter (1.2.3)
+    json_config (1.1.0)
+    ruby-zoom (5.3.0)
+      djinni (~> 2.2, >= 2.2.4)
+      fagin (~> 1.2, >= 1.2.1)
+      hilighter (~> 1.2, >= 1.2.3)
+      json_config (~> 1.0, >= 1.0.0)
+      scoobydoo (~> 1.0, >= 1.0.0)
+    scoobydoo (1.0.0)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  ruby-zoom
+
+BUNDLED WITH
+   1.17.2
diff --git a/nixpkgs/pkgs/tools/text/ruby-zoom/default.nix b/nixpkgs/pkgs/tools/text/ruby-zoom/default.nix
new file mode 100644
index 000000000000..965d23d0c44b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ruby-zoom/default.nix
@@ -0,0 +1,18 @@
+{ lib, bundlerEnv, ruby, bundlerUpdateScript }:
+
+bundlerEnv {
+  pname = "ruby-zoom";
+
+  inherit ruby;
+  gemdir = ./.;
+
+  passthru.updateScript = bundlerUpdateScript "ruby-zoom";
+
+  meta = with lib; {
+    description = "Quickly open CLI search results in your favorite editor!";
+    homepage    = "https://gitlab.com/mjwhitta/zoom";
+    license     = with licenses; gpl3;
+    maintainers = with maintainers; [ vmandela nicknovitski ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ruby-zoom/gemset.nix b/nixpkgs/pkgs/tools/text/ruby-zoom/gemset.nix
new file mode 100644
index 000000000000..19584787d904
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ruby-zoom/gemset.nix
@@ -0,0 +1,64 @@
+{
+  djinni = {
+    dependencies = ["fagin"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18zk80jk70xq1bnsvzcgxb13x9fqdb5g4m02b2f6mvqm4cyw26pl";
+      type = "gem";
+    };
+    version = "2.2.4";
+  };
+  fagin = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0psyydh4hf2s1kz0r50aiyjf5v2pqhkbmy0gicxzaj5n17q2ga24";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  hilighter = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03zm49g96dfpan5fhblcjxrzv7ldwan57sn0jcllkcmrqfd0zlyz";
+      type = "gem";
+    };
+    version = "1.2.3";
+  };
+  json_config = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0slb618n1ipn47j6dsxbfv2j9pl06dxn2i651llix09d529m7zwa";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  ruby-zoom = {
+    dependencies = ["djinni" "fagin" "hilighter" "json_config" "scoobydoo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iqxc0rzypsxy4wbxnvgvk98dbcsrcczq3xi9xd4wz4ggwq564l3";
+      type = "gem";
+    };
+    version = "5.3.0";
+  };
+  scoobydoo = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "162p75nc9x078kqcpdsrsd7kngs6jc5n4injz3kzpwf0jgbbm8n7";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/runiq/default.nix b/nixpkgs/pkgs/tools/text/runiq/default.nix
new file mode 100644
index 000000000000..7b1e99978a45
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/runiq/default.nix
@@ -0,0 +1,20 @@
+{ fetchCrate, lib, rustPlatform }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "runiq";
+  version = "1.2.2";
+
+  src = fetchCrate {
+    inherit pname version;
+    sha256 = "sha256-WPQgTQICZ0DFr+7D99UGMx+I78376IC6iIJ3tCsj0Js=";
+  };
+
+  cargoSha256 = "sha256-QKtrd690eoPXyd5CQg5/yAiTDk297y60XaUdoeFAe0c=";
+
+  meta = with lib; {
+    description = "An efficient way to filter duplicate lines from input, à la uniq";
+    homepage = "https://github.com/whitfin/runiq";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/ruplacer/default.nix b/nixpkgs/pkgs/tools/text/ruplacer/default.nix
new file mode 100644
index 000000000000..b44165d6ea88
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ruplacer/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ruplacer";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "TankerHQ";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-xuq+Scy5MyyGvI51Vs26pk9+NnlghzGEJDHYC3kSXNw=";
+  };
+
+  cargoHash = "sha256-Kevwpkvgq40LhWxhW9ra2Nd1zEiAF372DM1sY9hnQb0=";
+
+  buildInputs = (lib.optional stdenv.isDarwin Security);
+
+  meta = with lib; {
+    description = "Find and replace text in source files";
+    homepage = "https://github.com/TankerHQ/ruplacer";
+    license = [ licenses.bsd3 ];
+    maintainers = with maintainers; [ Br1ght0ne ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/rust-petname/default.nix b/nixpkgs/pkgs/tools/text/rust-petname/default.nix
new file mode 100644
index 000000000000..fda0ebf90404
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/rust-petname/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchCrate }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "rust-petname";
+  version = "1.1.3";
+
+  src = fetchCrate {
+    inherit version;
+    crateName = "petname";
+    sha256 = "sha256-C6EJ8awdTV9TecMeYdbmleK8171+hvphjXJrWNJSXxo=";
+  };
+
+  cargoSha256 = "sha256-mB4n1IxhNXrAsCz/jv5jgqyO9OgISZnI5E/vFu80+FE=";
+
+  meta = with lib; {
+    description = "Generate human readable random names";
+    homepage = "https://github.com/allenap/rust-petname";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "petname";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sad/default.nix b/nixpkgs/pkgs/tools/text/sad/default.nix
new file mode 100644
index 000000000000..da4ff0804b11
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sad/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+, python3
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "sad";
+  version = "0.4.23";
+
+  src = fetchFromGitHub {
+    owner = "ms-jpq";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-LNMc+3pXx7VyNq0dws+s13ZA3+f8aJzgbAxzI71NKx0=";
+  };
+
+  cargoHash = "sha256-UjXJmH4UI5Vey2rBy57CI1r13bpGYhIozEoOoyoRDLQ=";
+
+  nativeBuildInputs = [ python3 ];
+
+  # fix for compilation on aarch64
+  # see https://github.com/NixOS/nixpkgs/issues/145726
+  prePatch = ''
+    rm .cargo/config.toml
+  '';
+
+  meta = with lib; {
+    description = "CLI tool to search and replace";
+    homepage = "https://github.com/ms-jpq/sad";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/schema2ldif/default.nix b/nixpkgs/pkgs/tools/text/schema2ldif/default.nix
new file mode 100644
index 000000000000..fc4a2153d662
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/schema2ldif/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenvNoCC, fetchurl, makeWrapper, perlPackages }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "schema2ldif";
+  version = "1.3";
+
+  src = fetchurl {
+    url = "https://repos.fusiondirectory.org/sources/schema2ldif/schema2ldif-${version}.tar.gz";
+    hash = "sha256-KmXdqVuINUnJ6EF5oKgk6BsT3h5ebVqss7aCl3pPjQE=";
+  };
+
+  postPatch = ''
+    # Removes the root check and changes the temporary location
+    # from the nix store to $PWD
+    sed -i \
+      -e '/You have to run this script as root/d' \
+      -e 's|/\^(\.\*)\\\.schema\$/|/.*\\/(.*)\\.schema$/|g' \
+      bin/ldap-schema-manager
+  '';
+
+  buildInputs = [ perlPackages.perl ];
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/man/man1
+
+    cp bin/{schema2ldif,ldap-schema-manager} $out/bin
+    gzip -c man/schema2ldif.1 > $out/share/man/man1/schema2ldif.1.gz
+    gzip -c man/ldap-schema-manager.1 > $out/share/man/man1/ldap-schema-manager.1.gz
+
+    wrapProgram $out/bin/schema2ldif \
+       --prefix PERL5PATH : "${perlPackages.makePerlPath [ perlPackages.GetoptLong ]}"
+  '';
+
+  meta = with lib; {
+    description = "Utilities to manage schema in .schema and .ldif format";
+    homepage = "https://www.fusiondirectory.org/schema2ldif-project-and-components/";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ das_j ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/scraper/default.nix b/nixpkgs/pkgs/tools/text/scraper/default.nix
new file mode 100644
index 000000000000..d325646a35d2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/scraper/default.nix
@@ -0,0 +1,27 @@
+{ lib, rustPlatform, fetchCrate, installShellFiles }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "scraper";
+  version = "0.17.1";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-SVrQi9VxTzUHkdFdieOAIBhKvyrZqi3xKGooHkCEmhQ=";
+  };
+
+  cargoHash = "sha256-/Lut38gFO4XtrBHXr4sfcII+bWgcCDrHf5/PKPrDiDs=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall = ''
+    installManPage scraper.1
+  '';
+
+  meta = with lib; {
+    description = "A tool to query HTML files with CSS selectors";
+    homepage = "https://github.com/causal-agent/scraper";
+    changelog = "https://github.com/causal-agent/scraper/releases/tag/v${version}";
+    license = licenses.isc;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sd/default.nix b/nixpkgs/pkgs/tools/text/sd/default.nix
new file mode 100644
index 000000000000..009150062db2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sd/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, installShellFiles, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "sd";
+  version = "0.7.6";
+
+  src = fetchFromGitHub {
+    owner = "chmln";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0c5bsqs6c55x4j640vhzlmbiylhp5agr7lx0jrwcjazfyvxihc01";
+  };
+
+  cargoSha256 = "1iwgy9zzdxay6hb9pz47jchy03jrsy5csxijlq4i228qhqnvq1lr";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  preFixup = ''
+    installManPage $releaseDir/build/sd-*/out/sd.1
+
+    installShellCompletion $releaseDir/build/sd-*/out/sd.{bash,fish}
+    installShellCompletion --zsh $releaseDir/build/sd-*/out/_sd
+  '';
+
+  meta = with lib; {
+    description = "Intuitive find & replace CLI (sed alternative)";
+    homepage = "https://github.com/chmln/sd";
+    license = licenses.mit;
+    maintainers = with maintainers; [ amar1729 Br1ght0ne ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/seehecht/default.nix b/nixpkgs/pkgs/tools/text/seehecht/default.nix
new file mode 100644
index 000000000000..55c02a8c90c6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/seehecht/default.nix
@@ -0,0 +1,27 @@
+{ lib, rustPlatform, fetchFromGitea }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "seehecht";
+  version = "3.0.3";
+
+  src = fetchFromGitea {
+    domain = "codeberg.org";
+    owner = "annaaurora";
+    repo = "seehecht";
+    rev = "v${version}";
+    sha256 = "sha256-KIxK0JYfq/1Bn4LOn+LzWPBUvGYMvOEuqS7GMpDRvW0=";
+  };
+
+  cargoSha256 = "sha256-AeVUVF4SBS9FG0iezLBKUm4Uk1PPRXPTON93evgL9IA=";
+
+  postInstall = ''
+    ln -s $out/bin/seh $out/bin/seehecht
+  '';
+
+  meta = with lib; {
+    description = "A tool to quickly open a markdown document with already filled out frontmatter";
+    license = licenses.lgpl3Only;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ annaaurora ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sgml/jade/default.nix b/nixpkgs/pkgs/tools/text/sgml/jade/default.nix
new file mode 100644
index 000000000000..a744300bfdde
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/jade/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, gnum4 }:
+
+stdenv.mkDerivation rec {
+  pname = "jade";
+  version = "1.2.1";
+  debpatch = "47.3";
+
+  src = fetchurl {
+    url = "ftp://ftp.jclark.com/pub/jade/jade-${version}.tar.gz";
+    sha256 = "84e2f8a2a87aab44f86a46b71405d4f919b219e4c73e03a83ab6c746a674b187";
+  };
+
+  patchsrc =  fetchurl {
+    url = "mirror://debian/pool/main/j/jade/jade_${version}-${debpatch}.diff.gz";
+    sha256 = "8e94486898e3503308805f856a65ba5b499a6f21994151270aa743de48305464";
+  };
+
+  patches = [ patchsrc ];
+
+  buildInputs = [ gnum4 ];
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-deprecated";
+
+  # Makefile is missing intra-library depends, fails build as:
+  # ld: cannot find -lsp
+  # ld: cannot find -lspgrove
+  enableParallelBuilding = false;
+
+  preInstall = ''
+    install -d -m755 "$out"/lib
+  '';
+
+  postInstall = ''
+    mv "$out/bin/sx" "$out/bin/sgml2xml"
+  '';
+
+  meta = {
+    description = "James Clark's DSSSL Engine";
+    license = "custom";
+    homepage = "http://www.jclark.com/jade/";
+    platforms = with lib.platforms; linux;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sgml/linuxdoc-tools/default.nix b/nixpkgs/pkgs/tools/text/sgml/linuxdoc-tools/default.nix
new file mode 100644
index 000000000000..dad9975ebf12
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/linuxdoc-tools/default.nix
@@ -0,0 +1,62 @@
+{ stdenv, lib, makeWrapper, fetchFromGitLab, perl, flex
+, gnused, coreutils, which, opensp, groff, texlive, texinfo, withLatex ? false
+}:
+
+stdenv.mkDerivation rec {
+  pname = "linuxdoc-tools";
+  version = "0.9.83";
+
+  src = fetchFromGitLab {
+    owner = "agmartin";
+    repo = "linuxdoc-tools";
+    rev = version;
+    sha256 = "sha256-1F3MDYJ9UH7ypgTSfYZV59PfLirlTmw6XBMEnz5Jtyk=";
+  };
+
+  outputs = [ "out" "man" "doc" ];
+
+  configureFlags = [
+    ("--enable-docs=txt info lyx html rtf"
+      + lib.optionalString withLatex " pdf")
+  ];
+
+  LEX = "flex";
+
+  postInstall = ''
+    wrapProgram $out/bin/linuxdoc \
+      --prefix PATH : "${lib.makeBinPath [ groff opensp ]}:$out/bin" \
+      --prefix PERL5LIB : "$out/share/linuxdoc-tools/"
+  '';
+
+  doInstallCheck = true;
+
+  installCheckPhase = ''
+    pushd doc/example
+    substituteInPlace Makefile \
+      --replace "COMMAND=linuxdoc" "COMMAND=$out/bin/linuxdoc" \
+      ${lib.optionalString (!withLatex) "--replace '.tex .dvi .ps .pdf' ''"}
+    make
+    popd
+  '';
+
+  nativeBuildInputs = [ flex which makeWrapper ];
+
+  buildInputs = [ opensp groff texinfo perl gnused coreutils ]
+    ++ lib.optionals withLatex [ texlive.combined.scheme-medium ];
+
+  meta = with lib; {
+    description = "Toolset for processing LinuxDoc DTD SGML files";
+    longDescription = ''
+      A collection of text formatters which understands a LinuxDoc DTD SGML
+      source file. Each formatter (or "back-end") renders the source file into
+      a variety of output formats, including HTML, TeX, DVI, PostScript, plain
+      text, and groff source in manual-page format. The linuxdoc suite is
+      provided for backward compatibility, because there are still many useful
+      documents written in LinuxDoc DTD sgml source.
+    '';
+    homepage = "https://gitlab.com/agmartin/linuxdoc-tools";
+    license = with licenses; [ gpl3Plus mit sgmlug ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ p-h ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sgml/openjade/default.nix b/nixpkgs/pkgs/tools/text/sgml/openjade/default.nix
new file mode 100644
index 000000000000..5e175518b692
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/openjade/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl, opensp, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "openjade";
+  version = "1.3.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/openjade/openjade-${version}.tar.gz";
+    sha256 = "1l92sfvx1f0wmkbvzv1385y1gb3hh010xksi1iyviyclrjb7jb8x";
+  };
+
+  patches = [ ./msggen.patch ];
+
+  buildInputs = [ opensp perl ];
+
+  configureFlags = [
+    "--enable-spincludedir=${opensp}/include/OpenSP"
+    "--enable-splibdir=${opensp}/lib"
+  ];
+
+  meta = {
+    description = "An implementation of DSSSL, an ISO standard for formatting SGML (and XML) documents";
+    license = lib.licenses.mit;
+    homepage = "https://openjade.sourceforge.net/";
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sgml/openjade/msggen.patch b/nixpkgs/pkgs/tools/text/sgml/openjade/msggen.patch
new file mode 100644
index 000000000000..d59573fa49cf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/openjade/msggen.patch
@@ -0,0 +1,34 @@
+http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/app-text/openjade/files/openjade-1.3.2-msggen.pl.patch?revision=1.2
+
+Use Getopt::Std in place of getopts.pl.
+https://bugs.gentoo.org/show_bug.cgi?id=420083
+
+--- a/msggen.pl
++++ b/msggen.pl
+@@ -4,6 +4,7 @@
+ # See the file COPYING for copying permission.
+ 
+ use POSIX;
++use Getopt::Std;
+ 
+ # Package and version.
+ $package = 'openjade';
+@@ -18,8 +19,7 @@
+ undef $opt_l;
+ undef $opt_p;
+ undef $opt_t;
+-do 'getopts.pl';
+-&Getopts('l:p:t:');
++getopts('l:p:t:');
+ $module = $opt_l;
+ $pot_file = $opt_p;
+ 
+@@ -72,7 +72,7 @@
+     else {
+ 	$field[0] =~ /^[IWQXE][0-9]$/ || &error("invalid first field");;
+ 	$type[$num] = substr($field[0], 0, 1);
+-	$argc = int(substr($field[0], 1, 1));
++	$argc = substr($field[0], 1, 1);
+     }
+     $nargs[$num] = $argc;
+     $field[1] =~ /^[a-zA-Z_][a-zA-Z0-9_]+$/ || &error("invalid tag");
diff --git a/nixpkgs/pkgs/tools/text/sgml/opensp/default.nix b/nixpkgs/pkgs/tools/text/sgml/opensp/default.nix
new file mode 100644
index 000000000000..27f5dc4e9d9b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/opensp/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, fetchurl, fetchpatch, xmlto, docbook_xml_dtd_412
+, docbook_xsl, autoconf, automake, libtool
+, autoreconfHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "opensp";
+  version = "1.5.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/openjade/OpenSP-${version}.tar.gz";
+    sha256 = "1khpasr6l0a8nfz6kcf3s81vgdab8fm2dj291n5r2s53k228kx2p";
+  };
+
+  postPatch = ''
+    sed -i s,/usr/share/sgml/docbook/xml-dtd-4.1.2/,${docbook_xml_dtd_412}/xml/dtd/docbook/, \
+      docsrc/*.xml
+  '';
+
+  patches = [
+    (fetchpatch {
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/app-text/opensp/files/opensp-1.5.2-c11-using.patch?id=688d9675782dfc162d4e6cff04c668f7516118d0";
+      sha256 = "04q14s8qsad0bkjmj067dn831i0r6v7742rafdlnbfm5y249m2q6";
+    })
+    # Clang 16 defaults to C++17, which does not allow `register` as a storage class specifier.
+    ./fix-register-storage-class.patch
+  ];
+
+  setupHook = ./setup-hook.sh;
+
+  postFixup = ''
+    # Remove random ids in the release notes
+    sed -i -e 's/href="#idm.*"//g' $out/share/doc/OpenSP/releasenotes.html
+    sed -i -e 's/name="idm.*"//g' $out/share/doc/OpenSP/releasenotes.html
+    '';
+
+  preConfigure = lib.optionalString stdenv.isCygwin ''
+    autoreconf -fi
+  '';
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    xmlto
+    docbook_xml_dtd_412
+    docbook_xsl
+  ]
+  # Clang 16 fails to build due to inappropriate definitions in the `config.h` generated by the
+  # existing configure scripts. Regenerate them to make sure they detect its features correctly.
+  ++ lib.optional stdenv.cc.isClang autoreconfHook
+  ++ lib.optionals stdenv.isCygwin [ autoconf automake libtool ];
+
+  doCheck = false; # fails
+
+  meta = with lib; {
+    description = "A suite of SGML/XML processing tools";
+    license = licenses.mit;
+    homepage = "https://openjade.sourceforge.net/";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sgml/opensp/fix-register-storage-class.patch b/nixpkgs/pkgs/tools/text/sgml/opensp/fix-register-storage-class.patch
new file mode 100644
index 000000000000..ce1aba32437b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/opensp/fix-register-storage-class.patch
@@ -0,0 +1,11 @@
+--- a/lib/Recognizer.cxx	2005-11-05 04:05:20.000000000 -0500
++++ b/lib/Recognizer.cxx	2023-06-03 11:45:04.497116217 -0400
+@@ -39,7 +39,7 @@
+   }
+   else
+     in->startTokenNoMulticode();
+-  register const Trie *pos = trie_.pointer();
++  const Trie *pos = trie_.pointer();
+   do {
+     pos = pos->next(map_[in->tokenChar(mgr)]);
+   } while (pos->hasNext());
diff --git a/nixpkgs/pkgs/tools/text/sgml/opensp/setup-hook.sh b/nixpkgs/pkgs/tools/text/sgml/opensp/setup-hook.sh
new file mode 100644
index 000000000000..5bace3c66889
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgml/opensp/setup-hook.sh
@@ -0,0 +1,22 @@
+addSGMLCatalogs () {
+      if test -d $1/sgml/dtd; then
+          for i in $(find $1/sgml/dtd -name docbook.cat); do
+              export SGML_CATALOG_FILES="${SGML_CATALOG_FILES:+:}$i"
+          done
+      fi
+}
+
+if test -z "${sgmlHookDone-}"; then
+    sgmlHookDone=1
+
+    # Set http_proxy and ftp_proxy to a invalid host to prevent
+    # xmllint and xsltproc from trying to download DTDs from the
+    # network even when --nonet is not given.  That would be impure.
+    # (Note that .invalid is a reserved domain guaranteed not to
+    # work.)
+    export http_proxy=http://nodtd.invalid/
+    export ftp_proxy=http://nodtd.invalid/
+
+    export SGML_CATALOG_FILES
+    addEnvHooks "$targetOffset" addSGMLCatalogs
+fi
diff --git a/nixpkgs/pkgs/tools/text/sgrep/default.nix b/nixpkgs/pkgs/tools/text/sgrep/default.nix
new file mode 100644
index 000000000000..f3d23d166696
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sgrep/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, sgrep, fetchurl, runCommand, lib, m4, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "sgrep";
+  version = "1.94a";
+
+  src = fetchurl {
+    url = "https://www.cs.helsinki.fi/pub/Software/Local/Sgrep/sgrep-${version}.tar.gz";
+    sha256 = "sha256-1bFkeOOrRHNeJCg9LYldLJyAE5yVIo3zvbKsRGOV+vk=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/sgrep \
+      --prefix PATH : ${lib.makeBinPath [ m4 ]}
+  '';
+
+  passthru.tests.smokeTest = runCommand "test-sgrep" { } ''
+    expr='"<foo>" __ "</foo>"'
+    data="<foo>1</foo><bar>2</bar>"
+    ${sgrep}/bin/sgrep "$expr" <<<$data >$out
+    read result <$out
+    [[ $result = 1 ]]
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html";
+    description = "A grep for structured text formats such as XML";
+    longDescription = ''
+      sgrep (structured grep) is a tool for searching and indexing text,
+      SGML, XML and HTML files and filtering text streams using
+      structural criteria.
+    '';
+    platforms = platforms.unix;
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ eigengrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/shab/default.nix b/nixpkgs/pkgs/tools/text/shab/default.nix
new file mode 100644
index 000000000000..b5bb98e5f4d2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/shab/default.nix
@@ -0,0 +1,73 @@
+{ bash, stdenv, lib, runCommand, writeText, fetchFromGitHub }:
+let
+  version = "1.0.0";
+
+  shab = stdenv.mkDerivation {
+    pname = "shab";
+    inherit version;
+
+    src = fetchFromGitHub {
+      owner = "zimbatm";
+      repo = "shab";
+      rev = "v${version}";
+      sha256 = "02lf1s6plhhcfyj9xha44wij9jbphb1x5q55xj3b5bx2ji2jsvji";
+    };
+
+    postPatch = ''
+      for f in test.sh test/*.sh; do
+        patchShebangs "$f"
+      done
+    '';
+
+    doCheck = true;
+    doInstallCheck = true;
+
+    checkPhase = ''
+      ./test.sh
+    '';
+
+    installPhase = ''
+      mkdir -p $out/bin
+      cp ./shab $out/bin/shab
+    '';
+
+    installCheckPhase = ''
+      [[ "$(echo 'Hello $entity' | entity=world $out/bin/shab)" == 'Hello world' ]]
+    '';
+
+    passthru = {
+      inherit render renderText;
+    };
+
+    meta = with lib; {
+      description = "The bash templating language";
+      homepage = "https://github.com/zimbatm/shab";
+      license = licenses.unlicense;
+      maintainers = with maintainers; [ zimbatm ];
+      platforms = bash.meta.platforms;
+    };
+  };
+
+  /*
+     shabScript:       a path or filename to use as a template
+     parameters.name:  the name to use as part of the store path
+     parameters:       variables to expose to the template
+   */
+  render = shabScript: parameters:
+    let extraParams = {
+          inherit shabScript;
+        };
+    in runCommand "out" (parameters // extraParams) ''
+      ${shab}/bin/shab "$shabScript" >$out
+    '';
+
+  /*
+     shabScriptText:   a string to use as a template
+     parameters.name:  the name to use as part of the store path
+     parameters:       variables to expose to the template
+   */
+  renderText = shabScriptText: parameters:
+    render (writeText "template" shabScriptText) parameters;
+
+in
+  shab
diff --git a/nixpkgs/pkgs/tools/text/shfmt/default.nix b/nixpkgs/pkgs/tools/text/shfmt/default.nix
new file mode 100644
index 000000000000..0b1457f43b27
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/shfmt/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles, scdoc }:
+
+buildGoModule rec {
+  pname = "shfmt";
+  version = "3.7.0";
+
+  src = fetchFromGitHub {
+    owner = "mvdan";
+    repo = "sh";
+    rev = "v${version}";
+    sha256 = "sha256-5/WGYsmZAFFdONpViRaqjL/KXyOu618A8S/SqcgZoEU=";
+  };
+
+  vendorHash = "sha256-V/6wiC0oanytzMGW/lP+t+uz6cMgXRuviDEj7ErQh5k=";
+
+  subPackages = [ "cmd/shfmt" ];
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  nativeBuildInputs = [ installShellFiles scdoc ];
+
+  postBuild = ''
+    scdoc < cmd/shfmt/shfmt.1.scd > shfmt.1
+    installManPage shfmt.1
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/mvdan/sh";
+    description = "A shell parser and formatter";
+    longDescription = ''
+      shfmt formats shell programs. It can use tabs or any number of spaces to indent.
+      You can feed it standard input, any number of files or any number of directories to recurse into.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zowoq SuperSandro2000 ];
+    mainProgram = "shfmt";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/shocco/default.nix b/nixpkgs/pkgs/tools/text/shocco/default.nix
new file mode 100644
index 000000000000..1359db98978c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/shocco/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, perlPackages, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "shocco";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "rtomayko";
+    repo = "shocco";
+    rev = version;
+    sha256 = "1nkwcw9fqf4vyrwidqi6by7nrmainkjqkirkz3yxmzk6kzwr38mi";
+  };
+
+  prePatch = ''
+    # Don't change $PATH
+    substituteInPlace configure --replace PATH= NIRVANA=
+  '';
+
+  buildInputs = [ perlPackages.TextMarkdown python3.pkgs.pygments ];
+
+  meta = with lib; {
+    description = "A quick-and-dirty, literate-programming-style documentation generator for / in POSIX shell";
+    homepage = "https://rtomayko.github.io/shocco/";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sift/default.nix b/nixpkgs/pkgs/tools/text/sift/default.nix
new file mode 100644
index 000000000000..1e79570622c0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sift/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildGoModule, fetchFromGitHub, fetchpatch, installShellFiles }:
+
+buildGoModule rec {
+  pname = "sift";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "svent";
+    repo = "sift";
+    rev = "v${version}";
+    hash = "sha256-IZ4Hwg5NzdSXtrIDNxtkzquuiHQOmLV1HSx8gpwE/i0=";
+  };
+
+  vendorHash = "sha256-y883la4R4jhsS99/ohgBC9SHggybAq9hreda6quG3IY=";
+
+  patches = [
+    # Add Go Modules support
+    (fetchpatch {
+      url = "https://github.com/svent/sift/commit/b56fb3d0fd914c8a6c08b148e15dd8a07c7d8a5a.patch";
+      hash = "sha256-mFCEpkgQ8XDPRQ3yKDZ5qY9tKGSuHs+RnhMeAlx33Ng=";
+    })
+  ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  ldflags = [ "-s" "-w" ];
+
+  postInstall = ''
+    installShellCompletion --cmd sift --bash sift-completion.bash
+  '';
+
+  meta = with lib; {
+    description = "A fast and powerful alternative to grep";
+    homepage = "https://sift-tool.org";
+    maintainers = with maintainers; [ carlsverre viraptor ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/silver-searcher/bash-completion.patch b/nixpkgs/pkgs/tools/text/silver-searcher/bash-completion.patch
new file mode 100644
index 000000000000..30e8c72389b7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/silver-searcher/bash-completion.patch
@@ -0,0 +1,5 @@
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -9 +9 @@
+-bashcompdir = $(pkgdatadir)/completions
++bashcompdir = $(datadir)/bash-completion/completions
diff --git a/nixpkgs/pkgs/tools/text/silver-searcher/default.nix b/nixpkgs/pkgs/tools/text/silver-searcher/default.nix
new file mode 100644
index 000000000000..94c5c8cf02fc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/silver-searcher/default.nix
@@ -0,0 +1,35 @@
+{lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, pcre, zlib, xz}:
+
+stdenv.mkDerivation rec {
+  pname = "silver-searcher";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "ggreer";
+    repo = "the_silver_searcher";
+    rev = version;
+    sha256 = "0cyazh7a66pgcabijd27xnk1alhsccywivv6yihw378dqxb22i1p";
+  };
+
+  patches = [ ./bash-completion.patch ];
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: src/zfile.o:/build/source/src/log.h:12: multiple definition of
+  #     `print_mtx'; src/ignore.o:/build/source/src/log.h:12: first defined here
+  # TODO: remove once next release has https://github.com/ggreer/the_silver_searcher/pull/1377
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+  NIX_LDFLAGS = lib.optionalString stdenv.isLinux "-lgcc_s";
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ pcre zlib xz ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ggreer/the_silver_searcher/";
+    description = "A code-searching tool similar to ack, but faster";
+    maintainers = with maintainers; [ madjar ];
+    mainProgram = "ag";
+    platforms = platforms.all;
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/smu/default.nix b/nixpkgs/pkgs/tools/text/smu/default.nix
new file mode 100644
index 000000000000..85e593982e85
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/smu/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "smu";
+  version = "1.5";
+
+  src = fetchFromGitHub {
+    owner = "Gottox";
+    repo = "smu";
+    rev = "v${version}";
+    sha256 = "1jm7lhnzjx4q7gcwlkvsbffcy0zppywyh50d71ami6dnq182vvcc";
+  };
+
+  # _FORTIFY_SOURCE requires compiling with optimization (-O)
+  env.NIX_CFLAGS_COMPILE = "-O";
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+  ];
+
+  meta = with lib; {
+    description = "simple markup - markdown like syntax";
+    homepage = "https://github.com/Gottox/smu";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/tools/text/snippetpixie/default.nix b/nixpkgs/pkgs/tools/text/snippetpixie/default.nix
new file mode 100644
index 000000000000..0483d8c2c0cb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/snippetpixie/default.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, meson
+, ninja
+, vala
+, pkg-config
+, wrapGAppsHook
+, appstream
+, desktop-file-utils
+, python3
+, libgee
+, glib
+, gtk3
+, sqlite
+, at-spi2-atk
+, at-spi2-core
+, dbus
+, ibus
+, json-glib
+, pantheon
+, xorg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "snippetpixie";
+  version = "1.5.3";
+
+  src = fetchFromGitHub {
+    owner = "bytepixie";
+    repo = pname;
+    rev = version;
+    sha256 = "0gs3d9hdywg4vcfbp4qfcagfjqalfgw9xpvywg4pw1cm3rzbdqmz";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    vala
+    pkg-config
+    wrapGAppsHook
+    appstream
+    desktop-file-utils
+    python3
+  ];
+
+  buildInputs = [
+    libgee
+    glib
+    gtk3
+    sqlite
+    at-spi2-atk
+    at-spi2-core
+    dbus
+    ibus
+    json-glib
+    xorg.libXtst
+    pantheon.granite
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "Your little expandable text snippet helper";
+    longDescription = ''
+      Your little expandable text snippet helper.
+
+      Save your often used text snippets and then expand them whenever you type their abbreviation.
+
+      For example:- "spr`" expands to "Snippet Pixie rules!"
+
+      For non-accessible applications such as browsers and Electron apps, there's a shortcut (default is Ctrl+`) for opening a search window that pastes the selected snippet.
+    '';
+    homepage = "https://www.snippetpixie.com";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ianmjones ] ++ teams.pantheon.members;
+    platforms = platforms.linux;
+    mainProgram = "com.github.bytepixie.snippetpixie";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/sorted-grep/default.nix b/nixpkgs/pkgs/tools/text/sorted-grep/default.nix
new file mode 100644
index 000000000000..60bc0bee676f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/sorted-grep/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchurl, lib }:
+
+stdenv.mkDerivation rec {
+  pname = "sorted-grep";
+  version = "1.0";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/sgrep/sgrep-${version}.tgz";
+    hash = "sha256-3F7cXrZnB38YwE1sHYm/CIGKmG+1c0QU+Pk3Y53a0T4=";
+  };
+
+  postPatch = ''
+    # Its Makefile is missing compiler flags and an install step
+    rm -f Makefile
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    ${stdenv.cc.targetPrefix}cc -Wall -O2 -o sgrep sgrep.c
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D sgrep "$out/bin/sgrep"
+
+    runHook postInstall
+  '';
+
+  installCheckPhase = ''
+    runHook preInstallCheck
+
+    set +o pipefail
+    $out/bin/sgrep 2>&1 | grep ^Usage:
+
+    runHook postInstallCheck
+  '';
+
+  doInstallCheck = true;
+
+  meta = with lib; {
+    homepage = "https://sgrep.sourceforge.net/";
+    description = "Sgrep (sorted grep) searches sorted input files for lines that match a search key";
+    longDescription = ''
+      Sgrep (sorted grep) searches sorted input files for lines that match a search
+      key and outputs the matching lines. When searching large files sgrep is much
+      faster than traditional Unix grep, but with significant restrictions.
+    '';
+    platforms = platforms.unix;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/source-highlight/default.nix b/nixpkgs/pkgs/tools/text/source-highlight/default.nix
new file mode 100644
index 000000000000..c8a775e64459
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/source-highlight/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv, fetchpatch, fetchurl, boost }:
+
+stdenv.mkDerivation rec {
+  pname = "source-highlight";
+  version = "3.1.9";
+
+  outputs = [ "out" "doc" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnu/src-highlite/${pname}-${version}.tar.gz";
+    sha256 = "148w47k3zswbxvhg83z38ifi85f9dqcpg7icvvw1cm6bg21x4zrs";
+  };
+
+  patches = [
+    # gcc-11 compat upstream patch
+    (fetchpatch {
+      url = "http://git.savannah.gnu.org/cgit/src-highlite.git/patch/?id=904949c9026cb772dc93fbe0947a252ef47127f4";
+      sha256 = "1wnj0jmkmrwjww7qk9dvfxh8h06jdn7mi8v2fvwh95b6x87z5l47";
+      excludes = [ "ChangeLog" ];
+    })
+
+    # Upstream fix for clang-13 and gcc-12 test support
+    (fetchpatch {
+      name = "gcc-12.patch";
+      url = "http://git.savannah.gnu.org/cgit/src-highlite.git/patch/?id=ab9fe5cb9b85c5afab94f2a7f4b6d7d473c14ee9";
+      sha256 = "1v33zd2766k7cdgmajw2lffw9wd7v4f8z01f40z53f6bp608nr62";
+    })
+  ];
+
+  # source-highlight uses it's own binary to generate documentation.
+  # During cross-compilation, that binary was built for the target
+  # platform architecture, so it can't run on the build host.
+  postPatch = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+    substituteInPlace Makefile.in --replace "src doc tests" "src tests"
+  '';
+
+  strictDeps = true;
+  buildInputs = [ boost ];
+
+  configureFlags = [
+    "--with-boost=${boost.out}"
+    "--with-bash-completion=${placeholder "out"}/share/bash-completion/completions"
+  ];
+
+  doCheck = true;
+
+  enableParallelBuilding = true;
+  # Upstream uses the same intermediate files in multiple tests, running
+  # them in parallel by make will eventually break one or more tests.
+  enableParallelChecking = false;
+
+  meta = with lib; {
+    description = "Source code renderer with syntax highlighting";
+    longDescription = ''
+      GNU Source-highlight, given a source file, produces a document
+      with syntax highlighting.
+    '';
+    homepage = "https://www.gnu.org/software/src-highlite/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/subedit/default.nix b/nixpkgs/pkgs/tools/text/subedit/default.nix
new file mode 100644
index 000000000000..0ae48901cd96
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/subedit/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, libuchardet, dos2unix, file }:
+
+stdenv.mkDerivation {
+  pname = "subedit";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "helixarch";
+    repo = "subedit";
+    rev = "74e11816d7b4813064a2434a5abc0f78f66c0e53";
+    sha256 = "sha256-3ywBBCWbwDqNNkxRupNJX6mYKxVFnoCFKav3Hc4E+8A=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  buildInputs = [ libuchardet dos2unix file ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -m555 subedit $out/bin/
+  '';
+
+  postFixup = ''
+    wrapProgram $out/bin/subedit --prefix PATH : "${lib.makeBinPath [ libuchardet dos2unix file ]}"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/helixarch/subedit";
+    description = "Command-line subtitle editor written in BASH";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ppom ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/tab/default.nix b/nixpkgs/pkgs/tools/text/tab/default.nix
new file mode 100644
index 000000000000..89c31d0440aa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tab/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, python3 }:
+
+stdenv.mkDerivation rec {
+  version = "9.1";
+  pname = "tab";
+
+  src = fetchFromGitHub {
+    owner = "ivan-tkatchev";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-AhgWeV/ojB8jM16A5ggrOD1YjWfRVcoQbkd3S2bgdyE=";
+  };
+
+  # gcc12; see https://github.com/ivan-tkatchev/tab/commit/673bdac998
+  postPatch = ''
+    sed '1i#include <cstring>' -i deps.h
+  '';
+
+  nativeCheckInputs = [ python3 ];
+
+  doCheck = !stdenv.isDarwin;
+
+  checkTarget = "test";
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm555 -t $out/bin tab
+    install -Dm444 -t $out/share/doc/tab docs/*.html
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Programming language/shell calculator";
+    homepage    = "https://tab-lang.xyz";
+    license     = licenses.boost;
+    maintainers = with maintainers; [ mstarzyk ];
+    platforms   = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/teip/default.nix b/nixpkgs/pkgs/tools/text/teip/default.nix
new file mode 100644
index 000000000000..c0ac20a28149
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/teip/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, installShellFiles
+, perl
+, stdenv
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "teip";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "greymd";
+    repo = "teip";
+    rev = "v${version}";
+    hash = "sha256-09IKAM1ha40CvF5hdQIlUab7EBBFourC70LAagrs5+4=";
+  };
+
+  cargoHash = "sha256-cBFczgvLja6upuPnXphG2d9Rf1ZpNAVh16NHAHfXxHg=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  nativeCheckInputs = [ perl ];
+
+  # Cargo.lock is outdated
+  preConfigure = ''
+    cargo update --offline
+  '';
+
+  # tests are locale sensitive
+  preCheck = ''
+    export LANG=${if stdenv.isDarwin then "en_US.UTF-8" else "C.UTF-8"}
+  '';
+
+  postInstall = ''
+    installManPage man/teip.1
+    installShellCompletion \
+      --bash completion/bash/teip \
+      --fish completion/fish/teip.fish \
+      --zsh completion/zsh/_teip
+  '';
+
+  meta = with lib; {
+    description = "A tool to bypass a partial range of standard input to any command";
+    homepage = "https://github.com/greymd/teip";
+    changelog = "https://github.com/greymd/teip/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/termbook/Cargo.lock b/nixpkgs/pkgs/tools/text/termbook/Cargo.lock
new file mode 100644
index 000000000000..1e786d565107
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/termbook/Cargo.lock
@@ -0,0 +1,2900 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ammonia"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e6d1c7838db705c9b756557ee27c384ce695a1c51a6fe528784cb1c6840170"
+dependencies = [
+ "html5ever",
+ "maplit",
+ "once_cell",
+ "tendril",
+ "url 2.3.1",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "autocfg"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide 0.6.2",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
+dependencies = [
+ "byteorder",
+ "safemem",
+]
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "base64"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+dependencies = [
+ "block-padding",
+ "byte-tools",
+ "byteorder",
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array 0.14.7",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+dependencies = [
+ "byte-tools",
+]
+
+[[package]]
+name = "bstr"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b"
+
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
+dependencies = [
+ "byteorder",
+ "iovec",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "time",
+ "wasm-bindgen",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "term_size",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
+dependencies = [
+ "autocfg 1.1.0",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array 0.14.7",
+ "typenum",
+]
+
+[[package]]
+name = "darling"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9158d690bc62a3a57c3e45b85e4d50de2008b39345592c64efd79345c7e24be0"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2a368589465391e127e10c9e3a08efc8df66fd49b87dc8524c764bbe7f2ef82"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "244e8987bd4e174385240cde20a3657f607fb0797563c28255c353b5819a07b1"
+dependencies = [
+ "darling_core",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "deflate"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+dependencies = [
+ "block-buffer 0.10.4",
+ "crypto-common",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "elasticlunr-rs"
+version = "2.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60eee99ae400fb1c4521ea3bd678994cb66572754d240449368e8ecd40281569"
+dependencies = [
+ "lazy_static",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "strum",
+ "strum_macros",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
+dependencies = [
+ "atty",
+ "humantime",
+ "log 0.4.17",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+dependencies = [
+ "atty",
+ "humantime",
+ "log 0.4.17",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
+dependencies = [
+ "backtrace",
+ "version_check 0.9.4",
+]
+
+[[package]]
+name = "failure"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+dependencies = [
+ "backtrace",
+ "failure_derive",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 1.0.109",
+ "synstructure",
+]
+
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall 0.2.16",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide 0.7.1",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding 2.2.0",
+]
+
+[[package]]
+name = "fsevent"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6"
+dependencies = [
+ "bitflags",
+ "fsevent-sys",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check 0.9.4",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e"
+dependencies = [
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gif"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af"
+dependencies = [
+ "color_quant",
+ "lzw",
+]
+
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
+[[package]]
+name = "gitignore"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d051488d9a601181a9b90c9ad8ae7e8251d642ddd2463008f2f5019d255bd89"
+dependencies = [
+ "glob",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "globset"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
+dependencies = [
+ "aho-corasick 0.7.20",
+ "bstr",
+ "fnv",
+ "log 0.4.17",
+ "regex",
+]
+
+[[package]]
+name = "handlebars"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba758d094d31274eb49d15da6f326b96bf3185239a6359bf684f3d5321148900"
+dependencies = [
+ "log 0.4.17",
+ "pest",
+ "pest_derive",
+ "quick-error",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "html5ever"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+dependencies = [
+ "log 0.4.17",
+ "mac",
+ "markup5ever",
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "humantime"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
+dependencies = [
+ "quick-error",
+]
+
+[[package]]
+name = "hyper"
+version = "0.10.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273"
+dependencies = [
+ "base64 0.9.3",
+ "httparse",
+ "language-tags",
+ "log 0.3.9",
+ "mime 0.2.6",
+ "num_cpus",
+ "time",
+ "traitobject",
+ "typeable",
+ "unicase 1.4.2",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.22.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08ed2ada878397b045454ac7cfb011d73132c59f31a955d230bd1f1c2e68eb4a"
+dependencies = [
+ "byteorder",
+ "gif",
+ "jpeg-decoder",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+ "png",
+ "scoped_threadpool",
+ "tiff",
+]
+
+[[package]]
+name = "inflate"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "inotify"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f"
+dependencies = [
+ "bitflags",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "iron"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6d308ca2d884650a8bf9ed2ff4cb13fbb2207b71f64cda11dc9b892067295e8"
+dependencies = [
+ "hyper",
+ "log 0.3.9",
+ "mime_guess",
+ "modifier",
+ "num_cpus",
+ "plugin",
+ "typemap",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "is-match"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e5b386aef33a1c677be65237cb9d32c3f3ef56bd035949710c4bb13083eb053"
+
+[[package]]
+name = "itertools"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "language-tags"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+
+[[package]]
+name = "line-wrap"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+dependencies = [
+ "safemem",
+]
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg 1.1.0",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
+dependencies = [
+ "log 0.4.17",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "lzw"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "markup5ever"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+dependencies = [
+ "log 0.4.17",
+ "phf 0.10.1",
+ "phf_codegen 0.10.0",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "mdbook"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ec525f7ebccc2dd935c263717250cd37f9a4b264a77c5dbc950ea2734d8159"
+dependencies = [
+ "ammonia",
+ "chrono",
+ "clap",
+ "elasticlunr-rs",
+ "env_logger 0.6.2",
+ "error-chain",
+ "gitignore",
+ "handlebars",
+ "iron",
+ "itertools",
+ "lazy_static",
+ "log 0.4.17",
+ "memchr",
+ "notify",
+ "open",
+ "pulldown-cmark 0.6.1",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "shlex",
+ "staticfile",
+ "tempfile",
+ "toml",
+ "toml-query",
+ "ws",
+]
+
+[[package]]
+name = "mdcat"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a95a756c025b1c1a2e84a869fd690ee239ca4af65a8209191d04736e19ba9f08"
+dependencies = [
+ "ansi_term",
+ "base64 0.11.0",
+ "clap",
+ "failure",
+ "gethostname",
+ "image",
+ "mime 0.3.17",
+ "pulldown-cmark 0.6.1",
+ "syntect",
+ "term_size",
+ "url 2.3.1",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "mime"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
+dependencies = [
+ "log 0.3.9",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "1.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3"
+dependencies = [
+ "mime 0.2.6",
+ "phf 0.7.24",
+ "phf_codegen 0.7.24",
+ "unicase 1.4.2",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log 0.4.17",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-extras"
+version = "2.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
+dependencies = [
+ "lazycell",
+ "log 0.4.17",
+ "mio",
+ "slab",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "modifier"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58"
+
+[[package]]
+name = "mount"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e25c06012941aaf8c75f2eaf7ec5c48cf69f9fc489ab3eb3589edc107e386f0b"
+dependencies = [
+ "iron",
+ "sequence_trie",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "notify"
+version = "4.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257"
+dependencies = [
+ "bitflags",
+ "filetime",
+ "fsevent",
+ "fsevent-sys",
+ "inotify",
+ "libc",
+ "mio",
+ "mio-extras",
+ "walkdir",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2"
+dependencies = [
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "onig"
+version = "4.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8518fcb2b1b8c2f45f0ad499df4fda6087fc3475ca69a185c173b8315d2fb383"
+dependencies = [
+ "bitflags",
+ "lazy_static",
+ "libc",
+ "onig_sys",
+]
+
+[[package]]
+name = "onig_sys"
+version = "69.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388410bf5fa341f10e58e6db3975f4bea1ac30247dd79d37a9e5ced3cb4cc3b0"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
+
+[[package]]
+name = "opaque-debug"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+
+[[package]]
+name = "open"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcea7a30d6b81a2423cc59c43554880feff7b57d12916f231a79f8d6d9470201"
+dependencies = [
+ "pathdiff",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "pathdiff"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "pest"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70"
+dependencies = [
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "phf"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18"
+dependencies = [
+ "phf_shared 0.7.24",
+]
+
+[[package]]
+name = "phf"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+dependencies = [
+ "phf_shared 0.10.0",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e"
+dependencies = [
+ "phf_generator 0.7.24",
+ "phf_shared 0.7.24",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662"
+dependencies = [
+ "phf_shared 0.7.24",
+ "rand 0.6.5",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0"
+dependencies = [
+ "siphasher 0.2.3",
+ "unicase 1.4.2",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher 0.3.10",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "plist"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f2a9f075f6394100e7c105ed1af73fb1859d6fd14e49d4290d578120beb167f"
+dependencies = [
+ "base64 0.10.1",
+ "byteorder",
+ "humantime",
+ "line-wrap",
+ "serde",
+ "xml-rs",
+]
+
+[[package]]
+name = "plugin"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0"
+dependencies = [
+ "typemap",
+]
+
+[[package]]
+name = "png"
+version = "0.15.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef859a23054bbfee7811284275ae522f0434a3c8e7f4b74bd4a35ae7e1c4a283"
+dependencies = [
+ "bitflags",
+ "crc32fast",
+ "deflate",
+ "inflate",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c205cc82214f3594e2d50686730314f817c67ffa80fe800cf0db78c3c2b9d9e"
+dependencies = [
+ "bitflags",
+ "getopts",
+ "memchr",
+ "unicase 2.6.0",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca36dea94d187597e104a5c8e4b07576a8a45aa5db48a65e12940d3eb7461f55"
+dependencies = [
+ "bitflags",
+ "memchr",
+ "unicase 2.6.0",
+]
+
+[[package]]
+name = "pulldown-cmark-to-cmark"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf89659b1da0800e093162bc6f9305d896393af721cc88ffdb86a4b20760fe89"
+dependencies = [
+ "pulldown-cmark 0.6.1",
+]
+
+[[package]]
+name = "pulldown-cmark-to-cmark"
+version = "4.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cffb594e453d29e238ac190362a4a291daec00396717a8d1670863121ac56958"
+dependencies = [
+ "pulldown-cmark 0.7.2",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+dependencies = [
+ "proc-macro2 0.4.30",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+dependencies = [
+ "proc-macro2 1.0.56",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+dependencies = [
+ "autocfg 0.1.8",
+ "libc",
+ "rand_chacha 0.1.1",
+ "rand_core 0.4.2",
+ "rand_hc 0.1.0",
+ "rand_isaac",
+ "rand_jitter",
+ "rand_os",
+ "rand_pcg",
+ "rand_xorshift",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc 0.2.0",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.9",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+dependencies = [
+ "libc",
+ "rand_core 0.4.2",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_os"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.4.2",
+ "rdrand",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
+dependencies = [
+ "aho-corasick 1.0.1",
+ "memchr",
+ "regex-syntax 0.7.1",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustix"
+version = "0.37.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "safemem"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped_threadpool"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sequence_trie"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ee22067b7ccd072eeb64454b9c6e1b33b61cd0d49e895fd48676a184580e0c3"
+
+[[package]]
+name = "serde"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
+
+[[package]]
+name = "serde_derive"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
+dependencies = [
+ "block-buffer 0.7.3",
+ "digest 0.8.1",
+ "fake-simd",
+ "opaque-debug",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest 0.10.6",
+]
+
+[[package]]
+name = "shlex"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
+
+[[package]]
+name = "siphasher"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
+
+[[package]]
+name = "siphasher"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "staticfile"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "babd3fa68bb7e3994ce181c5f21ff3ff5fffef7b18b8a10163b45e4dafc6fb86"
+dependencies = [
+ "iron",
+ "mount",
+ "time",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "string_cache"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "strum"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
+
+[[package]]
+name = "strum_macros"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
+dependencies = [
+ "heck",
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+dependencies = [
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "unicode-ident",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 1.0.109",
+ "unicode-xid 0.2.4",
+]
+
+[[package]]
+name = "syntect"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72fed41b91655133c9819f68d0b9a194dcbf36aa46e80033b6e9ae169f58b211"
+dependencies = [
+ "bincode",
+ "bitflags",
+ "flate2",
+ "fnv",
+ "lazy_static",
+ "lazycell",
+ "onig",
+ "plist",
+ "regex-syntax 0.6.29",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "walkdir",
+ "yaml-rust",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fastrand",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "term_size"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
+dependencies = [
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "termbook"
+version = "1.4.2"
+dependencies = [
+ "atty",
+ "globset",
+ "mdbook",
+ "mdcat",
+ "pulldown-cmark 0.6.1",
+ "pulldown-cmark-to-cmark 2.0.1",
+ "syntect",
+]
+
+[[package]]
+name = "termbook-cli"
+version = "1.4.6"
+dependencies = [
+ "clap",
+ "env_logger 0.7.1",
+ "lazy_static",
+ "pulldown-cmark-to-cmark 4.0.2",
+ "termbook",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "term_size",
+ "unicode-width",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "tiff"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7b7c2cfc4742bd8a32f2e614339dd8ce30dbcf676bb262bd63a2327bc5df57d"
+dependencies = [
+ "byteorder",
+ "lzw",
+ "num-derive",
+ "num-traits",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml-query"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "654d5afba116c445bb5fb6812e7c3177d90d143427af73f12956f33e18a1cedb"
+dependencies = [
+ "failure",
+ "failure_derive",
+ "is-match",
+ "lazy_static",
+ "regex",
+ "toml",
+ "toml-query_derive",
+]
+
+[[package]]
+name = "toml-query_derive"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "528baacc7fbc5e12b3fc32f483bea1b1cf531afa71cfaae54838d7095a6add9b"
+dependencies = [
+ "darling",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "traitobject"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
+
+[[package]]
+name = "typeable"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887"
+
+[[package]]
+name = "typemap"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6"
+dependencies = [
+ "unsafe-any",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
+
+[[package]]
+name = "unicase"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
+dependencies = [
+ "version_check 0.1.5",
+]
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check 0.9.4",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unsafe-any"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f"
+dependencies = [
+ "traitobject",
+]
+
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+dependencies = [
+ "idna 0.1.5",
+ "matches",
+ "percent-encoding 1.0.1",
+]
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.3.0",
+ "percent-encoding 2.2.0",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822"
+dependencies = [
+ "bumpalo",
+ "log 0.4.17",
+ "once_cell",
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 2.0.16",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434"
+dependencies = [
+ "quote 1.0.27",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.27",
+ "syn 2.0.16",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "ws"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25fe90c75f236a0a00247d5900226aea4f2d7b05ccc34da9e7a8880ff59b5848"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "httparse",
+ "log 0.4.17",
+ "mio",
+ "mio-extras",
+ "rand 0.7.3",
+ "sha-1",
+ "slab",
+ "url 2.3.1",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc95a04ea24f543cd9be5aab44f963fa35589c99e18415c38fb2b17e133bf8d2"
+
+[[package]]
+name = "yaml-rust"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
diff --git a/nixpkgs/pkgs/tools/text/termbook/default.nix b/nixpkgs/pkgs/tools/text/termbook/default.nix
new file mode 100644
index 000000000000..ee9367038f63
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/termbook/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, installShellFiles
+, pkg-config
+, oniguruma
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "termbook-cli";
+  version = "1.4.6";
+
+  src = fetchFromGitHub {
+    owner = "Byron";
+    repo = "termbook";
+    rev = "v${version}";
+    sha256 = "Bo3DI0cMXIfP7ZVr8MAW/Tmv+4mEJBIQyLvRfVBDG8c=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    pkg-config
+  ];
+
+  buildInputs = [
+    oniguruma
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  env = {
+    RUSTONIG_SYSTEM_LIBONIG = true;
+  };
+
+  # update dependencies to fix build failure caused by unaligned packed structs
+  postPatch = ''
+    ln -sf ${./Cargo.lock} Cargo.lock
+  '';
+
+  postInstall = ''
+    installShellCompletion --cmd termbook \
+      --bash <($out/bin/termbook completions bash) \
+      --fish <($out/bin/termbook completions fish) \
+      --zsh <($out/bin/termbook completions zsh)
+  '';
+
+  meta = with lib; {
+    description = "A runner for `mdbooks` to keep your documentation tested";
+    homepage = "https://github.com/Byron/termbook/";
+    changelog = "https://github.com/Byron/termbook/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ phaer ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/tesh/default.nix b/nixpkgs/pkgs/tools/text/tesh/default.nix
new file mode 100644
index 000000000000..0b702ae0052a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tesh/default.nix
@@ -0,0 +1,36 @@
+{ python3Packages, fetchFromGitHub, fetchpatch }:
+
+let
+  version = "0.3.0";
+in python3Packages.buildPythonPackage rec {
+  pname = "tesh";
+  inherit version;
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "OceanSprint";
+    repo = "tesh";
+    rev = version;
+    hash = "sha256-/CSYz2YXbjKZszb1HMOCS+srVJ+TcFSeLeuz9VvtlI4=";
+  };
+
+  patches = [
+    # https://github.com/OceanSprint/tesh/pull/49
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core-1.patch";
+      url = "https://github.com/OceanSprint/tesh/commit/49b90f5a3c9cf111931393248943b1da966dc3ec.patch";
+      hash = "sha256-s+eGO4NXTGbyXcLP37kCg4GDrjAsYIlOwNDR1Q7+1Uc=";
+    })
+    # https://github.com/OceanSprint/tesh/pull/50
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core-2.patch";
+      url = "https://github.com/OceanSprint/tesh/commit/66798b54f28dc0b72159ee3a2144895cf945eaf0.patch";
+      hash = "sha256-f3uL7TZlkrTOWYihwWNfhrY5/xlBrclAMnbxRNXCGJw=";
+    })
+  ];
+
+  checkInputs = [ python3Packages.pytest ];
+  nativeBuildInputs = [ python3Packages.poetry-core ];
+  propagatedBuildInputs = with python3Packages; [ click pexpect ];
+}
diff --git a/nixpkgs/pkgs/tools/text/textpieces/default.nix b/nixpkgs/pkgs/tools/text/textpieces/default.nix
new file mode 100644
index 000000000000..9cea993710a8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/textpieces/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, python3
+, meson
+, ninja
+, pkg-config
+, vala
+, glib
+, gtk4
+, libgee
+, libadwaita
+, libportal-gtk4
+, json-glib
+, blueprint-compiler
+, gtksourceview5
+, gobject-introspection
+, wrapGAppsHook4
+, appstream-glib
+, desktop-file-utils
+}:
+
+let
+  pythonEnv = python3.withPackages (ps: with ps; [ pyyaml ]);
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "textpieces";
+  version = "3.4.1";
+
+  src = fetchFromGitHub {
+    owner = "liferooter";
+    repo = "textpieces";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-3ZUHzt3oXYgsnJVDf83JUDhcF+0DLgFfOMtpKI/FTcE=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    pythonEnv
+    vala
+    blueprint-compiler
+    wrapGAppsHook4
+    appstream-glib
+    desktop-file-utils
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    glib
+    gtk4
+    libadwaita
+    libportal-gtk4
+    libgee
+    json-glib
+    gtksourceview5
+  ];
+
+  runtimeDependencies = [
+    pythonEnv
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/postinstall.py
+    patchShebangs build-aux/meson/postinstall.py
+    patchShebangs scripts/
+  '';
+
+  meta = with lib; {
+    description = "Quick text processing";
+    longDescription = "A small tool for quick text transformations such as checksums, encoding, decoding and so on.";
+    homepage = "https://github.com/liferooter/textpieces";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ zendo ];
+    broken = true; # https://github.com/liferooter/textpieces/issues/130
+  };
+})
diff --git a/nixpkgs/pkgs/tools/text/tidy-viewer/default.nix b/nixpkgs/pkgs/tools/text/tidy-viewer/default.nix
new file mode 100644
index 000000000000..6c38007b3f26
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tidy-viewer/default.nix
@@ -0,0 +1,29 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "tidy-viewer";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "alexhallam";
+    repo = "tv";
+    rev = version;
+    sha256 = "sha256-OnvRiQ5H/Vsmfu+F1i68TowjrDwQLQtV1sC6Jrp4xA4=";
+  };
+
+  cargoSha256 = "sha256-pIGuBP0a4jWFzkQfqvxQUrBmqYjhERVyEbZvL7g5hRM=";
+
+  # this test parses command line arguments
+  # error: Found argument '--test-threads' which wasn't expected, or isn't valid in this context
+  checkFlags = [
+    "--skip=build_reader_can_create_reader_without_file_specified"
+  ];
+
+  meta = with lib; {
+    description = "A cross-platform CLI csv pretty printer that uses column styling to maximize viewer enjoyment";
+    homepage = "https://github.com/alexhallam/tv";
+    changelog = "https://github.com/alexhallam/tv/blob/${version}/CHANGELOG.md";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/tml/default.nix b/nixpkgs/pkgs/tools/text/tml/default.nix
new file mode 100644
index 000000000000..3f1a6477851c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tml/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "tml";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "liamg";
+    repo = "tml";
+    rev = "v${version}";
+    hash = "sha256-y9iv6s+ShKLxd+SOBQxwvPwuEL1kepJL6ukA4aoV9Z8=";
+  };
+
+  vendorHash = "sha256-CHZS1SpPko8u3tZAYbf+Di882W55X9Q/zd4SmFCRgKM=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A tiny markup language for terminal output";
+    homepage = "https://github.com/liamg/tml";
+    changelog = "https://github.com/liamg/tml/releases/tag/v${version}";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/to-html/default.nix b/nixpkgs/pkgs/tools/text/to-html/default.nix
new file mode 100644
index 000000000000..0b49fd8be2b1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/to-html/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  version = "0.1.4";
+  pname = "to-html";
+
+  src = fetchFromGitHub {
+    owner = "Aloso";
+    repo = "to-html";
+    rev = "v${version}";
+    hash = "sha256-zkTBjsMFhRz7lVRh8i+XkaJ/qWmTAMPnkH5aDhbHf8U=";
+  };
+
+  cargoHash = "sha256-hXc+lB3DKnRZkp1U5wW/vPKSZ0c1UknQCAxDfE7Eubg=";
+
+  # Requires external resources
+  doCheck = false;
+
+  meta = {
+    description = "Terminal wrapper for rendering a terminal on a website by converting ANSI escape sequences to HTML.";
+    homepage = "https://github.com/Aloso/to-html";
+    changelog = "https://github.com/Aloso/to-html/blob/${src.rev}/CHANGELOG.md";
+    license = lib.licenses.mit;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ icewind1991 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/topfew-rs/default.nix b/nixpkgs/pkgs/tools/text/topfew-rs/default.nix
new file mode 100644
index 000000000000..cb3aca7ab53d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/topfew-rs/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "topfew-rs";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "djc";
+    repo = "topfew-rs";
+    rev = version;
+    hash = "sha256-VlSLPcKw3LYGnmKk5YOkcGIizw1tqtKF2BykY+1MtvY=";
+  };
+
+  cargoHash = "sha256-j+afSwDHau7H20siYtid7l8tq+iS24KJBsNZAEdNJlI=";
+
+  meta = with lib; {
+    description = "Rust implementation of Tim Bray's topfew tool";
+    homepage = "https://github.com/djc/topfew-rs";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "tf";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/topfew/default.nix b/nixpkgs/pkgs/tools/text/topfew/default.nix
new file mode 100644
index 000000000000..967e4e1403a2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/topfew/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+}:
+
+buildGoModule rec {
+  pname = "topfew";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "timbray";
+    repo = "topfew";
+    rev = version;
+    hash = "sha256-6ydi/4LyqTLKpR00f4zpcrTnCorlhnsBOxdhzBMNcRI=";
+  };
+
+  vendorHash = null;
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  ldflags = [ "-s" "-w" ];
+
+  postInstall = ''
+    installManPage doc/tf.1
+  '';
+
+  meta = with lib; {
+    description = "Finds the fields (or combinations of fields) which appear most often in a stream of records";
+    homepage = "https://github.com/timbray/topfew";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "tf";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/transifex-client/default.nix b/nixpkgs/pkgs/tools/text/transifex-client/default.nix
new file mode 100644
index 000000000000..07a49c3d4505
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/transifex-client/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, python-slugify
+, requests
+, urllib3
+, six
+, setuptools
+, gitpython
+, pythonRelaxDepsHook
+}:
+
+buildPythonApplication rec {
+  pname = "transifex-client";
+  version = "0.14.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11dc95cefe90ebf0cef3749c8c7d85b9d389c05bd0e3389bf117685df562bd5c";
+  };
+
+  # https://github.com/transifex/transifex-client/issues/323
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "python-slugify"
+  ];
+
+  propagatedBuildInputs = [
+    gitpython
+    python-slugify
+    requests
+    setuptools
+    six
+    urllib3
+  ];
+
+  # Requires external resources
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Transifex translation service client";
+    homepage = "https://www.transifex.com/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/tuc/default.nix b/nixpkgs/pkgs/tools/text/tuc/default.nix
new file mode 100644
index 000000000000..3598a317633f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tuc/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchFromGitHub, rustPlatform }:
+rustPlatform.buildRustPackage rec {
+  pname = "tuc";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "riquito";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-zEWQ1wGpEowVPdlezC/LZhoPGS546nuqREfavo3fbTs=";
+  };
+
+  cargoHash = "sha256-YRw1HxVy1/SOWfareR6rh6M78xFm+Im//klhXGGt95g=";
+
+  meta = with lib; {
+    description = "When cut doesn't cut it";
+    homepage = "https://github.com/riquito/tuc";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ dit7ya ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/tv/default.nix b/nixpkgs/pkgs/tools/text/tv/default.nix
new file mode 100644
index 000000000000..686433ff4290
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/tv/default.nix
@@ -0,0 +1,23 @@
+{ fetchFromGitHub, lib, rustPlatform }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "tv";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "uzimaru0000";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-qODv45smZ6jHCJBaa6EEvFLG+7g+FWrRf6BiHRFLzqM=";
+  };
+
+  cargoSha256 = "sha256-nI4n4KMPLaIF978b5VvW3mb02vKW+r39nllrhukJilI=";
+
+  meta = with lib; {
+    description = "Format json into table view";
+    homepage = "https://github.com/uzimaru0000/tv";
+    changelog = "https://github.com/uzimaru0000/tv/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/txt2tags/default.nix b/nixpkgs/pkgs/tools/text/txt2tags/default.nix
new file mode 100644
index 000000000000..8ff39ac1ebfe
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/txt2tags/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, python3
+, fetchFromGitHub
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "txt2tags";
+  version = "3.9";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "txt2tags";
+    repo = "txt2tags";
+    rev = "refs/tags/${version}";
+    hash = "sha256-PwPGJJg79ny13gEb1WmgIVHcXQppI/j5mhIyOZjR19k=";
+  };
+
+  postPatch = ''
+    substituteInPlace test/lib.py \
+      --replace 'TXT2TAGS = os.path.join(TEST_DIR, "..", "txt2tags.py")' \
+                'TXT2TAGS = "${placeholder "out"}/bin/txt2tags"' \
+      --replace "[PYTHON] + TXT2TAGS" "TXT2TAGS"
+  '';
+
+  checkPhase = ''
+    ${python3.interpreter} test/run.py
+  '';
+
+  meta = {
+    changelog = "https://github.com/txt2tags/txt2tags/blob/${src.rev}/CHANGELOG.md";
+    description = "Convert between markup languages";
+    homepage = "https://txt2tags.org/";
+    license  = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ dotlambda kovirobi ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/u2ps/default.nix b/nixpkgs/pkgs/tools/text/u2ps/default.nix
new file mode 100644
index 000000000000..95d46db42ed2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/u2ps/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, ghostscript_headless
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "u2ps";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "arsv";
+    repo = "u2ps";
+    rev = finalAttrs.version;
+    hash = "sha256-sa0CL47PwYVDykxzF8KeWhz7HXAX6jZ0AcfecD+aFyg=";
+  };
+
+  buildInputs = [ ghostscript_headless ];
+
+  meta = with lib; {
+    description = "Unicode text to postscript converter";
+    homepage = "https://github.com/arsv/u2ps";
+    license = licenses.gpl3Plus;
+    longDescription = ''
+      U2ps is a text to postscript converter similar to a2ps,
+      with emphasis on Unicode support.
+    '';
+    mainProgram = "u2ps";
+    maintainers = [ maintainers.athas ];
+    platforms = platforms.unix;
+  };
+})
diff --git a/nixpkgs/pkgs/tools/text/ugrep/default.nix b/nixpkgs/pkgs/tools/text/ugrep/default.nix
new file mode 100644
index 000000000000..608ec5345aab
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/ugrep/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, boost
+, bzip2
+, lz4
+, pcre2
+, xz
+, zlib
+, zstd
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "ugrep";
+  version = "4.3.0";
+
+  src = fetchFromGitHub {
+    owner = "Genivia";
+    repo = "ugrep";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-X2tRjQ948fnyCn7vQbpmDqktMfP4A/s7bVfrKDed5nw=";
+  };
+
+  buildInputs = [
+    boost
+    bzip2
+    lz4
+    pcre2
+    xz
+    zlib
+    zstd
+  ];
+
+  meta = with lib; {
+    description = "Ultra fast grep with interactive query UI";
+    homepage = "https://github.com/Genivia/ugrep";
+    changelog = "https://github.com/Genivia/ugrep/releases/tag/v${finalAttrs.version}";
+    maintainers = with maintainers; [ numkem ];
+    license = licenses.bsd3;
+    platforms = platforms.all;
+  };
+})
diff --git a/nixpkgs/pkgs/tools/text/unfurl/default.nix b/nixpkgs/pkgs/tools/text/unfurl/default.nix
new file mode 100644
index 000000000000..35a43ea2fdbd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/unfurl/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "unfurl";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "tomnomnom";
+    repo = "unfurl";
+    rev = "v${version}";
+    hash = "sha256-7aLe5d8ku5llfJ2xh8fT56vqj12/CJ1ez3Vte2PF8KQ=";
+  };
+
+  vendorHash = "sha256-Kpd916+jjGvw56N122Ej4CXVcv1/xr1THkjsrhkIy+U=";
+
+  ldflags = [ "-s" "-w" ];
+
+  # tests tries to download a list of tlds from the internet
+  postPatch = ''
+    echo com > /tmp/.tlds
+  '';
+
+  meta = with lib; {
+    description = "Pull out bits of URLs provided on stdin";
+    homepage = "https://github.com/tomnomnom/unfurl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/uni2ascii/default.nix b/nixpkgs/pkgs/tools/text/uni2ascii/default.nix
new file mode 100644
index 000000000000..d83e9393f941
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uni2ascii/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "uni2ascii";
+  version = "4.18";
+
+  src = fetchurl {
+    url = "https://billposer.org/Software/Downloads/uni2ascii-${version}.tar.gz";
+    sha256 = "03lklnzr6ngs4wqiqa7rifd246f441gfvardbsaa5l6fn9pbn94y";
+  };
+
+  meta = {
+    license = lib.licenses.gpl3;
+    homepage = "http://billposer.org/Software/uni2ascii.html";
+    description = "Converts between UTF-8 and many 7-bit ASCII equivalents and back";
+
+    longDescription = ''
+    This package provides conversion in both directions between UTF-8
+    Unicode and more than thirty 7-bit ASCII equivalents, including
+    RFC 2396 URI format and RFC 2045 Quoted Printable format, the
+    representations used in HTML, SGML, XML, OOXML, the Unicode
+    standard, Rich Text Format, POSIX portable charmaps, POSIX locale
+    specifications, and Apache log files, and the escapes used for
+    including Unicode in Ada, C, Common Lisp, Java, Pascal, Perl,
+    Postscript, Python, Scheme, and Tcl.
+
+    Such ASCII equivalents are useful when including Unicode text in
+    program source, when debugging, and when entering text into web
+    programs that can handle the Unicode character set but are not
+    8-bit safe. For example, MovableType, the blog software, truncates
+    posts as soon as it encounters a byte with the high bit
+    set. However, if Unicode is entered in the form of HTML numeric
+    character entities, Movable Type will not garble the post.
+
+    It also provides ways of converting non-ASCII characters to
+    similar ASCII characters, e.g. by stripping diacritics.
+    '';
+    maintainers = with lib.maintainers; [ goibhniu ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/uniscribe/Gemfile b/nixpkgs/pkgs/tools/text/uniscribe/Gemfile
new file mode 100644
index 000000000000..9bc158c5435e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uniscribe/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "uniscribe"
diff --git a/nixpkgs/pkgs/tools/text/uniscribe/Gemfile.lock b/nixpkgs/pkgs/tools/text/uniscribe/Gemfile.lock
new file mode 100644
index 000000000000..ee6dc316669c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uniscribe/Gemfile.lock
@@ -0,0 +1,37 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    characteristics (1.4.0)
+      unicode-categories (~> 1.7)
+    paint (2.2.1)
+    rationalist (2.0.1)
+    symbolify (1.4.0)
+      characteristics (>= 0.8, < 2.0)
+    unicode-categories (1.7.0)
+    unicode-display_width (2.1.0)
+    unicode-emoji (2.9.0)
+      unicode-version (~> 1.0)
+    unicode-name (1.10.0)
+      unicode-types (~> 1.7)
+    unicode-sequence_name (1.10.0)
+    unicode-types (1.7.0)
+    unicode-version (1.1.0)
+    uniscribe (1.7.0)
+      characteristics (~> 1.4)
+      paint (>= 0.9, < 3.0)
+      rationalist (~> 2.0, >= 2.0.1)
+      symbolify (~> 1.4)
+      unicode-display_width (~> 2.1)
+      unicode-emoji (~> 2.9)
+      unicode-name (~> 1.10)
+      unicode-sequence_name (~> 1.10)
+      unicode-version (~> 1.1)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  uniscribe
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/tools/text/uniscribe/default.nix b/nixpkgs/pkgs/tools/text/uniscribe/default.nix
new file mode 100644
index 000000000000..e7b9cedd2b8c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uniscribe/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, lib, bundlerEnv, bundlerUpdateScript, makeWrapper }:
+
+let
+  rubyEnv = bundlerEnv {
+    name = "uniscribe";
+    gemdir = ./.;
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "uniscribe";
+  version = (import ./gemset.nix).uniscribe.version;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    makeWrapper ${rubyEnv}/bin/uniscribe $out/bin/uniscribe
+  '';
+
+  passthru.updateScript = bundlerUpdateScript "uniscribe";
+
+  meta = with lib; {
+    description = "Explains Unicode characters/code points: Displays their name, category, and shows compositions";
+    homepage = "https://github.com/janlelis/uniscribe";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kjeremy ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/uniscribe/gemset.nix b/nixpkgs/pkgs/tools/text/uniscribe/gemset.nix
new file mode 100644
index 000000000000..d61123585c2a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uniscribe/gemset.nix
@@ -0,0 +1,1766 @@
+{
+  characteristics = {
+    dependencies = ["unicode-categories"];
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zhgx2h89kfm1xdgfw78vyw6mgwca1nqd67hk13pfz8ffkig2ziq";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  paint = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01fhvxdaqngldqa7r0jgnskr4iv2x2i0n3z28za8j4qszpvlcb7x";
+      type = "gem";
+    };
+    version = "2.2.1";
+  };
+  rationalist = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zydr81pc63m7i5f5s51ryksv3g2qya5pd42s09v9ixk3fddpxgi";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  symbolify = {
+    dependencies = ["characteristics"];
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cjalbjgw50bwna2gyjczx42nszifslijy43bmiahn4dw76jz653";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  unicode-categories = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0prakys8s56hh56q2r4gm2iigq9wk4ywwpv9ywcyi4xr9k2pliy3";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  unicode-display_width = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0csjm9shhfik0ci9mgimb7hf3xgh7nx45rkd9rzgdz6vkwr8rzxn";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  unicode-emoji = {
+    dependencies = ["unicode-version"];
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fvm7z6s9nipbwsq4xqqz443g3x5lwkcpg7iwqxs9x43dd9r8h77";
+      type = "gem";
+    };
+    version = "2.9.0";
+  };
+  unicode-name = {
+    dependencies = ["unicode-types"];
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18ly2yy1jbdcvxgfyn2n17c2v54n9llzvr7klbfhy285lz1ylkdd";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  unicode-sequence_name = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fm57j4yplfsdq5pyxdp7pgp5adisdh8hr1dgvr5g1x076bvis16";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  unicode-types = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qrbvx01v1x931czvrng0hvlhyb1bwa3mnq008lq5w75ldrpyiis";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  unicode-version = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "maglev";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.8";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "1.9";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.0";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.1";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.2";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.3";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.4";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.5";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "maglev";
+      version = "2.6";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+    } {
+      engine = "rbx";
+      version = "1.8";
+    } {
+      engine = "rbx";
+      version = "1.9";
+    } {
+      engine = "rbx";
+      version = "2.0";
+    } {
+      engine = "rbx";
+      version = "2.1";
+    } {
+      engine = "rbx";
+      version = "2.2";
+    } {
+      engine = "rbx";
+      version = "2.3";
+    } {
+      engine = "rbx";
+      version = "2.4";
+    } {
+      engine = "rbx";
+      version = "2.5";
+    } {
+      engine = "rbx";
+      version = "2.6";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.8";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "1.9";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.0";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.1";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.2";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.3";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.4";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.5";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    } {
+      engine = "ruby";
+      version = "2.6";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0isqdyqix8gh2xkpy9ab7bhwwz4nc7zrv49l0kb0hqd7n3ip9zmg";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  uniscribe = {
+    dependencies = ["characteristics" "paint" "rationalist" "symbolify" "unicode-display_width" "unicode-emoji" "unicode-name" "unicode-sequence_name" "unicode-version"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0k66h24waqy51yfqkb1iish0kc3ky85h51dikzdhk6i51q2vrx7i";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/unoconv/default.nix b/nixpkgs/pkgs/tools/text/unoconv/default.nix
new file mode 100644
index 000000000000..ae70bd9f561e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/unoconv/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, python3, libreoffice-unwrapped, asciidoc, makeWrapper
+# whether to install odt2pdf/odt2doc/... symlinks to unoconv
+, installSymlinks ? true
+}:
+
+# IMPORTANT: unoconv must use the same python version as libreoffice (unless it
+# will not be able to load the pyuno module from libreoffice).
+
+stdenv.mkDerivation rec {
+  pname = "unoconv";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "unoconv";
+    repo = "unoconv";
+    rev = version;
+    sha256 = "1akx64686in8j8arl6vsgp2n3bv770q48pfv283c6fz6wf9p8fvr";
+  };
+
+  nativeBuildInputs = [ asciidoc makeWrapper ];
+
+  preBuild = ''
+    makeFlags=prefix="$out"
+  '';
+
+  postInstall = ''
+    sed -i "s|/usr/bin/env python.*|${python3}/bin/${python3.executable}|" "$out/bin/unoconv"
+    wrapProgram "$out/bin/unoconv" \
+        --set-default UNO_PATH "${libreoffice-unwrapped}/lib/libreoffice/program/"
+  '' + lib.optionalString installSymlinks ''
+    make install-links prefix="$out"
+  '';
+
+  meta = with lib; {
+    description = "Convert between any document format supported by LibreOffice/OpenOffice";
+    homepage = "http://dag.wieers.com/home-made/unoconv/";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/unrtf/default.nix b/nixpkgs/pkgs/tools/text/unrtf/default.nix
new file mode 100644
index 000000000000..3357404a7d3c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/unrtf/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchurl, autoconf, automake, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "unrtf";
+  version = "0.21.10";
+
+  src = fetchurl {
+    url = "https://ftp.gnu.org/gnu/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "1bil6z4niydz9gqm2j861dkxmqnpc8m7hvidsjbzz7x63whj17xl";
+  };
+
+  nativeBuildInputs = [ autoconf automake ];
+
+  buildInputs = [ libiconv ];
+
+  preConfigure = "./bootstrap";
+
+  outputs = [ "out" "man" ];
+
+  meta = with lib; {
+    description = "A converter from Rich Text Format to other formats";
+    longDescription = ''
+      UnRTF converts documents in Rich Text Format to other
+      formats, including HTML, LaTeX, and RTF itself.
+    '';
+    homepage = "https://www.gnu.org/software/unrtf/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ joachifm ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/untex/default.nix b/nixpkgs/pkgs/tools/text/untex/default.nix
new file mode 100644
index 000000000000..63108a923782
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/untex/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "untex";
+  version = "1.3";
+
+  src = fetchurl {
+    url = "ftp://ftp.thp.uni-duisburg.de/pub/source/${pname}-${version}.tar.gz";
+    sha256 = "1jww43pl9qvg6kwh4h8imp966fzd62dk99pb4s93786lmp3kgdjv";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  unpackPhase = "tar xf $src";
+  installTargets = [ "install" "install.man" ];
+  installFlags = [ "BINDIR=$(out)/bin" "MANDIR=$(out)/share/man/man1" ];
+  preBuild = ''
+    sed -i '1i#include <stdlib.h>\n#include <string.h>' untex.c
+    mkdir -p $out/bin $out/share/man/man1
+  '';
+
+  meta = with lib; {
+    description = "A utility which removes LaTeX commands from input";
+    homepage = "https://www.ctan.org/pkg/untex";
+    license = licenses.gpl1Only;
+    maintainers = with maintainers; [ joachifm ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/uwc/default.nix b/nixpkgs/pkgs/tools/text/uwc/default.nix
new file mode 100644
index 000000000000..dc34ecfacff2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/uwc/default.nix
@@ -0,0 +1,24 @@
+{ rustPlatform, lib, fetchFromGitLab }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "uwc";
+  version = "1.0.5";
+
+  src = fetchFromGitLab {
+    owner = "dead10ck";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-x2mijB1GkxdraFroG1+PiBzWKPjsaAeoDt0HFL2v93I=";
+  };
+
+  cargoHash = "sha256-0IvOaQaXfdEz5tlXh5gTbnZG9QZSWDVHGOqYq8aWOIc=";
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Like wc, but unicode-aware, and with per-line mode";
+    homepage = "https://gitlab.com/dead10ck/uwc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ShamrockLee ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/vale/default.nix b/nixpkgs/pkgs/tools/text/vale/default.nix
new file mode 100644
index 000000000000..d4ed3ba55a95
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/vale/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "vale";
+  version = "2.29.6";
+
+  subPackages = [ "cmd/vale" ];
+  outputs = [ "out" "data" ];
+
+  src = fetchFromGitHub {
+    owner = "errata-ai";
+    repo = "vale";
+    rev = "v${version}";
+    hash = "sha256-0btFCTpVB50097yQEggpm1rmm4aciTgfdLAkczQ1mj4=";
+  };
+
+  vendorHash = "sha256-EbhLz4agDWAlALfBcGUbVNz+teUvgroxzaSN8T19AJY=";
+
+  postInstall = ''
+    mkdir -p $data/share/vale
+    cp -r testdata/styles $data/share/vale
+  '';
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  # Tests require network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A syntax-aware linter for prose built with speed and extensibility in mind";
+    homepage = "https://vale.sh/";
+    changelog = "https://github.com/errata-ai/vale/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/validator-nu/default.nix b/nixpkgs/pkgs/tools/text/validator-nu/default.nix
new file mode 100644
index 000000000000..43f20db4a6da
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/validator-nu/default.nix
@@ -0,0 +1,68 @@
+{ fetchFromGitHub
+, git
+, jdk_headless
+, jre_headless
+, makeWrapper
+, python3
+, stdenvNoCC
+, lib
+}:
+
+let
+  pname = "validator-nu";
+  version = "22.9.29";
+
+  src = fetchFromGitHub {
+    owner = "validator";
+    repo = "validator";
+    rev = version;
+    fetchSubmodules = true;
+    hash = "sha256-NH/OyaKGITAL2yttB1kmuKVuZuYzhVuS0Oohj1N4icI=";
+  };
+
+  deps = stdenvNoCC.mkDerivation {
+    pname = "${pname}-deps";
+    inherit version src;
+
+    nativeBuildInputs = [ git jdk_headless python3 python3.pkgs.certifi ];
+
+    buildPhase = ''
+      python checker.py dldeps
+    '';
+
+    installPhase = ''
+      mkdir "$out"
+      mv dependencies extras "$out"
+    '';
+
+    outputHashMode = "recursive";
+    outputHash = "sha256-LPtxpUd7LAYZHJL7elgcZOTaTgHqeqquiB9hiuajA6c=";
+  };
+
+in
+stdenvNoCC.mkDerivation rec {
+  inherit pname version src;
+
+  nativeBuildInputs = [ git jdk_headless makeWrapper python3 ];
+
+  buildPhase = ''
+    ln -s '${deps}/dependencies' '${deps}/extras' .
+    JAVA_HOME='${jdk_headless}' python checker.py build
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/bin" "$out/share/java"
+    mv build/dist/vnu.jar "$out/share/java/"
+    makeWrapper "${jre_headless}/bin/java" "$out/bin/vnu" \
+      --add-flags "-jar '$out/share/java/vnu.jar'"
+  '';
+
+  meta = with lib; {
+    description = "Helps you catch problems in your HTML/CSS/SVG";
+    homepage = "https://validator.github.io/validator/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ andersk ];
+    mainProgram = "vnu";
+    sourceProvenance = with sourceTypes; [ binaryBytecode fromSource ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/vgrep/default.nix b/nixpkgs/pkgs/tools/text/vgrep/default.nix
new file mode 100644
index 000000000000..9022c5f5c03b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/vgrep/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildGoModule, fetchFromGitHub, go-md2man, installShellFiles }:
+
+buildGoModule rec {
+  pname = "vgrep";
+  version = "2.7.0";
+
+  src = fetchFromGitHub {
+    owner = "vrothberg";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+KZNNkTuZyF02YDZX3u1KdhOcZ3+Ud6aDGL/sGUN1hI=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  nativeBuildInputs = [ go-md2man installShellFiles ];
+
+  postBuild = ''
+    sed -i '/SHELL= /d' Makefile
+    make docs
+    installManPage docs/*.[1-9]
+  '';
+
+  meta = with lib; {
+    description = "User-friendly pager for grep/git-grep/ripgrep";
+    homepage = "https://github.com/vrothberg/vgrep";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/wdiff/default.nix b/nixpkgs/pkgs/tools/text/wdiff/default.nix
new file mode 100644
index 000000000000..d6ed960cce1e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/wdiff/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, texinfo, which }:
+
+stdenv.mkDerivation rec {
+  pname = "wdiff";
+  version = "1.2.2";
+
+  src = fetchurl {
+    url = "mirror://gnu/wdiff/${pname}-${version}.tar.gz";
+    sha256 = "0sxgg0ms5lhi4aqqvz1rj4s77yi9wymfm3l3gbjfd1qchy66kzrl";
+  };
+
+  # for makeinfo
+  nativeBuildInputs = [ texinfo ];
+
+  buildInputs = [ texinfo ];
+
+  nativeCheckInputs = [ which ];
+
+  strictDeps = true;
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/wdiff/";
+    description = "Comparing files on a word by word basis";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ eelco SuperSandro2000 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/wgetpaste/default.nix b/nixpkgs/pkgs/tools/text/wgetpaste/default.nix
new file mode 100644
index 000000000000..9a60b991a7f9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/wgetpaste/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, wget, bash }:
+
+stdenv.mkDerivation rec {
+  pname = "wgetpaste";
+  version = "2.33";
+
+  src = fetchurl {
+    url = "https://github.com/zlin/wgetpaste/releases/download/${version}/wgetpaste-${version}.tar.xz";
+    sha256 = "sha256-6TWdhKOmO7vRKGIVNcUwLy46heI6UiAOgej6ubd+lxs=";
+  };
+  # currently zsh-autocompletion support is not installed
+
+  prePatch = ''
+    substituteInPlace wgetpaste --replace "/usr/bin/env bash" "${bash}/bin/bash"
+    substituteInPlace wgetpaste --replace "LC_ALL=C wget" "LC_ALL=C ${wget}/bin/wget"
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin;
+    cp wgetpaste $out/bin;
+  '';
+
+  meta = {
+    description = "Command-line interface to various pastebins";
+    homepage = "https://github.com/zlin/wgetpaste";
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ qknight domenkozar ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/wrap/default.nix b/nixpkgs/pkgs/tools/text/wrap/default.nix
new file mode 100644
index 000000000000..4eebcf60437b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/wrap/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildGoModule, fetchFromGitHub, fetchpatch, makeWrapper, courier-prime }:
+
+buildGoModule rec {
+  pname = "wrap";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "Wraparound";
+    repo = "wrap";
+    rev = "v${version}";
+    hash = "sha256-58wsH/e3X72S7tJUObazyvvkI8+B7DLPTBmQO9A+jmk=";
+  };
+
+  vendorHash = "sha256-vg61Vypd+mSF9FyLFVpnS5UCTJDoobkDE1Cneg8O0RM=";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  patches = [
+    (fetchpatch {
+      name = "courier-prime-variants.patch";
+      url = "https://github.com/Wraparound/wrap/commit/b72c280b6eddba9ec7b3507c1f143eb28a85c9c1.patch";
+      hash = "sha256-hcUsRyv6XVN+GyMN7LXzXPsp8jYUKTJPaK+e5p4CO7U=";
+    })
+    # Fix build on Go 1.17+
+    (fetchpatch {
+      url = "https://github.com/Wraparound/wrap/commit/a222c18a7e0810486741684781ff6158a359a8ba.patch";
+      hash = "sha256-eIKvA91olfbNJhOhIUu3GOL/rbgX3m6unmU8nRdKbtc=";
+    })
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/wrap --prefix XDG_DATA_DIRS : ${courier-prime}/share/
+  '';
+
+  meta = with lib; {
+    description = "A Fountain export tool with some extras";
+    homepage = "https://github.com/Wraparound/wrap";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/write-good/default.nix b/nixpkgs/pkgs/tools/text/write-good/default.nix
new file mode 100644
index 000000000000..db3e16c23deb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/write-good/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "write-good";
+  version = "1.0.8";
+
+  src = fetchFromGitHub {
+    owner = "btford";
+    repo = "write-good";
+    rev = "v${version}";
+    hash = "sha256-cq3cj2BwoQMKqo3iU2l+PR/2bJIFMSTRsDGQJ06GWXk=";
+  };
+
+  npmDepsHash = "sha256-0M9RzyeINmUPYcLy654iI+/ehElKrhIAibpiSqlXD2A=";
+
+  dontNpmBuild = true;
+
+  meta = {
+    description = "Naive linter for English prose";
+    homepage = "https://github.com/btford/write-good";
+    license = lib.licenses.mit;
+    mainProgram = "write-good";
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xidel/default.nix b/nixpkgs/pkgs/tools/text/xidel/default.nix
new file mode 100644
index 000000000000..479cc0ff1115
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xidel/default.nix
@@ -0,0 +1,95 @@
+{ lib, stdenv, fetchFromGitHub, fpc, openssl }:
+
+let
+  flreSrc = fetchFromGitHub {
+    owner = "benibela";
+    repo = "flre";
+    rev = "3e926d45d4352f1b7c7cd411ccd625df117dad5c";
+    hash = "sha256-fs7CIjd3fwD/SORYh5pmJxIdrr8F9e36TNmnKUbUxP0=";
+  };
+  synapseSrc = fetchFromGitHub {
+    owner = "benibela";
+    repo = "ararat-synapse";
+    rev = "7a77db926de66809080bada68b54172da7f84c0e";
+    hash = "sha256-bVLQ0ohGJYtuP88Krxy9a7RnHHrW0OWw8H/uxa3PerU=";
+  };
+  rcmdlineSrc = fetchFromGitHub {
+    owner = "benibela";
+    repo = "rcmdline";
+    rev = "ea02b770c4568717dd7b3b72da191a8bbcb4c751";
+    hash = "sha256-6YtvAf0joRvtCKbUAaLwuwABw1GEIzammFLhboq9aG0=";
+  };
+  internettoolsSrc = fetchFromGitHub {
+    owner = "benibela";
+    repo = "internettools";
+    rev = "dd972caaa4415468fa679ea7262976ead3fd3e38";
+    hash = "sha256-09sADxPiE6ky1EX7dTXRBYVT3IarUcLYf5knzi7+CHU=";
+  };
+  pasdblstrutilsSrc = fetchFromGitHub {
+    owner = "BeRo1985";
+    repo = "pasdblstrutils";
+    rev = "1696f0a2b822fef26c8992f96620f1be129cfa99";
+    hash = "sha256-x0AjOTa1g7gJOR2iBO76yBt1kzcRNujHRUsq5QOlfP0=";
+  };
+in stdenv.mkDerivation rec {
+  pname = "xidel";
+  version = "unstable-2022-11-01";
+
+  src = fetchFromGitHub {
+    owner = "benibela";
+    repo = pname;
+    rev = "6d5655c1d73b88ddeb32d2450a35ee36e4762bb8";
+    hash = "sha256-9x2d5AKRBjocRawRHdeI4heIM5nb00/F/EIj+/to7ac=";
+  };
+
+  nativeBuildInputs = [ fpc ];
+  buildInputs = [ openssl ];
+
+  NIX_LDFLAGS = [ "-lcrypto" ];
+
+  patchPhase = ''
+    patchShebangs \
+      build.sh \
+      tests/test.sh \
+      tests/tests-file-module.sh \
+      tests/tests.sh \
+      tests/downloadTest.sh \
+      tests/downloadTests.sh \
+      tests/zorbajsoniq.sh \
+      tests/zorbajsoniq/download.sh
+  '';
+
+  preBuildPhase = ''
+    mkdir -p import/{flre,synapse,pasdblstrutils} rcmdline internettools
+    cp -R ${flreSrc}/. import/flre
+    cp -R ${synapseSrc}/. import/synapse
+    cp -R ${pasdblstrutilsSrc}/. import/pasdblstrutils
+    cp -R ${rcmdlineSrc}/. rcmdline
+    cp -R ${internettoolsSrc}/. internettools
+  '';
+
+  buildPhase = ''
+    runHook preBuildPhase
+    ./build.sh
+    runHook postBuildPhase
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/bin" "$out/share/man/man1"
+    cp meta/xidel.1 "$out/share/man/man1/"
+    cp xidel "$out/bin/"
+  '';
+
+  # disabled, because tests require network
+  checkPhase = ''
+    ./tests/tests.sh
+  '';
+
+  meta = with lib; {
+    description = "Command line tool to download and extract data from HTML/XML pages as well as JSON APIs";
+    homepage = "https://www.videlibri.de/xidel.html";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/basex/basex.svg b/nixpkgs/pkgs/tools/text/xml/basex/basex.svg
new file mode 100644
index 000000000000..9d476cec2ca1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/basex/basex.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2178"
+   sodipodi:version="0.32"
+   inkscape:version="0.45"
+   width="1568"
+   height="1164"
+   version="1.0"
+   sodipodi:docbase="F:\Uni\Scholl\Research\Conferences\BTW2007\Poster"
+   sodipodi:docname="Logo.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:modified="true">
+  <metadata
+     id="metadata2183">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs2181" />
+  <sodipodi:namedview
+     inkscape:window-height="1150"
+     inkscape:window-width="1143"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="0.64948454"
+     inkscape:cx="784"
+     inkscape:cy="584.00852"
+     inkscape:window-x="412"
+     inkscape:window-y="20"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:object-bbox="true"
+     inkscape:object-points="true"
+     gridempspacing="10" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     style="opacity:1">
+    <path
+       style="font-size:1470px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:19.98425102;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Clarendo"
+       d="M 628.08008,847.55762 C 613.24569,864.30587 601.88095,879.3791 593.98584,892.77734 C 586.08995,906.17595 582.1422,916.94254 582.14258,925.07715 C 582.1422,937.9972 586.92735,947.08899 596.49805,952.35254 C 606.06796,957.61633 624.49079,960.24816 651.7666,960.24805 L 720.67285,960.24805 L 720.67285,1072.2207 L 207.46484,1072.2207 L 207.46484,960.24805 L 256.27344,960.24805 C 284.9843,960.24816 308.07265,955.94152 325.53857,947.32813 C 343.00426,938.71498 364.89633,919.09586 391.21484,888.4707 L 673.2998,568.34375 L 441.45898,276.92773 C 416.57596,245.82505 393.60723,224.77038 372.55273,213.76367 C 351.4979,202.75868 325.89734,197.25576 295.75098,197.25488 L 245.50684,197.25488 L 245.50684,86 L 767.32813,86 L 767.32813,197.25488 L 699.85742,197.25488 C 685.97999,197.25576 675.45266,199.76796 668.27539,204.7915 C 661.0972,209.81678 657.50834,217.11414 657.50879,226.68359 C 657.50834,233.38365 659.30277,240.20249 662.89209,247.14014 C 666.4805,254.07943 672.58156,262.57308 681.19531,272.62109 L 810.39453,429.81348 L 967.58691,265.44336 C 974.76388,258.26644 980.50606,250.84945 984.81348,243.19238 C 989.11933,235.53697 991.27265,229.07702 991.27344,223.8125 C 991.27265,215.20008 985.88936,208.62049 975.12354,204.07373 C 964.35618,199.5287 948.20629,197.25576 926.67383,197.25488 L 869.25195,197.25488 L 869.25195,86 L 1332.2158,86 L 1332.2158,197.25488 L 1279.1006,197.25488 C 1241.2968,197.25576 1189.8564,233.14439 1124.7793,304.9209 L 1123.3438,306.35645 L 905.8584,544.65723 L 1155.6436,856.1709 C 1194.8808,904.97966 1224.6684,934.52797 1245.0063,944.81592 C 1265.3422,955.10412 1294.412,960.24816 1332.2158,960.24805 L 1376,960.24805 L 1376,1072.2207 L 810.39453,1072.2207 L 810.39453,960.24805 L 877.86523,960.24805 C 901.79032,960.24816 919.25612,958.21447 930.2627,954.14697 C 941.26782,950.07971 946.77074,943.26087 946.77148,933.69043 C 946.77074,926.51284 945.3352,918.97623 942.46484,911.08057 C 939.59302,903.18523 935.28638,895.64861 929.54492,888.4707 L 768.76367,685.34082 L 628.08008,847.55762 z "
+       id="text2175" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 146.16714,395.52869 L 353.19839,395.52869 C 387.70332,395.52904 414.19255,404.07396 432.66616,421.16345 C 451.13913,438.25361 460.37577,459.41244 460.37612,484.64001 C 460.37577,505.79912 453.78398,523.94688 440.60073,539.08337 C 431.81135,549.17472 418.95329,557.14998 402.02651,563.00916 C 427.74234,569.19424 446.66322,579.81434 458.78921,594.86951 C 470.9145,609.92499 476.97732,628.84587 476.97768,651.6322 C 476.97732,670.18697 472.66417,686.8699 464.03823,701.68103 C 455.41158,716.49227 443.61146,728.211 428.63784,736.83728 C 419.36019,742.20839 405.3628,746.11463 386.64565,748.55603 C 361.74306,751.81124 345.22289,753.43884 337.08511,753.43884 L 146.16714,753.43884 L 146.16714,395.52869 z M 257.7394,535.90955 L 305.83511,535.90955 C 323.0875,535.90976 335.09107,532.93939 341.84585,526.99841 C 348.60017,521.05789 351.97744,512.47229 351.97768,501.24158 C 351.97744,490.82517 348.60017,482.68716 341.84585,476.82751 C 335.09107,470.96842 323.33164,468.03874 306.56753,468.03845 L 257.7394,468.03845 L 257.7394,535.90955 z M 257.7394,676.53455 L 314.13589,676.53455 C 333.17863,676.53462 346.60635,673.15735 354.41909,666.40271 C 362.23134,659.64825 366.13758,650.57436 366.13784,639.18103 C 366.13758,628.60173 362.27203,620.0975 354.54116,613.66833 C 346.8098,607.23944 333.26001,604.02493 313.89175,604.02478 L 257.7394,604.02478 L 257.7394,676.53455 z "
+       id="text2205" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 703.69272,694.35681 L 577.71616,694.35681 L 560.38217,753.43884 L 447.34506,753.43884 L 581.86655,395.52869 L 702.47202,395.52869 L 836.9935,753.43884 L 721.27084,753.43884 L 703.69272,694.35681 z M 680.49936,616.96423 L 640.94858,488.30212 L 601.64194,616.96423 L 680.49936,616.96423 z "
+       id="text3180" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 810.90509,641.13416 L 916.1297,634.54236 C 918.40822,651.63231 923.04689,664.65313 930.04572,673.60486 C 941.4388,688.09061 957.71482,695.33344 978.87384,695.33337 C 994.6614,695.33344 1006.8277,691.63064 1015.3729,684.22498 C 1023.9176,676.81946 1028.19,668.23386 1028.1902,658.46814 C 1028.19,649.19091 1024.121,640.89013 1015.9832,633.5658 C 1007.845,626.24171 988.96479,619.3244 959.34259,612.81384 C 910.83987,601.90905 876.25331,587.42339 855.58282,569.35681 C 834.74945,551.29061 824.33279,528.26004 824.33282,500.26501 C 824.33279,481.87337 829.66319,464.49871 840.32404,448.14099 C 850.98479,431.7839 867.01667,418.92584 888.41974,409.56677 C 909.82262,400.20841 939.16015,395.52905 976.43243,395.52869 C 1022.1679,395.52905 1057.0393,404.03327 1081.0467,421.04138 C 1105.0535,438.05017 1119.3358,465.10906 1123.8934,502.21814 L 1019.6453,508.32166 C 1016.8782,492.20864 1011.0595,480.4899 1002.1893,473.16541 C 993.31863,465.84148 981.07092,462.17937 965.44611,462.17908 C 952.58787,462.17937 942.90364,464.90561 936.39337,470.35779 C 929.88282,475.81055 926.62761,482.44303 926.62775,490.25525 C 926.62761,495.95213 929.31316,501.07908 934.68439,505.63611 C 939.89257,510.35641 952.26235,514.75094 971.79376,518.8197 C 1020.1334,529.2366 1054.7606,539.77533 1075.6756,550.43591 C 1096.59,561.09692 1111.8081,574.32119 1121.3299,590.10876 C 1130.851,605.89668 1135.6118,623.55617 1135.6121,643.08728 C 1135.6118,666.03659 1129.2641,687.19543 1116.5692,706.56384 C 1103.8735,725.93237 1086.1327,740.62148 1063.3465,750.63123 C 1040.5598,760.64099 1011.8326,765.64587 977.16486,765.64587 C 916.29234,765.64587 874.13743,753.92713 850.70001,730.48962 C 827.26248,707.05218 813.99752,677.26705 810.90509,641.13416 L 810.90509,641.13416 z "
+       id="text3184" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 1139.0592,395.52869 L 1435.4459,395.52869 L 1435.4459,471.9447 L 1249.899,471.9447 L 1249.899,528.82947 L 1422.0182,528.82947 L 1422.0182,601.82751 L 1249.899,601.82751 L 1249.899,672.38416 L 1440.817,672.38416 L 1440.817,753.43884 L 1139.0592,753.43884 L 1139.0592,395.52869 z "
+       id="text3188" />
+  </g>
+</svg>
diff --git a/nixpkgs/pkgs/tools/text/xml/basex/default.nix b/nixpkgs/pkgs/tools/text/xml/basex/default.nix
new file mode 100644
index 000000000000..5e9df9f513b6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/basex/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv, fetchurl, unzip, jre, coreutils, makeDesktopItem, copyDesktopItems }:
+
+stdenv.mkDerivation rec {
+  pname = "basex";
+  version = "10.7";
+
+  src = fetchurl {
+    url = "http://files.basex.org/releases/${version}/BaseX${builtins.replaceStrings ["."] [""] version}.zip";
+    hash = "sha256-Jr73UoyJfhtXLnYgOPh+jqKc3XZs+WMwJaO5nuD+Vmw=";
+  };
+
+  nativeBuildInputs = [ unzip copyDesktopItems ];
+  buildInputs = [ jre ];
+
+  desktopItems = lib.optional (!stdenv.isDarwin) (makeDesktopItem {
+    name = "basex";
+    exec = "basexgui %f";
+    icon = "${./basex.svg}"; # icon copied from Ubuntu basex package
+    comment = "Visually query and analyse your XML data";
+    desktopName = "BaseX XML Database";
+    genericName = "XML database tool";
+    categories = [ "Development" "Utility" "Database" ];
+    mimeTypes = [ "text/xml" ];
+  });
+
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    # Remove Windows batch files (unclutter $out/bin)
+    rm ./bin/*.bat
+
+    mkdir -p "$out/share/basex"
+
+    cp -R bin etc lib webapp src BaseX.jar "$out"
+    cp -R readme.txt webapp "$out/share/basex"
+
+    # Use substitutions instead of wrapper scripts
+    for file in "$out"/bin/*; do
+        sed -i -e "s|/usr/bin/env bash|${stdenv.shell}|" \
+               -e "s|java|${jre}/bin/java|" \
+               -e "s|readlink|${coreutils}/bin/readlink|" \
+               -e "s|dirname|${coreutils}/bin/dirname|" \
+               -e "s|basename|${coreutils}/bin/basename|" \
+               -e "s|echo|${coreutils}/bin/echo|" \
+            "$file"
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "XML database and XPath/XQuery processor";
+    longDescription = ''
+      BaseX is a very fast and light-weight, yet powerful XML database and
+      XPath/XQuery processor, including support for the latest W3C Full Text
+      and Update Recommendations. It supports large XML instances and offers a
+      highly interactive front-end (basexgui). Apart from two local standalone
+      modes, BaseX offers a client/server architecture.
+    '';
+    homepage = "https://basex.org/";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/html-xml-utils/default.nix b/nixpkgs/pkgs/tools/text/xml/html-xml-utils/default.nix
new file mode 100644
index 000000000000..df91cbcea566
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/html-xml-utils/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchurl, curl, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "html-xml-utils";
+  version = "8.6";
+
+  src = fetchurl {
+    url = "https://www.w3.org/Tools/HTML-XML-utils/${pname}-${version}.tar.gz";
+    sha256 = "sha256-XoRynvNszTkk0ocu1O5pVMYzMtylQAuo606u8fLbT7I=";
+  };
+
+  buildInputs = [curl libiconv];
+
+  meta = with lib; {
+    description = "Utilities for manipulating HTML and XML files";
+    homepage = "https://www.w3.org/Tools/HTML-XML-utils/";
+    license = licenses.w3c;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/jing-trang/default.nix b/nixpkgs/pkgs/tools/text/xml/jing-trang/default.nix
new file mode 100644
index 000000000000..f13a82faf295
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/jing-trang/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, fetchFromGitHub, jre_headless, jdk_headless, ant, saxon }:
+
+stdenv.mkDerivation rec {
+  pname = "jing-trang";
+  version = "20181222";
+
+  src = fetchFromGitHub {
+    owner = "relaxng";
+    repo = "jing-trang";
+    rev = "V${version}";
+    sha256 = "sha256-Krupa3MGk5UaaQsaNpPMZuIUzHJytDiksz9ysCPkFS4=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [ jdk_headless ant saxon ];
+
+  CLASSPATH = "lib/saxon.jar";
+
+  patches = [
+    ./no-git-during-build.patch
+  ];
+
+  preBuild = "ant";
+
+  installPhase = ''
+    mkdir -p "$out"/{share/java,bin}
+    cp ./build/*.jar ./lib/resolver.jar "$out/share/java/"
+
+    for tool in jing trang; do
+    cat > "$out/bin/$tool" <<EOF
+    #! $SHELL
+    export JAVA_HOME='${jre_headless}'
+    exec '${jre_headless}/bin/java' -jar '$out/share/java/$tool.jar' "\$@"
+    EOF
+    done
+
+    chmod +x "$out"/bin/*
+  '';
+
+  doCheck = true;
+  checkPhase = "ant test";
+
+  meta = with lib; {
+    description = "A RELAX NG validator in Java";
+    # The homepage is www.thaiopensource.com, but it links to googlecode.com
+    # for downloads and call it the "project site".
+    homepage = "https://www.thaiopensource.com/relaxng/trang.html";
+    platforms = platforms.unix;
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode  # source bundles dependencies as jars
+    ];
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/jing-trang/no-git-during-build.patch b/nixpkgs/pkgs/tools/text/xml/jing-trang/no-git-during-build.patch
new file mode 100644
index 000000000000..3fc9b3f6ef53
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/jing-trang/no-git-during-build.patch
@@ -0,0 +1,47 @@
+From db0ed6267f1a85f0785c81b8ee396f74795c77c0 Mon Sep 17 00:00:00 2001
+From: Thomas Gerbet <thomas@gerbet.me>
+Date: Sat, 27 Nov 2021 10:24:07 +0100
+Subject: [PATCH] Do not rely on Git during the build
+
+---
+ build.xml | 6 ------
+ build.xsl | 6 ------
+ 2 files changed, 12 deletions(-)
+
+diff --git a/build.xml b/build.xml
+index e8ebaed8..2d26c72f 100644
+--- a/build.xml
++++ b/build.xml
+@@ -431,12 +431,6 @@
+ <target name="clean" 
+ 	description="Remove almost all files created during the build process">
+   <delete dir="${build.dir}"/>
+-  <exec executable="git">
+-    <arg value="clean"/>
+-    <arg value="-d"/>
+-    <arg value="--force"/>
+-    <arg value="${doc.dir}"/>
+-  </exec>
+ </target>
+ 
+ <target name="realclean" depends="clean"
+diff --git a/build.xsl b/build.xsl
+index fb9f3fef..fa384a27 100644
+--- a/build.xsl
++++ b/build.xsl
+@@ -23,12 +23,6 @@
+     <target name="dummy"/>
+     <target name="init">
+       <mkdir dir="{$build}"/>
+-      <exec executable="git">
+-        <arg value="submodule"/>
+-        <arg value="update"/>
+-        <arg value="--init"/>
+-        <arg value="--recursive"/>
+-      </exec>
+       <copy todir="{$doc}">
+         <fileset dir="relaxng.org/jclark" includes="**"/>
+       </copy>
+-- 
+2.34.1
+
diff --git a/nixpkgs/pkgs/tools/text/xml/rnv/default.nix b/nixpkgs/pkgs/tools/text/xml/rnv/default.nix
new file mode 100644
index 000000000000..1ee3355d1052
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/rnv/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchurl, expat }:
+
+stdenv.mkDerivation rec {
+  pname = "rnv";
+  version = "1.7.11";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/rnv/rnv-${version}.tar.xz";
+    sha256 = "1rlxrkkkp8b5j6lyvnd9z1d85grmwwmdggkxq6yl226nwkqj1faa";
+  };
+
+  buildInputs = [ expat ];
+
+  meta = with lib; {
+    description = "Relax NG Compact Syntax validator";
+    homepage = "http://www.davidashen.net/rnv.html";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/rxp/default.nix b/nixpkgs/pkgs/tools/text/xml/rxp/default.nix
new file mode 100644
index 000000000000..918a491ede38
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/rxp/default.nix
@@ -0,0 +1,18 @@
+{lib, stdenv, fetchurl} :
+
+stdenv.mkDerivation rec {
+  pname = "rxp";
+  version = "1.5.0";
+
+  src = fetchurl {
+    url = "mirror://debian/pool/main/r/rxp/rxp_${version}.orig.tar.gz";
+    sha256 = "0y365r36wzj4xn1dzhb03spxljnrx8vwqbiwnnwz4630129gzpm6";
+  };
+
+  meta = {
+    license = lib.licenses.gpl2Plus;
+    description = "A validating XML parser written in C";
+    homepage = "https://www.cogsci.ed.ac.uk/~richard/rxp.html";
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/xml2/default.nix b/nixpkgs/pkgs/tools/text/xml/xml2/default.nix
new file mode 100644
index 000000000000..d469078c91dc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xml2/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchurl, pkg-config, libxml2 }:
+
+stdenv.mkDerivation rec {
+  pname = "xml2";
+  version = "0.5";
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20160427221603/http://download.ofb.net/gale/xml2-${version}.tar.gz";
+    sha256 = "01cps980m99y99cnmvydihga9zh3pvdsqag2fi1n6k2x7rfkl873";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libxml2 ];
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    runHook preInstallCheck
+
+    echo -n 'checking csv2 and 2csv...'
+    $out/bin/csv2 -f <<< $'a,b\n1,2' \
+      | $out/bin/2csv record a b \
+      | grep -qF '1,2'
+    echo ' ok'
+
+    echo -n 'checking xml2 and 2xml...'
+    $out/bin/xml2 <<< $'<a>abc</a>' \
+      | $out/bin/2xml \
+      | grep -qF '<a>abc</a>'
+    echo ' ok'
+
+    runHook postInstallCheck
+  '';
+
+  meta = with lib; {
+    homepage = "https://web.archive.org/web/20160515005047/http://dan.egnor.name:80/xml2";
+    description = "Tools for command line processing of XML, HTML, and CSV";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.rycee ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/xmlformat/default.nix b/nixpkgs/pkgs/tools/text/xml/xmlformat/default.nix
new file mode 100644
index 000000000000..380baa906c27
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xmlformat/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, perl }:
+stdenv.mkDerivation rec {
+  pname = "xmlformat";
+  version = "1.04";
+
+  src = fetchurl {
+    url = "http://www.kitebird.com/software/xmlformat/xmlformat-${version}.tar.gz";
+    sha256 = "1vwgzn4ha0az7dx0cyc6dx5nywwrx9gxhyh08mvdcq27wjbh79vi";
+  };
+
+  buildInputs = [ perl ];
+  buildPhase = ''
+    patchShebangs ./xmlformat.pl
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp ./xmlformat.pl $out/bin/xmlformat
+    cp ./LICENSE $out/
+  '';
+
+  meta = {
+    description = "a configurable formatter (or 'pretty-printer') for XML documents";
+    homepage = "http://www.kitebird.com/software/xmlformat/";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/xmloscopy/default.nix b/nixpkgs/pkgs/tools/text/xml/xmloscopy/default.nix
new file mode 100644
index 000000000000..c915e2c7fc5b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xmloscopy/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, lib, makeWrapper, dev_only_shellcheck ? null,
+fetchFromGitHub,
+
+fzf, coreutils, libxml2, libxslt, jing, findutils, gnugrep, gnused,
+docbook5
+}:
+stdenv.mkDerivation rec {
+  pname = "xmloscopy";
+  version = "0.1.3";
+
+  nativeBuildInputs = [
+    makeWrapper
+    dev_only_shellcheck
+  ];
+
+  spath = lib.makeBinPath [
+    fzf
+    coreutils
+    libxml2
+    libxslt
+    jing
+    findutils
+    gnugrep
+    gnused
+  ];
+
+  src = fetchFromGitHub {
+    owner = "grahamc";
+    repo = "xmloscopy";
+    rev = "v${version}";
+    sha256 = "06y5bckrmnq7b5ny2hfvlmdws910jw3xbw5nzy3bcpqsccqnjxrc";
+  };
+
+  installPhase = ''
+    sed -i "s/hard to say/v${version}/" ./xmloscopy
+    type -P shellcheck && shellcheck ./xmloscopy
+    chmod +x ./xmloscopy
+    patchShebangs ./xmloscopy
+    mkdir -p $out/bin
+    cp ./xmloscopy $out/bin/
+    wrapProgram $out/bin/xmloscopy \
+      --set RNG "${docbook5}/xml/rng/docbook/docbook.rng" \
+      --set PATH "${spath}"
+  '';
+
+  meta = with lib; {
+    description = "wtf is my docbook broken?";
+    homepage = "https://github.com/grahamc/xmloscopy";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ grahamc ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/xmlstarlet/default.nix b/nixpkgs/pkgs/tools/text/xml/xmlstarlet/default.nix
new file mode 100644
index 000000000000..99c97452fe58
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xmlstarlet/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl, pkg-config, libxml2, libxslt }:
+
+stdenv.mkDerivation rec {
+  pname = "xmlstarlet";
+  version = "1.6.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/xmlstar/xmlstarlet-${version}.tar.gz";
+    sha256 = "1jp737nvfcf6wyb54fla868yrr39kcbijijmjpyk4lrpyg23in0m";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libxml2 libxslt ];
+
+  patches = [
+    # Fixes an incompatible function pointer error with clang 16.
+    ./fix-incompatible-function-pointer.patch
+  ];
+
+  preConfigure =
+    ''
+      export LIBXSLT_PREFIX=${libxslt.dev}
+      export LIBXML_PREFIX=${libxml2.dev}
+      export LIBXSLT_LIBS=$(pkg-config --libs libxslt libexslt)
+      export LIBXML_LIBS=$(pkg-config --libs libxml-2.0)
+    '';
+
+  postInstall =
+    ''
+      ln -s xml $out/bin/xmlstarlet
+    '';
+
+  meta = {
+    description = "A command line tool for manipulating and querying XML data";
+    homepage = "https://xmlstar.sourceforge.net/";
+    license = lib.licenses.mit;
+    mainProgram = "xmlstarlet";
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xml/xmlstarlet/fix-incompatible-function-pointer.patch b/nixpkgs/pkgs/tools/text/xml/xmlstarlet/fix-incompatible-function-pointer.patch
new file mode 100644
index 000000000000..a0818731c217
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xmlstarlet/fix-incompatible-function-pointer.patch
@@ -0,0 +1,11 @@
+--- a/src/xml_elem.c	2012-08-12 09:18:59.000000000 -0600
++++ b/src/xml_elem.c	2023-07-11 13:17:14.220809280 -0600
+@@ -186,7 +186,7 @@
+  * put @name into @data->array[@data->offset]
+  */
+ static void
+-hash_key_put(void *payload, void *data, xmlChar *name)
++hash_key_put(void *payload, void *data, const xmlChar *name)
+ {
+     ArrayDest *dest = data;
+     dest->array[dest->offset++] = name;
diff --git a/nixpkgs/pkgs/tools/text/xml/xq/default.nix b/nixpkgs/pkgs/tools/text/xml/xq/default.nix
new file mode 100644
index 000000000000..84dc36511bb9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xml/xq/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, testers
+, xq-xml
+}:
+
+buildGoModule rec {
+  pname = "xq";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "sibprogrammer";
+    repo = "xq";
+    rev = "v${version}";
+    hash = "sha256-bhJ8zMZQZn/VzhulkfGOW+uyS8E43TIREAvKIsEPonA=";
+  };
+
+  vendorHash = "sha256-iJ1JMvIJqXLkZXuzn2rzKnLbiagTocg/6mJN3Pgd/4w=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=main.commit=${src.rev}"
+    "-X=main.version=${version}"
+  ];
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = xq-xml;
+    };
+  };
+
+  meta = with lib; {
+    description = "Command-line XML and HTML beautifier and content extractor";
+    homepage = "https://github.com/sibprogrammer/xq";
+    changelog = "https://github.com/sibprogrammer/xq/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xpaste/default.nix b/nixpkgs/pkgs/tools/text/xpaste/default.nix
new file mode 100644
index 000000000000..88666fd25adc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xpaste/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchFromGitHub
+, python3Packages
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "xpaste";
+  version = "1.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ossobv";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eVnoLG+06UTOkvGhzL/XS4JBrEwbXYZ1fuNTIW7YAfE=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    xlib
+  ];
+
+  # no tests, no python module to import, no version output to check
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Paste text into X windows that don't work with selections";
+    homepage = "https://github.com/ossobv/xpaste";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xsv/default.nix b/nixpkgs/pkgs/tools/text/xsv/default.nix
new file mode 100644
index 000000000000..303b38d65c2d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xsv/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "xsv";
+  version = "0.13.0";
+
+  src = fetchFromGitHub {
+    owner = "BurntSushi";
+    repo = "xsv";
+    rev = version;
+    sha256 = "17v1nw36mrarrd5yv4xd3mpc1d7lvhd5786mqkzyyraf78pjg045";
+  };
+
+  cargoSha256 = "1bh60zgflaa5n914irkr4bpq3m4h2ngcj6bp5xx1qj112dwgvmyb";
+
+  buildInputs = lib.optional stdenv.isDarwin Security;
+
+  meta = with lib; {
+    description = "A fast CSV toolkit written in Rust";
+    homepage = "https://github.com/BurntSushi/xsv";
+    license = with licenses; [ unlicense /* or */ mit ];
+    maintainers = [ maintainers.jgertm ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/xurls/default.nix b/nixpkgs/pkgs/tools/text/xurls/default.nix
new file mode 100644
index 000000000000..dc0825b88d4f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/xurls/default.nix
@@ -0,0 +1,24 @@
+{ buildGoModule, lib, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "xurls";
+  version = "2.5.0";
+
+  src = fetchFromGitHub {
+    owner = "mvdan";
+    repo = "xurls";
+    rev = "v${version}";
+    sha256 = "sha256-9hPXZ/t15+LG9fji1gyeWhUrYOr6eGyKYg3a1SmHJpQ=";
+  };
+
+  vendorHash = "sha256-eVK7qU+NWsarBsEpg6aGow/urmhIpU3Z9RwoTvSymXo=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "Extract urls from text";
+    homepage = "https://github.com/mvdan/xurls";
+    maintainers = with maintainers; [ koral ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/yaml-merge/default.nix b/nixpkgs/pkgs/tools/text/yaml-merge/default.nix
new file mode 100644
index 000000000000..85ea3cd360da
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/yaml-merge/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, python3Packages }:
+
+stdenv.mkDerivation {
+  pname = "yaml-merge";
+  version = "unstable-2022-01-12";
+
+  src = fetchFromGitHub {
+    owner = "abbradar";
+    repo = "yaml-merge";
+    rev = "2f0174fe92fc283dd38063a3a14f7fe71db4d9ec";
+    sha256 = "sha256-S2eZw+FOZvOn0XupZDRNcolUPd4PhvU1ziu+kx2AwnY=";
+  };
+
+  pythonPath = with python3Packages; [ pyyaml ];
+  nativeBuildInputs = with python3Packages;  [ wrapPython ];
+
+  installPhase = ''
+    install -Dm755 yaml-merge.py $out/bin/yaml-merge
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    description = "Merge YAML data files";
+    homepage = "https://github.com/abbradar/yaml-merge";
+    license = licenses.bsd2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/yx/default.nix b/nixpkgs/pkgs/tools/text/yx/default.nix
new file mode 100644
index 000000000000..bff2b955fb42
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/yx/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitLab, libyaml }:
+stdenv.mkDerivation rec {
+  pname = "yx";
+  version = "1.0.0";
+
+  src = fetchFromGitLab {
+    owner = "tomalok";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-oY61V9xP0DwRooabzi0XtaFsQa2GwYbuvxfERXQtYcA=";
+  };
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+  ];
+
+  strictDeps = true;
+
+  buildInputs = [ libyaml ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "YAML Data Extraction Tool";
+    homepage = "https://gitlab.com/tomalok/yx";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ twz123 ];
+    mainProgram = pname;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/zet/default.nix b/nixpkgs/pkgs/tools/text/zet/default.nix
new file mode 100644
index 000000000000..50d149f4e655
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/zet/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "zet";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "yarrow";
+    repo = "zet";
+    rev = "v${version}";
+    hash = "sha256-IjM+jSb+kdML0zZGuz9+9wrFzQCujn/bg9/vaTzMtUs=";
+  };
+
+  cargoHash = "sha256-kHIOsSR7ZxBzp4dtm2hbi8ddtlQ86x5EASk5HFmnhFo=";
+
+  # tests fail with `--release`
+  # https://github.com/yarrow/zet/pull/7
+  checkType = "debug";
+
+  meta = with lib; {
+    description = "CLI utility to find the union, intersection, set difference, etc of files considered as sets of lines";
+    homepage = "https://github.com/yarrow/zet";
+    changelog = "https://github.com/yarrow/zet/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/zim-tools/default.nix b/nixpkgs/pkgs/tools/text/zim-tools/default.nix
new file mode 100644
index 000000000000..855b1baf8aac
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/zim-tools/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub
+, meson, ninja, pkg-config
+, docopt_cpp, file, gumbo, mustache-hpp, zimlib, zlib
+, gtest
+}:
+
+stdenv.mkDerivation rec {
+  pname = "zim-tools";
+  version = "3.2.0";
+
+  src = fetchFromGitHub {
+    owner = "openzim";
+    repo = "zim-tools";
+    rev = version;
+    sha256 = "sha256-E4E2ETuhlzBZKXMy2hNA66Vq1z2VzomgCsQp2y00XHQ=";
+  };
+
+  nativeBuildInputs = [ meson ninja pkg-config ];
+  buildInputs = [ docopt_cpp file gumbo mustache-hpp zimlib zlib ];
+
+  nativeCheckInputs = [ gtest ];
+  doCheck = true;
+
+  meta = {
+    description = "Various ZIM command line tools";
+    homepage = "https://github.com/openzim/zim-tools";
+    maintainers = with lib.maintainers; [ robbinch ];
+    license = lib.licenses.gpl3Plus;
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/zoekt/default.nix b/nixpkgs/pkgs/tools/text/zoekt/default.nix
new file mode 100644
index 000000000000..22059ebbf230
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/zoekt/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, git
+}:
+buildGoModule {
+  pname = "zoekt";
+  version = "unstable-2022-11-09";
+
+  src = fetchFromGitHub {
+    owner = "sourcegraph";
+    repo = "zoekt";
+    rev = "c4b18d3b44da94b3e7c9c94467d68c029666bb86";
+    hash = "sha256-QtwOiBxBeFkhRfH3R2fP72b05Hc4+zt9njqCNVcprZ4=";
+  };
+
+  vendorHash = "sha256-DiAqFJ8E5V0/eHztm92WVrf1XGPXmmOaVXaWHfQMn2k=";
+
+  nativeCheckInputs = [
+    git
+  ];
+
+  preCheck = ''
+    export HOME=`mktemp -d`
+    git config --global --replace-all protocol.file.allow always
+  '';
+
+  meta = with lib; {
+    description = "Fast trigram based code search";
+    homepage = "https://github.com/google/zoekt";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/text/zstxtns-utils/default.nix b/nixpkgs/pkgs/tools/text/zstxtns-utils/default.nix
new file mode 100644
index 000000000000..a797f2b8dab5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/text/zstxtns-utils/default.nix
@@ -0,0 +1,39 @@
+{ coreutils
+, fetchurl
+, gnugrep
+, lib
+, makeWrapper
+, moreutils
+, stdenvNoCC
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zstxtns-utils";
+  version = "0.0.3";
+
+  src = fetchurl {
+    url = "https://ytrizja.de/distfiles/zstxtns-utils-${version}.tar.gz";
+    sha256 = "I/Gm7vHUr29NClYWQ1kwu8HrNZpdLXfE/nutTNoqcdU=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+    install -D -t $out/bin zstxtns-merge zstxtns-unmerge
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/zstxtns-merge --set PATH "${lib.makeBinPath [coreutils gnugrep moreutils]}"
+    wrapProgram $out/bin/zstxtns-unmerge --set PATH "${lib.makeBinPath [coreutils gnugrep]}"
+  '';
+
+  meta = with lib; {
+    description = "utilities to deal with text based name service databases";
+    homepage = "https://ytrizja.de/";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.fogti ];
+    platforms = platforms.all;
+  };
+}