My final attempt at the PigLatin challenge. The code is much improved since my last submission. It passes all of the tests on the specification, including preserving punctuation + Rohit NamJoshi's Test procedure. I haven't tried to submit to the challenge web page, but will do so later. Any comments welcome: Having never really had a need to process strings before, I found this to be a difficult task...
PigLatin[text_String] := Module[{s = text},
vlclst = {"a", "e", "i", "o", "u"};
vuclst = {"A", "E", "I", "O", "U"};
punclist = {".", ",", ";", ":", "!"};
lst = StringExtract[s, All];
StrngReorder[strRO_] :=
StringInsert[
StringTake[strRO, 1 - StringLength[strRO]],
StringPart[strRO, 1],
If[StringEndsQ[strRO, punclist], -2, -1]
];
StrngStartConsonant[strSC_] :=
StringFreeQ[
StringPart[strSC, 1],
vlclst,
IgnoreCase -> True
];
StrngAddWay[strAW_] :=
StringInsert[strAW,
"way",
If[StringEndsQ[strAW, punclist], -2, -1]
];
StrngAddAy[strAY_] :=
StringInsert[
NestWhile[StrngReorder[#] &, strAY, StrngStartConsonant[#] &],
"ay",
If[StringEndsQ[strAY, punclist], -2, -1]
];
StrngMoveFirstVowel[strFV_] :=
StringInsert[
StringTake[strFV, 1 - StringLength[strFV]],
StringTake[strFV, 1],
If[StringEndsQ[str, punclist], -2, -1]
];
StrngAddAy2[strAY2_] := Module
[{str = strAY2},
str = StrngMoveFirstVowel[strAY2];
StrngAddAy[str]
];
StrngRule2[str2_] := If[
StringStartsQ[str2, vlclst],
StrngAddWay[str2],
str2];
StrngRule3[str3_] := If[
StrngStartConsonant[str3],
StrngAddAy[str3],
str3];
StrngRule4[str4_] := If[
StringStartsQ[str4, vuclst] &&
StringContainsQ[StringTake[str4, {2, StringLength[str4]}],
vlclst],
StrngAddAy2[str4],
str4
];
lst = StrngRule4 /@ StrngRule3 /@ StrngRule2 /@ lst;
StringRiffle[lst]
]