A JavaScript library for validating and sanitizing book-related input data. This project provides utilities for validating book titles, comparing titles flexibly, parsing page ranges, and sanitizing HTML content.
This library is designed for applications that need to handle book information safely and reliably. It includes input validation functions that handle edge cases like Unicode normalization, diacritics, ligatures, and malicious input patterns.
- Book Title Validation: Validate book titles with customizable rules and blocklists
- Title Comparison: Compare book titles flexibly, handling diacritics, ligatures, and Unicode variations
- Page Range Parsing: Parse and count pages from range specifications (e.g., "1-3,5-6,p9")
- HTML Sanitization: Clean user-supplied HTML to only allow safe tags (currently
<b>and<i>) - Unicode-Aware: Handles international characters, diacritics, combining marks, and bidirectional text
- npm command line tools
npm installconst validator = require('./src/book-validator');Validates if a string is a valid book title.
Rules:
- Cannot be any form of "Boaty McBoatface" (case-insensitive blocklist)
- Only English alphabet characters, Arabic numerals, spaces, hyphens, and quotes allowed
- No leading or trailing whitespace
- No control characters (tabs, newlines, etc.)
- Supports Unicode letters and diacritics
Example:
validator.isTitle('War and Peace') // true
validator.isTitle('Boaty McBoatface') // false (blocklisted)
validator.isTitle(' Leading space') // false (has leading space)
validator.isTitle('Mañana') // trueCompares two titles for semantic similarity, useful for search features.
Comparison rules:
- Ignores leading/trailing whitespace
- Normalizes diacritics and combining marks
- Treats ligatures as their letter equivalents (æ → ae, ß → ss, etc.)
- Removes bidirectional control characters and zalgo text
Example:
validator.isSameTitle('naïve', 'naive') // true
validator.isSameTitle('café', 'cafe') // true
validator.isSameTitle(' The Book ', 'The Book') // trueParses a page range string and counts the total number of pages.
Format:
- Single page:
1,p3 - Range:
1-2,10-100 - Multiple ranges:
1-3,5-6,9 - Whitespace is ignored
Returns:
- Number of pages (counted inclusively)
0if format is invalidundefinedif string is malformed or exceeds 1000 characters
Example:
validator.countPages('1') // 1
validator.countPages('1-3') // 3
validator.countPages('1-3,5-6,9') // 6
validator.countPages('10-100') // 91Extracts and validates a page number from a string.
Accepts:
- Plain numbers:
123 - With "p" prefix:
p123 - With surrounding whitespace
Returns:
- Integer page number
undefinedif invalid or not a safe integer
Example:
validator.cleanPageNum('p42') // 42
validator.cleanPageNum(' 100 ') // 100
validator.cleanPageNum('invalid') // undefinedSanitizes HTML to prevent injection attacks, allowing only <b> and <i> tags.
Example:
validator.cleanForHTML('Hello <b>world</b>') // 'Hello <b>world</b>'
validator.cleanForHTML('Click <script>alert("xss")</script>') // 'Click <script>...'
validator.cleanForHTML('<b>Bold</b> and <i>italic</i>') // '<b>Bold</b> and <i>italic</i>'Basic utility function for testing (returns a + b).
Run the test suite with:
npm testTests are written with Jest and cover:
- Title validation with various character types
- Unicode handling (diacritics, combining marks, ligatures)
- Title comparison normalization
- Page range parsing edge cases
- HTML sanitization
Helena Lynd
