/// 字符串工具类 - 统一导出接口 /// /// 提供常用的字符串处理功能,包括命名风格转换、注释生成、文本清理等。 /// 本文件作为统一导出接口,实际功能已按职责拆分到子模块: /// - NamingConverter: 命名转换(camelCase, PascalCase, snake_case 等) /// - TextCleaner: 文本清理和格式化 /// - TemplateService: 模板服务(注释生成、文件头生成等) /// - FormattingUtils: 格式化工具(缩进、字节大小、持续时间等) /// /// # 典型用法示例 /// ```dart /// // snake_case 转 camelCase /// StringHelper.toDartPropertyName('user_id'); // userId /// // 含特殊字符 /// StringHelper.toDartPropertyName('user-id'); // userId /// // 数字开头 /// StringHelper.toDartPropertyName('1st_field'); // n1stField /// // 生成注释 /// StringHelper.generateComment('API description'); // /// API description /// ``` /// library; import 'package:swagger_generator_flutter/core/config.dart'; import 'package:swagger_generator_flutter/core/models.dart'; import 'package:swagger_generator_flutter/utils/string_utils/formatting_utils.dart'; import 'package:swagger_generator_flutter/utils/string_utils/naming_converter.dart'; import 'package:swagger_generator_flutter/utils/string_utils/template_service.dart'; import 'package:swagger_generator_flutter/utils/string_utils/text_cleaner.dart'; /// 字符串工具类 - 统一导出接口 /// /// 将各子模块的功能聚合到统一的 API 中,保持向后兼容性 class StringHelper { // ==================== 命名转换 (NamingConverter) ==================== /// 转换为 camelCase static String toCamelCase(String input) => NamingConverter.toCamelCase(input); /// 转换为 PascalCase static String toPascalCase(String input) => NamingConverter.toPascalCase(input); /// 转换为 snake_case static String toSnakeCase(String input) => NamingConverter.toSnakeCase(input); /// 转换为符合 Dart 命名规范的属性名 static String toDartPropertyName(String propName) => NamingConverter.toDartPropertyName(propName); /// 生成 Dart 类名 static String generateClassName(String name) { var className = NamingConverter.generateClassName(name); final prefix = SwaggerConfig.modelClassPrefix; if (prefix != null && prefix.isNotEmpty) { if (!className.startsWith(prefix)) { className = prefix + className; } } return className; } /// 生成常量名称 (UPPER_SNAKE_CASE) static String generateConstantName(String name) => NamingConverter.toConstantCase(name); /// 生成文件名 static String generateFileName(String name) => NamingConverter.generateFileName(name); /// 验证是否为有效的 Dart 标识符 static bool isValidDartIdentifier(String identifier) => NamingConverter.isValidDartIdentifier(identifier); /// 生成枚举值名称 static String generateEnumValueName(dynamic value, int index) => NamingConverter.generateEnumValueName(value, index); /// pluralize 单词 static String pluralize(String word) => NamingConverter.pluralize(word); // ==================== 文本清理 (TextCleaner) ==================== /// 清理描述文本,移除特殊字符和格式化多行注释 static String cleanDescription(String description) => TextCleaner.cleanDescription(description); /// 转义字符串中的特殊字符 static String escapeString(String input) => TextCleaner.escapeString(input); /// 缩进文本 static String indent(String text, int spaces) => FormattingUtils.indent(text, spaces); /// 截断文本到指定长度 static String truncate(String text, int maxLength, {String suffix = '...'}) => TextCleaner.truncate(text, maxLength, suffix: suffix); /// 标准化文本(移除多余空白和统一换行符) static String normalize(String text) => TextCleaner.normalize(text); // ==================== 模板服务 (TemplateService) ==================== /// 生成注释块 static String generateComment(String text, {bool isBlock = false}) => TemplateService.generateComment(text, isBlock: isBlock); /// 生成文件头注释 static String generateFileHeader( String description, String source, { String? fileName, String? fileType, }) { final service = TemplateService(); return service.generateFileHeader( description, source, fileName: fileName, fileType: fileType, ); } // ==================== 格式化工具 (FormattingUtils) ==================== /// 格式化字节大小 static String formatBytes(int bytes) => FormattingUtils.formatBytes(bytes); /// 格式化持续时间 static String formatDuration(Duration duration) => FormattingUtils.formatDuration(duration); // ==================== 已废弃的方法(向后兼容) ==================== // 这些方法已移至 ApiNamingUtils,保留此处以兼容旧代码 /// 生成端点名称 /// @deprecated 使用 ApiNamingUtils.generateEndpointName 代替 @Deprecated('Use ApiNamingUtils.generateEndpointName instead') static String generateEndpointName(String path, String? operationId) { // 如果有 operationId,优先使用 if (operationId != null && operationId.isNotEmpty) { return toCamelCase(operationId); } // 移除路径中的版本前缀 var cleanPath = path.replaceFirst('/api/v1', ''); // 移除开头的斜杠 if (cleanPath.startsWith('/')) { cleanPath = cleanPath.substring(1); } // 将路径转换为 camelCase final parts = cleanPath.split('/'); if (parts.length >= 2) { final controller = parts[0]; final action = parts[1]; return toCamelCase('${controller}_$action'); } return toCamelCase(cleanPath.replaceAll('/', '_')); } /// 提取控制器名称 /// @deprecated 使用 ApiNamingUtils.extractControllerName 代替 @Deprecated('Use ApiNamingUtils.extractControllerName instead') static String extractControllerName(ApiPath path) { // 从 tags 中提取控制器名称 if (path.tags.isNotEmpty) { return path.tags.first; } // 从路径中提取控制器名称 final pathParts = path.path.split('/'); if (pathParts.length > 1) { return toPascalCase(pathParts[1]); } return 'General'; } }