Example #1
0
        /// <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));
        }
Example #2
0
        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();
        }