Compact domain specific language (DSL) for editing blocks of plain text
texted
is a line-oriented DSL that focus on simple text editing operations,
operating on independent chunks of text (for example commenting/uncommenting lines).
It is not suitable for complex changes. If you need those, please consider
using a library that is syntax-aware, like configupdater for .ini/.cfg
files, tomlkit for .toml
and libCST or refactor for Python files.
You can install texted
with the help of pip
:
$ pip install texted
After doing that you will be able to use texted
in your Python scripts.
Using texted
involves the following workflow:
- Select the relevant lines of a given text.
- Perform an edition operation over the selection.
This is workflow is shown in the example below:
>>> from texted import edit, find, until, contains, startswith, blank, remove_prefix >>> example = """\ ... # [testenv:typecheck] ... # deps = mypy ... # commands = python -m mypy {posargs:src} ... [testenv:docs] ... deps = sphinx ... changedir = docs ... commands = python -m sphinx -W --keep-going . {toxinidir}/build/html ... """ >>> new_text = edit( ... example, ... find(contains("[testenv:typecheck]")) >> until(startswith("[testenv") | blank), ... remove_prefix("# "), ... ) >>> print(new_text) [testenv:typecheck] deps = mypy commands = python -m mypy {posargs:src} [testenv:docs] deps = sphinx changedir = docs commands = python -m sphinx -W --keep-going . {toxinidir}/build/html
One of the most basic kinds of select operations can be created with find
.
This operation will select the first line that matches a criteria. For example:
find(lambda line: "[testenv:typecheck]" in line)
… will select the first line of a text that contains the "[testenv:typecheck]"
string.
We can then extend (>>
) this selection for all the contiguous lines that are not
empty with:
find(lambda line: "[testenv:typecheck]" in line) >> whilist(bool) # => bool is handy! bool("") == False, bool("not empty") == True
After you have selected the block of lines, you can apply a edit operation. For example:
add_prefix("# ") # => equivalent to: replace(lambda line: "# " + line)
… will add the prefix "# "
to all the non empty lines in the selection.
Note that all these functions are lazy and don't do anything until they are
called with edit
.
Note
This library supports only \n
line endings.
This project has been set up using PyScaffold 4.4. For details and usage information on PyScaffold see https://pyscaffold.org/.