using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ArcasDevTools { public static class Util { public static string PrepareCode(string code) { code = TrimMultiline(code); code = RemoveCodeComments(code); code = code.Replace("\"", "\"\""); code = MinifyCode(code); return code; } public static string TrimMultiline(string code) { code = Regex.Replace(code, @"^\s*", "", RegexOptions.Multiline); code = Regex.Replace(code, @"\s*$", "", RegexOptions.Multiline); return code; } public static string RemoveCodeComments(string code) { string blockComments = @"/\*(.*?)\*/"; string lineComments = @"//(.*?)\r?\n"; string strings = @"""((\\[^\n]|[^""\n])*)"""; string verbatimStrings = @"@(""[^""]*"")+"; string noComments = Regex.Replace ( code, blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings, me => { if (me.Value.StartsWith("/*") || me.Value.StartsWith("//")) { return me.Value.StartsWith("//") ? Environment.NewLine : ""; } // Keep the literal strings return me.Value; }, RegexOptions.Singleline ); return noComments; } public static string MinifyCode(string code) { // Remove whitespace before and after these needles code = Regex.Replace(code, @"\s*\;\s*", ";"); code = Regex.Replace(code, @"\s*\:\s*", ":"); code = Regex.Replace(code, @"\s*\,\s*", ","); code = Regex.Replace(code, @"\s*\[\s*", "["); code = Regex.Replace(code, @"\s*\]\s*", "]"); code = Regex.Replace(code, @"\s*\(\s*", "("); code = Regex.Replace(code, @"\s*\)\s*", ")"); code = Regex.Replace(code, @"\s*\-\s*", "-"); code = Regex.Replace(code, @"\s*\+\s*", "+"); code = Regex.Replace(code, @"\s*\/\s*", "/"); code = Regex.Replace(code, @"\s*\*\s*", "*"); code = Regex.Replace(code, @"\s*\%\s*", "%"); code = Regex.Replace(code, @"\s*\=\s*", "="); code = Regex.Replace(code, @"\s*\!\s*", "!"); code = Regex.Replace(code, @"\s*\>\s*", ">"); code = Regex.Replace(code, @"\s*\<\s*", "<"); code = Regex.Replace(code, @"\s*\>\>\s*", ">>"); code = Regex.Replace(code, @"\s*\&\&\s*", "&&"); code = Regex.Replace(code, @"\s*\|\|\s*", "||"); code = Regex.Replace(code, @"\s*\}\s*", "}"); code = Regex.Replace(code, @"\s*\{\s*", "{"); // Maybe ;} -> } ? // No whitespace at all, please! code = Regex.Replace(code, @"\s+", " "); code = code.Replace("\n", ""); code = code.Replace("\r", ""); code = code.Replace("\t", ""); return code; } } }