blob: 43d6dc2cd029c6387754a74f82c2d77c8fdd93de [file] [log] [blame]
// 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;
}