Normalize text to handle PDF/Unicode encoding issues and security evasion. Converts Windows-1252, curly quotes, em/en dashes, ligatures, directional formatting, zero-width chars, and more to clean ASCII. Security extensions: homoglyph translation, mixed-script detection, invisible content detection, URL double-decoding, letter-spacing collapse.
Scanned 9/11/2026
Install to Claude Code
npx -y skills add grahama1970/agent-skills --skill clean-text --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Clean Text?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/grahama1970-clean-text)More formats (shields.io, HTML) on the badges page.
---
name: clean-text
description: >
Normalize text to handle PDF/Unicode encoding issues and security evasion.
Converts Windows-1252, curly quotes, em/en dashes, ligatures,
directional formatting, zero-width chars, and more to clean ASCII.
Security extensions: homoglyph translation, mixed-script detection,
invisible content detection, URL double-decoding, letter-spacing collapse.
allowed-tools: Bash, Read
triggers:
- clean text
- normalize text
- normalize unicode
- fix encoding
- clean pdf text
- normalize pdf
- text cleaning
- sanitize input
- homoglyph detection
metadata:
short-description: Clean PDF/Unicode text to ASCII + security sanitization
project: pi-mono
provides:
- clean-text
- sanitize-for-validation
composes:
- task-monitor
- agentic-evals
taxonomy:
- preprocessing
- text
- precision
- corruption
disciplines:
- extraction
- data-engineering
---
# Clean Text
Comprehensive text normalization for handling PDF and Unicode encoding issues,
plus security-focused sanitization for injection detection.
## Quick Start
```bash
# Normalize text from stdin
echo "Hello\u2019world" | .pi/skills/clean-text/run.sh
# Normalize a file
.pi/skills/clean-text/run.sh document.txt
# Normalize with output file
.pi/skills/clean-text/run.sh document.txt -o clean.txt
# Treat argument as text (not filename)
.pi/skills/clean-text/run.sh -t "Hello\u201cworld\u201d"
# Show statistics
.pi/skills/clean-text/run.sh document.txt --stats
```
## What It Normalizes
| Category | Examples | Normalized To |
|----------|----------|---------------|
| **Whitespace** | Non-breaking, em/en space, hair space | Regular space |
| **Hyphens** | En dash, em dash, minus sign, figure dash | ASCII hyphen `-` |
| **Quotes** | Curly quotes, guillemets, primes | Straight `'` and `"` |
| **Windows-1252** | `\x93`, `\x94`, `\x92` | `"`, `"`, `'` |
| **Ligatures** | fi, fl, ffi, ffl | Expanded letters |
| **Bullets** | Various bullet points | Hyphen `-` |
| **Zero-width** | ZWSP, ZWNJ, ZWJ, BOM | Removed |
| **Directional** | LTR/RTL marks | Removed |
| **Control chars** | C0/C1 (except newline/tab) | Removed |
| **Line breaks** | `intro-\nduction` | `introduction` |
## Pipeline Integration
This skill is based on the same normalization used in the extractor pipeline's
s02_marker_extractor.py. The code is kept in sync with text_toolz patterns.
### Python Usage
```python
from clean_text import normalize_text
# Clean text for pattern matching
text = "1.\u00a0Introduction" # Non-breaking space
clean = normalize_text(text) # "1. Introduction"
```
## Normalization Steps
1. **Windows-1252 conversion** - Handle legacy MS Office encoding
2. **NFKC normalization** - Unicode compatibility decomposition
3. **Remove directional formatting** - LTR/RTL marks
4. **Remove control characters** - C0/C1 (preserve newlines)
5. **Normalize whitespace** - All special spaces to ASCII
6. **Normalize hyphens** - All dash variants to `-`
7. **Normalize quotes** - Curly to straight
8. **Normalize dots** - Ellipsis, leader dots
9. **Normalize bullets** - All bullet types to `-`
10. **Expand ligatures** - fi/fl/ffi/ffl
11. **Fix line-break hyphens** - Join hyphenated words
12. **Collapse whitespace** - Multiple spaces to single
## Security Sanitization API
For Tier 0 validators and injection detection, import the security functions directly:
```python
from clean_text import (
sanitize_for_validation, # NFKC + homoglyph + URL-decode + letter-spacing
has_control_chars, # null, DEL, C0 control chars
has_mixed_scripts, # Latin+Cyrillic mixing (homoglyph attack)
has_invisible_content, # >50% invisible characters
has_directional_chars, # Unicode Bidi override characters
is_whitespace_only, # empty after sanitization
HOMOGLYPH_MAP, # Cyrillic→Latin translation table
INVISIBLE_CHARS_RE, # zero-width + directional + BOM regex
)
```
Used by: `services/common/validation.py` (Embry OS Tier 0 validators)
## Based On
- text_toolz library patterns
- extractor pipeline s02 normalization
- NFKC Unicode standard
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!