/*! * Sitemap * Copyright(c) 2011 Eugene Kalinin * MIT Licensed */ import { TagNames, IndexTagNames, StringObj } from './types.js'; /** * Escapes text content for safe inclusion in XML text nodes. * * **Security Model:** * - Escapes `&` → `&` (required to prevent entity interpretation) * - Escapes `<` → `<` (required to prevent tag injection) * - Escapes `>` → `>` (defense-in-depth, prevents CDATA injection) * - Does NOT escape `"` or `'` (not required in text content, only in attributes) * - Removes invalid XML Unicode characters per XML 1.0 spec * * **Why quotes aren't escaped:** * In XML text content (between tags), quotes have no special meaning and don't * need escaping. They only need escaping in attribute values, which is handled * by the `otag()` function. * * @param txt - The text content to escape * @returns XML-safe escaped text with invalid characters removed * @throws {TypeError} If txt is not a string * * @example * text('Hello & World'); // Returns: 'Hello & World' * text('5 < 10'); // Returns: '5 < 10' * text('Hello "World"'); // Returns: 'Hello "World"' (quotes OK in text) * * @see https://www.w3.org/TR/xml/#syntax */ export declare function text(txt: string): string; /** * Generates an opening XML tag with optional attributes. * * **Security Model:** * - Validates attribute names to prevent injection via malformed names * - Escapes all attribute values with proper XML entity encoding * - Escapes `&`, `<`, `>`, `"`, and `'` in attribute values * - Removes invalid XML Unicode characters * * Attribute values use full escaping (including quotes) because they appear * within quoted strings in the XML output: ``. * * @param nodeName - The XML element name (e.g., 'url', 'loc', 'video:title') * @param attrs - Optional object mapping attribute names to string values * @param selfClose - If true, generates a self-closing tag (e.g., ``) * @returns Opening XML tag string * @throws {InvalidXMLAttributeNameError} If an attribute name contains invalid characters * @throws {TypeError} If nodeName is not a string or attrs values are not strings * * @example * otag('url'); // Returns: '' * otag('video:player_loc', { autoplay: 'ap=1' }); // Returns: '' * otag('image:image', {}, true); // Returns: '' * * @see https://www.w3.org/TR/xml/#NT-Attribute */ export declare function otag(nodeName: TagNames | IndexTagNames, attrs?: StringObj, selfClose?: boolean): string; /** * Generates a closing XML tag. * * @param nodeName - The XML element name (e.g., 'url', 'loc', 'video:title') * @returns Closing XML tag string * @throws {TypeError} If nodeName is not a string * * @example * ctag('url'); // Returns: '' * ctag('video:title'); // Returns: '' */ export declare function ctag(nodeName: TagNames | IndexTagNames): string; /** * Generates a complete XML element with optional attributes and text content. * * This is a convenience function that combines `otag()`, `text()`, and `ctag()`. * It supports three usage patterns via function overloading: * * 1. Element with text content: `element('loc', 'https://example.com')` * 2. Element with attributes and text: `element('video:player_loc', { autoplay: 'ap=1' }, 'https://...')` * 3. Self-closing element with attributes: `element('image:image', { href: '...' })` * * @param nodeName - The XML element name * @param attrs - Either a string (text content) or object (attributes) * @param innerText - Optional text content when attrs is an object * @returns Complete XML element string * @throws {InvalidXMLAttributeNameError} If an attribute name contains invalid characters * @throws {TypeError} If arguments have invalid types * * @example * // Pattern 1: Simple element with text * element('loc', 'https://example.com') * // Returns: 'https://example.com' * * @example * // Pattern 2: Element with attributes and text * element('video:player_loc', { autoplay: 'ap=1' }, 'https://example.com/video') * // Returns: 'https://example.com/video' * * @example * // Pattern 3: Self-closing element with attributes * element('xhtml:link', { rel: 'alternate', href: 'https://example.com/fr' }) * // Returns: '' */ export declare function element(nodeName: TagNames, attrs: StringObj, innerText: string): string; export declare function element(nodeName: TagNames | IndexTagNames, innerText: string): string; export declare function element(nodeName: TagNames, attrs: StringObj): string;