detectLanguage function
Detect programming language from input content.
Implementation
String? detectLanguage(String input) {
// Check for explicit code blocks with language tags.
final codeBlocks = extractCodeBlocks(input);
for (final block in codeBlocks) {
if (block.language.isNotEmpty) {
final normalized = _normalizeLanguageName(block.language);
if (normalized != null) return normalized;
}
}
// Check for file extension mentions.
final extensionMap = <String, String>{
'.dart': 'Dart',
'.ts': 'TypeScript',
'.tsx': 'TypeScript',
'.js': 'JavaScript',
'.jsx': 'JavaScript',
'.py': 'Python',
'.rb': 'Ruby',
'.rs': 'Rust',
'.go': 'Go',
'.java': 'Java',
'.kt': 'Kotlin',
'.swift': 'Swift',
'.c': 'C',
'.cpp': 'C++',
'.cs': 'C#',
'.php': 'PHP',
'.vue': 'Vue',
'.svelte': 'Svelte',
'.html': 'HTML',
'.css': 'CSS',
'.sql': 'SQL',
'.sh': 'Shell',
};
for (final entry in extensionMap.entries) {
if (input.contains(entry.key)) return entry.value;
}
// Check for language keyword hints in the text.
final keywordMap = <RegExp, String>{
RegExp(r'\b(?:flutter|dart|pubspec)\b', caseSensitive: false): 'Dart',
RegExp(r'\b(?:typescript|tsx?)\b', caseSensitive: false): 'TypeScript',
RegExp(r'\b(?:javascript|nodejs|node\.js)\b', caseSensitive: false):
'JavaScript',
RegExp(r'\b(?:python|pip|django|flask|fastapi)\b', caseSensitive: false):
'Python',
RegExp(r'\b(?:rust|cargo|crate)\b', caseSensitive: false): 'Rust',
RegExp(r'\b(?:golang|go\s+module)\b', caseSensitive: false): 'Go',
RegExp(r'\b(?:java|spring\s*boot|maven|gradle)\b', caseSensitive: false):
'Java',
RegExp(r'\b(?:kotlin|ktor)\b', caseSensitive: false): 'Kotlin',
RegExp(r'\b(?:swift|swiftui|xcode)\b', caseSensitive: false): 'Swift',
RegExp(r'\b(?:ruby|rails|bundler|gem)\b', caseSensitive: false): 'Ruby',
RegExp(r'\b(?:c\+\+|cpp|cmake)\b', caseSensitive: false): 'C++',
RegExp(r'\b(?:c#|csharp|dotnet|\.net)\b', caseSensitive: false): 'C#',
RegExp(r'\bphp\b', caseSensitive: false): 'PHP',
};
for (final entry in keywordMap.entries) {
if (entry.key.hasMatch(input)) return entry.value;
}
return null;
}