| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| extension StringExtension on String { |
| /// Returns this string if not empty, otherwise null. |
| String? get nullIfEmpty => isEmpty ? null : this; |
| |
| /// Computes a filename for a given symbol name (convert from PascalCase to |
| /// snake_case and append '.dart'). |
| /// |
| /// It is assumed that this String is a valid identifier and does not contain |
| /// characters that are invalid in file names. |
| String get toFileName { |
| var fileName = |
| replaceAllMapped( |
| RegExp('[A-Z]'), |
| (match) => match.start == 0 ? match[0]! : '_${match[0]}', |
| ).toLowerCase(); |
| return '$fileName.dart'; |
| } |
| |
| /// Returns a lowerCamelCase version of the receiver. |
| /// |
| /// No checks are made that the receiver is a valid identifier, other than |
| /// the requirement that the receiver must contain at least one underscore |
| /// (but neither at the beginning nor the end), and must not have two adjacent |
| /// underscores. |
| /// |
| /// The resulting identifier is one in which only the letters following the |
| /// underscores are capitalized. |
| String? get toLowerCamelCase { |
| var words = split('_'); |
| if (words.length < 2) { |
| return null; |
| } |
| var firstWord = words.first; |
| if (firstWord.isEmpty) { |
| return null; |
| } |
| var buffer = StringBuffer(); |
| buffer.write(firstWord.toLowerCase()); |
| for (var i = 1; i < words.length; i++) { |
| var word = words[i]; |
| if (word.isEmpty) { |
| return null; |
| } |
| buffer.write(word._capitalized); |
| } |
| return buffer.toString(); |
| } |
| |
| /// Returns an UpperCamelCase version of the receiver. |
| /// |
| /// No checks are made that the receiver is a valid identifier, other than |
| /// the requirement that the receiver must contain at least one underscore |
| /// (but neither at the beginning nor the end), and must not have two adjacent |
| /// underscores. |
| /// |
| /// The resulting identifier is one in which only the first letter and the |
| /// letters following the underscores are capitalized. |
| String? get toUpperCamelCase { |
| var words = split('_'); |
| if (words.length < 2) { |
| var first = words.firstOrNull; |
| if (first != null && first.isNotEmpty) { |
| return first._capitalized; |
| } |
| return null; |
| } |
| var buffer = StringBuffer(); |
| for (var i = 0; i < words.length; i++) { |
| var word = words[i]; |
| if (word.isEmpty) { |
| return null; |
| } |
| buffer.write(word._capitalized); |
| } |
| return buffer.toString(); |
| } |
| |
| /// Returns the string after removing the '^' in the string, if present, |
| /// along with the index of the caret, or null if not present. |
| (String, int?) get withoutCaret { |
| var caretIndex = indexOf('^'); |
| if (caretIndex < 0) { |
| return (this, null); |
| } else { |
| var rawText = substring(0, caretIndex) + substring(caretIndex + 1); |
| return (rawText, caretIndex); |
| } |
| } |
| |
| /// Return a version of this string in which the first character is upper case |
| /// and all remaining characters are lower case. |
| String get _capitalized { |
| if (length <= 1) { |
| return toUpperCase(); |
| } |
| return substring(0, 1).toUpperCase() + substring(1).toLowerCase(); |
| } |
| |
| /// Returns `null` if this string is the same as [other], otherwise `this`. |
| String? orNullIfSameAs(String other) => this == other ? null : this; |
| } |