Skip to content

houfu/redlines

Redlines

Repository banner image PyPI - Version GitHub Release Date - Published_At GitHub last commit (by committer) PyPI - License

Redlines compares two strings/text and produces structured output showing their differences. Changes are represented with strike-throughs and highlights, similar to Microsoft Word's track changes. The output includes detailed change information, positions, and statistics for programmatic use.

Supports multiple output formats: JSON (default, with structured change data and statistics), Markdown, HTML, and rich (terminal display).

Quick Start

# Install
pip install redlines

# CLI: Compare two texts (outputs JSON by default)
redlines "The quick brown fox jumps over the lazy dog." "The quick brown fox walks past the lazy dog."

# Python: Compare and get markdown
from redlines import Redlines
test = Redlines(
    "The quick brown fox jumps over the lazy dog.",
    "The quick brown fox walks past the lazy dog.",
    markdown_style="none"
)
print(test.output_markdown)
# Output: The quick brown fox <del>jumps over </del><ins>walks past </ins>the lazy dog.

Supported: Python 3.10 - 3.14 (Python 3.8 and 3.9 support dropped)

Optional dependencies:

  • pip install redlines[nupunkt] for advanced sentence boundary detection (Python 3.11+, handles abbreviations, citations, URLs)
  • pip install redlines[levenshtein] for additional statistics

Usage

Python API

The library contains one class: Redlines, which is used to compare text.

Basic comparison:

from redlines import Redlines

test = Redlines(
    "The quick brown fox jumps over the lazy dog.",
    "The quick brown fox walks past the lazy dog.",
    markdown_style="none"
)
assert (
    test.output_markdown
    == "The quick brown fox <del>jumps over </del><ins>walks past </ins>the lazy dog."
)

Multiple comparisons with one source:

from redlines import Redlines

test = Redlines("The quick brown fox jumps over the lazy dog.", markdown_style="none")
assert (
    test.compare("The quick brown fox walks past the lazy dog.")
    == "The quick brown fox <del>jumps over </del><ins>walks past </ins>the lazy dog."
)

assert (
    test.compare("The quick brown fox jumps over the dog.")
    == "The quick brown fox jumps over the <del>lazy </del>dog."
)

JSON output with structured data:

from redlines import Redlines

test = Redlines(
    "The quick brown fox jumps over the lazy dog.",
    "The quick brown fox walks past the lazy dog."
)

# Get JSON with changes, positions, and statistics
print(test.output_json(pretty=True))

CLI

Basic usage (outputs JSON by default):

redlines "old text" "new text"
redlines file1.txt file2.txt --pretty

Output formats:

redlines text "source" "test"              # Rich terminal display
redlines markdown file1.txt file2.txt      # Markdown output
redlines stats old.txt new.txt             # Statistics only

Run redlines --help or redlines guide for the Agent Integration Guide. See also: redlines-textual.

Advanced Features

Custom Processors

Use NupunktProcessor for sentence-level tokenization with intelligent boundary detection:

from redlines import Redlines
from redlines.processor import NupunktProcessor

processor = NupunktProcessor()
test = Redlines("Dr. Smith said hello.", "Dr. Smith said hi.", processor=processor)

Use NupunktProcessor for: Legal/technical documents with abbreviations, URLs, citations, decimals Use WholeDocumentProcessor (default) for: Simple documents, speed-critical tasks (5-6x faster), paragraph-level granularity

See demo comparison for benchmarks.

For AI Agents & Automation

🤖 Using with AI coding agents? See the Agent Integration Guide for JSON schemas, automation patterns, error handling, and runnable examples.

Documentation & Resources

Full Documentation: https://houfu.github.io/redlines

Example Use Cases:

License

MIT License

About

Show the differences between two strings/text as a compact text, in markdown/HTML, in the terminal and more.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 13

Languages