예제 #1
0
        private static List <WikiTextTableEntry> ParseTableEntry(string curTable)
        {
            var allEntries = new List <WikiTextTableEntry>();

            var regionInfo = GetRegionAndTierInfo(curTable);

            WikiTextTableEntry curEntry = null;
            var entryCounter            = 0;

            //read string line by line
            //use StringReader?
            foreach (var curLine in curTable.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
            {
                //line is end of table
                if (curLine.Equals("=", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                //line contains description
                if (!curLine.StartsWith("|", StringComparison.OrdinalIgnoreCase) && !curLine.StartsWith("(", StringComparison.OrdinalIgnoreCase))
                {
                    curEntry.Description += $"{Environment.NewLine}{curLine}";
                    continue;
                }

                //line contains radius info
                if (curLine.StartsWith("(", StringComparison.OrdinalIgnoreCase))
                {
                    curEntry.Size += $"{Environment.NewLine}{curLine}";
                    continue;
                }

                //start new entry
                if (curLine.StartsWith("|-", StringComparison.OrdinalIgnoreCase))
                {
                    if (curEntry != null)
                    {
                        allEntries.Add(curEntry);
                    }

                    entryCounter = 0;
                    curEntry     = new WikiTextTableEntry
                    {
                        Region = regionInfo.Item1,
                        Tier   = regionInfo.Item2
                    };
                    continue;
                }

                switch (entryCounter)
                {
                case 0:
                {
                    curEntry.Icon = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 1:
                {
                    curEntry.Name = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 2:
                {
                    curEntry.Description = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 3:
                {
                    curEntry.ConstructionCost = curLine.Remove(0, 1)
                                                .Replace(" style=\"text-align:center;\" |", string.Empty)
                                                .Replace(" style=\"text-align: center;\" |", string.Empty);
                    entryCounter++;
                    break;
                }

                case 4:
                {
                    curEntry.MaintenanceCost = curLine.Remove(0, 1)
                                               .Replace(" style=\"text-align:center;\" |", string.Empty)
                                               .Replace(" style=\"text-align: center;\" |", string.Empty)
                                               .Replace("−", "-");//can't parse as negative number
                    entryCounter++;
                    break;
                }

                case 5:
                {
                    curEntry.Size = curLine.Remove(0, 1)
                                    .Replace(" style=\"text-align:center;\" |", string.Empty)
                                    .Replace(" style=\"text-align: center;\" |", string.Empty);
                    entryCounter++;
                    break;
                }

                default:
                    break;
                }
            }

            //add last entry
            if (curEntry != null && !allEntries.Contains(curEntry))
            {
                allEntries.Add(curEntry);
            }

            return(allEntries);
        }
예제 #2
0
        private static List <WikiTextTableEntry> ParseTableEntry(string curTable)
        {
            var allEntries = new List <WikiTextTableEntry>();

            var regionInfo = GetRegionAndTierInfo(curTable);

            WikiTextTableEntry curEntry = null;
            var entryCounter            = 0;
            var lastLineWasCollapsible  = false;

            //read string line by line
            //use StringReader?
            foreach (var curLine in curTable.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
            {
                //line is a collapsible information
                if (lastLineWasCollapsible)
                {
                    lastLineWasCollapsible = !lastLineWasCollapsible;
                    continue;
                }

                if (curLine.StartsWith("!", StringComparison.OrdinalIgnoreCase) && curLine.Contains("colspan=\"6\""))
                {
                    lastLineWasCollapsible = true;
                    continue;
                }

                //line is empty
                if (string.IsNullOrWhiteSpace(curLine))
                {
                    continue;
                }

                //line has no useful information
                if (curLine.Equals(STYLE_INFO, StringComparison.OrdinalIgnoreCase) &&
                    entryCounter != 4)//there are buildings without maintenance cost
                {
                    continue;
                }

                //line is end of table
                if (curLine.Equals("=", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                //line contains description
                if (!curLine.StartsWith("|", StringComparison.OrdinalIgnoreCase) &&
                    !curLine.StartsWith("(", StringComparison.OrdinalIgnoreCase) &&
                    !regexSize.IsMatch(curLine))
                {
                    curEntry.Description += $"{Environment.NewLine}{curLine}";
                    continue;
                }

                //line contains radius info
                if (curLine.StartsWith("(", StringComparison.OrdinalIgnoreCase))
                {
                    curEntry.Size += $"{Environment.NewLine}{curLine}";
                    continue;
                }

                //start new entry
                if (curLine.StartsWith("|-", StringComparison.OrdinalIgnoreCase))
                {
                    if (curEntry != null)
                    {
                        allEntries.Add(curEntry);
                    }

                    entryCounter = 0;
                    curEntry     = new WikiTextTableEntry
                    {
                        Region = regionInfo.Item1,
                        Tier   = regionInfo.Item2
                    };
                    continue;
                }

                switch (entryCounter)
                {
                case 0:
                {
                    curEntry.Icon = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 1:
                {
                    curEntry.Name = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 2:
                {
                    curEntry.Description = curLine.Remove(0, 1);
                    entryCounter++;
                    break;
                }

                case 3:
                {
                    curEntry.ConstructionCost = curLine.Remove(0, 1)
                                                .Replace(" style=\"text-align:center;\" |", string.Empty)
                                                .Replace(" style=\"text-align: center;\" |", string.Empty);
                    entryCounter++;
                    break;
                }

                case 4:
                {
                    curEntry.MaintenanceCost = curLine.Remove(0, 1)
                                               .Replace(" style=\"text-align:center;\" |", string.Empty)
                                               .Replace(" style=\"text-align: center;\" |", string.Empty)
                                               .Replace("−", "-");//can't parse as negative number
                    entryCounter++;
                    break;
                }

                case 5:
                {
                    if (curLine.StartsWith("|", StringComparison.OrdinalIgnoreCase))
                    {
                        curEntry.Size = curLine.Remove(0, 1)
                                        .Replace(" style=\"text-align:center;\" |", string.Empty)
                                        .Replace(" style=\"text-align: center;\" |", string.Empty);
                    }
                    else
                    {
                        curEntry.Size = curLine.Replace(" style=\"text-align:center;\" |", string.Empty)
                                        .Replace(" style=\"text-align: center;\" |", string.Empty);
                    }

                    entryCounter++;
                    break;
                }

                default:
                    break;
                }
            }

            //add last entry
            if (curEntry != null && !allEntries.Contains(curEntry))
            {
                allEntries.Add(curEntry);
            }

            return(allEntries);
        }