UNPKG

coordinate-sanitizer

Version:

Flexible coordinate parser and sanitizer for astronomical coordinates. Handles various coordinate formats and converts them to standardized formats.

399 lines (299 loc) 10.9 kB
# Coordinate Sanitizer A flexible and robust JavaScript library for parsing and sanitizing astronomical coordinates. Handles various coordinate formats and converts them to standardized formats suitable for astronomical applications. ## Features - **Multiple Input Formats**: Supports HMS/DMS, decimal, and compact coordinate formats - **Flexible Output**: Configurable output formats (Aladin, decimal, HMS/DMS) - **Range Validation**: Optional validation of RA (0-24h) and DEC (-90°/+90°) ranges - **Security**: Built-in protection against malicious input - **Object Recognition**: Automatically detects and passes through astronomical object names - **Unicode Support**: Handles various Unicode symbols and separators - **High Performance**: Optimized for batch processing - **Zero Dependencies**: Lightweight with no external dependencies - **Universal**: Works in Node.js and browsers - **TypeScript Support**: Includes complete TypeScript definitions ## Installation ```bash npm install coordinate-sanitizer ``` ## Quick Start ```javascript const CoordinateSanitizer = require('coordinate-sanitizer'); const sanitizer = new CoordinateSanitizer(); // Parse various coordinate formats const result1 = sanitizer.sanitizeCoordinates('12h 34m 56s, +12° 34\' 56"'); console.log(result1.coordinates); // "12 34 56.000, +12 34 56.000" const result2 = sanitizer.sanitizeCoordinates('M31'); console.log(result2.coordinates); // "M31" (passed through as object name) const result3 = sanitizer.sanitizeCoordinates('123.456, -12.345'); console.log(result3.coordinates); // "08 13 49.440, -12 20 42.000" ``` ## Supported Input Formats ### Coordinate Formats - **HMS/DMS**: `12h 34m 56.78s, +12° 34' 56.78"` - **Colon separated**: `12:34:56.78, +12:34:56.78` - **Decimal**: `123.456, -12.345` - **Compact**: `123456, -123456` - **Space separated**: `12 34 56.7 -45 12 34.5` - **Mixed formats**: `12h 34m 56s, +12:34:56` ### Object Names - **Messier objects**: `M31`, `M42` - **NGC objects**: `NGC 1234`, `NGC 7000` - **IC objects**: `IC 1396` - **Other catalogs**: `HD 209458`, `HIP 27989`, `SAO 123456` - **Named stars**: `Polaris`, `Vega`, `51 Eri` ### Separators Supports multiple separators between RA and DEC: - Comma: `,` - Semicolon: `;` - Middle dot: `·` - Bullet: `•` ## API Reference ### Constructor ```javascript const sanitizer = new CoordinateSanitizer(options); ``` **Options:** - `outputFormat` (string): Output format - `'aladin'`, `'decimal'`, `'hms-dms'` (default: `'aladin'`) - `precision` (number): Decimal precision for output (default: `6`) - `validateRanges` (boolean): Enable range validation (default: `true`) - `strictMode` (boolean): Enable strict parsing mode (default: `false`) ### Methods #### `sanitizeCoordinates(input)` Main method for sanitizing coordinates. **Parameters:** - `input` (string): Input coordinate string **Returns:** ```javascript { isValid: boolean, // Whether the input was successfully parsed coordinates: string, // Sanitized coordinate string error: string|null, // Error message if parsing failed metadata: { // Additional information about the parsing inputFormat: string, // 'coordinates', 'object-name', 'already-valid' outputFormat: string,// Output format used ra: object, // RA parsing details (if coordinates) dec: object // DEC parsing details (if coordinates) } } ``` #### Static Methods ##### `getSupportedFormats()` Returns information about supported input and output formats. ##### `createPreset(preset)` Creates a sanitizer with predefined configurations: - `'aladin'`: Aladin format with range validation - `'decimal'`: Decimal format with high precision - `'loose'`: Aladin format without range validation - `'strict'`: Aladin format with strict parsing and validation ## Usage Examples ### Different Output Formats ```javascript // Aladin format (default) const aladinSanitizer = new CoordinateSanitizer({ outputFormat: 'aladin' }); const result1 = aladinSanitizer.sanitizeCoordinates('12h 34m 56s, +12° 34\' 56"'); console.log(result1.coordinates); // "12 34 56.000, +12 34 56.000" // Decimal format const decimalSanitizer = new CoordinateSanitizer({ outputFormat: 'decimal' }); const result2 = decimalSanitizer.sanitizeCoordinates('12h 34m 56s, +12° 34\' 56"'); console.log(result2.coordinates); // "12.582222, 12.582222" // HMS/DMS format const hmsSanitizer = new CoordinateSanitizer({ outputFormat: 'hms-dms' }); const result3 = hmsSanitizer.sanitizeCoordinates('12.5, 12.5'); console.log(result3.coordinates); // "12h 30m 0.000s, +12° 30' 0.000"" ``` ### Using Presets ```javascript // Quick setup with presets const aladinSanitizer = CoordinateSanitizer.createPreset('aladin'); const decimalSanitizer = CoordinateSanitizer.createPreset('decimal'); const looseSanitizer = CoordinateSanitizer.createPreset('loose'); const result = aladinSanitizer.sanitizeCoordinates('12h 34m 56s, +12° 34\' 56"'); ``` ### Range Validation ```javascript const sanitizer = new CoordinateSanitizer({ validateRanges: true }); // Valid coordinates const valid = sanitizer.sanitizeCoordinates('12h 00m 00s, +45° 00\' 00"'); console.log(valid.isValid); // true // Invalid RA (> 24h) const invalid = sanitizer.sanitizeCoordinates('25h 00m 00s, +45° 00\' 00"'); console.log(invalid.isValid); // false console.log(invalid.error); // "RA out of range: 25 (must be 0-24 hours)" ``` ### Batch Processing ```javascript const sanitizer = new CoordinateSanitizer(); const inputs = [ 'M31', 'NGC 1234', '12h 34m 56s, +12° 34\' 56"', '13:45:12.34, -23:45:12.34' ]; const results = inputs.map(input => { const result = sanitizer.sanitizeCoordinates(input); return { input, valid: result.isValid, output: result.coordinates, type: result.metadata?.inputFormat }; }); console.table(results); ``` ### Integration with Telescope Control ```javascript class TelescopeController { constructor() { this.sanitizer = new CoordinateSanitizer({ outputFormat: 'aladin', validateRanges: true }); } gotoTarget(target) { const result = this.sanitizer.sanitizeCoordinates(target); if (!result.isValid) { throw new Error(`Invalid target: ${result.error}`); } // Send to telescope this.sendToTelescope(result.coordinates); return { target: result.coordinates, inputType: result.metadata.inputFormat }; } } ``` ### Error Handling ```javascript const sanitizer = new CoordinateSanitizer(); function safeSearch(input) { try { const result = sanitizer.sanitizeCoordinates(input); if (!result.isValid) { return { success: false, error: result.error, suggestion: 'Please check coordinate format' }; } return { success: true, coordinates: result.coordinates, inputType: result.metadata.inputFormat }; } catch (error) { return { success: false, error: error.message, suggestion: 'Please contact support' }; } } ``` ## Browser Usage ### Script Tag ```html <script src="path/to/coordinate-sanitizer.js"></script> <script> const sanitizer = new CoordinateSanitizer(); const result = sanitizer.sanitizeCoordinates('M31'); console.log(result.coordinates); </script> ``` ### ES6 Modules ```javascript import CoordinateSanitizer from 'coordinate-sanitizer'; const sanitizer = new CoordinateSanitizer(); const result = sanitizer.sanitizeCoordinates('12h 34m 56s, +12° 34\' 56"'); ``` ## TypeScript Support The library includes complete TypeScript definitions: ```typescript import CoordinateSanitizer, { CoordinateSanitizerOptions, SanitizationResult } from 'coordinate-sanitizer'; const options: CoordinateSanitizerOptions = { outputFormat: 'decimal', precision: 4, validateRanges: true }; const sanitizer = new CoordinateSanitizer(options); const result: SanitizationResult = sanitizer.sanitizeCoordinates('M31'); ``` ## Performance The library is optimized for high-performance applications: - **10,000+ coordinates/second** on modern hardware - **Zero dependencies** - no external libraries - **Efficient regex patterns** for fast parsing - **Minimal memory footprint** - **Batch processing support** ## Security The library includes built-in security features: - **Input sanitization** prevents script injection - **Malicious content detection** blocks dangerous patterns - **Safe parsing** with input validation - **No eval() or dynamic code execution** ## Error Handling The library provides detailed error messages for debugging: ```javascript const result = sanitizer.sanitizeCoordinates('invalid input'); if (!result.isValid) { console.log(`Error: ${result.error}`); // Handle error appropriately } ``` Common error types: - Invalid coordinate format - Out of range values (RA > 24h, DEC > ±90°) - Malformed input strings - Security violations ## Testing Run the test suite: ```bash npm test ``` Run examples: ```bash npm run example ``` ## Contributing 1. Fork the repository 2. Create a feature branch (`git checkout -b feature/amazing-feature`) 3. Commit your changes (`git commit -m 'Add amazing feature'`) 4. Push to the branch (`git push origin feature/amazing-feature`) 5. Open a Pull Request ## Development Setup ```bash # Clone the repository git clone https://github.com/Francescodib/coordinate-sanitizer.git cd coordinate-sanitizer # Install dependencies npm install # Run tests npm test # Run examples npm run example ``` ## Changelog ### 1.0.0 - Initial release - Support for multiple coordinate formats - Range validation - Security features - TypeScript support - Comprehensive test suite ## License MIT License - see [LICENSE](LICENSE) file for details. ## Related Projects - [Aladin Lite](https://aladin.u-strasbg.fr/AladinLite/) - Sky atlas for the web - [Voyager](https://www.starkeeper.it/) - Advanced astronomy software - [Astropy](https://www.astropy.org/) - Python astronomy library ## Support - [Documentation](https://github.com/Francescodib/coordinate-sanitizer#readme) - [Issue Tracker](https://github.com/Francescodib/coordinate-sanitizer/issues) - [Discussions](https://github.com/Francescodib/coordinate-sanitizer/discussions) ## Author **Francesco di Biase** - GitHub: [@Francescodib](https://github.com/Francescodib) - Project: [coordinate-sanitizer](https://github.com/Francescodib/coordinate-sanitizer)