/// <summary>Helper method to get the next token</summary> Token GetToken() { while (Skip.Any(s => s == mText[mIdx])) { if (++mIdx >= mText.Length) { return(null); } } // Punc if (Punctuations.Any(p => p == mText[mIdx])) { return(new Token(E.Punctuation, $"'{mText[mIdx]}'")); } // String var str = GetString(); if (str != null) { return(new Token(E.String, $"\"{str}\"")); } // Number var num = GetNumberString(); if (num != null) { return(new Token(E.Number, num)); } // Keyword int end = mText.IndexOfAny(Delims, mIdx); if (end == -1) { return(null); } str = mText.Substring(mIdx, end - mIdx); mIdx = end - 1; if (Keywords.Any(k => k == str)) { return(new Token(E.Keyword, str)); } // This token does not satisfy any of the above criteria InvalidToken(str); return(new Token(E.Invalid, str)); }
static void Main(string[] args) { var ecDic = new Dictionary <string, string> { { string.Empty, string.Empty } }; foreach (var file in new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../Dictionaries")).EnumerateFiles()) { if (file.FullName.ToLower().EndsWith(".special.txt")) { var lines = File.ReadAllText(file.FullName).Split(new[] { '=' }, StringSplitOptions.None); if (lines.Length <= 1) { continue; } if (lines.Length > 2) { Console.WriteLine("WARNING: Incorrect line count. Details: {0}", file.FullName); } string en = lines[0].Replace("\r\n", "\n").Trim('\n'), cn = lines[1].Replace("\r\n", "\n").Trim('\n'); if (!ecDic.ContainsKey(en)) { ecDic.Add(en, cn); } else if (ecDic[en] != cn) { Console.WriteLine("WARNING: Same english but different translations!{0}{1}{0}{2}", Environment.NewLine, ecDic[en], cn); } } else { foreach (var str in File.ReadAllText(file.FullName).Split(new[] { "\r\n\r\n" }, StringSplitOptions.None)) { var lines = str.Split(new[] { "\r\n" }, StringSplitOptions.None); int start = 0, end = lines.Length; while (start < lines.Length && (string.IsNullOrWhiteSpace(lines[start]) || lines[start].StartsWith("=="))) { start++; } while (end >= start && (string.IsNullOrWhiteSpace(lines[end - 1]) || lines[end - 1].StartsWith("=="))) { end--; } lines = lines.Skip(start).Take(end - start).ToArray(); if (lines.Length <= 1) { continue; } if ((lines.Length & 1) > 0) { Console.WriteLine("WARNING: Incorrect line count. Details: {0}", str); } string en = lines.Take(lines.Length >> 1).Aggregate(string.Empty, (c, s) => c + s + "\n"), cn = lines.Skip(lines.Length >> 1).Aggregate(string.Empty, (c, s) => c + s + "\n"); en = en.Remove(en.Length - 1); cn = cn.TrimEnd('\n').Replace(@"\n", "\n"); if (cn.ToUpper().StartsWith("[C] ")) { cn = cn.Remove(0, 4); } else if (file.FullName.ToLower().EndsWith("dialogs.txt")) { cn = cn.Replace("......", "……"); const int charPerLine = 11; var i = 0; for (var j = 0; j < charPerLine; j++) { if (i >= cn.Length) { break; } if (cn[i++] == '.') { j--; } } while (i < cn.Length) { while (Punctuations.Contains(cn[i])) { i--; } cn = cn.Insert(i, "\n"); for (var j = 0; j < charPerLine; j++) { if (i >= cn.Length) { break; } if (cn[i++] == '.') { j--; } } i++; } cn = cn.Replace("……", "......"); } if (!ecDic.ContainsKey(en)) { ecDic.Add(en, cn); } else if (ecDic[en] != cn) { Console.WriteLine("WARNING: Same english but different translations!{0}{1}{0}{2}", Environment.NewLine, ecDic[en], cn); } } } } args = args.Where(a => !a.ToLower().EndsWith("filelist.txt", StringComparison.InvariantCultureIgnoreCase)) .Union(args.Where(a => a.ToLower().EndsWith("filelist.txt", StringComparison.InvariantCultureIgnoreCase)) .SelectMany(a => File.ReadAllText(a) .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))) .Union(args.Where(Directory.Exists).SelectMany(a => new DirectoryInfo(a) .EnumerateFiles("*.anim.xml", SearchOption.AllDirectories)).Select(f => f.FullName)) .ToArray(); var processed = false; foreach (var argTemp in args) { var arg = argTemp; if (arg.EndsWith(".xml", StringComparison.InvariantCultureIgnoreCase) && !arg.EndsWith(".anim.xml", StringComparison.InvariantCultureIgnoreCase)) { arg = arg.Remove(arg.Length - 4); } var xmlPath = arg + ".xml"; if (File.Exists(arg)) { processed = true; if (arg.ToLower().EndsWith(".bak", StringComparison.InvariantCultureIgnoreCase)) { RestoreBackup(arg.Remove(arg.Length - 4)); } else { if (File.Exists(arg + ".bak")) { RestoreBackup(arg); } try { StringTableHelper.Decode(arg); } catch (NoStringException) { Console.WriteLine("WARNING: No strings here!"); continue; } File.Copy(arg, arg + ".bak"); // backup var doc = XDocument.Load(xmlPath); var rollback = true; var forceRollback = false; foreach (var element in doc.Element("strings").Elements("string") .Where(element => element.Attribute("en") != null && element.Attribute("de") != null)) { if (element.Attribute("french") == null) { element.Add(new XAttribute("french", element.Attribute("fr").Value)); // backup element.Attribute("fr").Value = element.Attribute("en").Value; } var en = element.Attribute("fr").Value; if (ecDic.ContainsKey(en)) { if (element.Attribute("en") == null) { element.Add(new XAttribute("en", ecDic[en])); rollback = false; } else if (element.Attribute("en").Value != ecDic[en]) { element.Attribute("en").Value = ecDic[en]; rollback = false; } } else { if (element.Attribute("de") != null) { Console.WriteLine("ERROR: Unexpected content! Details: {0}", Environment.NewLine + en); forceRollback = true; } if (element.Attribute("en") != null) { element.Attribute("en").Remove(); } } } doc.Save(xmlPath); StringTableHelper.Encode(xmlPath); File.Delete(xmlPath); if (rollback || forceRollback) { Console.WriteLine("Rolling back..."); File.Delete(arg); File.Move(arg + ".bak", arg); } else { Console.WriteLine("Checked!"); } } } else if (File.Exists(xmlPath)) { processed = true; if (File.Exists(xmlPath + ".bak")) { RestoreBackup(xmlPath); } File.Copy(xmlPath, xmlPath + ".bak"); // backup var doc = XDocument.Load(xmlPath); var rollback = true; var forceRollback = false; foreach (var name in doc.XPathSelectElements("//name").Union(doc.XPathSelectElements("//text")) .Union(doc.XPathSelectElements("//description"))) { XElement en = name.XPathSelectElement("string[@lang='en']"), fr = name.XPathSelectElement("string[@lang='fr']"); if (en == null || fr == null) { continue; } var enValue = fr.Attribute("data").Value = en.Attribute("data").Value; if (ecDic.ContainsKey(enValue)) { if (en.Attribute("data").Value != ecDic[enValue]) { en.Attribute("data").Value = ecDic[enValue]; rollback = false; } } else { if (name.XPathSelectElement("string[@lang='de']") != null) { Console.WriteLine("ERROR: Unexpected content! Details: " + Environment.NewLine + en.Attribute("data").Value); forceRollback = true; } } } if (rollback || forceRollback) { Console.WriteLine("Rolling back..."); File.Delete(xmlPath); File.Move(xmlPath + ".bak", xmlPath); } else { doc.Save(xmlPath); Console.WriteLine("Checked!"); } } } if (!processed) { GenerateWordPackDictionary(); } Console.ReadKey(); }