1 /** 2 * Copyright © DiamondMVC 2019 3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE) 4 * Author: Jacob Jensen (bausshf) 5 */ 6 module diamond.core..string; 7 8 import std.traits : isSomeString; 9 10 /** 11 * Converts the first character of a string to lowercase. 12 * Params: 13 * s = The string to lowercase the first character. 14 * Returns: 15 * Returns a new string with the first character lowercased. The string is returned unmodified if its null or empty. 16 */ 17 TString firstToLower(TString)(TString s) 18 if (isSomeString!TString) 19 { 20 import std..string : toLower; 21 import std.conv : to; 22 23 if (!s || !s.length) 24 { 25 return s; 26 } 27 28 if (s.length == 1) 29 { 30 return s.toLower(); 31 } 32 33 return to!string(s[0]).toLower() ~ s[1 .. $]; 34 } 35 36 /** 37 * Converts the first character of a string to uppercase. 38 * Params: 39 * s = The string to uppercase the first character. 40 * Returns: 41 * Returns a new string with the first character uppercased. The string is returned unmodified if its null or empty. 42 */ 43 TString firstToUpper(TString)(TString s) 44 if (isSomeString!TString) 45 { 46 import std..string : toUpper; 47 import std.conv : to; 48 49 if (!s || !s.length) 50 { 51 return s; 52 } 53 54 if (s.length == 1) 55 { 56 return s.toUpper(); 57 } 58 59 return to!string(s[0]).toUpper() ~ s[1 .. $]; 60 } 61 62 /** 63 * Splits a string input into grouped words. 64 * Params: 65 * input = The input to split into grouped words. 66 * Returns: 67 * The string split into grouped words. 68 */ 69 string[] splitIntoGroupedWords(string input) 70 { 71 import std.array : split; 72 73 auto inputs = input.split(" "); 74 string[] words = []; 75 76 foreach (i; 0 .. inputs.length) 77 { 78 string current = inputs[i]; 79 string next1 = i < (inputs.length - 1) ? (" " ~ inputs[i + 1]) : null; 80 string next2 = i < (inputs.length - 2) ? (" " ~ inputs[i + 2]) : null; 81 82 words ~= current; 83 84 if (next1) 85 { 86 words ~= current ~ next1; 87 } 88 89 if (next2) 90 { 91 words ~= current ~ next1 ~ next2; 92 } 93 } 94 95 return words; 96 }