diff --git a/.forgejo/workflows/publish.yml b/.forgejo/workflows/publish.yml deleted file mode 100644 index fde3206..0000000 --- a/.forgejo/workflows/publish.yml +++ /dev/null @@ -1,20 +0,0 @@ -on: - push: - tags: - - 'v*' -jobs: - publish: - runs-on: based-alpine - steps: - - uses: actions/checkout@v4 - - name: setup cache - id: uv-cache - uses: https://git.ficd.sh/ficd/uv-cache@v1 - - name: build - run: | - uv sync - uv build - - name: publish - run: | - uv publish --token ${{ secrets.PYPI_TOKEN }} - diff --git a/README.md b/README.md index ff2c780..e09b662 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@

Mail Format

`mailfmt` is a simple plain text email formatter. It's designed to ensure -consistent paragraph spacing while preserving markdown syntax, email -headers, sign-offs, and signature blocks. +consistent paragraph spacing while preserving markdown syntax, email headers, +sign-offs, and signature blocks. -By default, the command accepts its input on `stdin` and prints to -`stdout`. This makes it well suited for use as a formatter with a text -editor like Kakoune or Helix. +By default, this script accepts its input on `stdin` and prints to `stdout`. +This makes it well suited for use as a formatter with a text editor like Kakoune +or Helix. It has no dependencies besides the standard Python interpreter, and +was written and tested against Python 3.13.3. - [Features](#features) -- [Installation](#installation) - [Usage](#usage) - [Output Example](#output-example) - [Markdown Safety](#markdown-safety) - [Aerc Integration](#aerc-integration) +- [Contributing](#contributing) @@ -32,27 +33,9 @@ editor like Kakoune or Helix. - Markdown-style code blocks. - Usenet-style signature block at EOF. - Sign-offs. -- If specified, output can be made safe for passing to a Markdown - renderer. - - Use case: piping the output to `pandoc` to write a `text/html` - message. See [Markdown Safety](#markdown-safety). - -## Installation - -`mailfmt` is intended for use as a standaole tool. The package is -available on PyPI as `mailfmt`. I recommend using -[uv](https://github.com/astral-sh/uv) or `pipx` to install it so the -`mailfmt` command is available on your path: - -```sh -uv tool install mailfmt -``` - -Verify that the installation was successful: - -```sh -mailfmt --help -``` +- If specified, output can be made safe for passing to a Markdown renderer. + - Use case: piping the output to `pandoc` to write a `text/html` message. See + [Markdown Safety](#markdown-safety). ## Usage @@ -80,7 +63,8 @@ options: -o, --output OUTPUT Output file. (default: STDOUT) Author : Daniel Fichtinger -Contact: daniel@ficd.sh +License: ISC +Contact: daniel@ficd.ca ``` ## Output Example @@ -103,7 +87,8 @@ Daniel -- Daniel -daniel@ficd.sh +sr.ht/~ficd +daniel@ficd.ca ``` After: @@ -125,24 +110,23 @@ Daniel -- Daniel -daniel@ficd.sh +sr.ht/~ficd +daniel@ficd.ca ``` ## Markdown Safety -In some cases, you may want to generate an HTML email. Ideally, you'd want -the HTML to be generated directly from the plain text message, and for -_both_ versions to be legible and have the same semantics. +In some cases, you may want to generate an HTML email. Ideally, you'd want the +HTML to be generated directly from the plain text message, and for _both_ +versions to be legible and have the same semantics. -Although `mailfmt` was written with Markdown markup in mind, its intended -output is still the `text/plain` format. If you pass its output directly -to a Markdown renderer, line breaks in sign-offs and the signature block -won't be preserved. +Although `mailfmt` was written with Markdown markup in mind, its intended output +is still the `text/plain` format. If you pass its output directly to a Markdown +renderer, line breaks in sign-offs and the signature block won't be preserved. -If you invoke `mailfmt --markdown-safe`, then `\` characters will be -appended to mark line breaks that would otherwise be squashed, making the -output suitable for conversion into HTML. Here's an example of one such -pipeline: +If you invoke `mailfmt --markdown-safe`, then `\` characters will be appended to +mark line breaks that would otherwise be squashed, making the output suitable +for conversion into HTML. Here's an example of one such pipeline: ```bash cat message.txt | mailfmt --markdown-safe | pandoc -f markdown -t html @@ -168,20 +152,24 @@ Daniel \ -- \ Daniel \ -daniel@ficd.sh \ +sr.ht/~ficd \ +daniel@ficd.ca \ ``` ## Aerc Integration -For integration with `aerc`, consider adding the following to your -`aerc.conf`: +For integration with `aerc`, consider adding the following to your `aerc.conf`: ```ini [multipart-converters] text/html=mailfmt --markdown-safe | pandoc -f markdown -t html --standalone ``` -When you're done writing your email, you can call the -`:multipart text/html` command to generate a `multipart/alternative` -message which includes _both_ your original `text/plain` _and_ the newly -generated `text/html` content. +When you're done writing your email, you can call the `:multipart text/html` +command to generate a `multipart/alternative` message which includes _both_ your +original `text/plain` _and_ the newly generated `text/html` content. + +## Contributing + +Please send patches, requests, and concerns to my +[public inbox](https://lists.sr.ht/~ficd/public-inbox). diff --git a/justfile b/justfile deleted file mode 100644 index b0828ed..0000000 --- a/justfile +++ /dev/null @@ -1,21 +0,0 @@ -clean: - #!/bin/sh - if [ ! -d "dist" ] && [ ! -d "__pycache__" ]; then - echo "Nothing to clean." - exit 0 - fi - if [ -d "dist" ]; then - echo "Removing dist/" - rm -r dist/ - fi - if [ -d "__pycache__" ]; then - echo "Removing __pycache__/" - rm -r "__pycache__" - fi -publish: - #!/bin/sh - just clean - uv build - export UV_PUBLISH_TOKEN="$(pass show pypi)" - uv publish - diff --git a/mailfmt.py b/mailfmt.py index 995e9aa..e8d1f7a 100755 --- a/mailfmt.py +++ b/mailfmt.py @@ -11,11 +11,10 @@ # Author: Daniel Fichtinger # License: ISC -import argparse -import re -import sys import textwrap -from importlib.metadata import version +import sys +import re +import argparse def main() -> None: @@ -76,7 +75,7 @@ def main() -> None: if not signoff_cache and 1 <= n <= 5 and line[-1] == ",": return True # second potential line - elif signoff_cache and 1 <= n <= 5: + elif signoff_cache and 1 <= n <= 5 and line[-1].isalpha(): for w in words: if not w[0].isupper(): return False @@ -85,22 +84,14 @@ def main() -> None: return False parser = argparse.ArgumentParser( - description="Heuristic formatter for plain text email. Preserves markup, signoffs, and signature blocks.", + description='Formatter for plain text email.\n"--no-*" options are NOT passed by default.', epilog=""" -Author : Daniel Fichtinger -Repository: https://git.ficd.sh/ficd/mailfmt -License : ISC -Contact : daniel@ficd.sh +Author : Daniel Fichtinger +License: ISC +Contact: daniel@ficd.ca """, formatter_class=argparse.RawDescriptionHelpFormatter, ) - parser.add_argument( - "-v", - "--version", - required=False, - help="Print version info and exit.", - action="store_true", - ) parser.add_argument( "-w", "--width", @@ -170,9 +161,6 @@ Contact : daniel@ficd.sh help="Output file. (default: %(default)s)", ) args = parser.parse_args() - if args.version: - print(version("mailfmt")) - exit(0) width = args.width should_check_signoff = args.no_signoff should_check_signature = args.no_signature diff --git a/pyproject.toml b/pyproject.toml index 5694f65..d8dedf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,13 @@ [project] name = "mailfmt" -version = "1.0.4" -description = "Heuristic plain text email formatter." +version = "0.1.0" +description = "Add your description here" readme = "README.md" authors = [ - { name = "Daniel Fichtinger", email = "daniel@ficd.sh" } + { name = "Daniel Fichtinger", email = "daniel@ficd.ca" } ] requires-python = ">=3.11" dependencies = [] -license = "ISC" -license-files = ["LICENSE"] -keywords = ["email", "formatter", "cli"] - -[project.urls] -Repository = "https://git.ficd.sh/ficd/mailfmt" [project.scripts] mailfmt = "mailfmt:main" diff --git a/uv.lock b/uv.lock index 029043b..6688ee9 100644 --- a/uv.lock +++ b/uv.lock @@ -4,5 +4,5 @@ requires-python = ">=3.11" [[package]] name = "mailfmt" -version = "1.0.3" +version = "0.1.0" source = { editable = "." }