- ✅ Ticket 1.1: Estructura Clean Architecture en backend - ✅ Ticket 1.2: Schemas Zod compartidos - ✅ Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares) - ✅ Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares) - ✅ Ticket 1.5: Eliminación de duplicidades (~50 líneas) Cambios principales: - Creada estructura Clean Architecture en backend/src/ - Schemas Zod compartidos en backend/src/shared/schemas/ - Refactorización modular de drugs y procedures - Utilidades genéricas en src/utils/ (filter, validation) - Eliminados scripts obsoletos y documentación antigua - Corregidos errores: QueryClient, import test-error-handling - Build verificado y funcionando correctamente
140 lines
3.8 KiB
JavaScript
140 lines
3.8 KiB
JavaScript
/**
|
|
* Utility for encoding.
|
|
*/
|
|
export default class XMLEncodeUtility {
|
|
/**
|
|
* Encodes attribute value.
|
|
*
|
|
* @param value Value.
|
|
* @returns Escaped value.
|
|
*/
|
|
static encodeXMLAttributeValue(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return value
|
|
.replace(/&/gu, '&')
|
|
.replace(/"/gu, '"')
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>')
|
|
.replace(/\t/gu, '	')
|
|
.replace(/\n/gu, '
')
|
|
.replace(/\r/gu, '
');
|
|
}
|
|
/**
|
|
* Decodes attribute value.
|
|
*
|
|
* @param value Value.
|
|
* @returns Decoded value.
|
|
*/
|
|
static decodeXMLAttributeValue(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return value
|
|
.replace(/"/gu, '"')
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>')
|
|
.replace(/	/gu, '\t')
|
|
.replace(/
/gu, '\n')
|
|
.replace(/
/gu, '\r')
|
|
.replace(/&/gu, '&');
|
|
}
|
|
/**
|
|
* Encodes attribute value.
|
|
*
|
|
* @param value Value.
|
|
* @returns Escaped value.
|
|
*/
|
|
static encodeHTMLAttributeValue(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return value.replace(/&/gu, '&').replace(/"/gu, '"');
|
|
}
|
|
/**
|
|
* Decodes attribute value.
|
|
*
|
|
* @param value Value.
|
|
* @returns Decoded value.
|
|
*/
|
|
static decodeHTMLAttributeValue(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return value.replace(/"/gu, '"').replace(/&/gu, '&');
|
|
}
|
|
/**
|
|
* Encodes text content.
|
|
*
|
|
* @param text Value.
|
|
* @returns Escaped value.
|
|
*/
|
|
static encodeTextContent(text) {
|
|
if (text === null) {
|
|
return '';
|
|
}
|
|
return text
|
|
.replace(/&/gu, '&')
|
|
.replace(/\xA0/gu, ' ')
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>');
|
|
}
|
|
/**
|
|
* Decodes text content.
|
|
*
|
|
* @param text Value.
|
|
* @returns Decoded value.
|
|
*/
|
|
static decodeTextContent(text) {
|
|
if (text === null) {
|
|
return '';
|
|
}
|
|
return text
|
|
.replace(/ /gu, String.fromCharCode(160))
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>')
|
|
.replace(/&/gu, '&');
|
|
}
|
|
/**
|
|
* Decodes HTML entities.
|
|
*
|
|
* @param value Value.
|
|
* @returns Decoded value.
|
|
*/
|
|
static decodeHTMLEntities(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return value
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>')
|
|
.replace(/ /gu, String.fromCharCode(160))
|
|
.replace(/"/gu, '"')
|
|
.replace(/'/gu, "'")
|
|
.replace(/&#(\d+);/gu, (_match, dec) => String.fromCharCode(parseInt(dec, 10)))
|
|
.replace(/&#x([A-Fa-f\d]+);/gu, (_match, hex) => String.fromCharCode(parseInt(hex, 16)))
|
|
.replace(/&/gu, '&');
|
|
}
|
|
/**
|
|
* Decodes XML entities.
|
|
*
|
|
* @param value Value.
|
|
* @returns Decoded value.
|
|
*/
|
|
static decodeXMLEntities(value) {
|
|
if (value === null) {
|
|
return '';
|
|
}
|
|
return (value
|
|
.replace(/</gu, '<')
|
|
.replace(/>/gu, '>')
|
|
// " " Should not be supported in XML.
|
|
.replace(/"/gu, '"')
|
|
.replace(/'/gu, "'")
|
|
.replace(/&#(\d+);/gu, (_match, dec) => String.fromCharCode(parseInt(dec, 10)))
|
|
.replace(/&#x([A-Fa-f\d]+);/gu, (_match, hex) => String.fromCharCode(parseInt(hex, 16)))
|
|
.replace(/&/gu, '&'));
|
|
}
|
|
}
|
|
//# sourceMappingURL=XMLEncodeUtility.js.map
|